瀏覽代碼

Sonar updates

Axel Nordh 3 年之前
父節點
當前提交
761d2e0983

二進制
.sonarqube/bin/SonarScanner.MSBuild.Common.dll


二進制
.sonarqube/bin/SonarScanner.MSBuild.Tasks.dll


+ 618 - 0
.sonarqube/bin/targets/SonarQube.Integration.targets

@@ -0,0 +1,618 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+
+  <!--
+    This file contains targets to integrate SonarQube and MSBuild.
+
+    The targets will produce an output folder structure containing information required by the sonar-scanner.
+
+    A subdirectory will be created for each MSBuild project. Information about the project
+    will be written to a file called "ProjectInfo.xml". Additional files may also be written
+    containing information required by different analyzers. In particular, a file will be written
+    containing the list of files in the project that should be analyzed by the sonar-scanner.
+
+    The output will only be produced if the property $(SonarQubeTempPath) and is specified.
+    $(SonarQubeTempPath) is the root folder under which per-analysis output should be written.
+
+    Excluding projects and files from SonarQube analysis
+    ****************************************************
+    Individual projects can excluded from SonarQube analysis by setting the property $(SonarQubeExclude) e.g.
+
+      <SonarQubeExclude>true</SonarQubeExclude>
+
+    Individual files can be excluded from analysis by setting the <SonarQubeExclude> metadata item e.g.
+
+      <Compile Include="Logger.cs">
+        <SonarQubeExclude>true</SonarQubeExclude>
+      </Compile>
+
+    Project is also excluded if it's recognized as a Fakes or a Temp project. These projects are auto-generated.
+
+    Test projects
+    *************
+    The analysis performed by SonarQube varies depending on whether a project is a test project or not.
+
+    A project can be explicitly marked as being a test or product project by setting the property $(SonarQubeTestProject) e.g.
+
+      <SonarQubeTestProject>true</SonarQubeTestProject>
+
+    If $(SonarQubeTestProject) is not set explicitly then the project is categorized as a Test project if:
+    * Is a Fakes or a Temp project explicitly marked as SonarQubeExclude=false
+    * Has one of the expected test project GUIDs ("3AC096D0-A1C2-E12C-1390-A8335801FDAB" or legacy "82A7F48D-3B50-4B1E-B82E-3ADA8210C358").
+    * Has a TestContainer project capability.
+    * References a known unit test related assembly.
+    * Deprecated: Project name matches "sonar.msbuild.testProjectPattern" parameter. Use SonarQubeTestProject=true instead.
+
+    Otherwise it is a Product project.
+
+    Supplying analysis setting in a project file
+    ********************************************
+    Project-level analysis settings can be specified in a project file using following
+    syntax:
+
+    <ItemGroup>
+      <SonarQubeSetting Include="sonar.my.analysis.setting">
+        <Value>42</Value>
+      </SonarQubeSetting>
+    </ItemGroup>
+
+    Settings specified in the project file will override those specified on the SonarQube server.
+
+    Specifying additional types of file to be analysed
+    **************************************************
+
+    The Scanner for MSBuild will automatically collect all of the common
+    file types that can be analysed by the various Sonar language plugins
+    (e.g. C# files, TypeScript, TSQL, C++ include and source files etc).
+    The full list of item types that will be included for analysis is
+    specified in $(SQAnalysisFileItemTypes) property below.
+
+    If you have any additional item types that you want to have analyzed,
+    you can specify them setting the property $(SQAdditionalAnalysisFileItemTypes)
+    in the project being analysed e.g.
+
+    <SQAdditionalAnalysisFileItemTypes>MyCustomFileType1;MyCustomFileType</SQAdditionalAnalysisFileItemTypes>
+
+    Specific handling of Razor builds
+    **************************************************
+    During the compilation of an SDK-style MSBuild project with Razor, MSBuild executes 2 build targets:
+    CoreCompile to compile the main code and RazorCoreCompile to compile ".cshtml" view files.
+    Since it is not possible to execute one target more than once, there's a logic that prevents RazorCoreCompile
+    from overriding output files from CoreCompile step:
+      * CoreCompile produces output files in directory "X", where X represents project specific unique number.
+      * Directory "X" with CoreCompile results is renamed to "X.tmp" before RazorCoreCompile and new empty directory "X" is prepared.
+      * RazorCoreCompile produces its output to the current directory "X".
+      * Directory "X" with Razor output is renamed to "X.Razor".
+      * Directory "X.tmp" with original output is renamed back to "X".
+-->
+
+  <!-- **************************************************************************** -->
+  <!-- SonarQube MSBuild Integration implementation logic -->
+  <!-- **************************************************************************** -->
+  <!-- Note: where possible, these targets avoid taking dependencies on specific
+        managed or C++- targets e.g. they use
+           "AfterTargets='Build'" which is general rather than
+           "AfterTargets='CoreCompile'" which is specific to managed projects.
+  -->
+
+  <!-- Safeguard against importing this .targets file multiple times -->
+  <PropertyGroup>
+    <SonarQubeTargetsImported>true</SonarQubeTargetsImported>
+  </PropertyGroup>
+
+  <!-- Set defaults if explicit values have not been provided -->
+  <PropertyGroup Condition=" $(SonarQubeTempPath) != '' ">
+    <SonarQubeConfigPath Condition=" $(SonarQubeConfigPath) == '' ">$(SonarQubeTempPath)\conf</SonarQubeConfigPath>
+    <SonarQubeOutputPath Condition=" $(SonarQubeOutputPath) == '' ">$(SonarQubeTempPath)\out</SonarQubeOutputPath>
+
+    <!-- Specify the ItemGroups to be analyzed -->
+    <SQAnalysisFileItemTypes Condition=" $(SQAnalysisFileItemTypes) == '' ">AndroidEnvironment;AndroidJavaSource;AndroidResource;ApplicationDefinition;Build;ClCompile;ClInclude;Compile;Content;DeploymentExtensionConfiguration;EmbeddedResource;EntityDeploy;None;Page;PostDeploy;PRIResource;PreDeploy;RefactorLog;Resource;Script;ScriptCode;TypeScriptCompile;$(SQAdditionalAnalysisFileItemTypes)</SQAnalysisFileItemTypes>
+  </PropertyGroup>
+
+  <!-- **************************************************************************** -->
+  <!-- Using tasks -->
+  <!-- **************************************************************************** -->
+  <PropertyGroup Condition=" $(SonarQubeTempPath) != '' AND $(SonarQubeBuildTasksAssemblyFile) == '' ">
+    <!-- Assume that the tasks assembly is in the same location as this targets file
+         or in a parent directory unless another location has already been specified. -->
+    <SonarQubeBuildTasksAssemblyFile>$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), SonarScanner.MSBuild.Tasks.dll))\SonarScanner.MSBuild.Tasks.dll</SonarQubeBuildTasksAssemblyFile>
+  </PropertyGroup>
+
+  <!-- Unescape the paths to work around the issue "MSBuild 4.0 UsingTask cannot have a path with parentheses".
+       See https://connect.microsoft.com/VisualStudio/feedback/details/713690/msbuild-4-0-usingtask-cannot-have-a-path-with-parentheses -->
+  <UsingTask TaskName="WriteProjectConfigFile" AssemblyFile="$([MSBUILD]::Unescape($(SonarQubeBuildTasksAssemblyFile)))" />
+  <UsingTask TaskName="WriteProjectInfoFile" AssemblyFile="$([MSBUILD]::Unescape($(SonarQubeBuildTasksAssemblyFile)))" />
+  <UsingTask TaskName="IsTestFileByName" AssemblyFile="$([MSBUILD]::Unescape($(SonarQubeBuildTasksAssemblyFile)))" />
+  <UsingTask TaskName="IsTestByReference" AssemblyFile="$([MSBUILD]::Unescape($(SonarQubeBuildTasksAssemblyFile)))" />
+  <UsingTask TaskName="GetAnalyzerSettings" AssemblyFile="$([MSBUILD]::Unescape($(SonarQubeBuildTasksAssemblyFile)))" />
+  <UsingTask TaskName="MakeUniqueDir" AssemblyFile="$([MSBUILD]::Unescape($(SonarQubeBuildTasksAssemblyFile)))" />
+  <UsingTask TaskName="WriteZeroLengthFiles" AssemblyFile="$([MSBUILD]::Unescape($(SonarQubeBuildTasksAssemblyFile)))" />
+
+  <!-- **************************************************************************** -->
+  <!-- **************************************************************************** -->
+  <!-- Targets -->
+  <!-- **************************************************************************** -->
+  <!-- **************************************************************************** -->
+
+  <Target Name="SkippingSonarQubeAnalysis" BeforeTargets="Build"
+          Condition=" $(SonarQubeTempPath) == '' ">
+    <Message Importance="high" Text="Sonar: ($(MSBuildProjectFile)) Skipping dumping compile outputs because SonarQubeTempPath has not been specified" />
+  </Target>
+
+  <Target Name="FailIfLowerThanMSBuild14"
+          Condition=" $(SonarQubeTempPath) != '' AND $(MSBuildToolsVersion) != '14.0' AND $(MSBuildToolsVersion) != '15.0' AND $(MSBuildToolsVersion) != 'Current'"
+          BeforeTargets="Build">
+    <Message Importance="high" Text="Sonar: ($(MSBuildProjectFile)) Current MSBuildToolsVersion: $(MSBuildToolsVersion)" />
+    <Message Importance="high" Text="Sonar: ($(MSBuildProjectFile)) Current MSBuildAssemblyVersion: $(MSBuildAssemblyVersion)" />
+    <Error Text="SonarQube analysis is only supported with MSBuild 14 or later." />
+  </Target>
+
+  <Target Name="SonarResolveReferencesMsBuild14"
+          AfterTargets="ResolveAssemblyReferences"
+          Condition=" $(SonarQubeTempPath) != '' AND $(MSBuildToolsVersion) == '14.0'">
+    <ItemGroup>
+      <SonarResolvedReferences Include="@(%(ReferencePath.FusionName))" />
+    </ItemGroup>
+  </Target>
+
+  <Target Name="SonarResolveReferences"
+          AfterTargets="FindReferenceAssembliesForReferences"
+          Condition=" $(SonarQubeTempPath) != '' AND $(MSBuildToolsVersion) != '14.0'">
+    <ItemGroup>
+      <SonarResolvedReferences Include="@(%(ReferencePathWithRefAssemblies.FusionName))" />
+    </ItemGroup>
+  </Target>
+
+  <!-- **************************************************************************** -->
+  <!-- Categorize as a product or test project -->
+  <!-- **************************************************************************** -->
+  <!-- This target is a utility target: it won't be executed unless a target that depends on it is executed. -->
+  <Target Name="SonarCategoriseProject"
+          DependsOnTargets="SonarResolveReferencesMsBuild14;SonarResolveReferences"
+          Condition=" $(SonarQubeTempPath) != '' ">
+
+    <Message Text="Sonar: ($(MSBuildProjectFile)) Categorizing project as test or product code..." />
+    <Message Condition="$(SonarQubeTestProject) != ''" Importance="normal" Text="Sonar: ($(MSBuildProjectFile)) SonarQubeTestProject has been set explicitly to $(SonarQubeTestProject)." />
+
+    <!-- Fakes detection -->
+    <PropertyGroup>
+      <IsFakesProject Condition="$(AssemblyName.EndsWith('.fakes', System.StringComparison.OrdinalIgnoreCase))">true</IsFakesProject>
+    </PropertyGroup>
+    <!-- Before deciding to exclude or tag as test such a project, make sure it is not a legitimate project that happens to be called something.fakes
+         In this case, we require from the user to explicitely state whether the project is to be analyzed/considered a test project -->
+    <PropertyGroup Condition="$(IsFakesProject) == 'true' and $(SonarQubeExclude) == ''">
+      <SonarQubeExclude>true</SonarQubeExclude>
+    </PropertyGroup>
+    <PropertyGroup Condition="$(IsFakesProject) == 'true' and $(SonarQubeTestProject) == ''">
+      <SonarQubeTestProject>true</SonarQubeTestProject>
+    </PropertyGroup>
+    <Message Condition="$(IsFakesProject) == 'true' and $(SonarQubeExclude) == 'true'" Importance="normal" Text="Sonar: ($(MSBuildProjectFile)) project is a temporary project generated by Microsoft Fakes and will be ignored." />
+
+    <!-- Temporary project detection -->
+    <!-- Some kinds of project have logic to trigger additional special builds based on the same project file
+         e.g. WPF projects build a temporary assembly before the main compilation takes place.
+         We only want to analyze the "normal" build of the project, so we should turn off analysis for the known cases. -->
+    <PropertyGroup>
+      <!-- Special case 1: WPF projects call the task Windows.GenerateTemporaryTargetAssembly in PresentationBuildTasks. -->
+      <IsTempProject Condition="$(MSBuildProjectFile.EndsWith('.tmp_proj', System.StringComparison.OrdinalIgnoreCase))">true</IsTempProject>
+      <IsTempProject Condition="$(MSBuildProjectFile.EndsWith('_wpftmp.csproj', System.StringComparison.OrdinalIgnoreCase))">true</IsTempProject>
+      <IsTempProject Condition="$(MSBuildProjectFile.EndsWith('_wpftmp.vbproj', System.StringComparison.OrdinalIgnoreCase))">true</IsTempProject>
+    </PropertyGroup>
+
+    <PropertyGroup Condition="$(IsTempProject) == 'true' AND $(SonarQubeExclude)==''" >
+      <SonarQubeExclude>true</SonarQubeExclude>
+    </PropertyGroup>
+    <Message Condition="$(IsTempProject) == 'true' AND $(SonarQubeExclude)=='true'" Importance="normal" Text="Sonar: ($(MSBuildProjectFile)) project is a temporary project and will be excluded." />
+
+    <PropertyGroup Condition=" $(SonarQubeTestProject) == '' ">
+      <!-- The MS Test project type guid -->
+      <SonarQubeMsTestProjectTypeGuid>3AC096D0-A1C2-E12C-1390-A8335801FDAB</SonarQubeMsTestProjectTypeGuid>
+      <tmpSonarHasMSTestProjectTypeGuid Condition=" $(ProjectTypeGuids.ToUpperInvariant().Contains('$(SonarQubeMsTestProjectTypeGuid)')) ">true</tmpSonarHasMSTestProjectTypeGuid>
+      <SonarQubeTestProject Condition=" $(tmpSonarHasMSTestProjectTypeGuid)=='true' ">true</SonarQubeTestProject>
+    </PropertyGroup>
+    <Message Condition="$(tmpSonarHasMSTestProjectTypeGuid)=='true'" Importance="normal" Text="Sonar: ($(MSBuildProjectFile)) project has the MSTest project type guid -> test project." />
+
+    <PropertyGroup Condition=" $(SonarQubeTestProject) == '' ">
+      <!-- The legacy Service tag added by the Test Explorer window -->
+      <tmpSQServiceList>@(Service)</tmpSQServiceList>
+      <tmpSonarHasServiceTag Condition="$(tmpSQServiceList.ToUpperInvariant().Contains('{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}')) ">true</tmpSonarHasServiceTag>
+      <SonarQubeTestProject Condition="$(tmpSonarHasServiceTag)=='true'">true</SonarQubeTestProject>
+    </PropertyGroup>
+    <Message Condition="$(tmpSonarHasServiceTag)=='true'" Importance="normal" Text="Sonar: ($(MSBuildProjectFile)) project has the legacy Test Explorer Service tag {82A7F48D-3B50-4B1E-B82E-3ADA8210C358} -> test project." />
+
+    <PropertyGroup Condition=" $(SonarQubeTestProject) == '' ">
+      <!-- The ProjectCapability for test projects -->
+      <tmpSQProjectCapabilities>@(ProjectCapability)</tmpSQProjectCapabilities>
+      <tmpSonarHasTestContainerCapability Condition="$(tmpSQProjectCapabilities.ToUpperInvariant().Contains('TESTCONTAINER')) ">true</tmpSonarHasTestContainerCapability>
+      <SonarQubeTestProject Condition="$(tmpSonarHasTestContainerCapability)=='true'">true</SonarQubeTestProject>
+    </PropertyGroup>
+    <Message Condition="$(tmpSonarHasTestContainerCapability)=='true'" Importance="normal" Text="Sonar: ($(MSBuildProjectFile)) project has the ProjectCapability 'TestContainer' -> test project." />
+
+    <IsTestByReference Condition=" $(SonarQubeTestProject) == '' "
+        References="@(SonarResolvedReferences)">
+      <Output TaskParameter="TestReference" PropertyName="tmpSonarTestReferenceResult" />
+    </IsTestByReference>
+    <PropertyGroup Condition=" $(SonarQubeTestProject) == '' ">
+      <SonarQubeTestProject Condition="$(tmpSonarTestReferenceResult)!=''">true</SonarQubeTestProject>
+    </PropertyGroup>
+    <Message Condition="$(tmpSonarTestReferenceResult)!=''" Importance="normal" Text="Sonar: ($(MSBuildProjectFile)) project is evaluated as a test project based on the '$(tmpSonarTestReferenceResult)' reference." />
+
+    <!-- If we haven't already determined whether the project is a test project then check its path/name against the regular expression in the config file -->
+    <IsTestFileByName Condition=" $(SonarQubeTestProject) == '' "
+        AnalysisConfigDir="$(SonarQubeConfigPath)"
+        FullFilePath="$(MSBuildProjectFullPath)">
+      <Output TaskParameter="IsTest" PropertyName="tmpSonarIsTestFileByNameResult" />
+    </IsTestFileByName>
+
+    <PropertyGroup Condition=" $(SonarQubeTestProject) == '' ">
+      <SonarQubeTestProject>$(tmpSonarIsTestFileByNameResult)</SonarQubeTestProject>
+    </PropertyGroup>
+    <Message Condition="$(tmpSonarIsTestFileByNameResult)=='true'" Importance="normal" Text="Sonar: ($(MSBuildProjectFile)) project is evaluated as a test project based on the project name." />
+
+    <Message Importance="normal" Condition="$(SonarQubeTestProject)=='false'" Text="Sonar: ($(MSBuildProjectFile)) categorized as MAIN project (production code)." />
+    <Message Importance="normal" Condition="$(SonarQubeTestProject)=='true'"  Text="Sonar: ($(MSBuildProjectFile)) categorized as TEST project (test code)." />
+  </Target>
+
+  <!-- **************************************************************************** -->
+  <!-- Calculate the set of files to be analyzed -->
+  <!-- **************************************************************************** -->
+  <!-- This target is a utility target: it won't be executed unless a target that
+       depends on it is executed.
+  -->
+  <Target Name="SonarWriteFilesToAnalyze"
+        Condition=" $(SonarQubeTempPath) != '' ">
+
+    <!-- Include all of contents of the specified item groups, but exclude
+         any that have the metadata 'SonarQubeExclude' set, or that are auto-generated -->
+    <ItemGroup Condition="('$(SQAnalysisFileItemTypes)' != '')">
+      <SonarQubeAnalysisFileItems Include="$(SQAnalysisFileItemTypes)" />
+      <SonarQubeAnalysisFiles Include="@(%(SonarQubeAnalysisFileItems.Identity))" />
+      <SonarQubeAnalysisFiles Remove="@(SonarQubeAnalysisFiles)" Condition=" %(SonarQubeAnalysisFiles.SonarQubeExclude) == 'true' OR %(SonarQubeAnalysisFiles.AutoGen) == 'true' OR %(SonarQubeAnalysisFiles.FullPath) == '$(TargetFrameworkMonikerAssemblyAttributesPath)'" />
+    </ItemGroup>
+
+    <!-- Exclude items under the intermediate output folder e.g. XAML files that are auto-generated on build -->
+    <PropertyGroup>
+      <!-- Calculate the full path to the base intermediate folder -->
+      <SQFullIntermediateOutputPath>$([System.IO.Path]::Combine($(MSBuildProjectDirectory),$(BaseIntermediateOutputPath)))</SQFullIntermediateOutputPath>
+    </PropertyGroup>
+    <ItemGroup>
+      <!-- Remove based on absolute path -->
+      <SQIntermediateFiles Include="$(SQFullIntermediateOutputPath)**\*.*" />
+      <!-- Remove based on relative path -->
+      <SQIntermediateFiles Include="$(BaseIntermediateOutputPath)**\*.*" />
+      <SonarQubeAnalysisFiles Remove="@(SQIntermediateFiles)" />
+    </ItemGroup>
+
+    <PropertyGroup>
+      <!-- Set a property indicating whether there are any files to analyze -->
+      <AnalysisFilesExist Condition=" @(SonarQubeAnalysisFiles) != '' ">true</AnalysisFilesExist>
+    </PropertyGroup>
+
+    <!-- Write the list of files  -->
+    <PropertyGroup>
+      <!-- Set the file name for the list file -->
+      <AnalysisFileList>$(ProjectSpecificConfDir)\FilesToAnalyze.txt</AnalysisFileList>
+    </PropertyGroup>
+
+    <Message Condition="$(AnalysisFilesExist)!='true'" Importance="normal" Text="Sonar: ($(MSBuildProjectFile)) No files were found to analyse" />
+    <Message Condition="$(AnalysisFilesExist)=='true'" Importance="normal" Text="Sonar: ($(MSBuildProjectFile)) Number of files to analyse: @(SonarQubeAnalysisFiles->Count()). The list of files to be analyzed is in $(AnalysisFileList)." />
+
+    <!-- Write out a list of files to analyze that will be passed to the sonar-scanner -->
+    <WriteLinesToFile Condition=" $(AnalysisFilesExist) == 'true' "
+            File="$(AnalysisFileList)"
+            Lines="%(SonarQubeAnalysisFiles.FullPath)"
+            Overwrite="false"
+            Encoding="utf-8" />
+  </Target>
+
+  <Target Name="SonarCreateProjectSpecificDirs" BeforeTargets="OverrideRoslynCodeAnalysisProperties;SonarWriteProjectData;SonarWriteFilesToAnalyze"  Condition=" $(SonarQubeTempPath) != '' ">
+    <!-- **************************************************************************** -->
+    <!-- Create the project-specific directories for conf and out -->
+
+    <!-- Create folder with unique name in the .sonarqube/out/ folder -->
+    <MakeUniqueDir Path="$(SonarQubeOutputPath)">
+      <Output TaskParameter="UniquePath" PropertyName="ProjectSpecificOutDir" />
+      <Output TaskParameter="UniqueName" PropertyName="UniqueName" />
+    </MakeUniqueDir>
+    <!-- Create .sonarqube/conf/ sub-folder with the same unique name -->
+    <PropertyGroup>
+      <ProjectSpecificConfDir>$(SonarQubeConfigPath)\$(UniqueName)</ProjectSpecificConfDir>
+    </PropertyGroup>
+    <MakeDir Directories="$(ProjectSpecificConfDir)" />
+  </Target>
+
+  <!-- SonarWriteProjectData has to be invoked after the Build target, so it can pick up the results for C++ projects.  -->
+  <Target Name="InvokeSonarWriteProjectData_NonRazorProject"
+          DependsOnTargets="SonarCategoriseProject;SonarWriteFilesToAnalyze;SonarCreateProjectSpecificDirs"
+          AfterTargets="Build"
+          Condition=" $(SonarQubeTempPath) != '' AND ('@(RazorCompile)'=='' OR ('@(RazorCompile)'!='' AND '$(UseRazorSourceGenerator)'=='true'))  ">
+    <CallTarget Targets="SonarWriteProjectData" />
+  </Target>
+
+  <Target Name="InvokeSonarWriteProjectData_RazorProject"
+          DependsOnTargets="SonarCategoriseProject;SonarWriteFilesToAnalyze;SonarCreateProjectSpecificDirs"
+          BeforeTargets="SonarPrepareRazorProjectCodeAnalysis"
+          AfterTargets="CoreCompile"
+          Condition=" $(SonarQubeTempPath) != '' AND '@(RazorCompile)'!='' AND ('$(UseRazorSourceGenerator)'=='' OR '$(UseRazorSourceGenerator)'=='false') ">
+    <CallTarget Targets="SonarWriteProjectData" />
+  </Target>
+
+  <Target Name="SonarWriteProjectData" >
+    <PropertyGroup>
+      <SonarErrorLogExists Condition=" $(SonarErrorLog) != '' AND  $([System.IO.File]::Exists($(SonarErrorLog))) == 'true' ">true</SonarErrorLogExists>
+    </PropertyGroup>
+
+    <ItemGroup>
+      <SonarReportFilePath Condition= "$(SonarErrorLogExists) == 'true'" Include="$(SonarErrorLog)" />
+    </ItemGroup>
+
+    <ItemGroup>
+      <SonarQubeSetting Include="sonar.$(SQLanguage).roslyn.reportFilePaths" Condition=" @(SonarReportFilePath) != '' ">
+        <!-- Join the paths with |  -->
+        <!-- This delimiter needs to be the same as PropertiesFileGenerator.RoslynReportPathsDelimiter -->
+        <Value>@(SonarReportFilePath->'%(identity)','|')</Value>
+      </SonarQubeSetting>
+      <SonarQubeSetting Include="sonar.$(SQLanguage).analyzer.projectOutPaths" Condition= "$(SonarErrorLogExists) == 'true'">
+        <Value>$(ProjectSpecificOutDir)</Value>
+      </SonarQubeSetting>
+    </ItemGroup>
+
+    <!-- Record the list of files as an analysis result -->
+    <ItemGroup Condition=" $(AnalysisFilesExist) == 'true' ">
+      <AnalysisResults Include="$(AnalysisFileList)">
+        <Id>FilesToAnalyze</Id>
+      </AnalysisResults>
+    </ItemGroup>
+
+    <CallTarget Targets="FixUpTestProjectOutputs" />
+
+    <WriteProjectInfoFile ProjectName="$(MSBuildProjectName)"
+       FullProjectPath="$(MSBuildProjectFullPath)"
+       ProjectLanguage="$(Language)"
+       ProjectGuid="$(ProjectGuid)"
+       SolutionConfigurationContents="$(CurrentSolutionConfigurationContents)"
+       IsTest="$(SonarQubeTestProject)"
+       IsExcluded="$(SonarQubeExclude)"
+       AnalysisResults="@(AnalysisResults)"
+       AnalysisSettings="@(SonarQubeSetting)"
+       OutputFolder="$(ProjectSpecificOutDir)"
+       CodePage="$(CodePage)"
+       Configuration="$(Configuration)"
+       Platform="$(Platform)"
+       TargetFramework="$(TargetFramework)" />
+
+    <Message Importance="high" Text="Sonar: ($(MSBuildProjectFile)) Project processed successfully" />
+  </Target>
+
+  <!--
+    Set the Razor specific error log properties.
+    Move the results of the core compilation to a temporary folder to prevent RazorCoreCompilation from overriding its content.
+    The contents will be moved back in SonarFinishRazorProjectCodeAnalysis target.
+  -->
+  <Target Name="SonarPrepareRazorProjectCodeAnalysis" BeforeTargets="RazorCoreCompile" AfterTargets="CoreCompile" Condition="'@(RazorCompile)'!='' AND ('$(UseRazorSourceGenerator)'=='' OR '$(UseRazorSourceGenerator)'=='false')" >
+    <PropertyGroup Condition=" $(SonarErrorLog) != '' ">
+      <!-- https://github.com/SonarSource/sonar-scanner-msbuild/issues/1015 Respect user-provided value. When set, users should provide unique path for each build (project and target framework). -->
+      <RazorSonarErrorLogName Condition=" $(RazorCompilationErrorLog) == '' ">Issues$(RazorTargetNameSuffix).json</RazorSonarErrorLogName>
+      <RazorCompilationErrorLog Condition=" $(RazorSonarErrorLogName) != '' ">$(ProjectSpecificOutDir)\$(RazorSonarErrorLogName)</RazorCompilationErrorLog>
+      <ErrorLog>$(RazorCompilationErrorLog)</ErrorLog>
+      <!-- Keep the path so that we could set SonarQubeSetting with sonar.language.roslyn.reportFilePaths -->
+      <RazorSonarErrorLog>$(RazorCompilationErrorLog)</RazorSonarErrorLog>
+    </PropertyGroup>
+    <PropertyGroup>
+      <SonarTemporaryProjectSpecificOutDir>$(ProjectSpecificOutDir).tmp</SonarTemporaryProjectSpecificOutDir>
+    </PropertyGroup>
+    <ItemGroup>
+      <CoreCompileOutFiles Include="$(ProjectSpecificOutDir)\**\*.*"/>
+    </ItemGroup>
+    <Move
+      SourceFiles="@(CoreCompileOutFiles)"
+      DestinationFolder="$(SonarTemporaryProjectSpecificOutDir)\%(RecursiveDir)" />
+    <Message Importance="high" Text="Sonar: Preparing for Razor compilation, moved files (@(CoreCompileOutFiles)) to $(SonarTemporaryProjectSpecificOutDir)." />
+  </Target>
+
+  <!-- In case of Razor compilation the output files generated during the core compilation step are already moved into a temporary folder.
+       This target renames output directories to their final state and creates the ProjectInfo.xml for them.
+  -->
+  <Target Name="SonarFinishRazorProjectCodeAnalysis" AfterTargets="RazorCoreCompile;InvokeSonarWriteProjectData_RazorProject" Condition=" $(SonarTemporaryProjectSpecificOutDir) != '' AND '@(RazorCompile)'!='' AND ('$(UseRazorSourceGenerator)'=='' OR '$(UseRazorSourceGenerator)'=='false') ">
+    <PropertyGroup>
+      <RazorSonarProjectSpecificOutDir>$(ProjectSpecificOutDir).Razor</RazorSonarProjectSpecificOutDir>
+      <RazorSonarProjectInfo>$(RazorSonarProjectSpecificOutDir)\ProjectInfo.xml</RazorSonarProjectInfo>
+    </PropertyGroup>
+    <ItemGroup>
+      <RazorCompilationOutFiles Include="$(ProjectSpecificOutDir)\**\*.*"/>
+      <SonarTempFiles Include="$(SonarTemporaryProjectSpecificOutDir)\**\*.*"/>
+    </ItemGroup>
+
+    <!-- Move main and Razor results to their final location. -->
+    <Move
+      SourceFiles="@(RazorCompilationOutFiles)"
+      DestinationFolder="$(RazorSonarProjectSpecificOutDir)\%(RecursiveDir)" />
+    <Message Importance="high" Text="Sonar: After Razor compilation, moved files (@(RazorCompilationOutFiles)) to $(RazorSonarProjectSpecificOutDir)." />
+
+    <Move
+      SourceFiles="@(SonarTempFiles)"
+      DestinationFolder="$(ProjectSpecificOutDir)\%(RecursiveDir)" />
+    <Message Importance="high" Text="Sonar: After Razor compilation, moved files (@(SonarTempFiles)) to $(ProjectSpecificOutDir) and will remove the temporary folder." />
+    <RemoveDir Directories="$(SonarTemporaryProjectSpecificOutDir)" />
+
+    <PropertyGroup>
+      <!-- This overwrites the previously set 'RazorSonarErrorLog' in 'SonarPrepareRazorProjectCodeAnalysis'
+           if 'RazorSonarErrorLogName' is set, which means 'RazorCompilationErrorLog' was null.
+           The condition is a bit difficult to follow, it would be easier to change it or also add "$(RazorSonarErrorLog) != ''" -->
+      <RazorSonarErrorLog Condition=" $(RazorSonarErrorLogName) != '' ">$(RazorSonarProjectSpecificOutDir)\$(RazorSonarErrorLogName)</RazorSonarErrorLog>
+      <RazorSonarErrorLogExists Condition=" $(RazorSonarErrorLog) != '' AND  $([System.IO.File]::Exists($(RazorSonarErrorLog))) == 'true' ">true</RazorSonarErrorLogExists>
+    </PropertyGroup>
+
+    <ItemGroup>
+      <RazorSonarReportFilePath Condition= "$(RazorSonarErrorLogExists) == 'true'" Include="$(RazorSonarErrorLog)" />
+      <RazorSonarQubeSetting Include="sonar.$(SQLanguage).roslyn.reportFilePaths" Condition=" @(RazorSonarReportFilePath) != '' ">
+        <!-- Join the paths with |  -->
+        <!-- This delimiter needs to be the same as PropertiesFileGenerator.RoslynReportPathsDelimiter -->
+        <Value>@(RazorSonarReportFilePath->'%(identity)','|')</Value>
+      </RazorSonarQubeSetting>
+      <RazorSonarQubeSetting Include="sonar.$(SQLanguage).analyzer.projectOutPaths" Condition= "$(RazorSonarErrorLogExists) == 'true'">
+        <Value>$(RazorSonarProjectSpecificOutDir)</Value>
+      </RazorSonarQubeSetting>
+    </ItemGroup>
+
+    <!-- Create the ProjectInfo.xml for the Razor part. -->
+    <WriteProjectInfoFile ProjectName="$(MSBuildProjectName)"
+                          FullProjectPath="$(MSBuildProjectFullPath)"
+                          ProjectLanguage="$(Language)"
+                          ProjectGuid="$(ProjectGuid)"
+                          SolutionConfigurationContents="$(CurrentSolutionConfigurationContents)"
+                          IsTest="$(SonarQubeTestProject)"
+                          IsExcluded="$(SonarQubeExclude)"
+                          AnalysisResults="@(AnalysisResults)"
+                          AnalysisSettings="@(RazorSonarQubeSetting)"
+                          OutputFolder="$(RazorSonarProjectSpecificOutDir)"
+                          CodePage="$(CodePage)"
+                          Configuration="$(Configuration)"
+                          Platform="$(Platform)"
+                          TargetFramework="$(TargetFramework)" />
+  </Target>
+
+  <Target Name="FixUpTestProjectOutputs" Condition="$(SonarQubeTestProject)=='true'" >
+    <Message Importance="low" Text="Sonar: ($(MSBuildProjectFile)) Fixing up test project outputs..." />
+
+    <ItemGroup>
+      <!-- Select specific metrics files that should not be uploaded for test files.
+           Assumption: these files will be in a sub-folder under the project-specific output folder. -->
+      <SQTestMetricFiles Include="$(ProjectSpecificOutDir)\*\metrics.pb" />
+      <SQTestMetricFiles Include="$(ProjectSpecificOutDir)\*\token-cpd.pb" />
+    </ItemGroup>
+
+    <Message Importance="low" Text="Sonar: ($(MSBuildProjectFile)) Selected test metric file: @(SQTestMetricFiles)" />
+    <WriteZeroLengthFiles FullFilePaths="@(SQTestMetricFiles)" />
+  </Target>
+
+  <!-- **************************************************************************** -->
+  <!-- Code analysis -->
+  <!-- **************************************************************************** -->
+  <!--  Implementation notes:
+
+        We want to override any code analysis-related properties that are set in the
+        project file. To do this, we need to execute our targets at the correct
+        point in the build.
+
+        Note that both the FxCop and Roslyn targets use a property called "CodeAnalysisRuleSet".
+        The FxCop targets use this value directly. However, the Roslyn targets use it
+        as input to the "ResolveCodeAnalysisRuleSet" target, which sets the property
+        "ResolvedCodeAnalysisRuleset".
+
+        We override the property "ResolveCodeAnalysisRuleSet" with the path to our Roslyn ruleset.
+  -->
+
+  <PropertyGroup>
+    <SQLanguage Condition="$(Language) == 'C#'">cs</SQLanguage>
+    <SQLanguage Condition="$(Language) == 'VB'">vbnet</SQLanguage>
+  </PropertyGroup>
+
+  <!-- **************************************************************************** -->
+  <!-- Roslyn analysis section -->
+  <!-- **************************************************************************** -->
+  <!-- Override VS2019 properties to make sure analysis runs in the scanner build.
+       We need to run before BeforeCompile that executes _ComputeSkipAnalyzers target.
+       We don't need to override this for excluded projects. -->
+  <Target Name="SonarOverrideRunAnalyzers"
+        Condition=" $(SonarQubeTempPath) != '' AND $(SonarQubeExclude) != 'true' "
+        BeforeTargets="BeforeCompile">
+
+    <PropertyGroup>
+      <RunAnalyzers>true</RunAnalyzers>
+      <RunAnalyzersDuringBuild>true</RunAnalyzersDuringBuild>
+    </PropertyGroup>
+  </Target>
+
+  <!-- Set the properties required to run Roslyn analysis as part of the build.
+       Analysis is controlled by the following properties:
+         ResolvedCodeAnalysisRuleSet - the full path to the ruleset to use
+         ErrorLog and RazorCompilationErrorLog - the file path for the error reporting file
+
+       We want to run after the core "ResolveCodeAnalysisRuleSet" target which assigns a value to "ResolvedCodeAnalysisRuleSet".
+
+       Conditions:
+       * project is excluded -> turn off Roslyn analysis
+       * project is a test project and parameter sonar.dotnet.excludeTestProjects=true -> run only metrics rules
+       * otherwise, use the analyzer settings loaded from the config file (removing any existing analyzers)
+   -->
+  <Target Name="OverrideRoslynCodeAnalysisProperties"
+        Condition=" $(SonarQubeTempPath) != '' "
+        DependsOnTargets="SonarCategoriseProject;SonarWriteFilesToAnalyze"
+        AfterTargets="ResolveCodeAnalysisRuleSet"
+        BeforeTargets="CoreCompile">
+
+    <PropertyGroup>
+      <!-- Make sure no warnings are treated as errors -->
+      <TreatWarningsAsErrors>false</TreatWarningsAsErrors>
+      <WarningsAsErrors></WarningsAsErrors>
+
+      <!-- The Roslyn analyzers output messages with different warning levels. This is tied to the diagnostic severity and currently
+      is translated as follows - error: 0, warning: 1, info: 4. To avoid issues being missed override the warning level by setting it to max tolerance.-->
+      <WarningLevel>4</WarningLevel>
+    </PropertyGroup>
+
+    <CallTarget Targets="SetRoslynCodeAnalysisProperties" Condition="$(SonarQubeExclude) != 'true'" />
+  </Target>
+
+  <Target Name="SetRoslynCodeAnalysisProperties">
+
+    <!-- Fetch the relevant settings from the config file -->
+    <GetAnalyzerSettings AnalysisConfigDir="$(SonarQubeConfigPath)"
+                         Language="$(SQLanguage)"
+                         CurrentProjectDirectoryPath="$(MSBuildProjectDirectory)"
+                         OriginalAnalyzers="@(Analyzer)"
+                         OriginalAdditionalFiles="@(AdditionalFiles)"
+                         OriginalRulesetFilePath="$(ResolvedCodeAnalysisRuleset)"
+                         ProjectSpecificConfigDirectory="$(ProjectSpecificConfDir)"
+                         IsTestProject="$(SonarQubeTestProject)">
+      <Output TaskParameter="RuleSetFilePath" PropertyName="SQRuleSetFilePath" />
+      <Output TaskParameter="AnalyzerFilePaths" ItemName="SQAnalyzerFilePaths" />
+      <Output TaskParameter="AdditionalFilePaths" ItemName="SQAdditionalFiles" />
+    </GetAnalyzerSettings>
+
+    <PropertyGroup>
+      <!-- https://github.com/SonarSource/sonar-scanner-msbuild/issues/1015 Respect user-provided value. When set, users should provide unique path for each build (project and target framework). -->
+      <!-- https://jira.sonarsource.com/browse/SONARMSBRU-211 - the full path should be unique per project and target framework. -->
+      <ErrorLog Condition=" $(ErrorLog) == '' ">$(ProjectSpecificOutDir)\Issues.json</ErrorLog>
+      <!-- Keep the path so that we could set SonarQubeSetting with sonar.language.roslyn.reportFilePaths -->
+      <SonarErrorLog>$(ErrorLog)</SonarErrorLog>
+    </PropertyGroup>
+
+    <PropertyGroup>
+      <ResolvedCodeAnalysisRuleSet>$(SQRuleSetFilePath)</ResolvedCodeAnalysisRuleSet>
+      <SonarProjectOutFolderFilePath>$(ProjectSpecificConfDir)\ProjectOutFolderPath.txt</SonarProjectOutFolderFilePath>
+    </PropertyGroup>
+
+    <!--SonarProjectOutFolderFilePath is generated only for backward compatibility with CSharp and VBNet analyzers before 8.20 -->
+    <WriteLinesToFile File="$(SonarProjectOutFolderFilePath)" Lines="$(ProjectSpecificOutDir)" Overwrite="true" />
+
+    <WriteProjectConfigFile ConfigDir="$(ProjectSpecificConfDir)"
+                            AnalysisConfigPath="$(SonarQubeConfigPath)\SonarQubeAnalysisConfig.xml"
+                            ProjectPath="$(MSBuildProjectFullPath)"
+                            FilesToAnalyzePath ="$(AnalysisFileList)"
+                            OutPath="$(ProjectSpecificOutDir)"
+                            IsTest="$(SonarQubeTestProject)"
+                            TargetFramework="$(TargetFramework)">
+      <Output TaskParameter="ProjectConfigFilePath" PropertyName="SonarProjectConfigFilePath" />
+    </WriteProjectConfigFile>
+
+    <ItemGroup>
+      <!-- Clear the original set of analyzers and additional files -->
+      <Analyzer Remove="@(Analyzer)" />
+      <AdditionalFiles Remove="@(AdditionalFiles)" />
+
+      <!-- Use the set of analyzers and additional files calculated by the GetAnalyzerSettings task -->
+      <Analyzer Include="@(SQAnalyzerFilePaths)" />
+      <AdditionalFiles Include="@(SQAdditionalFiles)" />
+      <AdditionalFiles Include="$(SonarProjectConfigFilePath)" />
+      <AdditionalFiles Include="$(SonarProjectOutFolderFilePath)" />
+    </ItemGroup>
+
+    <Message Importance="normal" Text="Sonar: ($(MSBuildProjectFile)) Analysis configured successfully with $(SonarProjectConfigFilePath)." />
+  </Target>
+  <!-- **************************************************************************** -->
+  <!-- End of Roslyn analysis section-->
+  <!-- **************************************************************************** -->
+
+</Project>

+ 49 - 0
.sonarqube/conf/0/FilesToAnalyze.txt

@@ -0,0 +1,49 @@
+F:\Unity\Projects\Nar Kampen\Assets\Scripts\CategoryPanel.cs
+F:\Unity\Projects\Nar Kampen\Assets\Scripts\Database\Database.cs
+F:\Unity\Projects\Nar Kampen\Assets\Scripts\Database\OnlineDatabase.cs
+F:\Unity\Projects\Nar Kampen\Assets\Scripts\Draggable.cs
+F:\Unity\Projects\Nar Kampen\Assets\Scripts\DropZone.cs
+F:\Unity\Projects\Nar Kampen\Assets\Scripts\EventManager.cs
+F:\Unity\Projects\Nar Kampen\Assets\Scripts\GameInfoScript.cs
+F:\Unity\Projects\Nar Kampen\Assets\Scripts\GameManagerScript.cs
+F:\Unity\Projects\Nar Kampen\Assets\Scripts\GeneralDialog\GenericDialog.cs
+F:\Unity\Projects\Nar Kampen\Assets\Scripts\InformationPanelScript.cs
+F:\Unity\Projects\Nar Kampen\Assets\Scripts\InvitePanelScript.cs
+F:\Unity\Projects\Nar Kampen\Assets\Scripts\InviteSearchResult.cs
+F:\Unity\Projects\Nar Kampen\Assets\Scripts\LocalGameScript.cs
+F:\Unity\Projects\Nar Kampen\Assets\Scripts\Localization\ButtonLocalization.cs
+F:\Unity\Projects\Nar Kampen\Assets\Scripts\Localization\InputFieldLocalization.cs
+F:\Unity\Projects\Nar Kampen\Assets\Scripts\Localization\LocalizationManager.cs
+F:\Unity\Projects\Nar Kampen\Assets\Scripts\Localization\TextLocalization.cs
+F:\Unity\Projects\Nar Kampen\Assets\Scripts\Login\Login.cs
+F:\Unity\Projects\Nar Kampen\Assets\Scripts\Login\Register.cs
+F:\Unity\Projects\Nar Kampen\Assets\Scripts\MainMenu.cs
+F:\Unity\Projects\Nar Kampen\Assets\Scripts\ModalPanel\BringToFront.cs
+F:\Unity\Projects\Nar Kampen\Assets\Scripts\ModalPanel\DisplayManager.cs
+F:\Unity\Projects\Nar Kampen\Assets\Scripts\ModalPanel\ModalPanel.cs
+F:\Unity\Projects\Nar Kampen\Assets\Scripts\NewOnlineGame.cs
+F:\Unity\Projects\Nar Kampen\Assets\Scripts\NewQuestion.cs
+F:\Unity\Projects\Nar Kampen\Assets\Scripts\OnlineGameScript.cs
+F:\Unity\Projects\Nar Kampen\Assets\Scripts\OnlinePlayerInfoScript.cs
+F:\Unity\Projects\Nar Kampen\Assets\Scripts\PinchZoom.cs
+F:\Unity\Projects\Nar Kampen\Assets\Scripts\PlayerInfo.cs
+F:\Unity\Projects\Nar Kampen\Assets\Scripts\PlayerSetting.cs
+F:\Unity\Projects\Nar Kampen\Assets\Scripts\PrivacyPolicy.cs
+F:\Unity\Projects\Nar Kampen\Assets\Scripts\QuestionCard.cs
+F:\Unity\Projects\Nar Kampen\Assets\Scripts\RoundButtonsScript.cs
+F:\Unity\Projects\Nar Kampen\Assets\Scripts\ScrollViewScript.cs
+F:\Unity\Projects\Nar Kampen\Assets\Scripts\StatsLine.cs
+F:\Unity\Projects\Nar Kampen\Assets\Scripts\StatsScript.cs
+F:\Unity\Projects\Nar Kampen\Assets\Scripts\TimerScript.cs
+F:\Unity\Projects\Nar Kampen\Assets\Translations\ENGLISH.xml
+F:\Unity\Projects\Nar Kampen\Assets\Translations\SWEDISH.xml
+F:\Unity\Projects\Nar Kampen\Packages\com.unity.2d.sprite\Editor\UI\SpriteEditor\PolygonChangeShapeWindow.uxml
+F:\Unity\Projects\Nar Kampen\Packages\com.unity.2d.sprite\Editor\UI\SpriteEditor\SpriteEditor.uss
+F:\Unity\Projects\Nar Kampen\Packages\com.unity.2d.sprite\Editor\UI\SpriteEditor\SpriteFrameModuleInspector.uxml
+F:\Unity\Projects\Nar Kampen\Packages\com.unity.collab-proxy\Editor\Resources\Styles\CollabHistoryCommon.uss
+F:\Unity\Projects\Nar Kampen\Packages\com.unity.collab-proxy\Editor\Resources\Styles\CollabHistoryDark.uss
+F:\Unity\Projects\Nar Kampen\Packages\com.unity.collab-proxy\Editor\Resources\Styles\CollabHistoryLight.uss
+F:\Unity\Projects\Nar Kampen\Packages\com.unity.ext.nunit\net35\unity-custom\This is a custom build DONT include.txt
+F:\Unity\Projects\Nar Kampen\Packages\com.unity.ext.nunit\net35\unity-custom\nunit.framework.xml
+F:\Unity\Projects\Nar Kampen\Packages\com.unity.textmeshpro\Editor Resources\Shaders\TMP_Properties.cginc
+F:\Unity\Projects\Nar Kampen\Packages\com.unity.textmeshpro\Editor Resources\Shaders\TMP_SDF Internal SSD.shader

+ 1 - 0
.sonarqube/conf/0/ProjectOutFolderPath.txt

@@ -0,0 +1 @@
+F:\Unity\Projects\Nar Kampen\.sonarqube\out\0

+ 8 - 0
.sonarqube/conf/0/SonarProjectConfig.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<SonarProjectConfig xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.sonarsource.com/msbuild/analyzer/2021/1">
+  <AnalysisConfigPath>F:\Unity\Projects\Nar Kampen\.sonarqube\conf\SonarQubeAnalysisConfig.xml</AnalysisConfigPath>
+  <ProjectPath>F:\Unity\Projects\Nar Kampen\Nar Kampen.csproj</ProjectPath>
+  <FilesToAnalyzePath>F:\Unity\Projects\Nar Kampen\.sonarqube\conf\0\FilesToAnalyze.txt</FilesToAnalyzePath>
+  <OutPath>F:\Unity\Projects\Nar Kampen\.sonarqube\out\0</OutPath>
+  <ProjectType>Product</ProjectType>
+</SonarProjectConfig>

+ 397 - 0
.sonarqube/conf/Sonar-cs-none.ruleset

@@ -0,0 +1,397 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RuleSet xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Name="Rules for SonarQube" Description="This rule set was automatically generated from SonarQube" ToolsVersion="14.0">
+  <Rules AnalyzerId="SonarAnalyzer.CSharp" RuleNamespace="SonarAnalyzer.CSharp">
+    <Rule Id="S1134" Action="None" />
+    <Rule Id="S1135" Action="None" />
+    <Rule Id="S1144" Action="None" />
+    <Rule Id="S1147" Action="None" />
+    <Rule Id="S1264" Action="None" />
+    <Rule Id="S2114" Action="None" />
+    <Rule Id="S2115" Action="None" />
+    <Rule Id="S2221" Action="None" />
+    <Rule Id="S2222" Action="None" />
+    <Rule Id="S2223" Action="None" />
+    <Rule Id="S2225" Action="None" />
+    <Rule Id="S2228" Action="None" />
+    <Rule Id="S2234" Action="None" />
+    <Rule Id="S2342" Action="None" />
+    <Rule Id="S2344" Action="None" />
+    <Rule Id="S2345" Action="None" />
+    <Rule Id="S2346" Action="None" />
+    <Rule Id="S2357" Action="None" />
+    <Rule Id="S2479" Action="None" />
+    <Rule Id="S2583" Action="None" />
+    <Rule Id="S2589" Action="None" />
+    <Rule Id="S3329" Action="None" />
+    <Rule Id="S3431" Action="None" />
+    <Rule Id="S3433" Action="None" />
+    <Rule Id="S3440" Action="None" />
+    <Rule Id="S3441" Action="None" />
+    <Rule Id="S3442" Action="None" />
+    <Rule Id="S3443" Action="None" />
+    <Rule Id="S3444" Action="None" />
+    <Rule Id="S3445" Action="None" />
+    <Rule Id="S3447" Action="None" />
+    <Rule Id="S3449" Action="None" />
+    <Rule Id="S3655" Action="None" />
+    <Rule Id="S4524" Action="None" />
+    <Rule Id="S881" Action="None" />
+    <Rule Id="S1006" Action="None" />
+    <Rule Id="S1110" Action="None" />
+    <Rule Id="S1116" Action="None" />
+    <Rule Id="S1117" Action="None" />
+    <Rule Id="S1118" Action="None" />
+    <Rule Id="S1121" Action="None" />
+    <Rule Id="S1123" Action="None" />
+    <Rule Id="S1125" Action="None" />
+    <Rule Id="S1128" Action="None" />
+    <Rule Id="S1244" Action="None" />
+    <Rule Id="S1479" Action="None" />
+    <Rule Id="S1481" Action="None" />
+    <Rule Id="S2148" Action="None" />
+    <Rule Id="S2201" Action="None" />
+    <Rule Id="S2219" Action="None" />
+    <Rule Id="S2325" Action="None" />
+    <Rule Id="S2326" Action="None" />
+    <Rule Id="S2327" Action="None" />
+    <Rule Id="S2328" Action="None" />
+    <Rule Id="S2330" Action="None" />
+    <Rule Id="S2333" Action="None" />
+    <Rule Id="S2339" Action="None" />
+    <Rule Id="S2681" Action="None" />
+    <Rule Id="S2688" Action="None" />
+    <Rule Id="S2692" Action="None" />
+    <Rule Id="S2696" Action="None" />
+    <Rule Id="S2699" Action="None" />
+    <Rule Id="S3235" Action="None" />
+    <Rule Id="S3237" Action="None" />
+    <Rule Id="S3358" Action="None" />
+    <Rule Id="S3415" Action="None" />
+    <Rule Id="S3427" Action="None" />
+    <Rule Id="S3532" Action="None" />
+    <Rule Id="S3598" Action="None" />
+    <Rule Id="S3776" Action="None" />
+    <Rule Id="S3897" Action="None" />
+    <Rule Id="S3898" Action="None" />
+    <Rule Id="S4502" Action="None" />
+    <Rule Id="S4507" Action="None" />
+    <Rule Id="S4635" Action="None" />
+    <Rule Id="S1066" Action="None" />
+    <Rule Id="S1067" Action="None" />
+    <Rule Id="S1172" Action="None" />
+    <Rule Id="S1185" Action="None" />
+    <Rule Id="S1186" Action="None" />
+    <Rule Id="S2156" Action="None" />
+    <Rule Id="S2275" Action="None" />
+    <Rule Id="S2368" Action="None" />
+    <Rule Id="S2386" Action="None" />
+    <Rule Id="S2387" Action="None" />
+    <Rule Id="S3005" Action="None" />
+    <Rule Id="S3215" Action="None" />
+    <Rule Id="S3234" Action="None" />
+    <Rule Id="S3236" Action="None" />
+    <Rule Id="S3240" Action="None" />
+    <Rule Id="S3241" Action="None" />
+    <Rule Id="S3242" Action="None" />
+    <Rule Id="S3244" Action="None" />
+    <Rule Id="S3246" Action="None" />
+    <Rule Id="S3247" Action="None" />
+    <Rule Id="S3249" Action="None" />
+    <Rule Id="S3353" Action="None" />
+    <Rule Id="S3366" Action="None" />
+    <Rule Id="S3457" Action="None" />
+    <Rule Id="S3597" Action="None" />
+    <Rule Id="S4200" Action="None" />
+    <Rule Id="S4201" Action="None" />
+    <Rule Id="S4210" Action="None" />
+    <Rule Id="S4211" Action="None" />
+    <Rule Id="S4212" Action="None" />
+    <Rule Id="S4214" Action="None" />
+    <Rule Id="S4456" Action="None" />
+    <Rule Id="S4457" Action="None" />
+    <Rule Id="S4564" Action="None" />
+    <Rule Id="S4787" Action="None" />
+    <Rule Id="S5542" Action="None" />
+    <Rule Id="S5547" Action="None" />
+    <Rule Id="S5659" Action="None" />
+    <Rule Id="S5773" Action="None" />
+    <Rule Id="S1048" Action="None" />
+    <Rule Id="S1151" Action="None" />
+    <Rule Id="S1155" Action="None" />
+    <Rule Id="S1168" Action="None" />
+    <Rule Id="S2123" Action="None" />
+    <Rule Id="S2245" Action="None" />
+    <Rule Id="S2259" Action="None" />
+    <Rule Id="S2360" Action="None" />
+    <Rule Id="S2365" Action="None" />
+    <Rule Id="S2486" Action="None" />
+    <Rule Id="S3216" Action="None" />
+    <Rule Id="S3217" Action="None" />
+    <Rule Id="S3218" Action="None" />
+    <Rule Id="S3330" Action="None" />
+    <Rule Id="S3450" Action="None" />
+    <Rule Id="S3451" Action="None" />
+    <Rule Id="S3453" Action="None" />
+    <Rule Id="S3456" Action="None" />
+    <Rule Id="S3458" Action="None" />
+    <Rule Id="S3459" Action="None" />
+    <Rule Id="S3466" Action="None" />
+    <Rule Id="S4423" Action="None" />
+    <Rule Id="S4426" Action="None" />
+    <Rule Id="S4428" Action="None" />
+    <Rule Id="S4784" Action="None" />
+    <Rule Id="S5753" Action="None" />
+    <Rule Id="S5766" Action="None" />
+    <Rule Id="S927" Action="None" />
+    <Rule Id="S2257" Action="None" />
+    <Rule Id="S3346" Action="None" />
+    <Rule Id="S3464" Action="None" />
+    <Rule Id="S1163" Action="None" />
+    <Rule Id="S1301" Action="None" />
+    <Rule Id="S1309" Action="None" />
+    <Rule Id="S1541" Action="None" />
+    <Rule Id="S1656" Action="None" />
+    <Rule Id="S1659" Action="None" />
+    <Rule Id="S2251" Action="None" />
+    <Rule Id="S2252" Action="None" />
+    <Rule Id="S2255" Action="None" />
+    <Rule Id="S2372" Action="None" />
+    <Rule Id="S2376" Action="None" />
+    <Rule Id="S2743" Action="None" />
+    <Rule Id="S2757" Action="None" />
+    <Rule Id="S2995" Action="None" />
+    <Rule Id="S2996" Action="None" />
+    <Rule Id="S3220" Action="None" />
+    <Rule Id="S3343" Action="None" />
+    <Rule Id="S3600" Action="None" />
+    <Rule Id="S3717" Action="None" />
+    <Rule Id="S3956" Action="None" />
+    <Rule Id="S3962" Action="None" />
+    <Rule Id="S3963" Action="None" />
+    <Rule Id="S4433" Action="None" />
+    <Rule Id="S4790" Action="None" />
+    <Rule Id="S4792" Action="None" />
+    <Rule Id="S4818" Action="None" />
+    <Rule Id="S818" Action="None" />
+    <Rule Id="S907" Action="None" />
+    <Rule Id="S1643" Action="None" />
+    <Rule Id="S1696" Action="None" />
+    <Rule Id="S1698" Action="None" />
+    <Rule Id="S1751" Action="None" />
+    <Rule Id="S1764" Action="None" />
+    <Rule Id="S1871" Action="None" />
+    <Rule Id="S1994" Action="None" />
+    <Rule Id="S2302" Action="None" />
+    <Rule Id="S2612" Action="None" />
+    <Rule Id="S2737" Action="None" />
+    <Rule Id="S2755" Action="None" />
+    <Rule Id="S2857" Action="None" />
+    <Rule Id="S2971" Action="None" />
+    <Rule Id="S2997" Action="None" />
+    <Rule Id="S3603" Action="None" />
+    <Rule Id="S3604" Action="None" />
+    <Rule Id="S3874" Action="None" />
+    <Rule Id="S3875" Action="None" />
+    <Rule Id="S3876" Action="None" />
+    <Rule Id="S3937" Action="None" />
+    <Rule Id="S3949" Action="None" />
+    <Rule Id="S3966" Action="None" />
+    <Rule Id="S3967" Action="None" />
+    <Rule Id="S3994" Action="None" />
+    <Rule Id="S3995" Action="None" />
+    <Rule Id="S3996" Action="None" />
+    <Rule Id="S3997" Action="None" />
+    <Rule Id="S1104" Action="None" />
+    <Rule Id="S1109" Action="None" />
+    <Rule Id="S1210" Action="None" />
+    <Rule Id="S1215" Action="None" />
+    <Rule Id="S1227" Action="None" />
+    <Rule Id="S1450" Action="None" />
+    <Rule Id="S1451" Action="None" />
+    <Rule Id="S1694" Action="None" />
+    <Rule Id="S1699" Action="None" />
+    <Rule Id="S2306" Action="None" />
+    <Rule Id="S2436" Action="None" />
+    <Rule Id="S2551" Action="None" />
+    <Rule Id="S2674" Action="None" />
+    <Rule Id="S3400" Action="None" />
+    <Rule Id="S3871" Action="None" />
+    <Rule Id="S3872" Action="None" />
+    <Rule Id="S3877" Action="None" />
+    <Rule Id="S3880" Action="None" />
+    <Rule Id="S3881" Action="None" />
+    <Rule Id="S3884" Action="None" />
+    <Rule Id="S3885" Action="None" />
+    <Rule Id="S3887" Action="None" />
+    <Rule Id="S3889" Action="None" />
+    <Rule Id="S3990" Action="None" />
+    <Rule Id="S3992" Action="None" />
+    <Rule Id="S3993" Action="None" />
+    <Rule Id="S3998" Action="None" />
+    <Rule Id="S1200" Action="None" />
+    <Rule Id="S1206" Action="None" />
+    <Rule Id="S1226" Action="None" />
+    <Rule Id="S1313" Action="None" />
+    <Rule Id="S1449" Action="None" />
+    <Rule Id="S1821" Action="None" />
+    <Rule Id="S1905" Action="None" />
+    <Rule Id="S1939" Action="None" />
+    <Rule Id="S1940" Action="None" />
+    <Rule Id="S1944" Action="None" />
+    <Rule Id="S2437" Action="None" />
+    <Rule Id="S2760" Action="None" />
+    <Rule Id="S2761" Action="None" />
+    <Rule Id="S3610" Action="None" />
+    <Rule Id="S3626" Action="None" />
+    <Rule Id="S3869" Action="None" />
+    <Rule Id="S3971" Action="None" />
+    <Rule Id="S3972" Action="None" />
+    <Rule Id="S3973" Action="None" />
+    <Rule Id="S3981" Action="None" />
+    <Rule Id="S3984" Action="None" />
+    <Rule Id="S4069" Action="None" />
+    <Rule Id="S4823" Action="None" />
+    <Rule Id="S4829" Action="None" />
+    <Rule Id="S4830" Action="None" />
+    <Rule Id="S4834" Action="None" />
+    <Rule Id="S5034" Action="None" />
+    <Rule Id="S125" Action="None" />
+    <Rule Id="S126" Action="None" />
+    <Rule Id="S127" Action="None" />
+    <Rule Id="S131" Action="None" />
+    <Rule Id="S134" Action="None" />
+    <Rule Id="S1607" Action="None" />
+    <Rule Id="S1848" Action="None" />
+    <Rule Id="S1854" Action="None" />
+    <Rule Id="S1858" Action="None" />
+    <Rule Id="S1862" Action="None" />
+    <Rule Id="S2701" Action="None" />
+    <Rule Id="S2930" Action="None" />
+    <Rule Id="S2952" Action="None" />
+    <Rule Id="S2953" Action="None" />
+    <Rule Id="S2955" Action="None" />
+    <Rule Id="S3903" Action="None" />
+    <Rule Id="S3906" Action="None" />
+    <Rule Id="S3908" Action="None" />
+    <Rule Id="S3909" Action="None" />
+    <Rule Id="S3923" Action="None" />
+    <Rule Id="S3925" Action="None" />
+    <Rule Id="S3926" Action="None" />
+    <Rule Id="S3927" Action="None" />
+    <Rule Id="S3928" Action="None" />
+    <Rule Id="S4060" Action="None" />
+    <Rule Id="S4061" Action="None" />
+    <Rule Id="S4070" Action="None" />
+    <Rule Id="S5042" Action="None" />
+    <Rule Id="S103" Action="None" />
+    <Rule Id="S104" Action="None" />
+    <Rule Id="S105" Action="None" />
+    <Rule Id="S106" Action="None" />
+    <Rule Id="S107" Action="None" />
+    <Rule Id="S108" Action="None" />
+    <Rule Id="S109" Action="None" />
+    <Rule Id="S110" Action="None" />
+    <Rule Id="S112" Action="None" />
+    <Rule Id="S138" Action="None" />
+    <Rule Id="S2068" Action="None" />
+    <Rule Id="S2183" Action="None" />
+    <Rule Id="S2184" Action="None" />
+    <Rule Id="S2187" Action="None" />
+    <Rule Id="S2931" Action="None" />
+    <Rule Id="S2933" Action="None" />
+    <Rule Id="S2934" Action="None" />
+    <Rule Id="S3397" Action="None" />
+    <Rule Id="S3900" Action="None" />
+    <Rule Id="S3902" Action="None" />
+    <Rule Id="S3904" Action="None" />
+    <Rule Id="S4000" Action="None" />
+    <Rule Id="S4002" Action="None" />
+    <Rule Id="S4004" Action="None" />
+    <Rule Id="S4005" Action="None" />
+    <Rule Id="S4487" Action="None" />
+    <Rule Id="S5332" Action="None" />
+    <Rule Id="S5693" Action="None" />
+    <Rule Id="S1075" Action="None" />
+    <Rule Id="S113" Action="None" />
+    <Rule Id="S1199" Action="None" />
+    <Rule Id="S121" Action="None" />
+    <Rule Id="S122" Action="None" />
+    <Rule Id="S2077" Action="None" />
+    <Rule Id="S2190" Action="None" />
+    <Rule Id="S2197" Action="None" />
+    <Rule Id="S3011" Action="None" />
+    <Rule Id="S3168" Action="None" />
+    <Rule Id="S3169" Action="None" />
+    <Rule Id="S3253" Action="None" />
+    <Rule Id="S3254" Action="None" />
+    <Rule Id="S3256" Action="None" />
+    <Rule Id="S3257" Action="None" />
+    <Rule Id="S3376" Action="None" />
+    <Rule Id="S4015" Action="None" />
+    <Rule Id="S4016" Action="None" />
+    <Rule Id="S4017" Action="None" />
+    <Rule Id="S4018" Action="None" />
+    <Rule Id="S4019" Action="None" />
+    <Rule Id="S4136" Action="None" />
+    <Rule Id="S4225" Action="None" />
+    <Rule Id="S4226" Action="None" />
+    <Rule Id="S100" Action="None" />
+    <Rule Id="S101" Action="None" />
+    <Rule Id="S1192" Action="None" />
+    <Rule Id="S2053" Action="None" />
+    <Rule Id="S2178" Action="None" />
+    <Rule Id="S2290" Action="None" />
+    <Rule Id="S2291" Action="None" />
+    <Rule Id="S2292" Action="None" />
+    <Rule Id="S3010" Action="None" />
+    <Rule Id="S3251" Action="None" />
+    <Rule Id="S3260" Action="None" />
+    <Rule Id="S3261" Action="None" />
+    <Rule Id="S3262" Action="None" />
+    <Rule Id="S3263" Action="None" />
+    <Rule Id="S3264" Action="None" />
+    <Rule Id="S3265" Action="None" />
+    <Rule Id="S3267" Action="None" />
+    <Rule Id="S4041" Action="None" />
+    <Rule Id="S4047" Action="None" />
+    <Rule Id="S4049" Action="None" />
+    <Rule Id="S4220" Action="None" />
+    <Rule Id="S4462" Action="None" />
+    <Rule Id="S4581" Action="None" />
+    <Rule Id="S4583" Action="None" />
+    <Rule Id="S4586" Action="None" />
+    <Rule Id="S5443" Action="None" />
+    <Rule Id="S5445" Action="None" />
+    <Rule Id="S3052" Action="None" />
+    <Rule Id="S3059" Action="None" />
+    <Rule Id="S3172" Action="None" />
+    <Rule Id="S4022" Action="None" />
+    <Rule Id="S4023" Action="None" />
+    <Rule Id="S4025" Action="None" />
+    <Rule Id="S4026" Action="None" />
+    <Rule Id="S4027" Action="None" />
+    <Rule Id="S4035" Action="None" />
+    <Rule Id="S4036" Action="None" />
+    <Rule Id="S4039" Action="None" />
+    <Rule Id="S4040" Action="None" />
+    <Rule Id="S4050" Action="None" />
+    <Rule Id="S4052" Action="None" />
+    <Rule Id="S4055" Action="None" />
+    <Rule Id="S4056" Action="None" />
+    <Rule Id="S4057" Action="None" />
+    <Rule Id="S4058" Action="None" />
+    <Rule Id="S4059" Action="None" />
+    <Rule Id="S4143" Action="None" />
+    <Rule Id="S4144" Action="None" />
+    <Rule Id="S4158" Action="None" />
+    <Rule Id="S4159" Action="None" />
+    <Rule Id="S4260" Action="None" />
+    <Rule Id="S4261" Action="None" />
+    <Rule Id="S4275" Action="None" />
+    <Rule Id="S4277" Action="None" />
+    <Rule Id="S6354" Action="None" />
+    <Rule Id="S2092" Action="None" />
+    <Rule Id="S3060" Action="None" />
+    <Rule Id="S5122" Action="None" />
+  </Rules>
+</RuleSet>

+ 397 - 0
.sonarqube/conf/Sonar-cs.ruleset

@@ -0,0 +1,397 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RuleSet xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Name="Rules for SonarQube" Description="This rule set was automatically generated from SonarQube" ToolsVersion="14.0">
+  <Rules AnalyzerId="SonarAnalyzer.CSharp" RuleNamespace="SonarAnalyzer.CSharp">
+    <Rule Id="S1134" Action="Warning" />
+    <Rule Id="S1135" Action="Warning" />
+    <Rule Id="S1144" Action="Warning" />
+    <Rule Id="S1147" Action="None" />
+    <Rule Id="S1264" Action="Warning" />
+    <Rule Id="S2114" Action="Warning" />
+    <Rule Id="S2115" Action="Warning" />
+    <Rule Id="S2221" Action="None" />
+    <Rule Id="S2222" Action="None" />
+    <Rule Id="S2223" Action="Warning" />
+    <Rule Id="S2225" Action="Warning" />
+    <Rule Id="S2228" Action="None" />
+    <Rule Id="S2234" Action="Warning" />
+    <Rule Id="S2342" Action="Warning" />
+    <Rule Id="S2344" Action="Warning" />
+    <Rule Id="S2345" Action="Warning" />
+    <Rule Id="S2346" Action="Warning" />
+    <Rule Id="S2357" Action="None" />
+    <Rule Id="S2479" Action="Warning" />
+    <Rule Id="S2583" Action="Warning" />
+    <Rule Id="S2589" Action="Warning" />
+    <Rule Id="S3329" Action="Warning" />
+    <Rule Id="S3431" Action="None" />
+    <Rule Id="S3433" Action="Warning" />
+    <Rule Id="S3440" Action="Warning" />
+    <Rule Id="S3441" Action="None" />
+    <Rule Id="S3442" Action="Warning" />
+    <Rule Id="S3443" Action="Warning" />
+    <Rule Id="S3444" Action="Warning" />
+    <Rule Id="S3445" Action="Warning" />
+    <Rule Id="S3447" Action="Warning" />
+    <Rule Id="S3449" Action="Warning" />
+    <Rule Id="S3655" Action="Warning" />
+    <Rule Id="S4524" Action="Warning" />
+    <Rule Id="S881" Action="None" />
+    <Rule Id="S1006" Action="Warning" />
+    <Rule Id="S1110" Action="Warning" />
+    <Rule Id="S1116" Action="Warning" />
+    <Rule Id="S1117" Action="Warning" />
+    <Rule Id="S1118" Action="Warning" />
+    <Rule Id="S1121" Action="Warning" />
+    <Rule Id="S1123" Action="Warning" />
+    <Rule Id="S1125" Action="Warning" />
+    <Rule Id="S1128" Action="None" />
+    <Rule Id="S1244" Action="None" />
+    <Rule Id="S1479" Action="Warning" />
+    <Rule Id="S1481" Action="Warning" />
+    <Rule Id="S2148" Action="None" />
+    <Rule Id="S2201" Action="Warning" />
+    <Rule Id="S2219" Action="Warning" />
+    <Rule Id="S2325" Action="None" />
+    <Rule Id="S2326" Action="Warning" />
+    <Rule Id="S2327" Action="None" />
+    <Rule Id="S2328" Action="Warning" />
+    <Rule Id="S2330" Action="None" />
+    <Rule Id="S2333" Action="None" />
+    <Rule Id="S2339" Action="None" />
+    <Rule Id="S2681" Action="Warning" />
+    <Rule Id="S2688" Action="Warning" />
+    <Rule Id="S2692" Action="Warning" />
+    <Rule Id="S2696" Action="Warning" />
+    <Rule Id="S2699" Action="Warning" />
+    <Rule Id="S3235" Action="None" />
+    <Rule Id="S3237" Action="Warning" />
+    <Rule Id="S3358" Action="Warning" />
+    <Rule Id="S3415" Action="Warning" />
+    <Rule Id="S3427" Action="Warning" />
+    <Rule Id="S3532" Action="None" />
+    <Rule Id="S3598" Action="Warning" />
+    <Rule Id="S3776" Action="Warning" />
+    <Rule Id="S3897" Action="Warning" />
+    <Rule Id="S3898" Action="None" />
+    <Rule Id="S4502" Action="Warning" />
+    <Rule Id="S4507" Action="Warning" />
+    <Rule Id="S4635" Action="Warning" />
+    <Rule Id="S1066" Action="Warning" />
+    <Rule Id="S1067" Action="None" />
+    <Rule Id="S1172" Action="Warning" />
+    <Rule Id="S1185" Action="Warning" />
+    <Rule Id="S1186" Action="Warning" />
+    <Rule Id="S2156" Action="None" />
+    <Rule Id="S2275" Action="Warning" />
+    <Rule Id="S2368" Action="Warning" />
+    <Rule Id="S2386" Action="Warning" />
+    <Rule Id="S2387" Action="None" />
+    <Rule Id="S3005" Action="Warning" />
+    <Rule Id="S3215" Action="None" />
+    <Rule Id="S3234" Action="None" />
+    <Rule Id="S3236" Action="Warning" />
+    <Rule Id="S3240" Action="None" />
+    <Rule Id="S3241" Action="Warning" />
+    <Rule Id="S3242" Action="None" />
+    <Rule Id="S3244" Action="Warning" />
+    <Rule Id="S3246" Action="Warning" />
+    <Rule Id="S3247" Action="Warning" />
+    <Rule Id="S3249" Action="Warning" />
+    <Rule Id="S3353" Action="None" />
+    <Rule Id="S3366" Action="None" />
+    <Rule Id="S3457" Action="Warning" />
+    <Rule Id="S3597" Action="Warning" />
+    <Rule Id="S4200" Action="Warning" />
+    <Rule Id="S4201" Action="Warning" />
+    <Rule Id="S4210" Action="Warning" />
+    <Rule Id="S4211" Action="Warning" />
+    <Rule Id="S4212" Action="None" />
+    <Rule Id="S4214" Action="Warning" />
+    <Rule Id="S4456" Action="Warning" />
+    <Rule Id="S4457" Action="Warning" />
+    <Rule Id="S4564" Action="None" />
+    <Rule Id="S4787" Action="None" />
+    <Rule Id="S5542" Action="Warning" />
+    <Rule Id="S5547" Action="Warning" />
+    <Rule Id="S5659" Action="Warning" />
+    <Rule Id="S5773" Action="Warning" />
+    <Rule Id="S1048" Action="Warning" />
+    <Rule Id="S1151" Action="None" />
+    <Rule Id="S1155" Action="Warning" />
+    <Rule Id="S1168" Action="Warning" />
+    <Rule Id="S2123" Action="Warning" />
+    <Rule Id="S2245" Action="Warning" />
+    <Rule Id="S2259" Action="Warning" />
+    <Rule Id="S2360" Action="None" />
+    <Rule Id="S2365" Action="Warning" />
+    <Rule Id="S2486" Action="Warning" />
+    <Rule Id="S3216" Action="None" />
+    <Rule Id="S3217" Action="Warning" />
+    <Rule Id="S3218" Action="Warning" />
+    <Rule Id="S3330" Action="Warning" />
+    <Rule Id="S3450" Action="Warning" />
+    <Rule Id="S3451" Action="Warning" />
+    <Rule Id="S3453" Action="Warning" />
+    <Rule Id="S3456" Action="Warning" />
+    <Rule Id="S3458" Action="Warning" />
+    <Rule Id="S3459" Action="Warning" />
+    <Rule Id="S3466" Action="Warning" />
+    <Rule Id="S4423" Action="Warning" />
+    <Rule Id="S4426" Action="Warning" />
+    <Rule Id="S4428" Action="Warning" />
+    <Rule Id="S4784" Action="None" />
+    <Rule Id="S5753" Action="Warning" />
+    <Rule Id="S5766" Action="Warning" />
+    <Rule Id="S927" Action="Warning" />
+    <Rule Id="S2257" Action="Warning" />
+    <Rule Id="S3346" Action="Warning" />
+    <Rule Id="S3464" Action="Warning" />
+    <Rule Id="S1163" Action="Warning" />
+    <Rule Id="S1301" Action="None" />
+    <Rule Id="S1309" Action="None" />
+    <Rule Id="S1541" Action="None" />
+    <Rule Id="S1656" Action="Warning" />
+    <Rule Id="S1659" Action="None" />
+    <Rule Id="S2251" Action="Warning" />
+    <Rule Id="S2252" Action="Warning" />
+    <Rule Id="S2255" Action="None" />
+    <Rule Id="S2372" Action="Warning" />
+    <Rule Id="S2376" Action="Warning" />
+    <Rule Id="S2743" Action="Warning" />
+    <Rule Id="S2757" Action="Warning" />
+    <Rule Id="S2995" Action="Warning" />
+    <Rule Id="S2996" Action="Warning" />
+    <Rule Id="S3220" Action="Warning" />
+    <Rule Id="S3343" Action="Warning" />
+    <Rule Id="S3600" Action="Warning" />
+    <Rule Id="S3717" Action="None" />
+    <Rule Id="S3956" Action="None" />
+    <Rule Id="S3962" Action="None" />
+    <Rule Id="S3963" Action="Warning" />
+    <Rule Id="S4433" Action="Warning" />
+    <Rule Id="S4790" Action="Warning" />
+    <Rule Id="S4792" Action="Warning" />
+    <Rule Id="S4818" Action="None" />
+    <Rule Id="S818" Action="Warning" />
+    <Rule Id="S907" Action="Warning" />
+    <Rule Id="S1643" Action="Warning" />
+    <Rule Id="S1696" Action="None" />
+    <Rule Id="S1698" Action="None" />
+    <Rule Id="S1751" Action="Warning" />
+    <Rule Id="S1764" Action="Warning" />
+    <Rule Id="S1871" Action="Warning" />
+    <Rule Id="S1994" Action="None" />
+    <Rule Id="S2302" Action="None" />
+    <Rule Id="S2612" Action="Warning" />
+    <Rule Id="S2737" Action="Warning" />
+    <Rule Id="S2755" Action="Warning" />
+    <Rule Id="S2857" Action="Warning" />
+    <Rule Id="S2971" Action="Warning" />
+    <Rule Id="S2997" Action="Warning" />
+    <Rule Id="S3603" Action="Warning" />
+    <Rule Id="S3604" Action="Warning" />
+    <Rule Id="S3874" Action="None" />
+    <Rule Id="S3875" Action="Warning" />
+    <Rule Id="S3876" Action="None" />
+    <Rule Id="S3937" Action="None" />
+    <Rule Id="S3949" Action="None" />
+    <Rule Id="S3966" Action="Warning" />
+    <Rule Id="S3967" Action="None" />
+    <Rule Id="S3994" Action="None" />
+    <Rule Id="S3995" Action="None" />
+    <Rule Id="S3996" Action="None" />
+    <Rule Id="S3997" Action="None" />
+    <Rule Id="S1104" Action="Warning" />
+    <Rule Id="S1109" Action="None" />
+    <Rule Id="S1210" Action="Warning" />
+    <Rule Id="S1215" Action="Warning" />
+    <Rule Id="S1227" Action="None" />
+    <Rule Id="S1450" Action="Warning" />
+    <Rule Id="S1451" Action="None" />
+    <Rule Id="S1694" Action="None" />
+    <Rule Id="S1699" Action="Warning" />
+    <Rule Id="S2306" Action="Warning" />
+    <Rule Id="S2436" Action="Warning" />
+    <Rule Id="S2551" Action="Warning" />
+    <Rule Id="S2674" Action="None" />
+    <Rule Id="S3400" Action="Warning" />
+    <Rule Id="S3871" Action="Warning" />
+    <Rule Id="S3872" Action="None" />
+    <Rule Id="S3877" Action="Warning" />
+    <Rule Id="S3880" Action="None" />
+    <Rule Id="S3881" Action="Warning" />
+    <Rule Id="S3884" Action="Warning" />
+    <Rule Id="S3885" Action="Warning" />
+    <Rule Id="S3887" Action="Warning" />
+    <Rule Id="S3889" Action="Warning" />
+    <Rule Id="S3990" Action="None" />
+    <Rule Id="S3992" Action="None" />
+    <Rule Id="S3993" Action="None" />
+    <Rule Id="S3998" Action="Warning" />
+    <Rule Id="S1200" Action="None" />
+    <Rule Id="S1206" Action="Warning" />
+    <Rule Id="S1226" Action="None" />
+    <Rule Id="S1313" Action="Warning" />
+    <Rule Id="S1449" Action="None" />
+    <Rule Id="S1821" Action="None" />
+    <Rule Id="S1905" Action="Warning" />
+    <Rule Id="S1939" Action="Warning" />
+    <Rule Id="S1940" Action="Warning" />
+    <Rule Id="S1944" Action="Warning" />
+    <Rule Id="S2437" Action="Warning" />
+    <Rule Id="S2760" Action="None" />
+    <Rule Id="S2761" Action="Warning" />
+    <Rule Id="S3610" Action="Warning" />
+    <Rule Id="S3626" Action="Warning" />
+    <Rule Id="S3869" Action="Warning" />
+    <Rule Id="S3971" Action="Warning" />
+    <Rule Id="S3972" Action="Warning" />
+    <Rule Id="S3973" Action="Warning" />
+    <Rule Id="S3981" Action="Warning" />
+    <Rule Id="S3984" Action="Warning" />
+    <Rule Id="S4069" Action="None" />
+    <Rule Id="S4823" Action="None" />
+    <Rule Id="S4829" Action="None" />
+    <Rule Id="S4830" Action="Warning" />
+    <Rule Id="S4834" Action="None" />
+    <Rule Id="S5034" Action="Warning" />
+    <Rule Id="S125" Action="Warning" />
+    <Rule Id="S126" Action="None" />
+    <Rule Id="S127" Action="None" />
+    <Rule Id="S131" Action="None" />
+    <Rule Id="S134" Action="None" />
+    <Rule Id="S1607" Action="Warning" />
+    <Rule Id="S1848" Action="Warning" />
+    <Rule Id="S1854" Action="Warning" />
+    <Rule Id="S1858" Action="None" />
+    <Rule Id="S1862" Action="Warning" />
+    <Rule Id="S2701" Action="None" />
+    <Rule Id="S2930" Action="Warning" />
+    <Rule Id="S2952" Action="None" />
+    <Rule Id="S2953" Action="Warning" />
+    <Rule Id="S2955" Action="None" />
+    <Rule Id="S3903" Action="Warning" />
+    <Rule Id="S3906" Action="None" />
+    <Rule Id="S3908" Action="None" />
+    <Rule Id="S3909" Action="None" />
+    <Rule Id="S3923" Action="Warning" />
+    <Rule Id="S3925" Action="Warning" />
+    <Rule Id="S3926" Action="Warning" />
+    <Rule Id="S3927" Action="Warning" />
+    <Rule Id="S3928" Action="Warning" />
+    <Rule Id="S4060" Action="None" />
+    <Rule Id="S4061" Action="Warning" />
+    <Rule Id="S4070" Action="Warning" />
+    <Rule Id="S5042" Action="Warning" />
+    <Rule Id="S103" Action="None" />
+    <Rule Id="S104" Action="None" />
+    <Rule Id="S105" Action="None" />
+    <Rule Id="S106" Action="None" />
+    <Rule Id="S107" Action="Warning" />
+    <Rule Id="S108" Action="Warning" />
+    <Rule Id="S109" Action="None" />
+    <Rule Id="S110" Action="Warning" />
+    <Rule Id="S112" Action="Warning" />
+    <Rule Id="S138" Action="None" />
+    <Rule Id="S2068" Action="Warning" />
+    <Rule Id="S2183" Action="Warning" />
+    <Rule Id="S2184" Action="Warning" />
+    <Rule Id="S2187" Action="Warning" />
+    <Rule Id="S2931" Action="None" />
+    <Rule Id="S2933" Action="Warning" />
+    <Rule Id="S2934" Action="Warning" />
+    <Rule Id="S3397" Action="Warning" />
+    <Rule Id="S3900" Action="None" />
+    <Rule Id="S3902" Action="None" />
+    <Rule Id="S3904" Action="Warning" />
+    <Rule Id="S4000" Action="None" />
+    <Rule Id="S4002" Action="None" />
+    <Rule Id="S4004" Action="None" />
+    <Rule Id="S4005" Action="None" />
+    <Rule Id="S4487" Action="Warning" />
+    <Rule Id="S5332" Action="Warning" />
+    <Rule Id="S5693" Action="Warning" />
+    <Rule Id="S1075" Action="Warning" />
+    <Rule Id="S113" Action="None" />
+    <Rule Id="S1199" Action="Warning" />
+    <Rule Id="S121" Action="None" />
+    <Rule Id="S122" Action="None" />
+    <Rule Id="S2077" Action="Warning" />
+    <Rule Id="S2190" Action="Warning" />
+    <Rule Id="S2197" Action="None" />
+    <Rule Id="S3011" Action="Warning" />
+    <Rule Id="S3168" Action="Warning" />
+    <Rule Id="S3169" Action="Warning" />
+    <Rule Id="S3253" Action="None" />
+    <Rule Id="S3254" Action="None" />
+    <Rule Id="S3256" Action="Warning" />
+    <Rule Id="S3257" Action="None" />
+    <Rule Id="S3376" Action="Warning" />
+    <Rule Id="S4015" Action="Warning" />
+    <Rule Id="S4016" Action="None" />
+    <Rule Id="S4017" Action="None" />
+    <Rule Id="S4018" Action="None" />
+    <Rule Id="S4019" Action="Warning" />
+    <Rule Id="S4136" Action="Warning" />
+    <Rule Id="S4225" Action="None" />
+    <Rule Id="S4226" Action="None" />
+    <Rule Id="S100" Action="None" />
+    <Rule Id="S101" Action="Warning" />
+    <Rule Id="S1192" Action="None" />
+    <Rule Id="S2053" Action="Warning" />
+    <Rule Id="S2178" Action="Warning" />
+    <Rule Id="S2290" Action="Warning" />
+    <Rule Id="S2291" Action="Warning" />
+    <Rule Id="S2292" Action="Warning" />
+    <Rule Id="S3010" Action="Warning" />
+    <Rule Id="S3251" Action="Warning" />
+    <Rule Id="S3260" Action="Warning" />
+    <Rule Id="S3261" Action="Warning" />
+    <Rule Id="S3262" Action="Warning" />
+    <Rule Id="S3263" Action="Warning" />
+    <Rule Id="S3264" Action="Warning" />
+    <Rule Id="S3265" Action="Warning" />
+    <Rule Id="S3267" Action="Warning" />
+    <Rule Id="S4041" Action="None" />
+    <Rule Id="S4047" Action="None" />
+    <Rule Id="S4049" Action="None" />
+    <Rule Id="S4220" Action="Warning" />
+    <Rule Id="S4462" Action="None" />
+    <Rule Id="S4581" Action="Warning" />
+    <Rule Id="S4583" Action="Warning" />
+    <Rule Id="S4586" Action="Warning" />
+    <Rule Id="S5443" Action="Warning" />
+    <Rule Id="S5445" Action="Warning" />
+    <Rule Id="S3052" Action="None" />
+    <Rule Id="S3059" Action="None" />
+    <Rule Id="S3172" Action="Warning" />
+    <Rule Id="S4022" Action="None" />
+    <Rule Id="S4023" Action="None" />
+    <Rule Id="S4025" Action="None" />
+    <Rule Id="S4026" Action="None" />
+    <Rule Id="S4027" Action="None" />
+    <Rule Id="S4035" Action="Warning" />
+    <Rule Id="S4036" Action="Warning" />
+    <Rule Id="S4039" Action="None" />
+    <Rule Id="S4040" Action="None" />
+    <Rule Id="S4050" Action="None" />
+    <Rule Id="S4052" Action="None" />
+    <Rule Id="S4055" Action="None" />
+    <Rule Id="S4056" Action="None" />
+    <Rule Id="S4057" Action="None" />
+    <Rule Id="S4058" Action="None" />
+    <Rule Id="S4059" Action="None" />
+    <Rule Id="S4143" Action="Warning" />
+    <Rule Id="S4144" Action="Warning" />
+    <Rule Id="S4158" Action="Warning" />
+    <Rule Id="S4159" Action="Warning" />
+    <Rule Id="S4260" Action="Warning" />
+    <Rule Id="S4261" Action="None" />
+    <Rule Id="S4275" Action="Warning" />
+    <Rule Id="S4277" Action="Warning" />
+    <Rule Id="S6354" Action="None" />
+    <Rule Id="S2092" Action="Warning" />
+    <Rule Id="S3060" Action="Warning" />
+    <Rule Id="S5122" Action="Warning" />
+  </Rules>
+</RuleSet>

+ 170 - 0
.sonarqube/conf/Sonar-vbnet-none.ruleset

@@ -0,0 +1,170 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RuleSet xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Name="Rules for SonarQube" Description="This rule set was automatically generated from SonarQube" ToolsVersion="14.0">
+  <Rules AnalyzerId="SonarAnalyzer.VisualBasic" RuleNamespace="SonarAnalyzer.VisualBasic">
+    <Rule Id="S112" Action="None" />
+    <Rule Id="S1134" Action="None" />
+    <Rule Id="S1135" Action="None" />
+    <Rule Id="S1654" Action="None" />
+    <Rule Id="S1656" Action="None" />
+    <Rule Id="S1659" Action="None" />
+    <Rule Id="S2068" Action="None" />
+    <Rule Id="S2222" Action="None" />
+    <Rule Id="S2340" Action="None" />
+    <Rule Id="S2342" Action="None" />
+    <Rule Id="S2343" Action="None" />
+    <Rule Id="S2344" Action="None" />
+    <Rule Id="S2345" Action="None" />
+    <Rule Id="S2346" Action="None" />
+    <Rule Id="S2347" Action="None" />
+    <Rule Id="S2348" Action="None" />
+    <Rule Id="S3431" Action="None" />
+    <Rule Id="S6146" Action="None" />
+    <Rule Id="S103" Action="None" />
+    <Rule Id="S104" Action="None" />
+    <Rule Id="S105" Action="None" />
+    <Rule Id="S107" Action="None" />
+    <Rule Id="S108" Action="None" />
+    <Rule Id="S114" Action="None" />
+    <Rule Id="S1147" Action="None" />
+    <Rule Id="S117" Action="None" />
+    <Rule Id="S122" Action="None" />
+    <Rule Id="S1301" Action="None" />
+    <Rule Id="S1541" Action="None" />
+    <Rule Id="S1542" Action="None" />
+    <Rule Id="S1821" Action="None" />
+    <Rule Id="S1940" Action="None" />
+    <Rule Id="S2077" Action="None" />
+    <Rule Id="S2234" Action="None" />
+    <Rule Id="S2349" Action="None" />
+    <Rule Id="S2352" Action="None" />
+    <Rule Id="S2353" Action="None" />
+    <Rule Id="S2354" Action="None" />
+    <Rule Id="S2355" Action="None" />
+    <Rule Id="S2357" Action="None" />
+    <Rule Id="S2358" Action="None" />
+    <Rule Id="S2359" Action="None" />
+    <Rule Id="S2757" Action="None" />
+    <Rule Id="S3449" Action="None" />
+    <Rule Id="S3603" Action="None" />
+    <Rule Id="S3776" Action="None" />
+    <Rule Id="S4136" Action="None" />
+    <Rule Id="S4818" Action="None" />
+    <Rule Id="S5693" Action="None" />
+    <Rule Id="S6145" Action="None" />
+    <Rule Id="S907" Action="None" />
+    <Rule Id="S101" Action="None" />
+    <Rule Id="S1075" Action="None" />
+    <Rule Id="S1110" Action="None" />
+    <Rule Id="S1125" Action="None" />
+    <Rule Id="S1192" Action="None" />
+    <Rule Id="S1197" Action="None" />
+    <Rule Id="S1451" Action="None" />
+    <Rule Id="S1479" Action="None" />
+    <Rule Id="S1481" Action="None" />
+    <Rule Id="S1643" Action="None" />
+    <Rule Id="S1645" Action="None" />
+    <Rule Id="S1751" Action="None" />
+    <Rule Id="S1764" Action="None" />
+    <Rule Id="S1871" Action="None" />
+    <Rule Id="S2178" Action="None" />
+    <Rule Id="S2302" Action="None" />
+    <Rule Id="S2339" Action="None" />
+    <Rule Id="S2387" Action="None" />
+    <Rule Id="S2612" Action="None" />
+    <Rule Id="S2692" Action="None" />
+    <Rule Id="S2737" Action="None" />
+    <Rule Id="S3011" Action="None" />
+    <Rule Id="S3358" Action="None" />
+    <Rule Id="S3385" Action="None" />
+    <Rule Id="S3598" Action="None" />
+    <Rule Id="S3990" Action="None" />
+    <Rule Id="S3992" Action="None" />
+    <Rule Id="S4201" Action="None" />
+    <Rule Id="S4507" Action="None" />
+    <Rule Id="S4583" Action="None" />
+    <Rule Id="S4586" Action="None" />
+    <Rule Id="S5042" Action="None" />
+    <Rule Id="S5443" Action="None" />
+    <Rule Id="S5445" Action="None" />
+    <Rule Id="S1066" Action="None" />
+    <Rule Id="S1067" Action="None" />
+    <Rule Id="S1172" Action="None" />
+    <Rule Id="S1186" Action="None" />
+    <Rule Id="S1226" Action="None" />
+    <Rule Id="S1313" Action="None" />
+    <Rule Id="S1862" Action="None" />
+    <Rule Id="S2304" Action="None" />
+    <Rule Id="S2366" Action="None" />
+    <Rule Id="S2368" Action="None" />
+    <Rule Id="S2369" Action="None" />
+    <Rule Id="S2429" Action="None" />
+    <Rule Id="S2437" Action="None" />
+    <Rule Id="S2551" Action="None" />
+    <Rule Id="S2951" Action="None" />
+    <Rule Id="S3884" Action="None" />
+    <Rule Id="S3889" Action="None" />
+    <Rule Id="S3923" Action="None" />
+    <Rule Id="S3926" Action="None" />
+    <Rule Id="S3927" Action="None" />
+    <Rule Id="S3998" Action="None" />
+    <Rule Id="S4210" Action="None" />
+    <Rule Id="S4423" Action="None" />
+    <Rule Id="S4787" Action="None" />
+    <Rule Id="S5542" Action="None" />
+    <Rule Id="S5547" Action="None" />
+    <Rule Id="S5659" Action="None" />
+    <Rule Id="S5944" Action="None" />
+    <Rule Id="S6354" Action="None" />
+    <Rule Id="S1048" Action="None" />
+    <Rule Id="S1151" Action="None" />
+    <Rule Id="S1155" Action="None" />
+    <Rule Id="S126" Action="None" />
+    <Rule Id="S131" Action="None" />
+    <Rule Id="S134" Action="None" />
+    <Rule Id="S2257" Action="None" />
+    <Rule Id="S2360" Action="None" />
+    <Rule Id="S2362" Action="None" />
+    <Rule Id="S2363" Action="None" />
+    <Rule Id="S2364" Action="None" />
+    <Rule Id="S2365" Action="None" />
+    <Rule Id="S2367" Action="None" />
+    <Rule Id="S2375" Action="None" />
+    <Rule Id="S2761" Action="None" />
+    <Rule Id="S3453" Action="None" />
+    <Rule Id="S3466" Action="None" />
+    <Rule Id="S4025" Action="None" />
+    <Rule Id="S4036" Action="None" />
+    <Rule Id="S4143" Action="None" />
+    <Rule Id="S4144" Action="None" />
+    <Rule Id="S4159" Action="None" />
+    <Rule Id="S4260" Action="None" />
+    <Rule Id="S4428" Action="None" />
+    <Rule Id="S4784" Action="None" />
+    <Rule Id="S4823" Action="None" />
+    <Rule Id="S4829" Action="None" />
+    <Rule Id="S4830" Action="None" />
+    <Rule Id="S5753" Action="None" />
+    <Rule Id="S927" Action="None" />
+    <Rule Id="S1163" Action="None" />
+    <Rule Id="S138" Action="None" />
+    <Rule Id="S139" Action="None" />
+    <Rule Id="S2255" Action="None" />
+    <Rule Id="S2370" Action="None" />
+    <Rule Id="S2372" Action="None" />
+    <Rule Id="S2373" Action="None" />
+    <Rule Id="S2374" Action="None" />
+    <Rule Id="S2376" Action="None" />
+    <Rule Id="S3464" Action="None" />
+    <Rule Id="S3860" Action="None" />
+    <Rule Id="S3866" Action="None" />
+    <Rule Id="S3869" Action="None" />
+    <Rule Id="S3903" Action="None" />
+    <Rule Id="S3904" Action="None" />
+    <Rule Id="S3981" Action="None" />
+    <Rule Id="S4275" Action="None" />
+    <Rule Id="S4277" Action="None" />
+    <Rule Id="S4790" Action="None" />
+    <Rule Id="S4792" Action="None" />
+    <Rule Id="S4834" Action="None" />
+  </Rules>
+</RuleSet>

+ 170 - 0
.sonarqube/conf/Sonar-vbnet.ruleset

@@ -0,0 +1,170 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RuleSet xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Name="Rules for SonarQube" Description="This rule set was automatically generated from SonarQube" ToolsVersion="14.0">
+  <Rules AnalyzerId="SonarAnalyzer.VisualBasic" RuleNamespace="SonarAnalyzer.VisualBasic">
+    <Rule Id="S112" Action="Warning" />
+    <Rule Id="S1134" Action="Warning" />
+    <Rule Id="S1135" Action="Warning" />
+    <Rule Id="S1654" Action="Warning" />
+    <Rule Id="S1656" Action="Warning" />
+    <Rule Id="S1659" Action="None" />
+    <Rule Id="S2068" Action="Warning" />
+    <Rule Id="S2222" Action="None" />
+    <Rule Id="S2340" Action="Warning" />
+    <Rule Id="S2342" Action="Warning" />
+    <Rule Id="S2343" Action="None" />
+    <Rule Id="S2344" Action="Warning" />
+    <Rule Id="S2345" Action="Warning" />
+    <Rule Id="S2346" Action="Warning" />
+    <Rule Id="S2347" Action="Warning" />
+    <Rule Id="S2348" Action="None" />
+    <Rule Id="S3431" Action="None" />
+    <Rule Id="S6146" Action="Warning" />
+    <Rule Id="S103" Action="None" />
+    <Rule Id="S104" Action="None" />
+    <Rule Id="S105" Action="None" />
+    <Rule Id="S107" Action="Warning" />
+    <Rule Id="S108" Action="Warning" />
+    <Rule Id="S114" Action="Warning" />
+    <Rule Id="S1147" Action="None" />
+    <Rule Id="S117" Action="Warning" />
+    <Rule Id="S122" Action="None" />
+    <Rule Id="S1301" Action="None" />
+    <Rule Id="S1541" Action="None" />
+    <Rule Id="S1542" Action="Warning" />
+    <Rule Id="S1821" Action="None" />
+    <Rule Id="S1940" Action="Warning" />
+    <Rule Id="S2077" Action="Warning" />
+    <Rule Id="S2234" Action="Warning" />
+    <Rule Id="S2349" Action="Warning" />
+    <Rule Id="S2352" Action="Warning" />
+    <Rule Id="S2353" Action="None" />
+    <Rule Id="S2354" Action="None" />
+    <Rule Id="S2355" Action="Warning" />
+    <Rule Id="S2357" Action="None" />
+    <Rule Id="S2358" Action="Warning" />
+    <Rule Id="S2359" Action="Warning" />
+    <Rule Id="S2757" Action="Warning" />
+    <Rule Id="S3449" Action="Warning" />
+    <Rule Id="S3603" Action="Warning" />
+    <Rule Id="S3776" Action="Warning" />
+    <Rule Id="S4136" Action="Warning" />
+    <Rule Id="S4818" Action="None" />
+    <Rule Id="S5693" Action="Warning" />
+    <Rule Id="S6145" Action="Warning" />
+    <Rule Id="S907" Action="Warning" />
+    <Rule Id="S101" Action="Warning" />
+    <Rule Id="S1075" Action="Warning" />
+    <Rule Id="S1110" Action="Warning" />
+    <Rule Id="S1125" Action="Warning" />
+    <Rule Id="S1192" Action="None" />
+    <Rule Id="S1197" Action="Warning" />
+    <Rule Id="S1451" Action="None" />
+    <Rule Id="S1479" Action="Warning" />
+    <Rule Id="S1481" Action="Warning" />
+    <Rule Id="S1643" Action="Warning" />
+    <Rule Id="S1645" Action="Warning" />
+    <Rule Id="S1751" Action="Warning" />
+    <Rule Id="S1764" Action="Warning" />
+    <Rule Id="S1871" Action="Warning" />
+    <Rule Id="S2178" Action="Warning" />
+    <Rule Id="S2302" Action="None" />
+    <Rule Id="S2339" Action="None" />
+    <Rule Id="S2387" Action="Warning" />
+    <Rule Id="S2612" Action="Warning" />
+    <Rule Id="S2692" Action="Warning" />
+    <Rule Id="S2737" Action="Warning" />
+    <Rule Id="S3011" Action="Warning" />
+    <Rule Id="S3358" Action="Warning" />
+    <Rule Id="S3385" Action="Warning" />
+    <Rule Id="S3598" Action="Warning" />
+    <Rule Id="S3990" Action="None" />
+    <Rule Id="S3992" Action="None" />
+    <Rule Id="S4201" Action="Warning" />
+    <Rule Id="S4507" Action="Warning" />
+    <Rule Id="S4583" Action="Warning" />
+    <Rule Id="S4586" Action="Warning" />
+    <Rule Id="S5042" Action="Warning" />
+    <Rule Id="S5443" Action="Warning" />
+    <Rule Id="S5445" Action="Warning" />
+    <Rule Id="S1066" Action="Warning" />
+    <Rule Id="S1067" Action="None" />
+    <Rule Id="S1172" Action="Warning" />
+    <Rule Id="S1186" Action="Warning" />
+    <Rule Id="S1226" Action="None" />
+    <Rule Id="S1313" Action="Warning" />
+    <Rule Id="S1862" Action="Warning" />
+    <Rule Id="S2304" Action="Warning" />
+    <Rule Id="S2366" Action="None" />
+    <Rule Id="S2368" Action="Warning" />
+    <Rule Id="S2369" Action="None" />
+    <Rule Id="S2429" Action="None" />
+    <Rule Id="S2437" Action="Warning" />
+    <Rule Id="S2551" Action="Warning" />
+    <Rule Id="S2951" Action="Warning" />
+    <Rule Id="S3884" Action="Warning" />
+    <Rule Id="S3889" Action="Warning" />
+    <Rule Id="S3923" Action="Warning" />
+    <Rule Id="S3926" Action="Warning" />
+    <Rule Id="S3927" Action="Warning" />
+    <Rule Id="S3998" Action="Warning" />
+    <Rule Id="S4210" Action="Warning" />
+    <Rule Id="S4423" Action="Warning" />
+    <Rule Id="S4787" Action="None" />
+    <Rule Id="S5542" Action="Warning" />
+    <Rule Id="S5547" Action="Warning" />
+    <Rule Id="S5659" Action="Warning" />
+    <Rule Id="S5944" Action="Warning" />
+    <Rule Id="S6354" Action="None" />
+    <Rule Id="S1048" Action="Warning" />
+    <Rule Id="S1151" Action="None" />
+    <Rule Id="S1155" Action="Warning" />
+    <Rule Id="S126" Action="None" />
+    <Rule Id="S131" Action="None" />
+    <Rule Id="S134" Action="None" />
+    <Rule Id="S2257" Action="Warning" />
+    <Rule Id="S2360" Action="None" />
+    <Rule Id="S2362" Action="None" />
+    <Rule Id="S2363" Action="None" />
+    <Rule Id="S2364" Action="None" />
+    <Rule Id="S2365" Action="Warning" />
+    <Rule Id="S2367" Action="None" />
+    <Rule Id="S2375" Action="Warning" />
+    <Rule Id="S2761" Action="Warning" />
+    <Rule Id="S3453" Action="Warning" />
+    <Rule Id="S3466" Action="Warning" />
+    <Rule Id="S4025" Action="None" />
+    <Rule Id="S4036" Action="Warning" />
+    <Rule Id="S4143" Action="Warning" />
+    <Rule Id="S4144" Action="Warning" />
+    <Rule Id="S4159" Action="Warning" />
+    <Rule Id="S4260" Action="Warning" />
+    <Rule Id="S4428" Action="Warning" />
+    <Rule Id="S4784" Action="None" />
+    <Rule Id="S4823" Action="None" />
+    <Rule Id="S4829" Action="None" />
+    <Rule Id="S4830" Action="Warning" />
+    <Rule Id="S5753" Action="Warning" />
+    <Rule Id="S927" Action="Warning" />
+    <Rule Id="S1163" Action="Warning" />
+    <Rule Id="S138" Action="None" />
+    <Rule Id="S139" Action="None" />
+    <Rule Id="S2255" Action="None" />
+    <Rule Id="S2370" Action="None" />
+    <Rule Id="S2372" Action="Warning" />
+    <Rule Id="S2373" Action="None" />
+    <Rule Id="S2374" Action="None" />
+    <Rule Id="S2376" Action="Warning" />
+    <Rule Id="S3464" Action="Warning" />
+    <Rule Id="S3860" Action="None" />
+    <Rule Id="S3866" Action="None" />
+    <Rule Id="S3869" Action="Warning" />
+    <Rule Id="S3903" Action="Warning" />
+    <Rule Id="S3904" Action="Warning" />
+    <Rule Id="S3981" Action="Warning" />
+    <Rule Id="S4275" Action="Warning" />
+    <Rule Id="S4277" Action="Warning" />
+    <Rule Id="S4790" Action="Warning" />
+    <Rule Id="S4792" Action="Warning" />
+    <Rule Id="S4834" Action="None" />
+  </Rules>
+</RuleSet>

+ 176 - 0
.sonarqube/conf/SonarQubeAnalysisConfig.xml

@@ -0,0 +1,176 @@
+<?xml version="1.0" encoding="utf-8"?>
+<AnalysisConfig xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.sonarsource.com/msbuild/integration/2015/1">
+  <SonarConfigDir>F:\Unity\Projects\Nar Kampen\.sonarqube\conf</SonarConfigDir>
+  <SonarOutputDir>F:\Unity\Projects\Nar Kampen\.sonarqube\out</SonarOutputDir>
+  <SonarBinDir>F:\Unity\Projects\Nar Kampen\.sonarqube\bin</SonarBinDir>
+  <SonarScannerWorkingDirectory>F:\Unity\Projects\Nar Kampen</SonarScannerWorkingDirectory>
+  <HasBeginStepCommandLineCredentials>true</HasBeginStepCommandLineCredentials>
+  <SonarQubeHostUrl>http://nordh.xyz:9088</SonarQubeHostUrl>
+  <SonarQubeVersion>9.4.0.54424</SonarQubeVersion>
+  <SonarProjectKey>narKampen</SonarProjectKey>
+  <AdditionalConfig>
+    <ConfigSetting Id="BuildUri" />
+    <ConfigSetting Id="TfsUri" />
+    <ConfigSetting Id="VsCoverageConverterToolPath" />
+    <ConfigSetting Id="settings.file.path" Value="C:\Users\Axel\.dotnet\tools\.store\dotnet-sonarscanner\5.5.3\dotnet-sonarscanner\5.5.3\tools\netcoreapp3.0\any\SonarQube.Analysis.xml" />
+  </AdditionalConfig>
+  <ServerSettings>
+    <Property Name="sonaranalyzer-cs.nuget.packageVersion">8.36.1.44192</Property>
+    <Property Name="sonar.cs.ignoreHeaderComments">true</Property>
+    <Property Name="sonar.typescript.file.suffixes">.ts,.tsx</Property>
+    <Property Name="email.fromName">SonarQube</Property>
+    <Property Name="sonar.python.xunit.skipDetails">false</Property>
+    <Property Name="sonar.go.exclusions">**/vendor/**</Property>
+    <Property Name="sonar.terraform.file.suffixes">.tf</Property>
+    <Property Name="sonar.forceAuthentication">true</Property>
+    <Property Name="sonar.notifications.delay">60</Property>
+    <Property Name="sonaranalyzer-cs.ruleNamespace">SonarAnalyzer.CSharp</Property>
+    <Property Name="sonar.cs.analyzeGeneratedCode">false</Property>
+    <Property Name="sonar.builtInQualityProfiles.disableNotificationOnUpdate">false</Property>
+    <Property Name="sonar.css.file.suffixes">.css,.less,.scss</Property>
+    <Property Name="sonar.html.file.suffixes">.html,.xhtml,.cshtml,.vbhtml,.aspx,.ascx,.rhtml,.erb,.shtm,.shtml,.cmp,.twig</Property>
+    <Property Name="sonar.auth.gitlab.enabled">false</Property>
+    <Property Name="sonar.cpd.cross_project">false</Property>
+    <Property Name="sonar.vbnet.ignoreHeaderComments">true</Property>
+    <Property Name="sonar.auth.github.groupsSync">false</Property>
+    <Property Name="sonar.scala.file.suffixes">.scala</Property>
+    <Property Name="sonar.cloudformation.activate">true</Property>
+    <Property Name="sonaranalyzer-vbnet.ruleNamespace">SonarAnalyzer.VisualBasic</Property>
+    <Property Name="sonar.cloudformation.file.identifier">AWSTemplateFormatVersion</Property>
+    <Property Name="sonar.javascript.ignoreHeaderComments">true</Property>
+    <Property Name="sonar.dbcleaner.daysBeforeDeletingClosedIssues">30</Property>
+    <Property Name="sonar.dbcleaner.weeksBeforeKeepingOnlyOneSnapshotByMonth">52</Property>
+    <Property Name="sonar.lf.gravatarServerUrl">https://secure.gravatar.com/avatar/{EMAIL_MD5}.jpg?s={SIZE}&amp;d=identicon</Property>
+    <Property Name="sonar.notifications.runningDelayBeforeReportingStatus">600</Property>
+    <Property Name="sonar.jsp.file.suffixes">.jsp,.jspf,.jspx</Property>
+    <Property Name="sonar.javascript.maxFileSize">1000</Property>
+    <Property Name="sonar.javascript.environments">amd, applescript, atomtest, browser, commonjs, couch, embertest, flow, greasemonkey, jasmine, jest, jquery, meteor, mocha, mongo, nashorn, node, phantomjs, prototypejs, protractor, qunit, rhino, serviceworker, shared-node-browser, shelljs, webextensions, worker, wsh, yui</Property>
+    <Property Name="sonar.scm.disabled">false</Property>
+    <Property Name="sonar.ruby.exclusions">**/vendor/**</Property>
+    <Property Name="sonar.auth.saml.enabled">false</Property>
+    <Property Name="sonar.vbnet.file.suffixes">.vb</Property>
+    <Property Name="sonar.technicalDebt.developmentCost">30</Property>
+    <Property Name="sonar.validateWebhooks">true</Property>
+    <Property Name="sonar.python.file.suffixes">py</Property>
+    <Property Name="sonar.cs.file.suffixes">.cs</Property>
+    <Property Name="sonar.allowPermissionManagementForProjectAdmins">true</Property>
+    <Property Name="sonaranalyzer-vbnet.staticResourceName">SonarAnalyzer-8.36.1.44192.zip</Property>
+    <Property Name="sonar.java.file.suffixes">.java,.jav</Property>
+    <Property Name="sonar.kotlin.file.suffixes">.kt</Property>
+    <Property Name="sonar.php.file.suffixes">php,php3,php4,php5,phtml,inc</Property>
+    <Property Name="sonar.xml.file.suffixes">.xml,.xsd,.xsl</Property>
+    <Property Name="sonar.dbcleaner.weeksBeforeDeletingAllSnapshots">260</Property>
+    <Property Name="sonar.updatecenter.cache.ttl">3600000</Property>
+    <Property Name="sonar.auth.bitbucket.allowUsersToSignUp">true</Property>
+    <Property Name="sonar.auth.github.enabled">false</Property>
+    <Property Name="sonar.python.coverage.reportPaths">coverage-reports/*coverage-*.xml</Property>
+    <Property Name="sonaranalyzer-vbnet.nuget.packageVersion">8.36.1.44192</Property>
+    <Property Name="sonar.go.file.suffixes">.go</Property>
+    <Property Name="sonar.auth.saml.applicationId">sonarqube</Property>
+    <Property Name="sonar.dbcleaner.weeksBeforeKeepingOnlyAnalysesWithVersion">104</Property>
+    <Property Name="sonar.qualitygate.ignoreSmallChanges">true</Property>
+    <Property Name="sonar.php.exclusions">**/vendor/**</Property>
+    <Property Name="sonar.vbnet.roslyn.ignoreIssues">false</Property>
+    <Property Name="sonar.flex.file.suffixes">as</Property>
+    <Property Name="sonar.auth.gitlab.groupsSync">false</Property>
+    <Property Name="sonar.auth.github.apiUrl">https://api.github.com/</Property>
+    <Property Name="sonar.ruby.file.suffixes">.rb</Property>
+    <Property Name="sonar.auth.github.allowUsersToSignUp">true</Property>
+    <Property Name="sonar.python.xunit.reportPath">xunit-reports/xunit-result-*.xml</Property>
+    <Property Name="sonar.javascript.globals">angular,goog,google,OenLayers,d3,dojo,dojox,dijit,Backbone,moment,casper,_</Property>
+    <Property Name="sonar.dbcleaner.hoursBeforeKeepingOnlyOneSnapshotByDay">24</Property>
+    <Property Name="sonar.yaml.file.suffixes">.yaml,.yml</Property>
+    <Property Name="sonar.auth.bitbucket.enabled">false</Property>
+    <Property Name="sonar.terraform.activate">true</Property>
+    <Property Name="sonar.auth.github.webUrl">https://github.com/</Property>
+    <Property Name="sonaranalyzer-vbnet.nuget.packageId">SonarAnalyzer.VisualBasic</Property>
+    <Property Name="email.from">noreply@nowhere</Property>
+    <Property Name="sonaranalyzer-vbnet.pluginVersion">8.36.1.44192</Property>
+    <Property Name="sonar.dbcleaner.weeksBeforeKeepingOnlyOneSnapshotByWeek">4</Property>
+    <Property Name="sonaranalyzer-vbnet.analyzerId">SonarAnalyzer.VisualBasic</Property>
+    <Property Name="email.prefix">[SONARQUBE]</Property>
+    <Property Name="sonar.cs.roslyn.ignoreIssues">false</Property>
+    <Property Name="sonaranalyzer-cs.pluginKey">csharp</Property>
+    <Property Name="sonar.json.file.suffixes">.json</Property>
+    <Property Name="sonar.auth.saml.providerName">SAML</Property>
+    <Property Name="sonar.ruby.coverage.reportPaths">coverage/.resultset.json</Property>
+    <Property Name="sonaranalyzer-cs.staticResourceName">SonarAnalyzer-8.36.1.44192.zip</Property>
+    <Property Name="sonar.auth.gitlab.allowUsersToSignUp">true</Property>
+    <Property Name="sonaranalyzer-cs.nuget.packageId">SonarAnalyzer.CSharp</Property>
+    <Property Name="sonar.authenticator.downcase">false</Property>
+    <Property Name="sonaranalyzer-cs.analyzerId">SonarAnalyzer.CSharp</Property>
+    <Property Name="sonar.technicalDebt.ratingGrid">0.05,0.1,0.2,0.5</Property>
+    <Property Name="sonar.lf.enableGravatar">false</Property>
+    <Property Name="sonaranalyzer-cs.pluginVersion">8.36.1.44192</Property>
+    <Property Name="sonar.developerAggregatedInfo.disabled">false</Property>
+    <Property Name="sonar.javascript.file.suffixes">.js,.jsx,.mjs,.vue</Property>
+    <Property Name="sonar.vbnet.analyzeGeneratedCode">false</Property>
+    <Property Name="sonar.plugins.risk.consent">NOT_ACCEPTED</Property>
+    <Property Name="sonar.auth.gitlab.url">https://gitlab.com</Property>
+    <Property Name="sonaranalyzer-vbnet.pluginKey">vbnet</Property>
+    <Property Name="sonar.updatecenter.url">https://update.sonarsource.org/update-center.properties</Property>
+    <Property Name="sonar.core.id">243B8A4D-AYB-puEKMQhf_f0rkCOd</Property>
+    <Property Name="sonar.core.startTime">2022-07-06 22:19:57</Property>
+  </ServerSettings>
+  <LocalSettings>
+    <Property Name="sonar.host.url">http://nordh.xyz:9088</Property>
+  </LocalSettings>
+  <AnalyzersSettings>
+    <AnalyzerSettings>
+      <Language>cs</Language>
+      <RulesetPath>F:\Unity\Projects\Nar Kampen\.sonarqube\conf\Sonar-cs.ruleset</RulesetPath>
+      <DeactivatedRulesetPath>F:\Unity\Projects\Nar Kampen\.sonarqube\conf\Sonar-cs-none.ruleset</DeactivatedRulesetPath>
+      <AnalyzerPlugins>
+        <AnalyzerPlugin Key="csharp" Version="8.36.1.44192" StaticResourceName="SonarAnalyzer-8.36.1.44192.zip">
+          <AssemblyPaths>
+            <Path>C:\Users\Axel\AppData\Local\Temp\.sonarqube\resources\2\Google.Protobuf.dll</Path>
+            <Path>C:\Users\Axel\AppData\Local\Temp\.sonarqube\resources\2\SonarAnalyzer.CFG.dll</Path>
+            <Path>C:\Users\Axel\AppData\Local\Temp\.sonarqube\resources\2\SonarAnalyzer.CSharp.dll</Path>
+            <Path>C:\Users\Axel\AppData\Local\Temp\.sonarqube\resources\2\SonarAnalyzer.dll</Path>
+            <Path>C:\Users\Axel\AppData\Local\Temp\.sonarqube\resources\2\THIRD-PARTY-NOTICES.txt</Path>
+          </AssemblyPaths>
+        </AnalyzerPlugin>
+        <AnalyzerPlugin Key="vbnet" Version="8.36.1.44192" StaticResourceName="SonarAnalyzer-8.36.1.44192.zip">
+          <AssemblyPaths>
+            <Path>C:\Users\Axel\AppData\Local\Temp\.sonarqube\resources\3\Google.Protobuf.dll</Path>
+            <Path>C:\Users\Axel\AppData\Local\Temp\.sonarqube\resources\3\SonarAnalyzer.CFG.dll</Path>
+            <Path>C:\Users\Axel\AppData\Local\Temp\.sonarqube\resources\3\SonarAnalyzer.dll</Path>
+            <Path>C:\Users\Axel\AppData\Local\Temp\.sonarqube\resources\3\SonarAnalyzer.VisualBasic.dll</Path>
+            <Path>C:\Users\Axel\AppData\Local\Temp\.sonarqube\resources\3\THIRD-PARTY-NOTICES.txt</Path>
+          </AssemblyPaths>
+        </AnalyzerPlugin>
+      </AnalyzerPlugins>
+      <AdditionalFilePaths>
+        <Path>F:\Unity\Projects\Nar Kampen\.sonarqube\conf\cs\SonarLint.xml</Path>
+      </AdditionalFilePaths>
+    </AnalyzerSettings>
+    <AnalyzerSettings>
+      <Language>vbnet</Language>
+      <RulesetPath>F:\Unity\Projects\Nar Kampen\.sonarqube\conf\Sonar-vbnet.ruleset</RulesetPath>
+      <DeactivatedRulesetPath>F:\Unity\Projects\Nar Kampen\.sonarqube\conf\Sonar-vbnet-none.ruleset</DeactivatedRulesetPath>
+      <AnalyzerPlugins>
+        <AnalyzerPlugin Key="csharp" Version="8.36.1.44192" StaticResourceName="SonarAnalyzer-8.36.1.44192.zip">
+          <AssemblyPaths>
+            <Path>C:\Users\Axel\AppData\Local\Temp\.sonarqube\resources\2\Google.Protobuf.dll</Path>
+            <Path>C:\Users\Axel\AppData\Local\Temp\.sonarqube\resources\2\SonarAnalyzer.CFG.dll</Path>
+            <Path>C:\Users\Axel\AppData\Local\Temp\.sonarqube\resources\2\SonarAnalyzer.CSharp.dll</Path>
+            <Path>C:\Users\Axel\AppData\Local\Temp\.sonarqube\resources\2\SonarAnalyzer.dll</Path>
+            <Path>C:\Users\Axel\AppData\Local\Temp\.sonarqube\resources\2\THIRD-PARTY-NOTICES.txt</Path>
+          </AssemblyPaths>
+        </AnalyzerPlugin>
+        <AnalyzerPlugin Key="vbnet" Version="8.36.1.44192" StaticResourceName="SonarAnalyzer-8.36.1.44192.zip">
+          <AssemblyPaths>
+            <Path>C:\Users\Axel\AppData\Local\Temp\.sonarqube\resources\3\Google.Protobuf.dll</Path>
+            <Path>C:\Users\Axel\AppData\Local\Temp\.sonarqube\resources\3\SonarAnalyzer.CFG.dll</Path>
+            <Path>C:\Users\Axel\AppData\Local\Temp\.sonarqube\resources\3\SonarAnalyzer.dll</Path>
+            <Path>C:\Users\Axel\AppData\Local\Temp\.sonarqube\resources\3\SonarAnalyzer.VisualBasic.dll</Path>
+            <Path>C:\Users\Axel\AppData\Local\Temp\.sonarqube\resources\3\THIRD-PARTY-NOTICES.txt</Path>
+          </AssemblyPaths>
+        </AnalyzerPlugin>
+      </AnalyzerPlugins>
+      <AdditionalFilePaths>
+        <Path>F:\Unity\Projects\Nar Kampen\.sonarqube\conf\vbnet\SonarLint.xml</Path>
+      </AdditionalFilePaths>
+    </AnalyzerSettings>
+  </AnalyzersSettings>
+</AnalysisConfig>

+ 850 - 0
.sonarqube/conf/cs/SonarLint.xml

@@ -0,0 +1,850 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<AnalysisInput>
+  <Settings>
+    <Setting>
+      <Key>sonar.cs.ignoreHeaderComments</Key>
+      <Value>true</Value>
+    </Setting>
+    <Setting>
+      <Key>sonar.cs.analyzeGeneratedCode</Key>
+      <Value>false</Value>
+    </Setting>
+    <Setting>
+      <Key>sonar.cs.file.suffixes</Key>
+      <Value>.cs</Value>
+    </Setting>
+    <Setting>
+      <Key>sonar.cs.roslyn.ignoreIssues</Key>
+      <Value>false</Value>
+    </Setting>
+  </Settings>
+  <Rules>
+    <Rule>
+      <Key>S1134</Key>
+    </Rule>
+    <Rule>
+      <Key>S1135</Key>
+    </Rule>
+    <Rule>
+      <Key>S1144</Key>
+    </Rule>
+    <Rule>
+      <Key>S1264</Key>
+    </Rule>
+    <Rule>
+      <Key>S2114</Key>
+    </Rule>
+    <Rule>
+      <Key>S2115</Key>
+    </Rule>
+    <Rule>
+      <Key>S2223</Key>
+    </Rule>
+    <Rule>
+      <Key>S2225</Key>
+    </Rule>
+    <Rule>
+      <Key>S2234</Key>
+    </Rule>
+    <Rule>
+      <Key>S2342</Key>
+      <Parameters>
+        <Parameter>
+          <Key>format</Key>
+          <Value>^([A-Z]{1,3}[a-z0-9]+)*([A-Z]{2})?$</Value>
+        </Parameter>
+        <Parameter>
+          <Key>flagsAttributeFormat</Key>
+          <Value>^([A-Z]{1,3}[a-z0-9]+)*([A-Z]{2})?s$</Value>
+        </Parameter>
+      </Parameters>
+    </Rule>
+    <Rule>
+      <Key>S2344</Key>
+    </Rule>
+    <Rule>
+      <Key>S2345</Key>
+    </Rule>
+    <Rule>
+      <Key>S2346</Key>
+    </Rule>
+    <Rule>
+      <Key>S2479</Key>
+    </Rule>
+    <Rule>
+      <Key>S2583</Key>
+    </Rule>
+    <Rule>
+      <Key>S2589</Key>
+    </Rule>
+    <Rule>
+      <Key>S3329</Key>
+    </Rule>
+    <Rule>
+      <Key>S3433</Key>
+    </Rule>
+    <Rule>
+      <Key>S3440</Key>
+    </Rule>
+    <Rule>
+      <Key>S3442</Key>
+    </Rule>
+    <Rule>
+      <Key>S3443</Key>
+    </Rule>
+    <Rule>
+      <Key>S3444</Key>
+    </Rule>
+    <Rule>
+      <Key>S3445</Key>
+    </Rule>
+    <Rule>
+      <Key>S3447</Key>
+    </Rule>
+    <Rule>
+      <Key>S3449</Key>
+    </Rule>
+    <Rule>
+      <Key>S3655</Key>
+    </Rule>
+    <Rule>
+      <Key>S4524</Key>
+    </Rule>
+    <Rule>
+      <Key>S1006</Key>
+    </Rule>
+    <Rule>
+      <Key>S1110</Key>
+    </Rule>
+    <Rule>
+      <Key>S1116</Key>
+    </Rule>
+    <Rule>
+      <Key>S1117</Key>
+    </Rule>
+    <Rule>
+      <Key>S1118</Key>
+    </Rule>
+    <Rule>
+      <Key>S1121</Key>
+    </Rule>
+    <Rule>
+      <Key>S1123</Key>
+    </Rule>
+    <Rule>
+      <Key>S1125</Key>
+    </Rule>
+    <Rule>
+      <Key>S1479</Key>
+      <Parameters>
+        <Parameter>
+          <Key>maximum</Key>
+          <Value>30</Value>
+        </Parameter>
+      </Parameters>
+    </Rule>
+    <Rule>
+      <Key>S1481</Key>
+    </Rule>
+    <Rule>
+      <Key>S2201</Key>
+    </Rule>
+    <Rule>
+      <Key>S2219</Key>
+    </Rule>
+    <Rule>
+      <Key>S2326</Key>
+    </Rule>
+    <Rule>
+      <Key>S2328</Key>
+    </Rule>
+    <Rule>
+      <Key>S2681</Key>
+    </Rule>
+    <Rule>
+      <Key>S2688</Key>
+    </Rule>
+    <Rule>
+      <Key>S2692</Key>
+    </Rule>
+    <Rule>
+      <Key>S2696</Key>
+    </Rule>
+    <Rule>
+      <Key>S2699</Key>
+    </Rule>
+    <Rule>
+      <Key>S3237</Key>
+    </Rule>
+    <Rule>
+      <Key>S3358</Key>
+    </Rule>
+    <Rule>
+      <Key>S3415</Key>
+    </Rule>
+    <Rule>
+      <Key>S3427</Key>
+    </Rule>
+    <Rule>
+      <Key>S3598</Key>
+    </Rule>
+    <Rule>
+      <Key>S3776</Key>
+      <Parameters>
+        <Parameter>
+          <Key>propertyThreshold</Key>
+          <Value>3</Value>
+        </Parameter>
+        <Parameter>
+          <Key>threshold</Key>
+          <Value>15</Value>
+        </Parameter>
+      </Parameters>
+    </Rule>
+    <Rule>
+      <Key>S3897</Key>
+    </Rule>
+    <Rule>
+      <Key>S4502</Key>
+    </Rule>
+    <Rule>
+      <Key>S4507</Key>
+    </Rule>
+    <Rule>
+      <Key>S4635</Key>
+    </Rule>
+    <Rule>
+      <Key>S1066</Key>
+    </Rule>
+    <Rule>
+      <Key>S1172</Key>
+    </Rule>
+    <Rule>
+      <Key>S1185</Key>
+    </Rule>
+    <Rule>
+      <Key>S1186</Key>
+    </Rule>
+    <Rule>
+      <Key>S2275</Key>
+    </Rule>
+    <Rule>
+      <Key>S2368</Key>
+    </Rule>
+    <Rule>
+      <Key>S2386</Key>
+    </Rule>
+    <Rule>
+      <Key>S3005</Key>
+    </Rule>
+    <Rule>
+      <Key>S3236</Key>
+    </Rule>
+    <Rule>
+      <Key>S3241</Key>
+    </Rule>
+    <Rule>
+      <Key>S3244</Key>
+    </Rule>
+    <Rule>
+      <Key>S3246</Key>
+    </Rule>
+    <Rule>
+      <Key>S3247</Key>
+    </Rule>
+    <Rule>
+      <Key>S3249</Key>
+    </Rule>
+    <Rule>
+      <Key>S3457</Key>
+    </Rule>
+    <Rule>
+      <Key>S3597</Key>
+    </Rule>
+    <Rule>
+      <Key>S4200</Key>
+    </Rule>
+    <Rule>
+      <Key>S4201</Key>
+    </Rule>
+    <Rule>
+      <Key>S4210</Key>
+    </Rule>
+    <Rule>
+      <Key>S4211</Key>
+    </Rule>
+    <Rule>
+      <Key>S4214</Key>
+    </Rule>
+    <Rule>
+      <Key>S4456</Key>
+    </Rule>
+    <Rule>
+      <Key>S4457</Key>
+    </Rule>
+    <Rule>
+      <Key>S5542</Key>
+    </Rule>
+    <Rule>
+      <Key>S5547</Key>
+    </Rule>
+    <Rule>
+      <Key>S5659</Key>
+    </Rule>
+    <Rule>
+      <Key>S5773</Key>
+    </Rule>
+    <Rule>
+      <Key>S1048</Key>
+    </Rule>
+    <Rule>
+      <Key>S1155</Key>
+    </Rule>
+    <Rule>
+      <Key>S1168</Key>
+    </Rule>
+    <Rule>
+      <Key>S2123</Key>
+    </Rule>
+    <Rule>
+      <Key>S2245</Key>
+    </Rule>
+    <Rule>
+      <Key>S2259</Key>
+    </Rule>
+    <Rule>
+      <Key>S2365</Key>
+    </Rule>
+    <Rule>
+      <Key>S2486</Key>
+    </Rule>
+    <Rule>
+      <Key>S3217</Key>
+    </Rule>
+    <Rule>
+      <Key>S3218</Key>
+    </Rule>
+    <Rule>
+      <Key>S3330</Key>
+    </Rule>
+    <Rule>
+      <Key>S3450</Key>
+    </Rule>
+    <Rule>
+      <Key>S3451</Key>
+    </Rule>
+    <Rule>
+      <Key>S3453</Key>
+    </Rule>
+    <Rule>
+      <Key>S3456</Key>
+    </Rule>
+    <Rule>
+      <Key>S3458</Key>
+    </Rule>
+    <Rule>
+      <Key>S3459</Key>
+    </Rule>
+    <Rule>
+      <Key>S3466</Key>
+    </Rule>
+    <Rule>
+      <Key>S4423</Key>
+    </Rule>
+    <Rule>
+      <Key>S4426</Key>
+    </Rule>
+    <Rule>
+      <Key>S4428</Key>
+    </Rule>
+    <Rule>
+      <Key>S5753</Key>
+    </Rule>
+    <Rule>
+      <Key>S5766</Key>
+    </Rule>
+    <Rule>
+      <Key>S927</Key>
+    </Rule>
+    <Rule>
+      <Key>S2257</Key>
+    </Rule>
+    <Rule>
+      <Key>S3346</Key>
+    </Rule>
+    <Rule>
+      <Key>S3464</Key>
+    </Rule>
+    <Rule>
+      <Key>S1163</Key>
+    </Rule>
+    <Rule>
+      <Key>S1656</Key>
+    </Rule>
+    <Rule>
+      <Key>S2251</Key>
+    </Rule>
+    <Rule>
+      <Key>S2252</Key>
+    </Rule>
+    <Rule>
+      <Key>S2372</Key>
+    </Rule>
+    <Rule>
+      <Key>S2376</Key>
+    </Rule>
+    <Rule>
+      <Key>S2743</Key>
+    </Rule>
+    <Rule>
+      <Key>S2757</Key>
+    </Rule>
+    <Rule>
+      <Key>S2995</Key>
+    </Rule>
+    <Rule>
+      <Key>S2996</Key>
+    </Rule>
+    <Rule>
+      <Key>S3220</Key>
+    </Rule>
+    <Rule>
+      <Key>S3343</Key>
+    </Rule>
+    <Rule>
+      <Key>S3600</Key>
+    </Rule>
+    <Rule>
+      <Key>S3963</Key>
+    </Rule>
+    <Rule>
+      <Key>S4433</Key>
+    </Rule>
+    <Rule>
+      <Key>S4790</Key>
+    </Rule>
+    <Rule>
+      <Key>S4792</Key>
+    </Rule>
+    <Rule>
+      <Key>S818</Key>
+    </Rule>
+    <Rule>
+      <Key>S907</Key>
+    </Rule>
+    <Rule>
+      <Key>S1643</Key>
+    </Rule>
+    <Rule>
+      <Key>S1751</Key>
+    </Rule>
+    <Rule>
+      <Key>S1764</Key>
+    </Rule>
+    <Rule>
+      <Key>S1871</Key>
+    </Rule>
+    <Rule>
+      <Key>S2612</Key>
+    </Rule>
+    <Rule>
+      <Key>S2737</Key>
+    </Rule>
+    <Rule>
+      <Key>S2755</Key>
+    </Rule>
+    <Rule>
+      <Key>S2857</Key>
+    </Rule>
+    <Rule>
+      <Key>S2971</Key>
+    </Rule>
+    <Rule>
+      <Key>S2997</Key>
+    </Rule>
+    <Rule>
+      <Key>S3603</Key>
+    </Rule>
+    <Rule>
+      <Key>S3604</Key>
+    </Rule>
+    <Rule>
+      <Key>S3875</Key>
+    </Rule>
+    <Rule>
+      <Key>S3966</Key>
+    </Rule>
+    <Rule>
+      <Key>S1104</Key>
+    </Rule>
+    <Rule>
+      <Key>S1210</Key>
+    </Rule>
+    <Rule>
+      <Key>S1215</Key>
+    </Rule>
+    <Rule>
+      <Key>S1450</Key>
+    </Rule>
+    <Rule>
+      <Key>S1699</Key>
+    </Rule>
+    <Rule>
+      <Key>S2306</Key>
+    </Rule>
+    <Rule>
+      <Key>S2436</Key>
+      <Parameters>
+        <Parameter>
+          <Key>max</Key>
+          <Value>2</Value>
+        </Parameter>
+        <Parameter>
+          <Key>maxMethod</Key>
+          <Value>3</Value>
+        </Parameter>
+      </Parameters>
+    </Rule>
+    <Rule>
+      <Key>S2551</Key>
+    </Rule>
+    <Rule>
+      <Key>S3400</Key>
+    </Rule>
+    <Rule>
+      <Key>S3871</Key>
+    </Rule>
+    <Rule>
+      <Key>S3877</Key>
+    </Rule>
+    <Rule>
+      <Key>S3881</Key>
+    </Rule>
+    <Rule>
+      <Key>S3884</Key>
+    </Rule>
+    <Rule>
+      <Key>S3885</Key>
+    </Rule>
+    <Rule>
+      <Key>S3887</Key>
+    </Rule>
+    <Rule>
+      <Key>S3889</Key>
+    </Rule>
+    <Rule>
+      <Key>S3998</Key>
+    </Rule>
+    <Rule>
+      <Key>S1206</Key>
+    </Rule>
+    <Rule>
+      <Key>S1313</Key>
+    </Rule>
+    <Rule>
+      <Key>S1905</Key>
+    </Rule>
+    <Rule>
+      <Key>S1939</Key>
+    </Rule>
+    <Rule>
+      <Key>S1940</Key>
+    </Rule>
+    <Rule>
+      <Key>S1944</Key>
+    </Rule>
+    <Rule>
+      <Key>S2437</Key>
+    </Rule>
+    <Rule>
+      <Key>S2761</Key>
+    </Rule>
+    <Rule>
+      <Key>S3610</Key>
+    </Rule>
+    <Rule>
+      <Key>S3626</Key>
+    </Rule>
+    <Rule>
+      <Key>S3869</Key>
+    </Rule>
+    <Rule>
+      <Key>S3971</Key>
+    </Rule>
+    <Rule>
+      <Key>S3972</Key>
+    </Rule>
+    <Rule>
+      <Key>S3973</Key>
+    </Rule>
+    <Rule>
+      <Key>S3981</Key>
+    </Rule>
+    <Rule>
+      <Key>S3984</Key>
+    </Rule>
+    <Rule>
+      <Key>S4830</Key>
+    </Rule>
+    <Rule>
+      <Key>S5034</Key>
+    </Rule>
+    <Rule>
+      <Key>S125</Key>
+    </Rule>
+    <Rule>
+      <Key>S1607</Key>
+    </Rule>
+    <Rule>
+      <Key>S1848</Key>
+    </Rule>
+    <Rule>
+      <Key>S1854</Key>
+    </Rule>
+    <Rule>
+      <Key>S1862</Key>
+    </Rule>
+    <Rule>
+      <Key>S2930</Key>
+    </Rule>
+    <Rule>
+      <Key>S2953</Key>
+    </Rule>
+    <Rule>
+      <Key>S3903</Key>
+    </Rule>
+    <Rule>
+      <Key>S3923</Key>
+    </Rule>
+    <Rule>
+      <Key>S3925</Key>
+    </Rule>
+    <Rule>
+      <Key>S3926</Key>
+    </Rule>
+    <Rule>
+      <Key>S3927</Key>
+    </Rule>
+    <Rule>
+      <Key>S3928</Key>
+    </Rule>
+    <Rule>
+      <Key>S4061</Key>
+    </Rule>
+    <Rule>
+      <Key>S4070</Key>
+    </Rule>
+    <Rule>
+      <Key>S5042</Key>
+    </Rule>
+    <Rule>
+      <Key>S107</Key>
+      <Parameters>
+        <Parameter>
+          <Key>max</Key>
+          <Value>7</Value>
+        </Parameter>
+      </Parameters>
+    </Rule>
+    <Rule>
+      <Key>S108</Key>
+    </Rule>
+    <Rule>
+      <Key>S110</Key>
+      <Parameters>
+        <Parameter>
+          <Key>max</Key>
+          <Value>5</Value>
+        </Parameter>
+      </Parameters>
+    </Rule>
+    <Rule>
+      <Key>S112</Key>
+    </Rule>
+    <Rule>
+      <Key>S2068</Key>
+      <Parameters>
+        <Parameter>
+          <Key>credentialWords</Key>
+          <Value>password, passwd, pwd, passphrase</Value>
+        </Parameter>
+      </Parameters>
+    </Rule>
+    <Rule>
+      <Key>S2183</Key>
+    </Rule>
+    <Rule>
+      <Key>S2184</Key>
+    </Rule>
+    <Rule>
+      <Key>S2187</Key>
+    </Rule>
+    <Rule>
+      <Key>S2933</Key>
+    </Rule>
+    <Rule>
+      <Key>S2934</Key>
+    </Rule>
+    <Rule>
+      <Key>S3397</Key>
+    </Rule>
+    <Rule>
+      <Key>S3904</Key>
+    </Rule>
+    <Rule>
+      <Key>S4487</Key>
+    </Rule>
+    <Rule>
+      <Key>S5332</Key>
+    </Rule>
+    <Rule>
+      <Key>S5693</Key>
+      <Parameters>
+        <Parameter>
+          <Key>fileUploadSizeLimit</Key>
+          <Value>8000000</Value>
+        </Parameter>
+      </Parameters>
+    </Rule>
+    <Rule>
+      <Key>S1075</Key>
+    </Rule>
+    <Rule>
+      <Key>S1199</Key>
+    </Rule>
+    <Rule>
+      <Key>S2077</Key>
+    </Rule>
+    <Rule>
+      <Key>S2190</Key>
+    </Rule>
+    <Rule>
+      <Key>S3011</Key>
+    </Rule>
+    <Rule>
+      <Key>S3168</Key>
+    </Rule>
+    <Rule>
+      <Key>S3169</Key>
+    </Rule>
+    <Rule>
+      <Key>S3256</Key>
+    </Rule>
+    <Rule>
+      <Key>S3376</Key>
+    </Rule>
+    <Rule>
+      <Key>S4015</Key>
+    </Rule>
+    <Rule>
+      <Key>S4019</Key>
+    </Rule>
+    <Rule>
+      <Key>S4136</Key>
+    </Rule>
+    <Rule>
+      <Key>S101</Key>
+    </Rule>
+    <Rule>
+      <Key>S2053</Key>
+    </Rule>
+    <Rule>
+      <Key>S2178</Key>
+    </Rule>
+    <Rule>
+      <Key>S2290</Key>
+    </Rule>
+    <Rule>
+      <Key>S2291</Key>
+    </Rule>
+    <Rule>
+      <Key>S2292</Key>
+    </Rule>
+    <Rule>
+      <Key>S3010</Key>
+    </Rule>
+    <Rule>
+      <Key>S3251</Key>
+    </Rule>
+    <Rule>
+      <Key>S3260</Key>
+    </Rule>
+    <Rule>
+      <Key>S3261</Key>
+    </Rule>
+    <Rule>
+      <Key>S3262</Key>
+    </Rule>
+    <Rule>
+      <Key>S3263</Key>
+    </Rule>
+    <Rule>
+      <Key>S3264</Key>
+    </Rule>
+    <Rule>
+      <Key>S3265</Key>
+    </Rule>
+    <Rule>
+      <Key>S3267</Key>
+    </Rule>
+    <Rule>
+      <Key>S4220</Key>
+    </Rule>
+    <Rule>
+      <Key>S4581</Key>
+    </Rule>
+    <Rule>
+      <Key>S4583</Key>
+    </Rule>
+    <Rule>
+      <Key>S4586</Key>
+    </Rule>
+    <Rule>
+      <Key>S5443</Key>
+    </Rule>
+    <Rule>
+      <Key>S5445</Key>
+    </Rule>
+    <Rule>
+      <Key>S3172</Key>
+    </Rule>
+    <Rule>
+      <Key>S4035</Key>
+    </Rule>
+    <Rule>
+      <Key>S4036</Key>
+    </Rule>
+    <Rule>
+      <Key>S4143</Key>
+    </Rule>
+    <Rule>
+      <Key>S4144</Key>
+    </Rule>
+    <Rule>
+      <Key>S4158</Key>
+    </Rule>
+    <Rule>
+      <Key>S4159</Key>
+    </Rule>
+    <Rule>
+      <Key>S4260</Key>
+    </Rule>
+    <Rule>
+      <Key>S4275</Key>
+    </Rule>
+    <Rule>
+      <Key>S4277</Key>
+    </Rule>
+    <Rule>
+      <Key>S2092</Key>
+    </Rule>
+    <Rule>
+      <Key>S3060</Key>
+    </Rule>
+    <Rule>
+      <Key>S5122</Key>
+    </Rule>
+  </Rules>
+  <Files>
+  </Files>
+</AnalysisInput>

+ 456 - 0
.sonarqube/conf/vbnet/SonarLint.xml

@@ -0,0 +1,456 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<AnalysisInput>
+  <Settings>
+    <Setting>
+      <Key>sonar.vbnet.ignoreHeaderComments</Key>
+      <Value>true</Value>
+    </Setting>
+    <Setting>
+      <Key>sonar.vbnet.file.suffixes</Key>
+      <Value>.vb</Value>
+    </Setting>
+    <Setting>
+      <Key>sonar.vbnet.roslyn.ignoreIssues</Key>
+      <Value>false</Value>
+    </Setting>
+    <Setting>
+      <Key>sonar.vbnet.analyzeGeneratedCode</Key>
+      <Value>false</Value>
+    </Setting>
+  </Settings>
+  <Rules>
+    <Rule>
+      <Key>S112</Key>
+    </Rule>
+    <Rule>
+      <Key>S1134</Key>
+    </Rule>
+    <Rule>
+      <Key>S1135</Key>
+    </Rule>
+    <Rule>
+      <Key>S1654</Key>
+      <Parameters>
+        <Parameter>
+          <Key>format</Key>
+          <Value>^[a-z][a-z0-9]*([A-Z]{1,3}[a-z0-9]+)*([A-Z]{2})?$</Value>
+        </Parameter>
+      </Parameters>
+    </Rule>
+    <Rule>
+      <Key>S1656</Key>
+    </Rule>
+    <Rule>
+      <Key>S2068</Key>
+      <Parameters>
+        <Parameter>
+          <Key>credentialWords</Key>
+          <Value>password, passwd, pwd, passphrase</Value>
+        </Parameter>
+      </Parameters>
+    </Rule>
+    <Rule>
+      <Key>S2340</Key>
+    </Rule>
+    <Rule>
+      <Key>S2342</Key>
+      <Parameters>
+        <Parameter>
+          <Key>format</Key>
+          <Value>^([A-Z]{1,3}[a-z0-9]+)*([A-Z]{2})?$</Value>
+        </Parameter>
+        <Parameter>
+          <Key>flagsAttributeFormat</Key>
+          <Value>^([A-Z]{1,3}[a-z0-9]+)*([A-Z]{2})?s$</Value>
+        </Parameter>
+      </Parameters>
+    </Rule>
+    <Rule>
+      <Key>S2344</Key>
+    </Rule>
+    <Rule>
+      <Key>S2345</Key>
+    </Rule>
+    <Rule>
+      <Key>S2346</Key>
+    </Rule>
+    <Rule>
+      <Key>S2347</Key>
+      <Parameters>
+        <Parameter>
+          <Key>format</Key>
+          <Value>^(([a-z][a-z0-9]*)?([A-Z]{1,3}[a-z0-9]+)*([A-Z]{2})?_)?([A-Z]{1,3}[a-z0-9]+)*([A-Z]{2})?$</Value>
+        </Parameter>
+      </Parameters>
+    </Rule>
+    <Rule>
+      <Key>S6146</Key>
+    </Rule>
+    <Rule>
+      <Key>S107</Key>
+      <Parameters>
+        <Parameter>
+          <Key>max</Key>
+          <Value>7</Value>
+        </Parameter>
+      </Parameters>
+    </Rule>
+    <Rule>
+      <Key>S108</Key>
+    </Rule>
+    <Rule>
+      <Key>S114</Key>
+      <Parameters>
+        <Parameter>
+          <Key>format</Key>
+          <Value>^I([A-Z]{1,3}[a-z0-9]+)*([A-Z]{2})?$</Value>
+        </Parameter>
+      </Parameters>
+    </Rule>
+    <Rule>
+      <Key>S117</Key>
+      <Parameters>
+        <Parameter>
+          <Key>format</Key>
+          <Value>^[a-z][a-z0-9]*([A-Z]{1,3}[a-z0-9]+)*([A-Z]{2})?$</Value>
+        </Parameter>
+      </Parameters>
+    </Rule>
+    <Rule>
+      <Key>S1542</Key>
+      <Parameters>
+        <Parameter>
+          <Key>format</Key>
+          <Value>^([A-Z]{1,3}[a-z0-9]+)*([A-Z]{2})?$</Value>
+        </Parameter>
+      </Parameters>
+    </Rule>
+    <Rule>
+      <Key>S1940</Key>
+    </Rule>
+    <Rule>
+      <Key>S2077</Key>
+    </Rule>
+    <Rule>
+      <Key>S2234</Key>
+    </Rule>
+    <Rule>
+      <Key>S2349</Key>
+    </Rule>
+    <Rule>
+      <Key>S2352</Key>
+    </Rule>
+    <Rule>
+      <Key>S2355</Key>
+    </Rule>
+    <Rule>
+      <Key>S2358</Key>
+    </Rule>
+    <Rule>
+      <Key>S2359</Key>
+    </Rule>
+    <Rule>
+      <Key>S2757</Key>
+    </Rule>
+    <Rule>
+      <Key>S3449</Key>
+    </Rule>
+    <Rule>
+      <Key>S3603</Key>
+    </Rule>
+    <Rule>
+      <Key>S3776</Key>
+      <Parameters>
+        <Parameter>
+          <Key>propertyThreshold</Key>
+          <Value>3</Value>
+        </Parameter>
+        <Parameter>
+          <Key>threshold</Key>
+          <Value>15</Value>
+        </Parameter>
+      </Parameters>
+    </Rule>
+    <Rule>
+      <Key>S4136</Key>
+    </Rule>
+    <Rule>
+      <Key>S5693</Key>
+      <Parameters>
+        <Parameter>
+          <Key>fileUploadSizeLimit</Key>
+          <Value>8000000</Value>
+        </Parameter>
+      </Parameters>
+    </Rule>
+    <Rule>
+      <Key>S6145</Key>
+    </Rule>
+    <Rule>
+      <Key>S907</Key>
+    </Rule>
+    <Rule>
+      <Key>S101</Key>
+      <Parameters>
+        <Parameter>
+          <Key>format</Key>
+          <Value>^([A-Z]{1,3}[a-z0-9]+)*([A-Z]{2})?$</Value>
+        </Parameter>
+      </Parameters>
+    </Rule>
+    <Rule>
+      <Key>S1075</Key>
+    </Rule>
+    <Rule>
+      <Key>S1110</Key>
+    </Rule>
+    <Rule>
+      <Key>S1125</Key>
+    </Rule>
+    <Rule>
+      <Key>S1197</Key>
+    </Rule>
+    <Rule>
+      <Key>S1479</Key>
+      <Parameters>
+        <Parameter>
+          <Key>maximum</Key>
+          <Value>30</Value>
+        </Parameter>
+      </Parameters>
+    </Rule>
+    <Rule>
+      <Key>S1481</Key>
+    </Rule>
+    <Rule>
+      <Key>S1643</Key>
+    </Rule>
+    <Rule>
+      <Key>S1645</Key>
+    </Rule>
+    <Rule>
+      <Key>S1751</Key>
+    </Rule>
+    <Rule>
+      <Key>S1764</Key>
+    </Rule>
+    <Rule>
+      <Key>S1871</Key>
+    </Rule>
+    <Rule>
+      <Key>S2178</Key>
+    </Rule>
+    <Rule>
+      <Key>S2387</Key>
+    </Rule>
+    <Rule>
+      <Key>S2612</Key>
+    </Rule>
+    <Rule>
+      <Key>S2692</Key>
+    </Rule>
+    <Rule>
+      <Key>S2737</Key>
+    </Rule>
+    <Rule>
+      <Key>S3011</Key>
+    </Rule>
+    <Rule>
+      <Key>S3358</Key>
+    </Rule>
+    <Rule>
+      <Key>S3385</Key>
+    </Rule>
+    <Rule>
+      <Key>S3598</Key>
+    </Rule>
+    <Rule>
+      <Key>S4201</Key>
+    </Rule>
+    <Rule>
+      <Key>S4507</Key>
+    </Rule>
+    <Rule>
+      <Key>S4583</Key>
+    </Rule>
+    <Rule>
+      <Key>S4586</Key>
+    </Rule>
+    <Rule>
+      <Key>S5042</Key>
+    </Rule>
+    <Rule>
+      <Key>S5443</Key>
+    </Rule>
+    <Rule>
+      <Key>S5445</Key>
+    </Rule>
+    <Rule>
+      <Key>S1066</Key>
+    </Rule>
+    <Rule>
+      <Key>S1172</Key>
+    </Rule>
+    <Rule>
+      <Key>S1186</Key>
+    </Rule>
+    <Rule>
+      <Key>S1313</Key>
+    </Rule>
+    <Rule>
+      <Key>S1862</Key>
+    </Rule>
+    <Rule>
+      <Key>S2304</Key>
+      <Parameters>
+        <Parameter>
+          <Key>format</Key>
+          <Value>^([A-Z]{1,3}[a-z0-9]+)*([A-Z]{2})?(\.([A-Z]{1,3}[a-z0-9]+)*([A-Z]{2})?)*$</Value>
+        </Parameter>
+      </Parameters>
+    </Rule>
+    <Rule>
+      <Key>S2368</Key>
+    </Rule>
+    <Rule>
+      <Key>S2437</Key>
+    </Rule>
+    <Rule>
+      <Key>S2551</Key>
+    </Rule>
+    <Rule>
+      <Key>S2951</Key>
+    </Rule>
+    <Rule>
+      <Key>S3884</Key>
+    </Rule>
+    <Rule>
+      <Key>S3889</Key>
+    </Rule>
+    <Rule>
+      <Key>S3923</Key>
+    </Rule>
+    <Rule>
+      <Key>S3926</Key>
+    </Rule>
+    <Rule>
+      <Key>S3927</Key>
+    </Rule>
+    <Rule>
+      <Key>S3998</Key>
+    </Rule>
+    <Rule>
+      <Key>S4210</Key>
+    </Rule>
+    <Rule>
+      <Key>S4423</Key>
+    </Rule>
+    <Rule>
+      <Key>S5542</Key>
+    </Rule>
+    <Rule>
+      <Key>S5547</Key>
+    </Rule>
+    <Rule>
+      <Key>S5659</Key>
+    </Rule>
+    <Rule>
+      <Key>S5944</Key>
+    </Rule>
+    <Rule>
+      <Key>S1048</Key>
+    </Rule>
+    <Rule>
+      <Key>S1155</Key>
+    </Rule>
+    <Rule>
+      <Key>S2257</Key>
+    </Rule>
+    <Rule>
+      <Key>S2365</Key>
+    </Rule>
+    <Rule>
+      <Key>S2375</Key>
+      <Parameters>
+        <Parameter>
+          <Key>minimumSeriesLength</Key>
+          <Value>6</Value>
+        </Parameter>
+      </Parameters>
+    </Rule>
+    <Rule>
+      <Key>S2761</Key>
+    </Rule>
+    <Rule>
+      <Key>S3453</Key>
+    </Rule>
+    <Rule>
+      <Key>S3466</Key>
+    </Rule>
+    <Rule>
+      <Key>S4036</Key>
+    </Rule>
+    <Rule>
+      <Key>S4143</Key>
+    </Rule>
+    <Rule>
+      <Key>S4144</Key>
+    </Rule>
+    <Rule>
+      <Key>S4159</Key>
+    </Rule>
+    <Rule>
+      <Key>S4260</Key>
+    </Rule>
+    <Rule>
+      <Key>S4428</Key>
+    </Rule>
+    <Rule>
+      <Key>S4830</Key>
+    </Rule>
+    <Rule>
+      <Key>S5753</Key>
+    </Rule>
+    <Rule>
+      <Key>S927</Key>
+    </Rule>
+    <Rule>
+      <Key>S1163</Key>
+    </Rule>
+    <Rule>
+      <Key>S2372</Key>
+    </Rule>
+    <Rule>
+      <Key>S2376</Key>
+    </Rule>
+    <Rule>
+      <Key>S3464</Key>
+    </Rule>
+    <Rule>
+      <Key>S3869</Key>
+    </Rule>
+    <Rule>
+      <Key>S3903</Key>
+    </Rule>
+    <Rule>
+      <Key>S3904</Key>
+    </Rule>
+    <Rule>
+      <Key>S3981</Key>
+    </Rule>
+    <Rule>
+      <Key>S4275</Key>
+    </Rule>
+    <Rule>
+      <Key>S4277</Key>
+    </Rule>
+    <Rule>
+      <Key>S4790</Key>
+    </Rule>
+    <Rule>
+      <Key>S4792</Key>
+    </Rule>
+  </Rules>
+  <Files>
+  </Files>
+</AnalysisInput>

+ 137 - 0
.sonarqube/out/0/Issues.json

@@ -0,0 +1,137 @@
+{
+  "$schema": "http://json.schemastore.org/sarif-1.0.0",
+  "version": "1.0.0",
+  "runs": [
+    {
+      "tool": {
+        "name": "Microsoft (R) Visual C# Compiler",
+        "version": "3.7.0.0",
+        "fileVersion": "3.7.0-6.20570.4 (dc3f4eef)",
+        "semanticVersion": "3.7.0",
+        "language": "en-US"
+      },
+      "results": [
+        {
+          "ruleId": "CS2001",
+          "level": "error",
+          "message": "Source file 'F:\\Unity\\Projects\\Nar Kampen\\Assets\\Scripts\\DropZone.cs' could not be found."
+        },
+        {
+          "ruleId": "CS2001",
+          "level": "error",
+          "message": "Source file 'F:\\Unity\\Projects\\Nar Kampen\\Assets\\Scripts\\NewQuestion.cs' could not be found."
+        },
+        {
+          "ruleId": "CS2001",
+          "level": "error",
+          "message": "Source file 'F:\\Unity\\Projects\\Nar Kampen\\Assets\\Scripts\\RoundButtonsScript.cs' could not be found."
+        },
+        {
+          "ruleId": "CS2001",
+          "level": "error",
+          "message": "Source file 'F:\\Unity\\Projects\\Nar Kampen\\Assets\\Scripts\\PlayerInfo.cs' could not be found."
+        },
+        {
+          "ruleId": "CS2001",
+          "level": "error",
+          "message": "Source file 'F:\\Unity\\Projects\\Nar Kampen\\Assets\\Scripts\\CategoryPanel.cs' could not be found."
+        },
+        {
+          "ruleId": "CS2001",
+          "level": "error",
+          "message": "Source file 'F:\\Unity\\Projects\\Nar Kampen\\Assets\\Scripts\\LocalGameScript.cs' could not be found."
+        },
+        {
+          "ruleId": "CS2001",
+          "level": "error",
+          "message": "Source file 'F:\\Unity\\Projects\\Nar Kampen\\Assets\\Scripts\\OnlineGameScript.cs' could not be found."
+        },
+        {
+          "ruleId": "CS2001",
+          "level": "error",
+          "message": "Source file 'F:\\Unity\\Projects\\Nar Kampen\\Assets\\Scripts\\ScrollViewScript.cs' could not be found."
+        },
+        {
+          "ruleId": "CS2001",
+          "level": "error",
+          "message": "Source file 'F:\\Unity\\Projects\\Nar Kampen\\Assets\\Scripts\\PlayerSetting.cs' could not be found."
+        },
+        {
+          "ruleId": "CS2001",
+          "level": "error",
+          "message": "Source file 'F:\\Unity\\Projects\\Nar Kampen\\Assets\\Scripts\\OnlinePlayerInfoScript.cs' could not be found."
+        },
+        {
+          "ruleId": "CS2001",
+          "level": "error",
+          "message": "Source file 'F:\\Unity\\Projects\\Nar Kampen\\Assets\\Scripts\\StatsLine.cs' could not be found."
+        },
+        {
+          "ruleId": "CS2001",
+          "level": "error",
+          "message": "Source file 'F:\\Unity\\Projects\\Nar Kampen\\Assets\\Scripts\\PinchZoom.cs' could not be found."
+        },
+        {
+          "ruleId": "CS2001",
+          "level": "error",
+          "message": "Source file 'F:\\Unity\\Projects\\Nar Kampen\\Assets\\Scripts\\StatsScript.cs' could not be found."
+        },
+        {
+          "ruleId": "CS2001",
+          "level": "error",
+          "message": "Source file 'F:\\Unity\\Projects\\Nar Kampen\\Assets\\Scripts\\QuestionCard.cs' could not be found."
+        },
+        {
+          "ruleId": "CS2001",
+          "level": "error",
+          "message": "Source file 'F:\\Unity\\Projects\\Nar Kampen\\Assets\\Scripts\\TimerScript.cs' could not be found."
+        },
+        {
+          "ruleId": "CS2001",
+          "level": "error",
+          "message": "Source file 'F:\\Unity\\Projects\\Nar Kampen\\Assets\\Scripts\\Draggable.cs' could not be found."
+        },
+        {
+          "ruleId": "CS2001",
+          "level": "error",
+          "message": "Source file 'F:\\Unity\\Projects\\Nar Kampen\\Assets\\Scripts\\InformationPanelScript.cs' could not be found."
+        },
+        {
+          "ruleId": "CS2001",
+          "level": "error",
+          "message": "Source file 'F:\\Unity\\Projects\\Nar Kampen\\Assets\\Scripts\\InvitePanelScript.cs' could not be found."
+        },
+        {
+          "ruleId": "CS2001",
+          "level": "error",
+          "message": "Source file 'F:\\Unity\\Projects\\Nar Kampen\\Assets\\Scripts\\InviteSearchResult.cs' could not be found."
+        },
+        {
+          "ruleId": "CS2001",
+          "level": "error",
+          "message": "Source file 'F:\\Unity\\Projects\\Nar Kampen\\Assets\\Scripts\\GameInfoScript.cs' could not be found."
+        },
+        {
+          "ruleId": "CS2001",
+          "level": "error",
+          "message": "Source file 'F:\\Unity\\Projects\\Nar Kampen\\Assets\\Scripts\\NewOnlineGame.cs' could not be found."
+        }
+      ],
+      "rules": {
+        "CS2001": {
+          "id": "CS2001",
+          "defaultLevel": "error",
+          "properties": {
+            "category": "Compiler",
+            "isEnabledByDefault": true,
+            "tags": [
+              "Compiler",
+              "Telemetry",
+              "NotConfigurable"
+            ]
+          }
+        }
+      }
+    }
+  ]
+}

+ 24 - 2
.vscode/settings.json

@@ -1,4 +1,4 @@
-{
+{
     "files.exclude":
     {
         "**/.DS_Store":true,
@@ -52,5 +52,27 @@
         "ProjectSettings/":true,
         "temp/":true,
         "Temp/":true
-    }
+    },
+    "sonar-dotnet-vscode.connection.project": {
+        "projectKey": "narKampen"
+    },
+    "sonarlint.analyzerProperties": {
+
+    },
+
+    "sonarlint.connectedMode.project": {
+      "connectionId": "narKampen-CON-ID",
+          "projectKey": "Nar Kampen"
+      },
+
+      "sonarlint.ls.javaHome": "C:\\Program Files\\Java\\jdk-14.0.2",
+      "sonarqube-rules-synchroniser.Sonarqube-projectkey": "narKampen",
+      "sonarqube-rules-synchroniser.Sonarqube-token": "6e98aad9ad84f310e7540e7c736e4307a39e5b21",
+      "sonarqube-rules-synchroniser.Sonarqube-url": "nordh.xyz:9088",
+      "omnisharp.analyzeOpenDocumentsOnly": false,
+      "omnisharp.enableRoslynAnalyzers": false,
+
+    "sonarlint.connectedMode.connections.sonarqube": [
+        { "connectionId": "narKampen", "serverUrl": "http://nordh.xyz:9088", "token": "6e98aad9ad84f310e7540e7c736e4307a39e5b21" }
+    ]
 }

+ 31 - 34
Assets/AnswerLineInfoScript.cs

@@ -1,27 +1,26 @@
 using System;
 using System.Collections;
 using System.Collections.Generic;
+using System.Linq;
 using UnityEngine;
 using UnityEngine.UI;
-using System.Linq;
 
-public class AnswerLineInfoScript : MonoBehaviour
-{
+public class AnswerLineInfoScript : MonoBehaviour {
 
-    [SerializeField] Button nextPlayerButton;
-    [SerializeField] Button prevPlayerButton;
-    [SerializeField] Text lockedQuestionsText;
-    [SerializeField] Text unlockedQuestionsText;
-    [SerializeField] GameObject scrollView;
-    [SerializeField] GameObject answerLine;
-    [SerializeField] GameObject newQuestion;
+    [SerializeField] readonly Button nextPlayerButton;
+    [SerializeField] readonly Button prevPlayerButton;
+    [SerializeField] readonly Text lockedQuestionsText;
+    [SerializeField] readonly Text unlockedQuestionsText;
+    [SerializeField] readonly GameObject scrollView;
+    [SerializeField] readonly GameObject answerLine;
+    [SerializeField] readonly GameObject newQuestion;
 
-    [SerializeField] GameObject gameManager;
+    [SerializeField] readonly GameObject gameManager;
     private List<KeyValuePair<string, int>> players;
     private string currentPlayerShown;
     private String signedInName;
     private GameManagerScript gameManagerScript;
-    
+
     private List<AnswerLineQuestionCard> signedInPlayerQuestions = new List<AnswerLineQuestionCard>();
     private void Start() {
         nextPlayerButton.onClick.AddListener(ShowNextPlayerAnswerLine);
@@ -34,9 +33,9 @@ public class AnswerLineInfoScript : MonoBehaviour
     private void Update() {
         UpdateLockedQuestionsText();
         UpdateUnlockedQuestionsText();
-        UpdateButtonsText(); 
+        UpdateButtonsText();
         SetQuestionClickable();
-        if (signedInName.Equals(currentPlayerShown, StringComparison.InvariantCultureIgnoreCase) && 
+        if (signedInName.Equals(currentPlayerShown, StringComparison.InvariantCultureIgnoreCase) &&
             signedInPlayerQuestions != answerLine.GetComponentsInChildren<AnswerLineQuestionCard>().ToList()) {
             signedInPlayerQuestions = answerLine.GetComponentsInChildren<AnswerLineQuestionCard>().ToList();
         }
@@ -54,10 +53,10 @@ public class AnswerLineInfoScript : MonoBehaviour
                     }
                 }
             } else {
-                    newQuestion.GetComponent<NewQuestionCardController>().BackClickable = true;
+                newQuestion.GetComponent<NewQuestionCardController>().BackClickable = true;
             }
         } else {
-                    newQuestion.GetComponent<NewQuestionCardController>().BackClickable = false;
+            newQuestion.GetComponent<NewQuestionCardController>().BackClickable = false;
         }
     }
 
@@ -76,21 +75,21 @@ public class AnswerLineInfoScript : MonoBehaviour
             if (gameManagerScript.GameMode.Equals(Constants.ONLINE) && currentPlayerShown == null) { // fungerar enbart vid online
                 currentPlayerShown = signedInName;
             } else if (gameManagerScript.GameMode.Equals(Constants.LOCAL) && currentPlayerShown == null) {
-                currentPlayerShown = Database.Instance.GetCurrentPlayer(gameManagerScript.GameId,gameManagerScript.GameMode);
+                currentPlayerShown = Database.Instance.GetCurrentPlayer(gameManagerScript.GameId, gameManagerScript.GameMode);
             }
 
             string playerBaseText = LocalizationManager.Instance.GetText("ANSWERLINE_OTHER_PLAYER");
             for (int i = 0; i < players.Count; i++) {
                 if (players[i].Key.Equals(currentPlayerShown, StringComparison.InvariantCultureIgnoreCase)) {
                     if (i + 1 < players.Count) {
-                        if (players[i+1].Key.Equals(signedInName, StringComparison.InvariantCultureIgnoreCase)) {
+                        if (players[i + 1].Key.Equals(signedInName, StringComparison.InvariantCultureIgnoreCase)) {
                             nextPlayerButton.GetComponent<AnswerLineInfoPlayerButton>().PlayerName = LocalizationManager.Instance.GetText("YOUR");
                         } else {
                             nextPlayerButton.GetComponent<AnswerLineInfoPlayerButton>().PlayerName = players[i + 1].Key + "s";
                         }
                         nextPlayerButton.GetComponentInChildren<Text>().text = String.Format(playerBaseText, nextPlayerButton.GetComponent<AnswerLineInfoPlayerButton>().PlayerName);
                         if (i - 1 >= 0) {
-                            if (players[i-1].Key.Equals(signedInName, StringComparison.InvariantCultureIgnoreCase)) {
+                            if (players[i - 1].Key.Equals(signedInName, StringComparison.InvariantCultureIgnoreCase)) {
                                 prevPlayerButton.GetComponent<AnswerLineInfoPlayerButton>().PlayerName = LocalizationManager.Instance.GetText("YOUR");
                             } else {
                                 prevPlayerButton.GetComponent<AnswerLineInfoPlayerButton>().PlayerName = players[i - 1].Key + "s";
@@ -99,7 +98,7 @@ public class AnswerLineInfoScript : MonoBehaviour
                             if (players[players.Count - 1].Key.Equals(signedInName, StringComparison.InvariantCultureIgnoreCase)) {
                                 prevPlayerButton.GetComponent<AnswerLineInfoPlayerButton>().PlayerName = LocalizationManager.Instance.GetText("YOUR");
                             } else {
-                                prevPlayerButton.GetComponent<AnswerLineInfoPlayerButton>().PlayerName = players[players.Count-1].Key + "s";
+                                prevPlayerButton.GetComponent<AnswerLineInfoPlayerButton>().PlayerName = players[players.Count - 1].Key + "s";
                             }
                         }
                         prevPlayerButton.GetComponentInChildren<Text>().text = String.Format(playerBaseText, prevPlayerButton.GetComponent<AnswerLineInfoPlayerButton>().PlayerName);
@@ -111,11 +110,11 @@ public class AnswerLineInfoScript : MonoBehaviour
                             nextPlayerButton.GetComponent<AnswerLineInfoPlayerButton>().PlayerName = players[0].Key + "s";
                         }
                         nextPlayerButton.GetComponentInChildren<Text>().text = String.Format(playerBaseText, nextPlayerButton.GetComponent<AnswerLineInfoPlayerButton>().PlayerName);
-                        
-                        if (players[i-1].Key.Equals(signedInName, StringComparison.InvariantCultureIgnoreCase)) {
-                                prevPlayerButton.GetComponent<AnswerLineInfoPlayerButton>().PlayerName = LocalizationManager.Instance.GetText("YOUR");
+
+                        if (players[i - 1].Key.Equals(signedInName, StringComparison.InvariantCultureIgnoreCase)) {
+                            prevPlayerButton.GetComponent<AnswerLineInfoPlayerButton>().PlayerName = LocalizationManager.Instance.GetText("YOUR");
                         } else {
-                            prevPlayerButton.GetComponent<AnswerLineInfoPlayerButton>().PlayerName = players[i-1].Key + "s";
+                            prevPlayerButton.GetComponent<AnswerLineInfoPlayerButton>().PlayerName = players[i - 1].Key + "s";
                         }
                         prevPlayerButton.GetComponentInChildren<Text>().text = String.Format(playerBaseText, prevPlayerButton.GetComponent<AnswerLineInfoPlayerButton>().PlayerName);
                         break;
@@ -133,7 +132,7 @@ public class AnswerLineInfoScript : MonoBehaviour
             unlockedQuestionsText.gameObject.SetActive(true);
             unlockedQuestionsText.text = String.Format(
                 LocalizationManager.Instance.GetText(
-                    unlockedQuestionsText.GetComponent<TextLocalization>().key), 
+                    unlockedQuestionsText.GetComponent<TextLocalization>().key),
                 unlockedQuestionCount);
         }
     }
@@ -141,29 +140,28 @@ public class AnswerLineInfoScript : MonoBehaviour
     private void UpdateLockedQuestionsText() {
         ScrollViewScript scrollViewScript = scrollView.GetComponent<ScrollViewScript>();
         int lockedQuestionsCount = scrollViewScript.GetQuestionIdsInAnswerLine().Count - scrollViewScript.GetUnlockedQuestionCount();
-            String playerText;
+        String playerText;
         if (currentPlayerShown == null || currentPlayerShown.Equals(signedInName, StringComparison.InvariantCultureIgnoreCase)) {
             playerText = LocalizationManager.Instance.GetText("YOU");
         } else {
             playerText = currentPlayerShown;
         }
 
-        if (lockedQuestionsText != null){
+        if (lockedQuestionsText != null) {
             lockedQuestionsText.text = String.Format(
                 LocalizationManager.Instance.GetText(
-                    lockedQuestionsText.GetComponent<TextLocalization>().key), 
+                    lockedQuestionsText.GetComponent<TextLocalization>().key),
                     playerText,
                     lockedQuestionsCount);
         }
     }
 
-    private void ShowNextPlayerAnswerLine()
-    {
+    private void ShowNextPlayerAnswerLine() {
         if (nextPlayerButton.GetComponent<AnswerLineInfoPlayerButton>().PlayerName.Equals(LocalizationManager.Instance.GetText("YOUR"))) {
             currentPlayerShown = signedInName;
         } else {
             currentPlayerShown = nextPlayerButton.GetComponent<AnswerLineInfoPlayerButton>().PlayerName;
-            currentPlayerShown = currentPlayerShown.Substring(0,currentPlayerShown.Length - 1);
+            currentPlayerShown = currentPlayerShown.Substring(0, currentPlayerShown.Length - 1);
         }
 
         if (currentPlayerShown.Equals(signedInName, StringComparison.InvariantCultureIgnoreCase)) {
@@ -179,8 +177,7 @@ public class AnswerLineInfoScript : MonoBehaviour
         UpdateButtonsText();
     }
 
-    private void ShowPrevPlayerAnswerLine()
-    {       
+    private void ShowPrevPlayerAnswerLine() {
         if (prevPlayerButton.GetComponent<AnswerLineInfoPlayerButton>().PlayerName.Equals(LocalizationManager.Instance.GetText("YOUR"))) {
             currentPlayerShown = signedInName;
         } else {
@@ -211,7 +208,7 @@ public class AnswerLineInfoScript : MonoBehaviour
             } else {
                 scrollViewScript.SetQuestionsFrosted(true);
             }
-        } else  {
+        } else {
             if (currentPlayerShown.Equals(Database.Instance.GetCurrentPlayer(gameManagerScript.GameId, gameManagerScript.GameMode), StringComparison.InvariantCultureIgnoreCase)) {
                 scrollViewScript.SetQuestionsFrosted(false);
             } else {

+ 6 - 9
Assets/CategorySelection.cs

@@ -4,11 +4,10 @@ using System.Collections.Generic;
 using UnityEngine;
 using UnityEngine.UI;
 
-public class CategorySelection : MonoBehaviour
-{
+public class CategorySelection : MonoBehaviour {
 
-    [SerializeField] Text CategoryNameText;
-    [SerializeField] Toggle selectionToggle;
+    [SerializeField] readonly Text CategoryNameText;
+    [SerializeField] readonly Toggle selectionToggle;
     private int questionCount;
 
     private Boolean selected;
@@ -17,8 +16,7 @@ public class CategorySelection : MonoBehaviour
     public bool Selected { get => selected; set => selected = value; }
 
     // Start is called before the first frame update
-    void Start()
-    {
+    void Start() {
         selectionToggle.onValueChanged.AddListener(SelectionChanged);
     }
 
@@ -27,9 +25,8 @@ public class CategorySelection : MonoBehaviour
     }
 
     // Update is called once per frame
-    void Update()
-    {
-        
+    void Update() {
+
     }
 
     internal void SetCategoryText(string categoryName, int questionCount) {

+ 3 - 5
Assets/Scripts/PrivacyPolicy.cs

@@ -4,14 +4,12 @@ using System.Collections.Generic;
 using UnityEngine;
 using UnityEngine.UI;
 
-public class PrivacyPolicy : MonoBehaviour
-{
+public class PrivacyPolicy : MonoBehaviour {
     Button pp;
-    private string privacyPolicyLink = "http://nordh.xyz/narKampen/privacy_policy.html";
+    private readonly string privacyPolicyLink = "http://nordh.xyz/narKampen/privacy_policy.html";
 
     // Start is called before the first frame update
-    void Start()
-    {
+    void Start() {
         pp = this.GetComponent<Button>();
         pp.onClick.AddListener(OpenWebpage);
     }

+ 12 - 23
Assets/SelectCategoryScript.cs

@@ -1,12 +1,11 @@
 using System;
 using System.Collections;
 using System.Collections.Generic;
+using System.Linq;
 using UnityEngine;
 using UnityEngine.UI;
-using System.Linq;
 
-public class SelectCategoryScript : MonoBehaviour
-{
+public class SelectCategoryScript : MonoBehaviour {
 
     [SerializeField] Button doneButton;
     [SerializeField] Button closeButton;
@@ -19,8 +18,7 @@ public class SelectCategoryScript : MonoBehaviour
     // Start is called before the first frame update
 
     private List<CategoryPanel.Category> categories;
-    private void Start()
-    {
+    private void Start() {
         doneButton.onClick.AddListener(CloseDialogAction);
         closeButton.onClick.AddListener(CloseDialogAction);
 
@@ -29,8 +27,7 @@ public class SelectCategoryScript : MonoBehaviour
         updateTotalsText();
 
         int pos = 0;
-        foreach (CategoryPanel.Category cat in categories)
-        {
+        foreach (CategoryPanel.Category cat in categories) {
             GameObject go = Instantiate(CategoryToSelectPrefab, Vector3.zero, Quaternion.identity);
             CategorySelection c = go.GetComponent<CategorySelection>();
             c.SetSelected(true);
@@ -47,13 +44,12 @@ public class SelectCategoryScript : MonoBehaviour
     }
 
     private void updateTotalsText() {
-        string totalsText = String.Format(LocalizationManager.Instance.GetText(TotalsText.GetComponent<TextLocalization>().key), 
+        string totalsText = String.Format(LocalizationManager.Instance.GetText(TotalsText.GetComponent<TextLocalization>().key),
             GetSelectedCategoriesQuestionCount().ToString());
         TotalsText.text = totalsText;
     }
 
-    private void GetCategories()
-    {
+    private void GetCategories() {
         if (categories == null || categories.Count == 0) {
             categories = new List<CategoryPanel.Category>();
             categories = OnlineDatabase.Instance.GetCategories(categories, -1);
@@ -65,30 +61,24 @@ public class SelectCategoryScript : MonoBehaviour
         gameObject.SetActive(false);
     }
 
-    internal int GetSelectedCategoriesQuestionCount()
-    {
+    internal int GetSelectedCategoriesQuestionCount() {
         IEnumerable<CategorySelection> selectedCategories = ContentPanel.GetComponentsInChildren<CategorySelection>().Where(c => c.isSelected());
         return selectedCategories.Sum(c => c.QuestionCount);
     }
 
-    internal string GetCategoriesSelectedCount()
-    {
+    internal string GetCategoriesSelectedCount() {
         string returnValue;
         int selectionCount = GetSelectedCategoriesAsList().Count;
 
-        if (selectionCount == categories.Count)
-        {
+        if (selectionCount == categories.Count) {
             returnValue = LocalizationManager.Instance.GetText("ALL");
-        }
-        else
-        {
+        } else {
             returnValue = selectionCount.ToString();
         }
         return returnValue;
     }
 
-    private List<CategorySelection> GetSelectedCategoriesAsList()
-    {
+    private List<CategorySelection> GetSelectedCategoriesAsList() {
         return ContentPanel.GetComponentsInChildren<CategorySelection>().Where(c => c.isSelected()).ToList();
     }
 
@@ -106,8 +96,7 @@ public class SelectCategoryScript : MonoBehaviour
         return categories.Where(c => names.Contains(c.name)).ToList();
     }
 
-    internal void ShowDialog()
-    {
+    internal void ShowDialog() {
         gameObject.SetActive(true);
     }
 }

+ 8 - 0
sonar-project.properties

@@ -0,0 +1,8 @@
+sonar.projectKey=narKampen
+sonar.projectName=narKampen
+sonar.login = 6e98aad9ad84f310e7540e7c736e4307a39e5b21
+sonar.projectVersion=1.0
+sonar.sources=src
+sonar.exclusions=node_modules/**,src/environments/**,**/*.spec.ts,dist/**,**/docs/**,**/*.js,e2e/**,coverage/**,TLH-distributions/**,src/bsb-theme/css/**
+sonar.ts.tslint.configPath=tslint.json
+sonar.typescript.lcov.reportPaths=coverage/lcov.info