Skip to content

Commit

Permalink
Contributing First Steps (#104)
Browse files Browse the repository at this point in the history
  • Loading branch information
SlavaVedernikov authored Sep 27, 2024
2 parents 8872304 + 1fc9f44 commit ec9f90a
Show file tree
Hide file tree
Showing 19 changed files with 1,357 additions and 198 deletions.
609 changes: 609 additions & 0 deletions .editorconfig

Large diffs are not rendered by default.

11 changes: 9 additions & 2 deletions C4InterFlow.Automation/Writers/CSharpToAnyAaCWriter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,15 @@ public abstract class CSharpToAnyAaCWriter : IAaCWriter

private static void RegisterInstanceVisualStudioInstance()
{
MSBuildLocator.RegisterInstance(MSBuildLocator.QueryVisualStudioInstances().OrderByDescending(
instance => instance.Version).First());
var instance = MSBuildLocator.QueryVisualStudioInstances().MaxBy(instance => instance.Version);
if (instance != null)
{
MSBuildLocator.RegisterInstance(instance);
}
else
{
Log.Warning("MSBuildLocator could not find any instances to register.");
}
}

public CSharpToAnyAaCWriter(string softwareSystemSourcePath, string architectureRootNamespace)
Expand Down
30 changes: 27 additions & 3 deletions C4InterFlow.Cli/Properties/launchSettings.json
Original file line number Diff line number Diff line change
@@ -1,8 +1,32 @@
{
"profiles": {
"C4InterFlow.Cli": {
"commandName": "Project",
"commandLineArgs": "draw-diagrams --interfaces ECommercePlatform.SoftwareSystems.*.Interfaces.* ECommercePlatform.SoftwareSystems.*.Containers.*.Interfaces.* ECommercePlatform.SoftwareSystems.*.Containers.*.Components.*.Interfaces.* ECommercePlatform.*.SoftwareSystems.*.Interfaces.* ECommercePlatform.*.SoftwareSystems.*.Containers.*.Interfaces.* ECommercePlatform.*.SoftwareSystems.*.Containers.*.Components.*.Interfaces.* --namespaces ECommercePlatform ECommercePlatform.FrontEnd --levels-of-details context container --scopes namespace namespace-software-systems --types c4-static --aac-reader-strategy \"C4InterFlow.Automation.Readers.YamlAaCReaderStrategy,C4InterFlow.Automation\" --aac-input-paths \"C:\\C4InterFlow\\Samples\\Temp\\Architecture\" --output-dir \"C:\\C4InterFlow\\Samples\\Temp\\Diagrams\""
"E-Commerce Platform - YAML - Draw Diagrams": {
"commandName": "Project",
"commandLineArgs": "draw-diagrams --interfaces ECommercePlatform.*.*.SoftwareSystems.*.Interfaces.* ECommercePlatform.*.*.SoftwareSystems.*.Containers.*.Interfaces.* --business-processes ECommercePlatform.BusinessProcesses.* --levels-of-details context container --aac-reader-strategy \"C4InterFlow.Automation.Readers.YamlAaCReaderStrategy,C4InterFlow.Automation\" --aac-input-paths \"$(ProjectDir)\\..\\Samples\\E-Commerce Platform\\Yaml\\Architecture\" --output-dir \"$(ProjectDir)\\..\\Samples\\E-Commerce Platform\\Yaml\\Diagrams\""
},
"Internet Banking System - YAML - Draw Diagrams": {
"commandName": "Project",
"commandLineArgs": "draw-diagrams --interfaces BigBankPlc.SoftwareSystems.*.Containers.*.Interfaces.* --business-processes BigBankPlc.BusinessProcesses.* --levels-of-details context container --scopes namespace namespace-software-systems --types c4-static --aac-reader-strategy \"C4InterFlow.Automation.Readers.YamlAaCReaderStrategy,C4InterFlow.Automation\" --aac-input-paths \"$(ProjectDir)\\..\\Samples\\Internet Banking System\\Yaml\\Architecture\" --output-dir \"$(ProjectDir)\\..\\Samples\\Internet Banking System\\Yaml\\Diagrams\""
},
"Internet Banking System - CSV/YAML - Draw Diagrams": {
"commandName": "Project",
"commandLineArgs": "draw-diagrams --interfaces BigBankPlc.SoftwareSystems.*.Containers.*.Interfaces.* --business-processes BigBankPlc.BusinessProcesses.* --levels-of-details context container --aac-reader-strategy \"C4InterFlow.Automation.Readers.YamlAaCReaderStrategy,C4InterFlow.Automation\" --aac-input-paths \"$(ProjectDir)\\..\\Samples\\Internet Banking System\\CSV\\Architecture\\Yaml\" --output-dir \"$(ProjectDir)\\..\\Samples\\Internet Banking System\\CSV\\Diagrams\""
},
"Internet Banking System - CSV/JSON - Draw Diagrams": {
"commandName": "Project",
"commandLineArgs": "draw-diagrams --interfaces BigBankPlc.SoftwareSystems.*.Containers.*.Interfaces.* --business-processes BigBankPlc.BusinessProcesses.* --levels-of-details context container --aac-reader-strategy \"C4InterFlow.Automation.Readers.JsonAaCReaderStrategy,C4InterFlow.Automation\" --aac-input-paths \"$(ProjectDir)\\..\\Samples\\Internet Banking System\\CSV\\Architecture\\Json\" --output-dir \"$(ProjectDir)\\..\\Samples\\Internet Banking System\\CSV\\Diagrams\""
},
"ToDoApp - YAML - Draw Diagrams": {
"commandName": "Project",
"commandLineArgs": "draw-diagrams --interfaces ToDoAppExample.SoftwareSystems.*.Containers.*.Interfaces.* ToDoAppExample.SoftwareSystems.*.Interfaces.* --levels-of-details context container --aac-reader-strategy \"C4InterFlow.Automation.Readers.YamlAaCReaderStrategy,C4InterFlow.Automation\" --aac-input-paths \"$(ProjectDir)\\..\\Samples\\ToDoApp\\Architecture\" --output-dir \"$(ProjectDir)\\..\\Samples\\ToDoApp\\Diagrams\""
},
"TraderX - CSV/YAML - Draw Diagrams": {
"commandName": "Project",
"commandLineArgs": "draw-diagrams --interfaces TraderXExample.SoftwareSystems.*.Containers.*.Interfaces.* --business-processes TraderXExample.BusinessProcesses.* --levels-of-details context container --aac-reader-strategy \"C4InterFlow.Automation.Readers.YamlAaCReaderStrategy,C4InterFlow.Automation\" --aac-input-paths \"$(ProjectDir)\\..\\Samples\\TraderX\\CSV\\Architecture\\Yaml\" --output-dir \"$(ProjectDir)\\..\\Samples\\TraderX\\CSV\\Diagrams\""
},
"TraderX - CSV/JSON - Draw Diagrams": {
"commandName": "Project",
"commandLineArgs": "draw-diagrams --interfaces TraderXExample.SoftwareSystems.*.Containers.*.Interfaces.* --business-processes TraderXExample.BusinessProcesses.* --levels-of-details context container --aac-reader-strategy \"C4InterFlow.Automation.Readers.JsonAaCReaderStrategy,C4InterFlow.Automation\" --aac-input-paths \"$(ProjectDir)\\..\\Samples\\TraderX\\CSV\\Architecture\\Json\" --output-dir \"$(ProjectDir)\\..\\Samples\\TraderX\\CSV\\Diagrams\""
}
}
}
7 changes: 6 additions & 1 deletion C4InterFlow.sln
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,16 @@ Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.4.33110.190
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "C4InterFlow.Cli", "C4InterFlow.Cli\C4InterFlow.Cli.csproj", "{EB78BBEC-4D8A-456C-90F1-920E45FFF982}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "C4InterFlow", "C4InterFlow\C4InterFlow.csproj", "{B047B5AE-FA9A-453E-B522-F53ED61A0C80}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "C4InterFlow.Automation", "C4InterFlow.Automation\C4InterFlow.Automation.csproj", "{5DD6985D-35AC-4154-B09B-2186AB9AA3AD}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "C4InterFlow.Cli", "C4InterFlow.Cli\C4InterFlow.Cli.csproj", "{EB78BBEC-4D8A-456C-90F1-920E45FFF982}"
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{B5B62581-615E-45C5-8A4A-3FEC83B827F6}"
ProjectSection(SolutionItems) = preProject
.editorconfig = .editorconfig
EndProjectSection
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Expand Down
26 changes: 26 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
# Contributing to C4InterFlow

## As a Developer

C4InterFlow is developed on dotnet core, and so far development has been done on a Windows machine with Visual Studio.
Editor files have been put in place to enforce consistency where applicable.

### Environment Prerequisites

* Windows environment
* All testing scripts are currently utilizing Windows Batch files.
* Visual Studio (able to support dotnet 6 or later)
* Java JRE
* Necessary to execute the `plantuml.jar` file to render diagrams

## As a tester

The [Samples](./Samples/) folder contains all valid use cases for the project.
The focus of the samples is on a business domain rather than a specific technology or format.

There are `draw-diagrams.bat` scripts for each sample that can be run individually.
This is a great way to work on an isolated domain at a time.
But there is also a [`draw-diagrams.bat`](./Samples/draw-diagrams.bat) in the Samples directory that runs all the samples under the same conditions.
This is the best way to perform what effectively is a regression test.

## All Others
63 changes: 46 additions & 17 deletions Samples/E-Commerce Platform/Yaml/draw-diagrams.bat
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
@echo off
:: Possible values: TRUE, FALSE
set "redraw-all=TRUE"
if not defined redraw-all set "redraw-all=TRUE"
:::::::::::::::::::::::::::::::

set "build-configuration=Debug"
if not defined build-configuration set "build-configuration=Debug"
set "aac-root-namespace=ECommercePlatform"
set "cli-project-path=..\..\..\C4InterFlow.Cli\C4InterFlow.Cli.csproj"
set "cli-output-dir=..\..\..\C4InterFlow.Cli\bin\%build-configuration%\net6.0\win-x64"
Expand All @@ -12,27 +12,50 @@ set "diagrams-dir=.\Diagrams"
set "aac-reader-strategy=C4InterFlow.Automation.Readers.YamlAaCReaderStrategy,C4InterFlow.Automation"
set "aac-input-paths=.\Architecture"

echo redraw-all: %redraw-all%
echo aac-root-namespace: %aac-root-namespace%
echo cli-output-dir: %cli-output-dir%
echo cli-exe: %cli-exe%
echo diagrams-dir: %diagrams-dir%
echo aac-reader-strategy: %aac-reader-strategy%
echo aac-input-paths: %aac-input-paths%
CALL :NormalizePath %cli-project-path%
SET "cli-project-path=%_NORMALIZED_PATH_%"
CALL :NormalizePath %cli-output-dir%
SET "cli-output-dir=%_NORMALIZED_PATH_%"
CALL :NormalizePath %aac-input-paths%
SET "aac-input-paths=%_NORMALIZED_PATH_%"
CALL :NormalizePath %diagrams-dir%
SET "diagrams-dir=%_NORMALIZED_PATH_%"

if "%ENABLE_LINE_DRAWING%"=="" (
echo redraw-all : %redraw-all%
echo aac-root-namespace : %aac-root-namespace%
echo cli-output-dir : %cli-output-dir%
echo cli-exe : %cli-exe%
echo diagrams-dir : %diagrams-dir%
echo aac-reader-strategy : %aac-reader-strategy%
echo aac-input-paths : %aac-input-paths%
) else (
@ECHO %ENABLE_LINE_DRAWING%lqqqqqqqqqqqqqqqqqqqqqqwqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqk
@ECHO x %DISABLE_LINE_DRAWING%redraw-all %ENABLE_LINE_DRAWING% x %DISABLE_LINE_DRAWING%!redraw-all!%ENABLE_LINE_DRAWING%
@ECHO x %DISABLE_LINE_DRAWING%aac-root-namespace %ENABLE_LINE_DRAWING% x %DISABLE_LINE_DRAWING%!aac-root-namespace!%ENABLE_LINE_DRAWING%
@ECHO x %DISABLE_LINE_DRAWING%cli-output-dir %ENABLE_LINE_DRAWING% x %DISABLE_LINE_DRAWING%!cli-output-dir!%ENABLE_LINE_DRAWING%
@ECHO x %DISABLE_LINE_DRAWING%cli-exe %ENABLE_LINE_DRAWING% x %DISABLE_LINE_DRAWING%!cli-exe!%ENABLE_LINE_DRAWING%
@ECHO x %DISABLE_LINE_DRAWING%diagrams-dir %ENABLE_LINE_DRAWING% x %DISABLE_LINE_DRAWING%!diagrams-dir!%ENABLE_LINE_DRAWING%
@ECHO x %DISABLE_LINE_DRAWING%aac-reader-strategy %ENABLE_LINE_DRAWING% x %DISABLE_LINE_DRAWING%!aac-reader-strategy!%ENABLE_LINE_DRAWING%
@ECHO x %DISABLE_LINE_DRAWING%aac-input-paths %ENABLE_LINE_DRAWING% x %DISABLE_LINE_DRAWING%!aac-input-paths!%ENABLE_LINE_DRAWING%
@ECHO mqqqqqqqqqqqqqqqqqqqqqqvqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj%DISABLE_LINE_DRAWING%%COLOR_RESET%
)

if not %redraw-all%==TRUE if not %redraw-all%==FALSE (
echo ERROR: 'redraw-all' can only be set either to 'TRUE' or 'FALSE'. Edit script and re-run.
pause
goto end
)

echo Check the above settings.
pause
if NOT "%BATCH_TEST_MODE%"=="1" (
echo Check the above settings.
pause
)

:: Publish
echo Publishing...
:: pause
dotnet publish %cli-project-path% --configuration %build-configuration% --output %cli-output-dir%
dotnet publish %cli-project-path% --configuration %build-configuration% --output %cli-output-dir% --verbosity quiet

echo Clearing diagrams...
:: pause
Expand All @@ -42,16 +65,22 @@ powershell.exe -Command "if (Test-Path '%diagrams-dir%\*') { Remove-Item -Path '
powershell.exe -Command "if (Test-Path '%diagrams-dir%\*') { Get-ChildItem -Path '%diagrams-dir%' -Recurse | Where-Object { $_.Extension -eq '.puml' } | ForEach-Object { Remove-Item -Path $_.FullName -Force } }"
)

powershell.exe -Command "Get-ChildItem -Path "%diagrams-dir%" -Recurse -Directory | Where-Object { !(Get-ChildItem -Path $_.FullName) } | ForEach-Object { Remove-Item -Path $_.FullName;}"
:: powershell.exe -Command "Get-ChildItem -Path '%diagrams-dir%' -Recurse -Directory | Where-Object { !(Get-ChildItem -Path $_.FullName) } | ForEach-Object { Remove-Item -Path $_.FullName -Force;}"

echo Draw Diagrams with '%aac-reader-strategy%' AaC reader strategy and '%aac-input-paths%' AaC input path
pause
if NOT "%BATCH_TEST_MODE%"=="1" pause

echo Drawing Diagrams...
if %redraw-all%==TRUE (
%cli-output-dir%\%cli-exe% draw-diagrams --interfaces ..SoftwareSystems.*.Interfaces.* ..SoftwareSystems.*.Containers.*.Interfaces.* --business-processes %aac-root-namespace%.BusinessProcesses.* --levels-of-details context container --aac-reader-strategy "%aac-reader-strategy%" --aac-input-paths "%aac-input-paths%" --output-dir "%diagrams-dir%" --formats png svg
%cli-output-dir%\%cli-exe% draw-diagrams --interfaces %aac-root-namespace%.*.*.SoftwareSystems.*.Interfaces.* %aac-root-namespace%.*.*.SoftwareSystems.*.Containers.*.Interfaces.* --business-processes %aac-root-namespace%.BusinessProcesses.* --levels-of-details context container --aac-reader-strategy "%aac-reader-strategy%" --aac-input-paths "%aac-input-paths%" --output-dir "%diagrams-dir%" --formats png svg
) else (
%cli-output-dir%\%cli-exe% draw-diagrams --interfaces ..SoftwareSystems.*.Interfaces.* ..SoftwareSystems.*.Containers.*.Interfaces.* --business-processes %aac-root-namespace%.BusinessProcesses.* --levels-of-details context container --aac-reader-strategy "%aac-reader-strategy%" --aac-input-paths "%aac-input-paths%" --output-dir "%diagrams-dir%"
%cli-output-dir%\%cli-exe% draw-diagrams --interfaces %aac-root-namespace%.*.*.SoftwareSystems.*.Interfaces.* %aac-root-namespace%.*.*.SoftwareSystems.*.Containers.*.Interfaces.* --business-processes %aac-root-namespace%.BusinessProcesses.* --levels-of-details context container --aac-reader-strategy "%aac-reader-strategy%" --aac-input-paths "%aac-input-paths%" --output-dir "%diagrams-dir%"
)
pause
if NOT "%BATCH_TEST_MODE%"=="1" pause
@GOTO :end

:NormalizePath
@SET _NORMALIZED_PATH_=%~f1
@EXIT /B 0

:end
57 changes: 43 additions & 14 deletions Samples/Internet Banking System/CSV/draw-diagrams.bat
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
@echo off
:: Possible values: TRUE, FALSE
set "redraw-all=TRUE"
if not defined redraw-all set "redraw-all=TRUE"
:::::::::::::::::::::::::::::::

:: Possible values: Yaml, Json
set "aac-type=Yaml"
:::::::::::::::::::::::::::::::

set "build-configuration=Debug"
if not defined build-configuration set "build-configuration=Debug"
set "aac-root-namespace=BigBankPlc"
set "cli-project-path=..\..\..\C4InterFlow.Cli\C4InterFlow.Cli.csproj"
set "cli-output-dir=..\..\..\C4InterFlow.Cli\bin\%build-configuration%\net6.0\win-x64"
Expand All @@ -16,27 +16,50 @@ set "diagrams-dir=.\Diagrams"
set "aac-reader-strategy=C4InterFlow.Automation.Readers.%aac-type%AaCReaderStrategy,C4InterFlow.Automation"
set "aac-input-paths=.\Architecture\%aac-type%"

echo redraw-all: %redraw-all%
echo aac-root-namespace: %aac-root-namespace%
echo cli-output-dir: %cli-output-dir%
echo cli-exe: %cli-exe%
echo diagrams-dir: %diagrams-dir%
echo aac-reader-strategy: %aac-reader-strategy%
echo aac-input-paths: %aac-input-paths%
CALL :NormalizePath %cli-project-path%
SET "cli-project-path=%_NORMALIZED_PATH_%"
CALL :NormalizePath %cli-output-dir%
SET "cli-output-dir=%_NORMALIZED_PATH_%"
CALL :NormalizePath %aac-input-paths%
SET "aac-input-paths=%_NORMALIZED_PATH_%"
CALL :NormalizePath %diagrams-dir%
SET "diagrams-dir=%_NORMALIZED_PATH_%"

if "%ENABLE_LINE_DRAWING%"=="" (
echo redraw-all : %redraw-all%
echo aac-root-namespace : %aac-root-namespace%
echo cli-output-dir : %cli-output-dir%
echo cli-exe : %cli-exe%
echo diagrams-dir : %diagrams-dir%
echo aac-reader-strategy : %aac-reader-strategy%
echo aac-input-paths : %aac-input-paths%
) else (
@ECHO %ENABLE_LINE_DRAWING%lqqqqqqqqqqqqqqqqqqqqqqwqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqk
@ECHO x %DISABLE_LINE_DRAWING%redraw-all %ENABLE_LINE_DRAWING% x %DISABLE_LINE_DRAWING%!redraw-all!%ENABLE_LINE_DRAWING%
@ECHO x %DISABLE_LINE_DRAWING%aac-root-namespace %ENABLE_LINE_DRAWING% x %DISABLE_LINE_DRAWING%!aac-root-namespace!%ENABLE_LINE_DRAWING%
@ECHO x %DISABLE_LINE_DRAWING%cli-output-dir %ENABLE_LINE_DRAWING% x %DISABLE_LINE_DRAWING%!cli-output-dir!%ENABLE_LINE_DRAWING%
@ECHO x %DISABLE_LINE_DRAWING%cli-exe %ENABLE_LINE_DRAWING% x %DISABLE_LINE_DRAWING%!cli-exe!%ENABLE_LINE_DRAWING%
@ECHO x %DISABLE_LINE_DRAWING%diagrams-dir %ENABLE_LINE_DRAWING% x %DISABLE_LINE_DRAWING%!diagrams-dir!%ENABLE_LINE_DRAWING%
@ECHO x %DISABLE_LINE_DRAWING%aac-reader-strategy %ENABLE_LINE_DRAWING% x %DISABLE_LINE_DRAWING%!aac-reader-strategy!%ENABLE_LINE_DRAWING%
@ECHO x %DISABLE_LINE_DRAWING%aac-input-paths %ENABLE_LINE_DRAWING% x %DISABLE_LINE_DRAWING%!aac-input-paths!%ENABLE_LINE_DRAWING%
@ECHO mqqqqqqqqqqqqqqqqqqqqqqvqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj%DISABLE_LINE_DRAWING%%COLOR_RESET%
)

if not %redraw-all%==TRUE if not %redraw-all%==FALSE (
echo ERROR: 'redraw-all' can only be set either to 'TRUE' or 'FALSE'. Edit script and re-run.
pause
goto end
)

echo Check the above settings.
pause
if NOT "%BATCH_TEST_MODE%"=="1" (
echo Check the above settings.
pause
)

:: Publish
echo Publishing...
:: pause
dotnet publish %cli-project-path% --configuration %build-configuration% --output %cli-output-dir%
dotnet publish %cli-project-path% --configuration %build-configuration% --output %cli-output-dir% --verbosity quiet

echo Clearing diagrams...
:: pause
Expand All @@ -47,13 +70,19 @@ powershell.exe -Command "if (Test-Path '%diagrams-dir%\*') { Get-ChildItem -Path
)

echo Draw Diagrams with '%aac-reader-strategy%' AaC reader strategy and '%aac-input-paths%' AaC input path
pause
if NOT "%BATCH_TEST_MODE%"=="1" pause

echo Drawing Diagrams...
if %redraw-all%==TRUE (
%cli-output-dir%\%cli-exe% draw-diagrams --interfaces %aac-root-namespace%.SoftwareSystems.*.Containers.*.Interfaces.* --business-processes %aac-root-namespace%.BusinessProcesses.* --levels-of-details context container --aac-reader-strategy "%aac-reader-strategy%" --aac-input-paths "%aac-input-paths%" --output-dir "%diagrams-dir%" --formats png svg
) else (
%cli-output-dir%\%cli-exe% draw-diagrams --interfaces %aac-root-namespace%.SoftwareSystems.*.Containers.*.Interfaces.* --business-processes %aac-root-namespace%.BusinessProcesses.* --levels-of-details context container --aac-reader-strategy "%aac-reader-strategy%" --aac-input-paths "%aac-input-paths%" --output-dir "%diagrams-dir%"
)
pause
if NOT "%BATCH_TEST_MODE%"=="1" pause
@GOTO :end

:NormalizePath
@SET _NORMALIZED_PATH_=%~f1
@EXIT /B 0

:end
Loading

0 comments on commit ec9f90a

Please sign in to comment.