Skip to content

Commit d561a4f

Browse files
authored
Merge pull request #36 from silahian/performance-improvements-ariel
Performance improvements ariel
2 parents ec5c619 + df0125d commit d561a4f

File tree

186 files changed

+6866
-12963
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

186 files changed

+6866
-12963
lines changed

AnalyticReports/ReportDictionary.xaml

Lines changed: 7 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
22
xmlns:oxy="http://oxyplot.org/wpf"
3-
xmlns:contrib="http://oxyplot.org/wpf/contrib"
43
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
54
xmlns:Formatters="clr-namespace:VisualHFT.Converters">
65

@@ -33,14 +32,14 @@
3332
</Style>
3433

3534
<Style x:Key="ExpanderHeaderStyle" TargetType="TextBlock">
36-
<Setter Property="Height" Value="30" />
35+
<Setter Property="Height" Value="30" />
3736
<Setter Property="Foreground" Value="White" />
3837
<Setter Property="Background" Value="#898a75" />
3938
<Setter Property="FontWeight" Value="100" />
4039
<Setter Property="FontFamily" Value="Myriad Pro" />
41-
<Setter Property="Padding" Value="10,6,0,0" />
40+
<Setter Property="Padding" Value="10,6,0,0" />
4241
</Style>
43-
42+
4443
<Style x:Key="DataTitleStyle" TargetType="Label">
4544
<Setter Property="FontWeight" Value="300" />
4645
<Setter Property="Foreground" Value="#4d4e3a" />
@@ -61,7 +60,7 @@
6160
<Setter Property="Foreground" Value="#4d4e3a" />
6261
<Setter Property="FontSize" Value="12" />
6362
</Style>
64-
63+
6564
<Style x:Key="GridDataStyle" TargetType="Label">
6665
<Setter Property="Template">
6766
<Setter.Value>
@@ -71,7 +70,7 @@
7170
</Border>
7271
</ControlTemplate>
7372
</Setter.Value>
74-
</Setter>
73+
</Setter>
7574
<Setter Property="Background" Value="#fff" />
7675
<Setter Property="Foreground" Value="#4d4e3a" />
7776
<Setter Property="FontSize" Value="12" />
@@ -97,12 +96,12 @@
9796
<Setter Property="Background" Value="GhostWhite" />
9897
<Setter Property="Foreground" Value="Black" />
9998
<Setter Property="FontSize" Value="12" />
100-
<Setter Property="FontFamily" Value="Segoe UI" />
99+
<Setter Property="FontFamily" Value="Segoe UI" />
101100
<Setter Property="ToolTipService.ShowDuration" Value="10000"/>
102101
<Setter Property="TextBlock.TextWrapping" Value="Wrap" />
103102
</Style>
104103
<!--CHARTS-->
105-
104+
106105
<Style x:Key="ChartTitleStyle" TargetType="Label">
107106
<Setter Property="FontWeight" Value="300" />
108107
<Setter Property="Foreground" Value="#4d4e3a" />
@@ -118,18 +117,5 @@
118117
<Setter Property="VerticalAlignment" Value="Top" />
119118
<Setter Property="HorizontalAlignment" Value="Center"/>
120119
</Style>
121-
<Style x:Key="PlotStyle" TargetType="{x:Type contrib:Plot}">
122-
<Setter Property="DefaultTrackerTemplate">
123-
<Setter.Value>
124-
<ControlTemplate>
125-
<oxy:TrackerControl Position="{Binding Position}" LineExtents="{Binding PlotModel.PlotArea}">
126-
<oxy:TrackerControl.Content>
127-
<TextBlock Text="{Binding}" Margin="7" />
128-
</oxy:TrackerControl.Content>
129-
</oxy:TrackerControl>
130-
</ControlTemplate>
131-
</Setter.Value>
132-
</Setter>
133-
</Style>
134120
</ResourceDictionary>
135121

AnalyticReports/View/ucCharts.xaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
<UserControl x:Class="VisualHFT.AnalyticReports.View.ucCharts"
22
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
3-
xmlns:contrib="http://oxyplot.org/wpf/contrib"
43
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
54
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
65
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
@@ -22,6 +21,7 @@
2221
<ColumnDefinition Width="*" SharedSizeGroup="A"/>
2322
<ColumnDefinition Width="*" SharedSizeGroup="A"/>
2423
</Grid.ColumnDefinitions>
24+
<!--
2525
<contrib:Plot x:Name="chart1" Title="By Hour Win/Loss | Qty of Trades" Grid.Column="0" Grid.Row="0" IsEnabled="True" Style="{StaticResource PlotStyle}" Margin="0,0,0,10" >
2626
<contrib:Plot.Resources>
2727
<SolidColorBrush x:Key="PlotBackgroundBrush" Color="{DynamicResource PrimaryHueLight}" />
@@ -65,6 +65,6 @@
6565
<contrib:BarSeries Title="Losses" ItemsSource="{Binding HourSerieLosses}" ValueField="PLAmount" Color="Red"/>
6666
</contrib:Plot.Series>
6767
</contrib:Plot>
68-
68+
-->
6969
</Grid>
7070
</UserControl>

AnalyticReports/View/ucChartsStatistics.xaml

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
<UserControl x:Class="VisualHFT.AnalyticReports.View.ucChartsStatistics"
22
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
3-
xmlns:contrib="http://oxyplot.org/wpf/contrib"
43
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
54
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
65
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
@@ -26,7 +25,7 @@
2625
<ColumnDefinition Width="*" SharedSizeGroup="A"/>
2726
</Grid.ColumnDefinitions>
2827
<!--Trade Duration (Qty trades by holding period)-->
29-
<contrib:Plot x:Name="chart1" Title="Trade Duration (Qty trades by holding period)" Grid.Column="0" Grid.Row="0" IsEnabled="True" Style="{StaticResource PlotStyle}" Margin="0,0,0,10">
28+
<!--<contrib:Plot x:Name="chart1" Title="Trade Duration (Qty trades by holding period)" Grid.Column="0" Grid.Row="0" IsEnabled="True" Style="{StaticResource PlotStyle}" Margin="0,0,0,10">
3029
<contrib:Plot.Resources>
3130
<SolidColorBrush x:Key="PlotBackgroundBrush" Color="{DynamicResource PrimaryHueLight}" />
3231
<SolidColorBrush x:Key="PlotTextBrush" Color="{DynamicResource PrimaryHueMid}" />
@@ -47,9 +46,9 @@
4746
<contrib:BarSeries Title="Wins" ItemsSource="{Binding heldBars}" ValueField="WinPnLCount" Color="Green"/>
4847
<contrib:BarSeries Title="Losses" ItemsSource="{Binding heldBars}" ValueField="LossPnlCount" Color="Red"/>
4948
</contrib:Plot.Series>
50-
</contrib:Plot>
49+
</contrib:Plot>-->
5150
<!--Trade Duration (PnL by holding period)-->
52-
<contrib:Plot x:Name="chart2" Title="Trade Duration (PnL by holding period)" Grid.Column="1" Grid.Row="0" IsEnabled="True" Style="{StaticResource PlotStyle}" Margin="0,0,0,10">
51+
<!--<contrib:Plot x:Name="chart2" Title="Trade Duration (PnL by holding period)" Grid.Column="1" Grid.Row="0" IsEnabled="True" Style="{StaticResource PlotStyle}" Margin="0,0,0,10">
5352
<contrib:Plot.Resources>
5453
<SolidColorBrush x:Key="PlotBackgroundBrush" Color="{DynamicResource PrimaryHueLight}" />
5554
<SolidColorBrush x:Key="PlotTextBrush" Color="{DynamicResource PrimaryHueMid}" />
@@ -70,9 +69,9 @@
7069
<contrib:BarSeries Title="Wins" ItemsSource="{Binding heldBars}" ValueField="TotalWinPnL" Color="Green"/>
7170
<contrib:BarSeries Title="Losses" ItemsSource="{Binding heldBars}" ValueField="TotalLossPnl" Color="Red"/>
7271
</contrib:Plot.Series>
73-
</contrib:Plot>
72+
</contrib:Plot>-->
7473
<!--Top 20 Symbols (by PL)-->
75-
<contrib:Plot x:Name="chart3" Title="Top 20 Symbols (by PL)" Grid.Column="0" Grid.Row="1" IsEnabled="True" Style="{StaticResource PlotStyle}" Margin="0,0,0,10">
74+
<!--<contrib:Plot x:Name="chart3" Title="Top 20 Symbols (by PL)" Grid.Column="0" Grid.Row="1" IsEnabled="True" Style="{StaticResource PlotStyle}" Margin="0,0,0,10">
7675
<contrib:Plot.Resources>
7776
<SolidColorBrush x:Key="PlotBackgroundBrush" Color="{DynamicResource PrimaryHueLight}" />
7877
<SolidColorBrush x:Key="PlotTextBrush" Color="{DynamicResource PrimaryHueMid}" />
@@ -93,9 +92,9 @@
9392
<contrib:BarSeries Title="Wins" ItemsSource="{Binding Top20}" ValueField="WinsPnL" Color="Green"/>
9493
<contrib:BarSeries Title="Losses" ItemsSource="{Binding Top20}" ValueField="LossesPnL" Color="Red"/>
9594
</contrib:Plot.Series>
96-
</contrib:Plot>
95+
</contrib:Plot>-->
9796
<!--PL Ranges-->
98-
<contrib:Plot x:Name="chart4" Title="PL Ranges" Grid.Column="1" Grid.Row="1" IsEnabled="True" Style="{StaticResource PlotStyle}" Margin="0,0,0,10">
97+
<!--<contrib:Plot x:Name="chart4" Title="PL Ranges" Grid.Column="1" Grid.Row="1" IsEnabled="True" Style="{StaticResource PlotStyle}" Margin="0,0,0,10">
9998
<contrib:Plot.Resources>
10099
<SolidColorBrush x:Key="PlotBackgroundBrush" Color="{DynamicResource PrimaryHueLight}" />
101100
<SolidColorBrush x:Key="PlotTextBrush" Color="{DynamicResource PrimaryHueMid}" />
@@ -115,9 +114,9 @@
115114
<contrib:Plot.Series>
116115
<contrib:BarSeries Title="Qty Trades" ItemsSource="{Binding ListPLRanges}" ValueField="Qty" Color="Blue"/>
117116
</contrib:Plot.Series>
118-
</contrib:Plot>
117+
</contrib:Plot>-->
119118
<!--PL Range($) vs Duration-->
120-
<contrib:Plot x:Name="chart5" Title="PL Range($) vs Duration" Grid.ColumnSpan="2" Grid.Row="2" IsEnabled="True" Margin="0,0,0,10">
119+
<!--<contrib:Plot x:Name="chart5" Title="PL Range($) vs Duration" Grid.ColumnSpan="2" Grid.Row="2" IsEnabled="True" Margin="0,0,0,10">
121120
<contrib:Plot.Resources>
122121
<SolidColorBrush x:Key="PlotBackgroundBrush" Color="{DynamicResource PrimaryHueLight}" />
123122
<SolidColorBrush x:Key="PlotTextBrush" Color="{DynamicResource PrimaryHueMid}" />
@@ -138,9 +137,9 @@
138137
<contrib:ScatterSeries ItemsSource="{Binding PLRangeDuration}" DataFieldX="Duration" DataFieldY="PLRange" MarkerType="Circle" MarkerSize="2"/>
139138
<contrib:LineSeries Title="Regression" ItemsSource="{Binding regressionLineData}" DataFieldX="X" DataFieldY="Y" Color="Blue"/>
140139
</contrib:Plot.Series>
141-
</contrib:Plot>
140+
</contrib:Plot>-->
142141
<!--Maximum Adverse Excursion (MAE)-->
143-
<contrib:Plot x:Name="chart6" Title="Maximum Adverse Excursion (MAE)" Grid.Column="0" Grid.Row="3" IsEnabled="True" Margin="0,0,0,10">
142+
<!--<contrib:Plot x:Name="chart6" Title="Maximum Adverse Excursion (MAE)" Grid.Column="0" Grid.Row="3" IsEnabled="True" Margin="0,0,0,10">
144143
<contrib:Plot.Resources>
145144
<SolidColorBrush x:Key="PlotBackgroundBrush" Color="{DynamicResource PrimaryHueLight}" />
146145
<SolidColorBrush x:Key="PlotTextBrush" Color="{DynamicResource PrimaryHueMid}" />
@@ -161,9 +160,9 @@
161160
<contrib:ScatterSeries ItemsSource="{Binding MAE}" DataFieldX="XValue" DataFieldY="YValue" MarkerType="Circle" MarkerSize="2"/>
162161
<contrib:LineSeries Title="Regression" ItemsSource="{Binding regressionLineDataMAE}" DataFieldX="X" DataFieldY="Y" Color="Blue"/>
163162
</contrib:Plot.Series>
164-
</contrib:Plot>
163+
</contrib:Plot>-->
165164
<!--Maximum Favorable Excursion (MFE)-->
166-
<contrib:Plot x:Name="chart7" Title="Maximum Favorable Excursion (MFE)" Grid.Column="1" Grid.Row="3" IsEnabled="True" Margin="0,0,0,10">
165+
<!--<contrib:Plot x:Name="chart7" Title="Maximum Favorable Excursion (MFE)" Grid.Column="1" Grid.Row="3" IsEnabled="True" Margin="0,0,0,10">
167166
<contrib:Plot.Resources>
168167
<SolidColorBrush x:Key="PlotBackgroundBrush" Color="{DynamicResource PrimaryHueLight}" />
169168
<SolidColorBrush x:Key="PlotTextBrush" Color="{DynamicResource PrimaryHueMid}" />
@@ -184,6 +183,6 @@
184183
<contrib:ScatterSeries ItemsSource="{Binding MFE}" DataFieldX="XValue" DataFieldY="YValue" MarkerType="Circle" MarkerSize="2"/>
185184
<contrib:LineSeries Title="Regression" ItemsSource="{Binding regressionLineDataMFE}" DataFieldX="X" DataFieldY="Y" Color="Blue"/>
186185
</contrib:Plot.Series>
187-
</contrib:Plot>
186+
</contrib:Plot>-->
188187
</Grid>
189188
</UserControl>

AnalyticReports/View/ucEquityChart.xaml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
<UserControl x:Class="VisualHFT.AnalyticReports.View.ucEquityChart"
22
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
3-
xmlns:contrib="http://oxyplot.org/wpf/contrib"
43
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
54
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
65
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
@@ -12,7 +11,7 @@
1211
<ResourceDictionary.MergedDictionaries>
1312
<ResourceDictionary Source="../ReportDictionary.xaml" />
1413
</ResourceDictionary.MergedDictionaries>
15-
</ResourceDictionary>
14+
</ResourceDictionary>
1615
</UserControl.Resources>
1716

1817
<Grid>
@@ -26,6 +25,7 @@
2625
<ColumnDefinition Width="*" />
2726
</Grid.ColumnDefinitions>
2827

28+
<!--
2929
<contrib:Plot x:Name="chartEquity" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Grid.Row="0" Grid.ColumnSpan="2" IsEnabled="True" Style="{StaticResource PlotStyle}" >
3030
<contrib:Plot.Resources>
3131
<SolidColorBrush x:Key="PlotBackgroundBrush" Color="{DynamicResource PrimaryHueLight}" />
@@ -70,6 +70,7 @@
7070
<contrib:BarSeries Title="Ammount" ItemsSource="{Binding DrawDowns}" ValueField="DrawDownAmmount" Color="Green" />
7171
</contrib:Plot.Series>
7272
</contrib:Plot>
73+
-->
7374
<StackPanel Grid.Row="2" Grid.Column="1" Width="770" HorizontalAlignment="Center" >
7475
<Label Content="Monthly Performance" TextBlock.TextAlignment="Center" TextElement.FontWeight="Bold"></Label>
7576
<DataGrid AutoGenerateColumns="False" Name="dataGrid1" ItemsSource="{Binding}" VerticalAlignment="Stretch" IsReadOnly="True" UseLayoutRounding="True" FontSize="11"

App.config

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,11 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<configuration>
33
<connectionStrings>
4-
<!--LOCAL-->
5-
<add name="HFTEntities" connectionString="metadata=res://*/Model.hftModel.csdl|res://*/Model.hftModel.ssdl|res://*/Model.hftModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=.;initial catalog=HFT;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient"/>
64
</connectionStrings>
75
<appSettings>
86

97
<!--LOCAL -->
10-
<add key="ConnectionString" value="Data Source=(local);Initial Catalog=HFT;Trusted_Connection=True"/>
118
<add key="RestFullConnection" value="http://localhost:6800/"/>
12-
<add key="WSorderBook" value="ws://localhost:6900/"/>
139

1410
<add key="log4net.Internal.Debug" value="true"/>
1511

App.xaml

Lines changed: 3 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,16 @@
11
<Application x:Class="VisualHFT.App"
22
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
33
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
4-
xmlns:local="clr-namespace:VisualHFT"
4+
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
55
StartupUri="View/Dashboard.xaml">
66
<Application.Resources>
77
<ResourceDictionary>
88
<ResourceDictionary.MergedDictionaries>
99

10-
<!--
11-
<ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.Light.xaml" />
12-
<ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.Dark.xaml" />
13-
<ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.Defaults.xaml" />
14-
15-
1610

17-
<ResourceDictionary Source="pack://application:,,,/MaterialDesignColors;component/Themes/Recommended/Primary/MaterialDesignColor.Indigo.xaml" />
18-
<ResourceDictionary Source="pack://application:,,,/MaterialDesignColors;component/Themes/Recommended/Accent/MaterialDesignColor.Red.xaml" />
19-
<ResourceDictionary Source="pack://application:,,,/MaterialDesignColors;component/Themes/Recommended/Primary/MaterialDesignColor.DeepPurple.xaml" />
20-
<ResourceDictionary Source="pack://application:,,,/MaterialDesignColors;component/Themes/Recommended/Accent/MaterialDesignColor.Lime.xaml" />
21-
-->
11+
<materialDesign:BundledTheme BaseTheme="Dark" PrimaryColor="Indigo" SecondaryColor="Red" />
2212

23-
24-
<ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.Dark.xaml" />
25-
<ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.Defaults.xaml" />
26-
27-
<ResourceDictionary Source="pack://application:,,,/MaterialDesignColors;component/Themes/Recommended/Primary/MaterialDesignColor.Indigo.xaml" />
28-
<ResourceDictionary Source="pack://application:,,,/MaterialDesignColors;component/Themes/Recommended/Accent/MaterialDesignColor.Red.xaml" />
13+
<ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesign2.Defaults.xaml" />
2914

3015
</ResourceDictionary.MergedDictionaries>
3116

App.xaml.cs

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,9 @@
11
using System;
2-
using System.Collections.Generic;
3-
using System.Configuration;
4-
using System.Data;
5-
using System.Linq;
6-
using System.Threading;
2+
using System.Runtime;
73
using System.Threading.Tasks;
84
using System.Windows;
9-
using VisualHFT.PluginManager;
5+
using System.Windows.Interop;
6+
using System.Windows.Media;
107

118
namespace VisualHFT
129
{
@@ -22,7 +19,19 @@ protected override void OnStartup(StartupEventArgs e)
2219
//Initialize logging
2320
log4net.Config.XmlConfigurator.Configure(new System.IO.FileInfo("log4net.config"));
2421

25-
//Launch the GC cleanup thread
22+
/*----------------------------------------------------------------------------------------------------------------------*/
23+
/* This is to avoid errors when rendering too much in short times
24+
*
25+
* Exception thrown: 'System.Runtime.InteropServices.COMException' in PresentationCore.dll
26+
* An unhandled exception of type 'System.Runtime.InteropServices.COMException' occurred in PresentationCore.dll
27+
* UCEERR_RENDERTHREADFAILURE (0x88980406)
28+
*
29+
*/
30+
//RenderOptions.ProcessRenderMode = RenderMode.SoftwareOnly;
31+
/*----------------------------------------------------------------------------------------------------------------------*/
32+
33+
34+
//Launch the GC cleanup thread ==> *** Since using Object Pools, we improved a lot the memory prints. So We commented this out.
2635
Task.Run(async () => { await GCCleanupAsync(); });
2736

2837
//Load Plugins
@@ -35,26 +44,25 @@ protected override void OnStartup(StartupEventArgs e)
3544
catch (Exception ex)
3645
{
3746
// Handle the exception
38-
Application.Current.Dispatcher.Invoke(() =>
47+
Application.Current.Dispatcher.BeginInvoke(() =>
3948
{
4049
MessageBox.Show("ERROR LOADING Plugins: " + ex.Message, "Error", MessageBoxButton.OK, MessageBoxImage.Error);
4150
});
4251
}
4352
});
44-
4553
}
46-
4754
protected override void OnExit(ExitEventArgs e)
4855
{
4956
PluginManager.PluginManager.UnloadPlugins();
57+
5058
base.OnExit(e);
5159
}
5260

5361
private async Task LoadPlugins()
5462
{
5563
PluginManager.PluginManager.AllPluginsReloaded = false;
56-
PluginManager.PluginManager.LoadPlugins();
57-
PluginManager.PluginManager.StartPlugins();
64+
await PluginManager.PluginManager.LoadPlugins();
65+
await PluginManager.PluginManager.StartPlugins();
5866
PluginManager.PluginManager.AllPluginsReloaded = true;
5967
}
6068
private async Task GCCleanupAsync()
@@ -64,7 +72,7 @@ private async Task GCCleanupAsync()
6472
while (true)
6573
{
6674
await Task.Delay(5000);
67-
GC.Collect(); //force garbage collection
75+
GC.Collect(0, GCCollectionMode.Forced, false); //force garbage collection
6876
};
6977

7078
}

0 commit comments

Comments
 (0)