diff --git a/.gitignore b/.gitignore
index b25641c..b41f884 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,5 +1,10 @@
-################################################################################
-# Diese .gitignore-Datei wurde von Microsoft(R) Visual Studio automatisch erstellt.
-################################################################################
-
-/.vs/ClearstreamAPIConnector/FileContentIndex/b3742b59-3079-442f-8ac0-b3a694dd7689.vsidx
+bin/
+obj/
+.vs/
+.idea/
+.vscode/
+NDependOut/
+*.suo
+*.user
+*.cache
+*.pdb
diff --git a/.idea/.idea.ClearstreamAPIConnector/.idea/.gitignore b/.idea/.idea.ClearstreamAPIConnector/.idea/.gitignore
deleted file mode 100644
index 026494a..0000000
--- a/.idea/.idea.ClearstreamAPIConnector/.idea/.gitignore
+++ /dev/null
@@ -1,13 +0,0 @@
-# Default ignored files
-/shelf/
-/workspace.xml
-# Rider ignored files
-/projectSettingsUpdater.xml
-/contentModel.xml
-/modules.xml
-/.idea.ClearstreamAPIConnector.iml
-# Editor-based HTTP Client requests
-/httpRequests/
-# Datasource local storage ignored files
-/dataSources/
-/dataSources.local.xml
diff --git a/.idea/.idea.ClearstreamAPIConnector/.idea/encodings.xml b/.idea/.idea.ClearstreamAPIConnector/.idea/encodings.xml
deleted file mode 100644
index df87cf9..0000000
--- a/.idea/.idea.ClearstreamAPIConnector/.idea/encodings.xml
+++ /dev/null
@@ -1,4 +0,0 @@
-
-
-
-
\ No newline at end of file
diff --git a/.idea/.idea.ClearstreamAPIConnector/.idea/indexLayout.xml b/.idea/.idea.ClearstreamAPIConnector/.idea/indexLayout.xml
deleted file mode 100644
index f5a863a..0000000
--- a/.idea/.idea.ClearstreamAPIConnector/.idea/indexLayout.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/.idea.ClearstreamAPIConnector/.idea/vcs.xml b/.idea/.idea.ClearstreamAPIConnector/.idea/vcs.xml
deleted file mode 100644
index c8397c9..0000000
--- a/.idea/.idea.ClearstreamAPIConnector/.idea/vcs.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.vs/ClearstreamAPIConnector/CopilotIndices/17.14.1347.20289/CodeChunks.db b/.vs/ClearstreamAPIConnector/CopilotIndices/17.14.1347.20289/CodeChunks.db
deleted file mode 100644
index 326739a..0000000
Binary files a/.vs/ClearstreamAPIConnector/CopilotIndices/17.14.1347.20289/CodeChunks.db and /dev/null differ
diff --git a/.vs/ClearstreamAPIConnector/CopilotIndices/17.14.1347.20289/SemanticSymbols.db b/.vs/ClearstreamAPIConnector/CopilotIndices/17.14.1347.20289/SemanticSymbols.db
deleted file mode 100644
index 93c37bc..0000000
Binary files a/.vs/ClearstreamAPIConnector/CopilotIndices/17.14.1347.20289/SemanticSymbols.db and /dev/null differ
diff --git a/.vs/ClearstreamAPIConnector/DesignTimeBuild/.dtbcache-winwork11jr.v2 b/.vs/ClearstreamAPIConnector/DesignTimeBuild/.dtbcache-winwork11jr.v2
deleted file mode 100644
index b8e2267..0000000
Binary files a/.vs/ClearstreamAPIConnector/DesignTimeBuild/.dtbcache-winwork11jr.v2 and /dev/null differ
diff --git a/.vs/ClearstreamAPIConnector/DesignTimeBuild/.dtbcache.v2 b/.vs/ClearstreamAPIConnector/DesignTimeBuild/.dtbcache.v2
deleted file mode 100644
index 00cb0c7..0000000
Binary files a/.vs/ClearstreamAPIConnector/DesignTimeBuild/.dtbcache.v2 and /dev/null differ
diff --git a/.vs/ClearstreamAPIConnector/FileContentIndex/1c2b4799-7c48-488d-847b-9fe3dbe6203a.vsidx b/.vs/ClearstreamAPIConnector/FileContentIndex/1c2b4799-7c48-488d-847b-9fe3dbe6203a.vsidx
deleted file mode 100644
index 6d32fcd..0000000
Binary files a/.vs/ClearstreamAPIConnector/FileContentIndex/1c2b4799-7c48-488d-847b-9fe3dbe6203a.vsidx and /dev/null differ
diff --git a/.vs/ClearstreamAPIConnector/v17/-winwork11jr.suo b/.vs/ClearstreamAPIConnector/v17/-winwork11jr.suo
deleted file mode 100644
index 18eee59..0000000
Binary files a/.vs/ClearstreamAPIConnector/v17/-winwork11jr.suo and /dev/null differ
diff --git a/.vs/ClearstreamAPIConnector/v17/.futdcache.v2 b/.vs/ClearstreamAPIConnector/v17/.futdcache.v2
deleted file mode 100644
index f3af29b..0000000
Binary files a/.vs/ClearstreamAPIConnector/v17/.futdcache.v2 and /dev/null differ
diff --git a/.vs/ClearstreamAPIConnector/v17/.suo b/.vs/ClearstreamAPIConnector/v17/.suo
deleted file mode 100644
index 77acd7d..0000000
Binary files a/.vs/ClearstreamAPIConnector/v17/.suo and /dev/null differ
diff --git a/.vs/ClearstreamAPIConnector/v17/.wsuo b/.vs/ClearstreamAPIConnector/v17/.wsuo
deleted file mode 100644
index 88b5e71..0000000
Binary files a/.vs/ClearstreamAPIConnector/v17/.wsuo and /dev/null differ
diff --git a/.vs/ClearstreamAPIConnector/v17/DocumentLayout.backup.json b/.vs/ClearstreamAPIConnector/v17/DocumentLayout.backup.json
deleted file mode 100644
index 234f819..0000000
--- a/.vs/ClearstreamAPIConnector/v17/DocumentLayout.backup.json
+++ /dev/null
@@ -1,125 +0,0 @@
-{
- "Version": 1,
- "WorkspaceRootPath": "C:\\Users\\johan\\OneDrive\\DEV\\ClearstreamAPIConnector\\",
- "Documents": [
- {
- "AbsoluteMoniker": "D:0:0:{E515D972-CAC3-4EC9-9140-C95F4A96F02F}|ClearstreamAPIConnector.csproj|c:\\users\\johan\\onedrive\\dev\\clearstreamapiconnector\\program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
- "RelativeMoniker": "D:0:0:{E515D972-CAC3-4EC9-9140-C95F4A96F02F}|ClearstreamAPIConnector.csproj|solutionrelative:program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|CMake-\u00DCbersichtsseiten||{B1CAA5B0-FEB1-4350-8AB9-F895876842F2}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{E515D972-CAC3-4EC9-9140-C95F4A96F02F}|ClearstreamAPIConnector.csproj|c:\\users\\johan\\onedrive\\dev\\clearstreamapiconnector\\clearstreamapiconnector.csproj||{04B8AB82-A572-4FEF-95CE-5222444B6B64}|",
- "RelativeMoniker": "D:0:0:{E515D972-CAC3-4EC9-9140-C95F4A96F02F}|ClearstreamAPIConnector.csproj|solutionrelative:clearstreamapiconnector.csproj||{04B8AB82-A572-4FEF-95CE-5222444B6B64}|"
- },
- {
- "AbsoluteMoniker": "D:0:0:{E515D972-CAC3-4EC9-9140-C95F4A96F02F}|ClearstreamAPIConnector.csproj|c:\\users\\johan\\onedrive\\dev\\clearstreamapiconnector\\ditemplate.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
- "RelativeMoniker": "D:0:0:{E515D972-CAC3-4EC9-9140-C95F4A96F02F}|ClearstreamAPIConnector.csproj|solutionrelative:ditemplate.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{E515D972-CAC3-4EC9-9140-C95F4A96F02F}|ClearstreamAPIConnector.csproj|c:\\users\\johan\\onedrive\\dev\\clearstreamapiconnector\\logginghandler.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
- "RelativeMoniker": "D:0:0:{E515D972-CAC3-4EC9-9140-C95F4A96F02F}|ClearstreamAPIConnector.csproj|solutionrelative:logginghandler.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{E515D972-CAC3-4EC9-9140-C95F4A96F02F}|ClearstreamAPIConnector.csproj|c:\\users\\johan\\onedrive\\dev\\clearstreamapiconnector\\token.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
- "RelativeMoniker": "D:0:0:{E515D972-CAC3-4EC9-9140-C95F4A96F02F}|ClearstreamAPIConnector.csproj|solutionrelative:token.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
- }
- ],
- "DocumentGroupContainers": [
- {
- "Orientation": 0,
- "VerticalTabListWidth": 256,
- "DocumentGroups": [
- {
- "DockedWidth": 200,
- "SelectedChildIndex": 0,
- "Children": [
- {
- "$type": "Document",
- "DocumentIndex": 0,
- "Title": "Program.cs",
- "DocumentMoniker": "C:\\Users\\johan\\OneDrive\\DEV\\ClearstreamAPIConnector\\Program.cs",
- "RelativeDocumentMoniker": "Program.cs",
- "ToolTip": "C:\\Users\\johan\\OneDrive\\DEV\\ClearstreamAPIConnector\\Program.cs",
- "RelativeToolTip": "Program.cs",
- "ViewState": "AgIAAFABAAAAAAAAAAAowIgAAAAFAAAAAAAAAA==",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
- "WhenOpened": "2023-04-06T12:35:03.248Z",
- "IsPinned": true,
- "EditorCaption": ""
- },
- {
- "$type": "Bookmark",
- "Name": "ST:0:0:{e506b91c-c606-466a-90a9-123d1d1e12b3}"
- },
- {
- "$type": "Document",
- "DocumentIndex": 2,
- "Title": "ClearstreamAPIConnector",
- "DocumentMoniker": "C:\\Users\\johan\\OneDrive\\DEV\\ClearstreamAPIConnector\\ClearstreamAPIConnector.csproj",
- "RelativeDocumentMoniker": "ClearstreamAPIConnector.csproj",
- "ToolTip": "C:\\Users\\johan\\OneDrive\\DEV\\ClearstreamAPIConnector\\ClearstreamAPIConnector.csproj",
- "RelativeToolTip": "ClearstreamAPIConnector.csproj",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000758|",
- "WhenOpened": "2024-04-12T05:47:29.75Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 3,
- "Title": "DiTemplate.cs",
- "DocumentMoniker": "C:\\Users\\johan\\OneDrive\\DEV\\ClearstreamAPIConnector\\DiTemplate.cs",
- "RelativeDocumentMoniker": "DiTemplate.cs",
- "ToolTip": "C:\\Users\\johan\\OneDrive\\DEV\\ClearstreamAPIConnector\\DiTemplate.cs",
- "RelativeToolTip": "DiTemplate.cs",
- "ViewState": "AgIAAAAAAAAAAAAAAAAAABUAAAABAAAAAAAAAA==",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
- "WhenOpened": "2023-04-06T12:35:03.412Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 4,
- "Title": "LoggingHandler.cs",
- "DocumentMoniker": "C:\\Users\\johan\\OneDrive\\DEV\\ClearstreamAPIConnector\\LoggingHandler.cs",
- "RelativeDocumentMoniker": "LoggingHandler.cs",
- "ToolTip": "C:\\Users\\johan\\OneDrive\\DEV\\ClearstreamAPIConnector\\LoggingHandler.cs",
- "RelativeToolTip": "LoggingHandler.cs",
- "ViewState": "AQIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
- "WhenOpened": "2023-04-06T12:35:03.414Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 5,
- "Title": "Token.cs",
- "DocumentMoniker": "C:\\Users\\johan\\OneDrive\\DEV\\ClearstreamAPIConnector\\Token.cs",
- "RelativeDocumentMoniker": "Token.cs",
- "ToolTip": "C:\\Users\\johan\\OneDrive\\DEV\\ClearstreamAPIConnector\\Token.cs",
- "RelativeToolTip": "Token.cs",
- "ViewState": "AQIAAAAAAAAAAAAAAAAqwAIAAAAAAAAA",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
- "WhenOpened": "2023-04-06T12:35:03.414Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 1,
- "Title": "CMake-\u00DCbersichtsseiten",
- "DocumentMoniker": "CMake-\u00DCbersichtsseiten",
- "ToolTip": "CMake-\u00DCbersichtsseiten",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001001|",
- "WhenOpened": "2024-04-12T05:42:47.668Z"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:0:0:{d84ee353-0bef-5a41-a649-8f89aca5d84d}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:0:0:{cce594b6-0c39-4442-ba28-10c64ac7e89f}"
- }
- ]
- }
- ]
- }
- ]
-}
\ No newline at end of file
diff --git a/.vs/ClearstreamAPIConnector/v17/DocumentLayout.json b/.vs/ClearstreamAPIConnector/v17/DocumentLayout.json
deleted file mode 100644
index be51a64..0000000
--- a/.vs/ClearstreamAPIConnector/v17/DocumentLayout.json
+++ /dev/null
@@ -1,125 +0,0 @@
-{
- "Version": 1,
- "WorkspaceRootPath": "C:\\Users\\johan\\OneDrive\\DEV\\ClearstreamAPIConnector\\",
- "Documents": [
- {
- "AbsoluteMoniker": "D:0:0:{E515D972-CAC3-4EC9-9140-C95F4A96F02F}|ClearstreamAPIConnector.csproj|c:\\users\\johan\\onedrive\\dev\\clearstreamapiconnector\\program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
- "RelativeMoniker": "D:0:0:{E515D972-CAC3-4EC9-9140-C95F4A96F02F}|ClearstreamAPIConnector.csproj|solutionrelative:program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|CMake-\u00DCbersichtsseiten||{B1CAA5B0-FEB1-4350-8AB9-F895876842F2}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{E515D972-CAC3-4EC9-9140-C95F4A96F02F}|ClearstreamAPIConnector.csproj|c:\\users\\johan\\onedrive\\dev\\clearstreamapiconnector\\clearstreamapiconnector.csproj||{04B8AB82-A572-4FEF-95CE-5222444B6B64}|",
- "RelativeMoniker": "D:0:0:{E515D972-CAC3-4EC9-9140-C95F4A96F02F}|ClearstreamAPIConnector.csproj|solutionrelative:clearstreamapiconnector.csproj||{04B8AB82-A572-4FEF-95CE-5222444B6B64}|"
- },
- {
- "AbsoluteMoniker": "D:0:0:{E515D972-CAC3-4EC9-9140-C95F4A96F02F}|ClearstreamAPIConnector.csproj|c:\\users\\johan\\onedrive\\dev\\clearstreamapiconnector\\ditemplate.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
- "RelativeMoniker": "D:0:0:{E515D972-CAC3-4EC9-9140-C95F4A96F02F}|ClearstreamAPIConnector.csproj|solutionrelative:ditemplate.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{E515D972-CAC3-4EC9-9140-C95F4A96F02F}|ClearstreamAPIConnector.csproj|c:\\users\\johan\\onedrive\\dev\\clearstreamapiconnector\\logginghandler.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
- "RelativeMoniker": "D:0:0:{E515D972-CAC3-4EC9-9140-C95F4A96F02F}|ClearstreamAPIConnector.csproj|solutionrelative:logginghandler.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{E515D972-CAC3-4EC9-9140-C95F4A96F02F}|ClearstreamAPIConnector.csproj|c:\\users\\johan\\onedrive\\dev\\clearstreamapiconnector\\token.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
- "RelativeMoniker": "D:0:0:{E515D972-CAC3-4EC9-9140-C95F4A96F02F}|ClearstreamAPIConnector.csproj|solutionrelative:token.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
- }
- ],
- "DocumentGroupContainers": [
- {
- "Orientation": 0,
- "VerticalTabListWidth": 256,
- "DocumentGroups": [
- {
- "DockedWidth": 200,
- "SelectedChildIndex": 0,
- "Children": [
- {
- "$type": "Document",
- "DocumentIndex": 0,
- "Title": "Program.cs",
- "DocumentMoniker": "C:\\Users\\johan\\OneDrive\\DEV\\ClearstreamAPIConnector\\Program.cs",
- "RelativeDocumentMoniker": "Program.cs",
- "ToolTip": "C:\\Users\\johan\\OneDrive\\DEV\\ClearstreamAPIConnector\\Program.cs",
- "RelativeToolTip": "Program.cs",
- "ViewState": "AgIAAFYBAAAAAAAAAAAowIgAAAAFAAAAAAAAAA==",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
- "WhenOpened": "2023-04-06T12:35:03.248Z",
- "IsPinned": true,
- "EditorCaption": ""
- },
- {
- "$type": "Bookmark",
- "Name": "ST:0:0:{e506b91c-c606-466a-90a9-123d1d1e12b3}"
- },
- {
- "$type": "Document",
- "DocumentIndex": 2,
- "Title": "ClearstreamAPIConnector",
- "DocumentMoniker": "C:\\Users\\johan\\OneDrive\\DEV\\ClearstreamAPIConnector\\ClearstreamAPIConnector.csproj",
- "RelativeDocumentMoniker": "ClearstreamAPIConnector.csproj",
- "ToolTip": "C:\\Users\\johan\\OneDrive\\DEV\\ClearstreamAPIConnector\\ClearstreamAPIConnector.csproj",
- "RelativeToolTip": "ClearstreamAPIConnector.csproj",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000758|",
- "WhenOpened": "2024-04-12T05:47:29.75Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 3,
- "Title": "DiTemplate.cs",
- "DocumentMoniker": "C:\\Users\\johan\\OneDrive\\DEV\\ClearstreamAPIConnector\\DiTemplate.cs",
- "RelativeDocumentMoniker": "DiTemplate.cs",
- "ToolTip": "C:\\Users\\johan\\OneDrive\\DEV\\ClearstreamAPIConnector\\DiTemplate.cs",
- "RelativeToolTip": "DiTemplate.cs",
- "ViewState": "AgIAAAAAAAAAAAAAAAAAABUAAAABAAAAAAAAAA==",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
- "WhenOpened": "2023-04-06T12:35:03.412Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 4,
- "Title": "LoggingHandler.cs",
- "DocumentMoniker": "C:\\Users\\johan\\OneDrive\\DEV\\ClearstreamAPIConnector\\LoggingHandler.cs",
- "RelativeDocumentMoniker": "LoggingHandler.cs",
- "ToolTip": "C:\\Users\\johan\\OneDrive\\DEV\\ClearstreamAPIConnector\\LoggingHandler.cs",
- "RelativeToolTip": "LoggingHandler.cs",
- "ViewState": "AQIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
- "WhenOpened": "2023-04-06T12:35:03.414Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 5,
- "Title": "Token.cs",
- "DocumentMoniker": "C:\\Users\\johan\\OneDrive\\DEV\\ClearstreamAPIConnector\\Token.cs",
- "RelativeDocumentMoniker": "Token.cs",
- "ToolTip": "C:\\Users\\johan\\OneDrive\\DEV\\ClearstreamAPIConnector\\Token.cs",
- "RelativeToolTip": "Token.cs",
- "ViewState": "AQIAAAAAAAAAAAAAAAAqwAIAAAAAAAAA",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
- "WhenOpened": "2023-04-06T12:35:03.414Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 1,
- "Title": "CMake-\u00DCbersichtsseiten",
- "DocumentMoniker": "CMake-\u00DCbersichtsseiten",
- "ToolTip": "CMake-\u00DCbersichtsseiten",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001001|",
- "WhenOpened": "2024-04-12T05:42:47.668Z"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:0:0:{d84ee353-0bef-5a41-a649-8f89aca5d84d}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:0:0:{cce594b6-0c39-4442-ba28-10c64ac7e89f}"
- }
- ]
- }
- ]
- }
- ]
-}
\ No newline at end of file
diff --git a/.vs/ClearstreamAPIConnector/v18/.futdcache.v2 b/.vs/ClearstreamAPIConnector/v18/.futdcache.v2
deleted file mode 100644
index 53ad4b6..0000000
Binary files a/.vs/ClearstreamAPIConnector/v18/.futdcache.v2 and /dev/null differ
diff --git a/.vs/ClearstreamAPIConnector/v18/.suo b/.vs/ClearstreamAPIConnector/v18/.suo
deleted file mode 100644
index 1416e4c..0000000
Binary files a/.vs/ClearstreamAPIConnector/v18/.suo and /dev/null differ
diff --git a/.vs/ClearstreamAPIConnector/v18/DocumentLayout.json b/.vs/ClearstreamAPIConnector/v18/DocumentLayout.json
deleted file mode 100644
index d28a403..0000000
--- a/.vs/ClearstreamAPIConnector/v18/DocumentLayout.json
+++ /dev/null
@@ -1,125 +0,0 @@
-{
- "Version": 1,
- "WorkspaceRootPath": "C:\\Users\\johan\\OneDrive\\DEV\\ClearstreamAPIConnector\\",
- "Documents": [
- {
- "AbsoluteMoniker": "D:0:0:{E515D972-CAC3-4EC9-9140-C95F4A96F02F}|ClearstreamAPIConnector.csproj|c:\\users\\johan\\onedrive\\dev\\clearstreamapiconnector\\program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
- "RelativeMoniker": "D:0:0:{E515D972-CAC3-4EC9-9140-C95F4A96F02F}|ClearstreamAPIConnector.csproj|solutionrelative:program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|CMake-\u00DCbersichtsseiten||{B1CAA5B0-FEB1-4350-8AB9-F895876842F2}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{E515D972-CAC3-4EC9-9140-C95F4A96F02F}|ClearstreamAPIConnector.csproj|c:\\users\\johan\\onedrive\\dev\\clearstreamapiconnector\\clearstreamapiconnector.csproj||{04B8AB82-A572-4FEF-95CE-5222444B6B64}|",
- "RelativeMoniker": "D:0:0:{E515D972-CAC3-4EC9-9140-C95F4A96F02F}|ClearstreamAPIConnector.csproj|solutionrelative:clearstreamapiconnector.csproj||{04B8AB82-A572-4FEF-95CE-5222444B6B64}|"
- },
- {
- "AbsoluteMoniker": "D:0:0:{E515D972-CAC3-4EC9-9140-C95F4A96F02F}|ClearstreamAPIConnector.csproj|c:\\users\\johan\\onedrive\\dev\\clearstreamapiconnector\\ditemplate.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
- "RelativeMoniker": "D:0:0:{E515D972-CAC3-4EC9-9140-C95F4A96F02F}|ClearstreamAPIConnector.csproj|solutionrelative:ditemplate.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{E515D972-CAC3-4EC9-9140-C95F4A96F02F}|ClearstreamAPIConnector.csproj|c:\\users\\johan\\onedrive\\dev\\clearstreamapiconnector\\logginghandler.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
- "RelativeMoniker": "D:0:0:{E515D972-CAC3-4EC9-9140-C95F4A96F02F}|ClearstreamAPIConnector.csproj|solutionrelative:logginghandler.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{E515D972-CAC3-4EC9-9140-C95F4A96F02F}|ClearstreamAPIConnector.csproj|c:\\users\\johan\\onedrive\\dev\\clearstreamapiconnector\\token.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
- "RelativeMoniker": "D:0:0:{E515D972-CAC3-4EC9-9140-C95F4A96F02F}|ClearstreamAPIConnector.csproj|solutionrelative:token.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
- }
- ],
- "DocumentGroupContainers": [
- {
- "Orientation": 0,
- "VerticalTabListWidth": 256,
- "DocumentGroups": [
- {
- "DockedWidth": 200,
- "SelectedChildIndex": 0,
- "Children": [
- {
- "$type": "Document",
- "DocumentIndex": 0,
- "Title": "Program.cs",
- "DocumentMoniker": "C:\\Users\\johan\\OneDrive\\DEV\\ClearstreamAPIConnector\\Program.cs",
- "RelativeDocumentMoniker": "Program.cs",
- "ToolTip": "C:\\Users\\johan\\OneDrive\\DEV\\ClearstreamAPIConnector\\Program.cs",
- "RelativeToolTip": "Program.cs",
- "ViewState": "AgIAAEIBAAAAAAAAAAAAAIgAAAAFAAAAAAAAAA==",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
- "WhenOpened": "2023-04-06T12:35:03.248Z",
- "IsPinned": true,
- "EditorCaption": ""
- },
- {
- "$type": "Document",
- "DocumentIndex": 2,
- "Title": "ClearstreamAPIConnector",
- "DocumentMoniker": "C:\\Users\\johan\\OneDrive\\DEV\\ClearstreamAPIConnector\\ClearstreamAPIConnector.csproj",
- "RelativeDocumentMoniker": "ClearstreamAPIConnector.csproj",
- "ToolTip": "C:\\Users\\johan\\OneDrive\\DEV\\ClearstreamAPIConnector\\ClearstreamAPIConnector.csproj",
- "RelativeToolTip": "ClearstreamAPIConnector.csproj",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000758|",
- "WhenOpened": "2024-04-12T05:47:29.75Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 3,
- "Title": "DiTemplate.cs",
- "DocumentMoniker": "C:\\Users\\johan\\OneDrive\\DEV\\ClearstreamAPIConnector\\DiTemplate.cs",
- "RelativeDocumentMoniker": "DiTemplate.cs",
- "ToolTip": "C:\\Users\\johan\\OneDrive\\DEV\\ClearstreamAPIConnector\\DiTemplate.cs",
- "RelativeToolTip": "DiTemplate.cs",
- "ViewState": "AgIAAAAAAAAAAAAAAAAAABUAAAABAAAAAAAAAA==",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
- "WhenOpened": "2023-04-06T12:35:03.412Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 4,
- "Title": "LoggingHandler.cs",
- "DocumentMoniker": "C:\\Users\\johan\\OneDrive\\DEV\\ClearstreamAPIConnector\\LoggingHandler.cs",
- "RelativeDocumentMoniker": "LoggingHandler.cs",
- "ToolTip": "C:\\Users\\johan\\OneDrive\\DEV\\ClearstreamAPIConnector\\LoggingHandler.cs",
- "RelativeToolTip": "LoggingHandler.cs",
- "ViewState": "AQIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
- "WhenOpened": "2023-04-06T12:35:03.414Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 5,
- "Title": "Token.cs",
- "DocumentMoniker": "C:\\Users\\johan\\OneDrive\\DEV\\ClearstreamAPIConnector\\Token.cs",
- "RelativeDocumentMoniker": "Token.cs",
- "ToolTip": "C:\\Users\\johan\\OneDrive\\DEV\\ClearstreamAPIConnector\\Token.cs",
- "RelativeToolTip": "Token.cs",
- "ViewState": "AQIAAAAAAAAAAAAAAAAqwAIAAAAAAAAA",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
- "WhenOpened": "2023-04-06T12:35:03.414Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 1,
- "Title": "CMake-\u00DCbersichtsseiten",
- "DocumentMoniker": "CMake-\u00DCbersichtsseiten",
- "ToolTip": "CMake-\u00DCbersichtsseiten",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001001|",
- "WhenOpened": "2024-04-12T05:42:47.668Z"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:0:0:{e506b91c-c606-466a-90a9-123d1d1e12b3}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:0:0:{d84ee353-0bef-5a41-a649-8f89aca5d84d}"
- },
- {
- "$type": "Bookmark",
- "Name": "ST:0:0:{cce594b6-0c39-4442-ba28-10c64ac7e89f}"
- }
- ]
- }
- ]
- }
- ]
-}
\ No newline at end of file
diff --git a/.vs/ProjectEvaluation/clearstreamapiconnector.metadata.v9.bin b/.vs/ProjectEvaluation/clearstreamapiconnector.metadata.v9.bin
deleted file mode 100644
index 9b3b6c6..0000000
Binary files a/.vs/ProjectEvaluation/clearstreamapiconnector.metadata.v9.bin and /dev/null differ
diff --git a/.vs/ProjectEvaluation/clearstreamapiconnector.projects.v9.bin b/.vs/ProjectEvaluation/clearstreamapiconnector.projects.v9.bin
deleted file mode 100644
index 9d7d03d..0000000
Binary files a/.vs/ProjectEvaluation/clearstreamapiconnector.projects.v9.bin and /dev/null differ
diff --git a/.vs/ProjectEvaluation/clearstreamapiconnector.strings.v9.bin b/.vs/ProjectEvaluation/clearstreamapiconnector.strings.v9.bin
deleted file mode 100644
index cd3d0af..0000000
Binary files a/.vs/ProjectEvaluation/clearstreamapiconnector.strings.v9.bin and /dev/null differ
diff --git a/.vs/ProjectSettings.json b/.vs/ProjectSettings.json
deleted file mode 100644
index 866f1e1..0000000
--- a/.vs/ProjectSettings.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "CurrentProjectSetting": null
-}
\ No newline at end of file
diff --git a/.vs/VSWorkspaceState.json b/.vs/VSWorkspaceState.json
deleted file mode 100644
index deac369..0000000
--- a/.vs/VSWorkspaceState.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "ExpandedNodes": [
- ""
- ],
- "SelectedNode": "\\ClearstreamAPIConnector.sln",
- "PreviewInSolutionExplorer": false
-}
\ No newline at end of file
diff --git a/.vs/slnx.sqlite b/.vs/slnx.sqlite
deleted file mode 100644
index 18f284f..0000000
Binary files a/.vs/slnx.sqlite and /dev/null differ
diff --git a/.vscode/launch.json b/.vscode/launch.json
deleted file mode 100644
index e45dee5..0000000
--- a/.vscode/launch.json
+++ /dev/null
@@ -1,28 +0,0 @@
-{
- "version": "0.2.0",
- "configurations": [
-
-
- {
- // Use IntelliSense to find out which attributes exist for C# debugging
- // Use hover for the description of the existing attributes
- // For further information visit https://github.com/OmniSharp/omnisharp-vscode/blob/master/debugger-launchjson.md
- "name": ".NET Core Launch (console)",
- "type": "coreclr",
- "request": "launch",
- "preLaunchTask": "build",
- // If you have changed target frameworks, make sure to update the program path.
- "program": "${workspaceFolder}/bin/Debug/net6.0/ClearstreamAPIConnector.dll",
- "args": [],
- "cwd": "${workspaceFolder}",
- // For more information about the 'console' field, see https://aka.ms/VSCode-CS-LaunchJson-Console
- "console": "internalConsole",
- "stopAtEntry": false
- },
- {
- "name": ".NET Core Attach",
- "type": "coreclr",
- "request": "attach"
- }
- ]
-}
\ No newline at end of file
diff --git a/.vscode/tasks.json b/.vscode/tasks.json
deleted file mode 100644
index 72a4fbd..0000000
--- a/.vscode/tasks.json
+++ /dev/null
@@ -1,41 +0,0 @@
-{
- "version": "2.0.0",
- "tasks": [
- {
- "label": "build",
- "command": "dotnet",
- "type": "process",
- "args": [
- "build",
- "${workspaceFolder}/ClearstreamAPIConnector.csproj",
- "/property:GenerateFullPaths=true",
- "/consoleloggerparameters:NoSummary"
- ],
- "problemMatcher": "$msCompile"
- },
- {
- "label": "publish",
- "command": "dotnet",
- "type": "process",
- "args": [
- "publish",
- "${workspaceFolder}/ClearstreamAPIConnector.csproj",
- "/property:GenerateFullPaths=true",
- "/consoleloggerparameters:NoSummary"
- ],
- "problemMatcher": "$msCompile"
- },
- {
- "label": "watch",
- "command": "dotnet",
- "type": "process",
- "args": [
- "watch",
- "run",
- "--project",
- "${workspaceFolder}/ClearstreamAPIConnector.csproj"
- ],
- "problemMatcher": "$msCompile"
- }
- ]
-}
\ No newline at end of file
diff --git a/NDependOut/2024_07/04_11_53_22/InfoWarnings.xml b/NDependOut/2024_07/04_11_53_22/InfoWarnings.xml
deleted file mode 100644
index 8f97600..0000000
--- a/NDependOut/2024_07/04_11_53_22/InfoWarnings.xml
+++ /dev/null
@@ -1,62 +0,0 @@
-
-
- Begin full analysis with NDepend v2024.1.1 on 04 Jul 2024 11:53:22
- Visual Studio solution file resolved to absolute file path: from {.\ClearstreamAPIConnector.sln} to {C:\Users\Johannes Rest\OneDrive\DEV\ClearstreamAPIConnector\ClearstreamAPIConnector.sln}
- Output directory resolved to absolute directory path: C:\Users\Johannes Rest\OneDrive\DEV\ClearstreamAPIConnector\NDependOut
- .NET Assembly resolved from the Visual Studio solution file {C:\Users\Johannes Rest\OneDrive\DEV\ClearstreamAPIConnector\ClearstreamAPIConnector.sln}
- C:\Users\Johannes Rest\OneDrive\DEV\ClearstreamAPIConnector\bin\Debug\net7.0\ClearstreamAPIConnector.dll
- No .NET Assembly filtered out from the Visual Studio solution file {C:\Users\Johannes Rest\OneDrive\DEV\ClearstreamAPIConnector\ClearstreamAPIConnector.sln}.
- Concurrent mode
- The source file {C:\Users\Johannes Rest\OneDrive\DEV\ClearstreamAPIConnector\DiTemplate.cs} (last modified 26 Jun 2024 08:42:44) and the PDB file of the assembly {ClearstreamAPIConnector} (last modified 18 Aug 2023 12:45:55) are not in-sync.
- The source file {C:\Users\Johannes Rest\OneDrive\DEV\ClearstreamAPIConnector\LoggingHandler.cs} (last modified 26 Jun 2024 08:42:44) and the PDB file of the assembly {ClearstreamAPIConnector} (last modified 18 Aug 2023 12:45:55) are not in-sync.
- The source file {C:\Users\Johannes Rest\OneDrive\DEV\ClearstreamAPIConnector\Program.cs} (last modified 26 Jun 2024 08:42:44) and the PDB file of the assembly {ClearstreamAPIConnector} (last modified 18 Aug 2023 12:45:55) are not in-sync.
- The source file {C:\Users\Johannes Rest\OneDrive\DEV\ClearstreamAPIConnector\Token.cs} (last modified 26 Jun 2024 08:42:44) and the PDB file of the assembly {ClearstreamAPIConnector} (last modified 18 Aug 2023 12:45:55) are not in-sync.
- 4 source files parsed ; 4 source files not found ; 4 source files not in-sync with PDB
- 0 code rule has been extracted from code.
- No issue have been imported. No directory that contains issue files have been resolved from the project ClearstreamAPIConnector
- No dependency cycle detected in assemblies referencement graph.
- Do merge code generated by compiler into application code.
- Analyze dependencies of your application.
- No SuppressMessageAttribute found in the analyzed code base. Since NDepend v2018.2 SuppressMessageAttribute can be used to suppress NDepend issues. Don't forget to set in your projects the compilation symbol CODE_ANALYSIS to use this attribute to suppress NDepend issues.
- Persisting code model snapshot in {C:\Users\Johannes Rest\OneDrive\DEV\ClearstreamAPIConnector\NDependOut\NDependAnalysisResult_ClearstreamAPIConnector_2024Jul04_11h53m22.ndar}
- The source directory {C:\Users\johan\OneDrive\DEV\ClearstreamAPIConnector} referenced by the PDB file of the assembly {ClearstreamAPIConnector} can't be found.
- Log trend metrics values.
- Rule {From now, all types added should be 100% covered by tests} relies on code coverage data that is not available in the baseline code base snapshot. The rule hasen't been executed on both baseline and newer code base snapshots.
- Rule {From now, all types added should be 100% covered by tests} relies on code coverage data that is not available in the newer code base snapshot. The rule hasen't been executed on both baseline and newer code base snapshots.
- Rule {Avoid decreasing code coverage by tests of types} relies on code coverage data that is not available in the baseline code base snapshot. The rule hasen't been executed on both baseline and newer code base snapshots.
- Rule {Avoid decreasing code coverage by tests of types} relies on code coverage data that is not available in the newer code base snapshot. The rule hasen't been executed on both baseline and newer code base snapshots.
- Rule {Code should be tested} relies on code coverage data that is not available in the baseline code base snapshot. The rule hasen't been executed on both baseline and newer code base snapshots.
- Rule {Code should be tested} relies on code coverage data that is not available in the newer code base snapshot. The rule hasen't been executed on both baseline and newer code base snapshots.
- Rule {New Types and Methods should be tested} relies on code coverage data that is not available in the baseline code base snapshot. The rule hasen't been executed on both baseline and newer code base snapshots.
- Rule {New Types and Methods should be tested} relies on code coverage data that is not available in the newer code base snapshot. The rule hasen't been executed on both baseline and newer code base snapshots.
- Rule {Methods refactored should be tested} relies on code coverage data that is not available in the baseline code base snapshot. The rule hasen't been executed on both baseline and newer code base snapshots.
- Rule {Methods refactored should be tested} relies on code coverage data that is not available in the newer code base snapshot. The rule hasen't been executed on both baseline and newer code base snapshots.
- Rule {Assemblies and Namespaces should be tested} relies on code coverage data that is not available in the baseline code base snapshot. The rule hasen't been executed on both baseline and newer code base snapshots.
- Rule {Assemblies and Namespaces should be tested} relies on code coverage data that is not available in the newer code base snapshot. The rule hasen't been executed on both baseline and newer code base snapshots.
- Rule {Types almost 100% tested should be 100% tested} relies on code coverage data that is not available in the baseline code base snapshot. The rule hasen't been executed on both baseline and newer code base snapshots.
- Rule {Types almost 100% tested should be 100% tested} relies on code coverage data that is not available in the newer code base snapshot. The rule hasen't been executed on both baseline and newer code base snapshots.
- Rule {Namespaces almost 100% tested should be 100% tested} relies on code coverage data that is not available in the baseline code base snapshot. The rule hasen't been executed on both baseline and newer code base snapshots.
- Rule {Namespaces almost 100% tested should be 100% tested} relies on code coverage data that is not available in the newer code base snapshot. The rule hasen't been executed on both baseline and newer code base snapshots.
- Rule {Types that used to be 100% covered by tests should still be 100% covered} relies on code coverage data that is not available in the baseline code base snapshot. The rule hasen't been executed on both baseline and newer code base snapshots.
- Rule {Types that used to be 100% covered by tests should still be 100% covered} relies on code coverage data that is not available in the newer code base snapshot. The rule hasen't been executed on both baseline and newer code base snapshots.
- Rule {Types tagged with FullCoveredAttribute should be 100% covered} relies on code coverage data that is not available in the baseline code base snapshot. The rule hasen't been executed on both baseline and newer code base snapshots.
- Rule {Types tagged with FullCoveredAttribute should be 100% covered} relies on code coverage data that is not available in the newer code base snapshot. The rule hasen't been executed on both baseline and newer code base snapshots.
- Rule {Types 100% covered should be tagged with FullCoveredAttribute} relies on code coverage data that is not available in the baseline code base snapshot. The rule hasen't been executed on both baseline and newer code base snapshots.
- Rule {Types 100% covered should be tagged with FullCoveredAttribute} relies on code coverage data that is not available in the newer code base snapshot. The rule hasen't been executed on both baseline and newer code base snapshots.
- Rule {Methods should have a low C.R.A.P score} relies on code coverage data that is not available in the baseline code base snapshot. The rule hasen't been executed on both baseline and newer code base snapshots.
- Rule {Methods should have a low C.R.A.P score} relies on code coverage data that is not available in the newer code base snapshot. The rule hasen't been executed on both baseline and newer code base snapshots.
- Quality Gate {Percentage Coverage} relies on code coverage data that is not available in the baseline code base snapshot.
- Quality Gate {Percentage Coverage} relies on code coverage data that is not available in the newer code base snapshot.
- Quality Gate {Percentage Coverage on New Code} relies on code coverage data that is not available in the baseline code base snapshot.
- Quality Gate {Percentage Coverage on New Code} relies on code coverage data that is not available in the newer code base snapshot.
- Quality Gate {Percentage Coverage on Refactored Code} relies on code coverage data that is not available in the baseline code base snapshot.
- Quality Gate {Percentage Coverage on Refactored Code} relies on code coverage data that is not available in the newer code base snapshot.
- Execute queries and rules
- Output report source files
- The baseline versions of source files modified are not available in the report.
-Reason: Cannot find the file {SourceFiles.zip} in the analysis result directory {C:\Users\Johannes Rest\OneDrive\DEV\ClearstreamAPIConnector\NDependOut}.
-Make sure that the NDepend Project Properties > Analysis > Zip Source Files setting is enabled.
- Output report projects
- Building the report (standard).
- NDepend analysis done. Duration: 00:05.663
-
\ No newline at end of file
diff --git a/NDependOut/2024_07/04_11_53_22/NDependAnalysisResult_ClearstreamAPIConnector_2024Jul04_11h53m22.ndar b/NDependOut/2024_07/04_11_53_22/NDependAnalysisResult_ClearstreamAPIConnector_2024Jul04_11h53m22.ndar
deleted file mode 100644
index dfc846c..0000000
Binary files a/NDependOut/2024_07/04_11_53_22/NDependAnalysisResult_ClearstreamAPIConnector_2024Jul04_11h53m22.ndar and /dev/null differ
diff --git a/NDependOut/2024_07/04_11_53_22/NDependReport.html b/NDependOut/2024_07/04_11_53_22/NDependReport.html
deleted file mode 100644
index 32f8a8d..0000000
--- a/NDependOut/2024_07/04_11_53_22/NDependReport.html
+++ /dev/null
@@ -1,2103 +0,0 @@
-
Report: ClearstreamAPIConnector (v1.0.0.0)
04 Jul 2024 11:53:22
Dependency Graph
This diagram represents the Graph of Dependencies between the .NET assemblies of your application.
This static diagram can be useful but it is just a coarse view of your application architecture.
- It is recommended to use the NDepend interactive Dependency Graph and interactive Dependency Matrix found in the NDepend UI for an in-depth exploration of the actual architecture of your code.
This diagram represents the DSM (Dependency Structure Matrix) beetween the .NET assemblies of your application.
The Dependency Matrix is a compact way to represent and navigate across dependencies between components.
The number on cells of the Dependency Matrix included in the report, represent the number of types involved in the coupling
- It is recommended to use the NDepend interactive Dependency Matrix and interactive Dependency Graph found in the NDepend UI for an in-depth exploration of the actual architecture of your code.
-
In this Metric View, the code base is represented through a Treemap.
Treemapping is a method for displaying tree-structured data by using nested rectangles.
In the present treemap, each rectangle represents a method and the area of a rectangle is proportional to the number of lines of code of the corresponding method.
- It is recommended to use the NDepend interactive Metric View found in the NDepend UI for an in-depth code metrics exploration.
-
- With the Online documentation, understand how Treemaping can help you see patterns in your code base, that would be hard to spot with other ways.
- The Abstractness versus Instability Diagram helps to detect which assemblies are potentially painful to maintain (i.e concrete and stable) and which assemblies are potentially useless (i.e abstract and instable).
-
Abstractness:
- If an assembly contains many abstract types (i.e interfaces and abstract classes) and few concrete types, it is considered as abstract.
Instability:
- An assembly is considered stable if its types are used by a lot of types from other assemblies. In this context stable means painful to modify.
-
- The Issues tab makes it easy to identify the source files with most issues and most technical debt.
-
Write clean code from now on:
- The first analysis result of your project is considered as the baseline.
- Continue your development and further analysis results will be compared against the baseline.
- In all tabs new issues introduced on new and refactored classes will be highlighted.
- This will be the issues to fix first.
-
- In addition to the NDepend report, use the interactive UI through the standalone executable VisualNDepend.exe, or through the Visual Studio NDepend extension.
- With the interactive UI, browse more detailed data and have Rules checking updated each time the code is modified and recompiled.
-
- The baseline, the analysis execution and the report options settings are customizable through the interactive UI, in the panel Project Properties.
-
- Code queries and rules results are truncated to list a maximum of 20 code elements in this report
-
- To enable or disable this setting, there is a tickbox labelled
- Don't show more than 20 matched items for a Rule violated
-
- in the NDepend Project Properties panel > Report tab > Avoid too big report for large code base section
- This setting is enabled by default to avoid to have too large reports when analyzing large code bases.
-
Does this report gets too large?
- There is a setting enabled by default to avoid to have too large reports when analyzing large code bases.
-
- To enable or disable this setting, there is a tick-box labelled Don't show more than 100 matched items for a Rule violated
- in the NDepend Project Properties panel > Report tab > Avoid too big report for large code base section
- Sort the column #Un-resolved ascending to list these files first.
-
1
The number of projects with at least one unresolved issue but no new issue added since the baseline.
- Sort the column #Un-resolved Issues to list these files first.
-
0
The number of projects with at least one new issue introduced since the baseline.
- Sort the column #New Issues to list these files first.
-
- Clicking a project's name selects its associated source files under the Issues tab.
- This occurs because the search pattern for the source files grid is set to the project's name.
-
A Quality Gate passes if its value is lower than its warning threshold, and lower than its failure threshold.
0 warn
-
The number of Quality Gates that warn.
A Quality Gate warns if its value is equal to or higher than its warning threshold, but lower than its failure threshold.
0 fail
-
The number of Quality Gates that fail.
A Quality Gate fails if its value is equal to or higher than its failure threshold. If any, it means that the code is not ready for production. You have the option to stop the build process upon any Quality Gate failure.
- Quality Gates that measure diff cannot
- be run on the baseline. Hence they
- have blank trend and baseline value.
-
A particular warning can be disabled through the NDepend interactive UI, panel Error List, tick the checkbox Disabled corresponding to the warning to disable.
- Message
-
-
Begin full analysis with NDepend v2024.1.1 on 04 Jul 2024 11:53:22
-
Visual Studio solution file resolved to absolute file path: from {.\ClearstreamAPIConnector.sln} to {C:\Users\Johannes Rest\OneDrive\DEV\ClearstreamAPIConnector\ClearstreamAPIConnector.sln}
-
Output directory resolved to absolute directory path: C:\Users\Johannes Rest\OneDrive\DEV\ClearstreamAPIConnector\NDependOut
-
.NET Assembly resolved from the Visual Studio solution file {C:\Users\Johannes Rest\OneDrive\DEV\ClearstreamAPIConnector\ClearstreamAPIConnector.sln}
- C:\Users\Johannes Rest\OneDrive\DEV\ClearstreamAPIConnector\bin\Debug\net7.0\ClearstreamAPIConnector.dll
-
No .NET Assembly filtered out from the Visual Studio solution file {C:\Users\Johannes Rest\OneDrive\DEV\ClearstreamAPIConnector\ClearstreamAPIConnector.sln}.
-
Concurrent mode
-
The source file {C:\Users\Johannes Rest\OneDrive\DEV\ClearstreamAPIConnector\DiTemplate.cs} (last modified 26 Jun 2024 08:42:44) and the PDB file of the assembly {ClearstreamAPIConnector} (last modified 18 Aug 2023 12:45:55) are not in-sync.
-
The source file {C:\Users\Johannes Rest\OneDrive\DEV\ClearstreamAPIConnector\LoggingHandler.cs} (last modified 26 Jun 2024 08:42:44) and the PDB file of the assembly {ClearstreamAPIConnector} (last modified 18 Aug 2023 12:45:55) are not in-sync.
-
The source file {C:\Users\Johannes Rest\OneDrive\DEV\ClearstreamAPIConnector\Program.cs} (last modified 26 Jun 2024 08:42:44) and the PDB file of the assembly {ClearstreamAPIConnector} (last modified 18 Aug 2023 12:45:55) are not in-sync.
-
The source file {C:\Users\Johannes Rest\OneDrive\DEV\ClearstreamAPIConnector\Token.cs} (last modified 26 Jun 2024 08:42:44) and the PDB file of the assembly {ClearstreamAPIConnector} (last modified 18 Aug 2023 12:45:55) are not in-sync.
-
4 source files parsed ; 4 source files not found ; 4 source files not in-sync with PDB
-
0 code rule has been extracted from code.
-
No issue have been imported. No directory that contains issue files have been resolved from the project ClearstreamAPIConnector
-
No dependency cycle detected in assemblies referencement graph.
-
Do merge code generated by compiler into application code.
-
Analyze dependencies of your application.
-
No SuppressMessageAttribute found in the analyzed code base. Since NDepend v2018.2 SuppressMessageAttribute can be used to suppress NDepend issues. Don't forget to set in your projects the compilation symbol CODE_ANALYSIS to use this attribute to suppress NDepend issues.
-
Persisting code model snapshot in {C:\Users\Johannes Rest\OneDrive\DEV\ClearstreamAPIConnector\NDependOut\NDependAnalysisResult_ClearstreamAPIConnector_2024Jul04_11h53m22.ndar}
-
The source directory {C:\Users\johan\OneDrive\DEV\ClearstreamAPIConnector} referenced by the PDB file of the assembly {ClearstreamAPIConnector} can't be found.
-
Log trend metrics values.
-
Rule {From now, all types added should be 100% covered by tests} relies on code coverage data that is not available in the baseline code base snapshot. The rule hasen't been executed on both baseline and newer code base snapshots.
-
Rule {From now, all types added should be 100% covered by tests} relies on code coverage data that is not available in the newer code base snapshot. The rule hasen't been executed on both baseline and newer code base snapshots.
-
Rule {Avoid decreasing code coverage by tests of types} relies on code coverage data that is not available in the baseline code base snapshot. The rule hasen't been executed on both baseline and newer code base snapshots.
-
Rule {Avoid decreasing code coverage by tests of types} relies on code coverage data that is not available in the newer code base snapshot. The rule hasen't been executed on both baseline and newer code base snapshots.
-
Rule {Code should be tested} relies on code coverage data that is not available in the baseline code base snapshot. The rule hasen't been executed on both baseline and newer code base snapshots.
-
Rule {Code should be tested} relies on code coverage data that is not available in the newer code base snapshot. The rule hasen't been executed on both baseline and newer code base snapshots.
-
Rule {New Types and Methods should be tested} relies on code coverage data that is not available in the baseline code base snapshot. The rule hasen't been executed on both baseline and newer code base snapshots.
-
Rule {New Types and Methods should be tested} relies on code coverage data that is not available in the newer code base snapshot. The rule hasen't been executed on both baseline and newer code base snapshots.
-
Rule {Methods refactored should be tested} relies on code coverage data that is not available in the baseline code base snapshot. The rule hasen't been executed on both baseline and newer code base snapshots.
-
Rule {Methods refactored should be tested} relies on code coverage data that is not available in the newer code base snapshot. The rule hasen't been executed on both baseline and newer code base snapshots.
-
Rule {Assemblies and Namespaces should be tested} relies on code coverage data that is not available in the baseline code base snapshot. The rule hasen't been executed on both baseline and newer code base snapshots.
-
Rule {Assemblies and Namespaces should be tested} relies on code coverage data that is not available in the newer code base snapshot. The rule hasen't been executed on both baseline and newer code base snapshots.
-
Rule {Types almost 100% tested should be 100% tested} relies on code coverage data that is not available in the baseline code base snapshot. The rule hasen't been executed on both baseline and newer code base snapshots.
-
Rule {Types almost 100% tested should be 100% tested} relies on code coverage data that is not available in the newer code base snapshot. The rule hasen't been executed on both baseline and newer code base snapshots.
-
Rule {Namespaces almost 100% tested should be 100% tested} relies on code coverage data that is not available in the baseline code base snapshot. The rule hasen't been executed on both baseline and newer code base snapshots.
-
Rule {Namespaces almost 100% tested should be 100% tested} relies on code coverage data that is not available in the newer code base snapshot. The rule hasen't been executed on both baseline and newer code base snapshots.
-
Rule {Types that used to be 100% covered by tests should still be 100% covered} relies on code coverage data that is not available in the baseline code base snapshot. The rule hasen't been executed on both baseline and newer code base snapshots.
-
Rule {Types that used to be 100% covered by tests should still be 100% covered} relies on code coverage data that is not available in the newer code base snapshot. The rule hasen't been executed on both baseline and newer code base snapshots.
-
Rule {Types tagged with FullCoveredAttribute should be 100% covered} relies on code coverage data that is not available in the baseline code base snapshot. The rule hasen't been executed on both baseline and newer code base snapshots.
-
Rule {Types tagged with FullCoveredAttribute should be 100% covered} relies on code coverage data that is not available in the newer code base snapshot. The rule hasen't been executed on both baseline and newer code base snapshots.
-
Rule {Types 100% covered should be tagged with FullCoveredAttribute} relies on code coverage data that is not available in the baseline code base snapshot. The rule hasen't been executed on both baseline and newer code base snapshots.
-
Rule {Types 100% covered should be tagged with FullCoveredAttribute} relies on code coverage data that is not available in the newer code base snapshot. The rule hasen't been executed on both baseline and newer code base snapshots.
-
Rule {Methods should have a low C.R.A.P score} relies on code coverage data that is not available in the baseline code base snapshot. The rule hasen't been executed on both baseline and newer code base snapshots.
-
Rule {Methods should have a low C.R.A.P score} relies on code coverage data that is not available in the newer code base snapshot. The rule hasen't been executed on both baseline and newer code base snapshots.
-
Quality Gate {Percentage Coverage} relies on code coverage data that is not available in the baseline code base snapshot.
-
Quality Gate {Percentage Coverage} relies on code coverage data that is not available in the newer code base snapshot.
-
Quality Gate {Percentage Coverage on New Code} relies on code coverage data that is not available in the baseline code base snapshot.
-
Quality Gate {Percentage Coverage on New Code} relies on code coverage data that is not available in the newer code base snapshot.
-
Quality Gate {Percentage Coverage on Refactored Code} relies on code coverage data that is not available in the baseline code base snapshot.
-
Quality Gate {Percentage Coverage on Refactored Code} relies on code coverage data that is not available in the newer code base snapshot.
-
Execute queries and rules
-
Output report source files
-
The baseline versions of source files modified are not available in the report.
-Reason: Cannot find the file {SourceFiles.zip} in the analysis result directory {C:\Users\Johannes Rest\OneDrive\DEV\ClearstreamAPIConnector\NDependOut}.
-Make sure that the NDepend Project Properties > Analysis > Zip Source Files setting is enabled.
-
Output report projects
-
Building the report (standard).
-
NDepend analysis done. Duration: 00:05.663
-
Application Statistics
- Stat
-
- # Occurences
-
- Avg
-
- StdDev
-
- Max
-
- Properties on interfaces
-
interfaces
-
0
0
-1 properties on
- Methods on interfaces
-
interfaces
-
0
0
-1 methods on
- Arguments on methods on interfaces
-
methods
-
0
0
-1 arguments on
- Public properties on classes
-
9 Classes
-
1.56
3.24
10 public properties on TestClearstreamAPIEndpoint.DiTemplate
- Public methods on classes
-
9 classes
-
4.22
6.43
21 public methods on TestClearstreamAPIEndpoint.DiTemplate
- Arguments on public methods on classes
-
38 methods
-
0.5
0.5
1 arguments on System.Runtime.CompilerServices.NullableAttribute..ctor(Byte)
- IL instructions in non-abstract methods
-
47 methods
-
52.57
121.36
430 IL instructions in TestClearstreamAPIEndpoint.Program.GetRefreshTokenAsync(Token)
- Cyclomatic complexity on non abstract Methods
-
47 Methods
-
4.77
9.64
- CC = 34 for TestClearstreamAPIEndpoint.Program.GetRefreshTokenAsync(Token)
Assemblies Metrics
- If you wish to define thresholds on assemblies' Code Metrics, consider writing some Rules.
- Clicking column header arrows sorts values.
- Clicking column header title text redirect to the online Code Metric definition.
- If you wish to define thresholds on types' Code Metrics, consider writing some Rule.
- Clicking column header arrows sorts values.
- Clicking column header title text redirect to the online Code Metric definition.
- If you wish to define thresholds on namespaces' Code Metrics, consider writing some Code Rules.
- Clicking column header arrows sorts values.
- Clicking column header title text redirect to the online Code Metric definition.
• Quality Gate Description:
-Code coverage is a measure used to describe the degree to which the source code of a program is tested by a particular test suite. A program with high code coverage, measured as a percentage, has had more of its source code executed during testing which suggests it has a lower chance of containing undetected software bugs compared to a program with low code coverage.
-Code coverage is certainly the most important quality code metric. But coverage is not enough the team needs to ensure that results are checked at test-time. These checks can be done both in test code, and in application code through assertions. The important part is that a test must fail explicitly when a check gets unvalidated during the test execution.
-This quality gate defines a warn threshold (80%) and a fail threshold (70%). These are indicative thresholds and in practice the more the better. To achieve high coverage and low risk, make sure that new and refactored classes gets 100% covered by tests and that the application and test code contains as many checks/assertions as possible.
- Scalar Result: N/A %
Quality Gate Pass: Percentage Coverage on New Code
• Quality Gate Description:
-New Code is defined as methods added since the baseline.
-To achieve high code coverage it is essential that new code gets properly tested and covered by tests. It is advised that all non-UI new classes gets 100% covered.
-Typically 90% of a class is easy to cover by tests and 10% is hard to reach through tests. It means that this 10% remaining is not easily testable, which means it is not well designed, which often means that this code is especially error-prone. This is the reason why it is important to reach 100% coverage for a class, to make sure that potentially error-prone code gets tested.
- Scalar Result: N/A %
Quality Gate Pass: Percentage Coverage on Refactored Code
• Quality Gate Description:
-Refactored Code is defined as methods where code was changed since the baseline.
-Comment changes and formatting changes are not considered as refactoring.
-To achieve high code coverage it is essential that refactored code gets properly tested and covered by tests. It is advised that when refactoring a class or a method, it is important to also write tests to make sure it gets 100% covered.
-Typically 90% of a class is easy to cover by tests and 10% is hard to reach through tests. It means that this 10% remaining is not easily testable, which means it is not well designed, which often means that this code is especially error-prone. This is the reason why it is important to reach 100% coverage for a class, to make sure that potentially error-prone code gets tested.
- Scalar Result: N/A %
Quality Gate Pass: Blocker Issues
• Quality Gate Description:
-An issue with the severity Blocker cannot move to production, it must be fixed.
-The severity of an issue is either defined explicitly in the rule source code, either inferred from the issue annual interest and thresholds defined in the NDepend Project Properties > Issue and Debt.
- No issue matched
Quality Gate Pass: Critical Issues
• Quality Gate Description:
-An issue with a severity level Critical shouldn't move to production. It still can for business imperative needs purposes, but at worst it must be fixed during the next iterations.
-The severity of an issue is either defined explicitly in the rule source code, either inferred from the issue annual interest and thresholds defined in the NDepend Project Properties > Issue and Debt.
- No issue matched
Quality Gate Pass: New Blocker / Critical / High Issues
• Quality Gate Description:
-An issue with the severity Blocker cannot move to production, it must be fixed.
-An issue with a severity level Critical shouldn't move to production. It still can for business imperative needs purposes, but at worth it must be fixed during the next iterations.
-An issue with a severity level High should be fixed quickly, but can wait until the next scheduled interval.
-The severity of an issue is either defined explicitly in the rule source code, either inferred from the issue annual interest and thresholds defined in the NDepend Project Properties > Issue and Debt.
- No issue matched
Quality Gate Pass: Critical Rules Violated
• Quality Gate Description:
-The concept of critical rule is useful to pinpoint certain rules that should not be violated.
-A rule can be made critical just by checking the Critical button in the rule edition control and then saving the rule.
-This quality gate fails if any critical rule gets any violations.
-When no baseline is available, rules that rely on diff are not counted. If you observe that this quality gate count slightly decreases with no apparent reason, the reason is certainly that rules that rely on diff are not counted because the baseline is not defined.
- No rule matched
Quality Gate Pass: Treat Compiler Warnings as Error
• Quality Gate Description:
-Many compiler warnings, if ignored, could lead to runtime errors, unpredictable behavior, or security vulnerabilities. Addressing these warnings early can prevent such issues from becoming real problems in production.
-Also, this approach encourages developers to follow best coding practices and to use language features correctly. It helps in maintaining a high standard of coding within a team, especially in projects with multiple contributors.
-This Quality Gate requires Roslyn Analyzers issues to be imported: https://www.ndepend.com/docs/roslyn-analyzer-issue-import
-C# and VB.NET compiler warnings are Roslyn Analyzers issues whose rule id starts with "CS" or "VB".
-This Quality Gate warns if there are any such warning. It fails if there are 10 or more such warnings.
-See list of C# compiler warnings here: https://learn.microsoft.com/en-us/dotnet/csharp/misc/cs0183
- No issue matched
Quality Gate Pass: Percentage Debt
• Quality Gate Description:
-% Debt total is defined as a percentage on:
-• the estimated total effort to develop the code base
-• and the the estimated total time to fix all issues (the Debt)
-Estimated total effort to develop the code base is inferred from # lines of code of the code base and from the Estimated number of man-day to develop 1000 logical lines of code setting found in NDepend Project Properties > Issue and Debt.
-Debt documentation: https://www.ndepend.com/docs/technical-debt#Debt
-This quality gates fails if the estimated debt is more than 30% of the estimated effort to develop the code base, and warns if the estimated debt is more than 20% of the estimated effort to develop the code base
- Scalar Result: 6.64 %
Quality Gate Pass: New Debt since Baseline
• Quality Gate Description:
-This Quality Gate fails if the estimated effort to fix new or worsened issues (what is called the New Debt since Baseline) is higher than 2 man-days.
-This Quality Gate warns if this estimated effort is positive.
-Debt documentation: https://www.ndepend.com/docs/technical-debt#Debt
- Scalar Result: 0 man-days
Quality Gate Pass: Debt Rating per Namespace
• Quality Gate Description:
-Forbid namespaces with a poor Debt Rating equals to E or D.
-The Debt Rating for a code element is estimated by the value of the Debt Ratio and from the various rating thresholds defined in this project Debt Settings.
-The Debt Ratio of a code element is a percentage of Debt Amount (in floating man-days) compared to the estimated effort to develop the code element (also in floating man-days).
-The estimated effort to develop the code element is inferred from the code elements number of lines of code, and from the project Debt Settings parameters estimated number of man-days to develop 1000logical lines of code.
-The logical lines of code corresponds to the number of debug breakpoints in a method and doesn't depend on code formatting nor comments.
-The Quality Gate can be modified to match assemblies, types or methods with a poor Debt Rating, instead of matching namespaces.
- No namespace matched
Quality Gate Pass: New Annual Interest since Baseline
• Quality Gate Description:
-This Quality Gate fails if the estimated annual cost to leave all issues unfixed, increased from more than 2 man-days since the baseline.
-This Quality Gate warns if this estimated annual cost is positive.
-This estimated annual cost is named the Annual-Interest.
-Each rule can either provide a formula to compute the Annual-Interest per issue, or assign a Severity level for each issue. Some thresholds defined in Project Properties > Issue and Debt > Annual Interest are used to infer an Annual-Interest value from a Severity level. Annual Interest documentation: https://www.ndepend.com/docs/technical-debt#AnnualInterest
Rule Violated:ND1203 Class with no descendant should be sealed if possible
• Rule Description:
-If a non-static class isn't declared with the keyword sealed, it means that it can be subclassed everywhere the non-sealed class is visible.
-Making a class a base class requires significant design effort. Subclassing a non-sealed class, not initially designed to be subclassed, will lead to unanticipated design issue.
-Most classes are non-sealed because developers don't care about the keyword sealed, not because the primary intention was to write a class that can be subclassed.
-There are performance gain in declaring a class as sealed. See a benchmark here: https://www.meziantou.net/performance-benefits-of-sealed-class.htm
-But the real benefit of doing so, is actually to express the intention: this class has not be designed to be a base class, hence it is not allowed to subclass it.
-Notice that by default this rule doesn't match public class to avoid matching classes that are intended to be sub-classed by third-party code using your library. If you are developing an application and not a library, just uncomment the clause !t.IsPubliclyVisible.
-
-
- • How to Fix Issues of this Rule:
-For each matched class, take the time to assess if it is really meant to be subclassed. Certainly most matched class will end up being declared as sealed.
-
-
- • How to Suppress an Issue of this Rule:
-In source code, tag the concerned code element with this attribute:
-[SuppressMessage("NDepend", "ND1203:ClassWithNoDescendantShouldBeSealedIfPossible", Justification="...")]
-This attribute requires the compilation symbol CODE_ANALYSIS to be set on each Visual Studio project relying on it. Without CODE_ANALYSIS symbol defined, the attribute is not compiled and the issues are not suppressed.
3 types matched
- Formatting: bold✱ means added ● means code was changed strike-bold means removed (since baseline)
-
• Rule Description:
-Types are declared within namespaces to prevent name collisions, and as a way of organizing related types in an object hierarchy.
-Types outside any named namespace are in a global namespace that cannot be referenced in code. Such practice results in naming collisions and ambiguity since types in the global namespace are accessible from anywhere in the code.
-Also, placing types within namespaces allows to encapsulate related code and data, providing a level of abstraction and modularity. Global types lack this encapsulation, making it harder to understand the organization and structure of your code.
-The global namespace has no name, hence it is qualified as being the anonymous namespace. This rule warns about anonymous namespaces.
-
-
- • How to Fix Issues of this Rule:
-To fix a violation of this rule, declare all types of all anonymous namespaces in some named namespaces.
-
-
- • How to Suppress an Issue of this Rule:
-In source code, tag the concerned code element with this attribute:
-[SuppressMessage("NDepend", "ND1307:DeclareTypesInNamespaces", Justification="...")]
-This attribute requires the compilation symbol CODE_ANALYSIS to be set on each Visual Studio project relying on it. Without CODE_ANALYSIS symbol defined, the attribute is not compiled and the issues are not suppressed.
1 namespace matched
- Formatting: bold✱ means added ● means code was changed strike-bold means removed (since baseline)
-
• Rule Description:
-This rule lists potentiallydead methods. A dead method is a method that can be removed because it is never called by the program.
-This rule lists not only methods not called anywhere in code, but also methods called only by methods not called anywhere in code. This is why this rule comes with a column MethodsCallingMe and this is why there is a code metric named depth:
-• A depth value of 0 means the method is not called.
-• A depth value of 1 means the method is called only by methods not called.
-• etc…
-By reading the source code of this rule, you'll see that by default, public methods are not matched, because such method might not be called by the analyzed code, but still be called by client code, not analyzed by NDepend. This default behavior can be easily changed.
-
-
- • How to Fix Issues of this Rule:
-Static analysis cannot provide an exact list of dead methods, because there are several ways to invoke a method dynamically (like through reflection).
-For each method matched by this query, first investigate if the method is invoked somehow (like through reflection). If the method is really never invoked, it is important to remove it to avoid maintaining useless code. If you estimate the code of the method might be used in the future, at least comment it, and provide an explanatory comment about the future intentions.
-If a method is invoked somehow, but still is matched by this rule, you can tag it with the attribute IsNotDeadCodeAttribute found in NDepend.API.dll to avoid matching the method again. You can also provide your own attribute for this need, but then you'll need to adapt this code rule.
-Issues of this rule have a Debt equal to 10 minutes because it only takes a short while to investigate if a method can be safely discarded. On top of these 10 minutes, the depth of usage of such method adds up 3 minutes per unity because dead method only called by dead code takes a bit more time to be investigated.
-The Annual Interest of issues of this rule, the annual cost to not fix such issue, is proportional to the type #lines of code, because the bigger the method is, the more it slows down maintenance.
-
-
- • How to Suppress an Issue of this Rule:
-In source code, tag the concerned code element with this attribute:
-[SuppressMessage("NDepend", "ND1701:PotentiallyDeadMethods", Justification="...")]
-This attribute requires the compilation symbol CODE_ANALYSIS to be set on each Visual Studio project relying on it. Without CODE_ANALYSIS symbol defined, the attribute is not compiled and the issues are not suppressed.
3 methods matched
- Formatting: bold✱ means added ● means code was changed strike-bold means removed (since baseline)
-
• Rule Description:
-Matched methods are subscribing a custom certificate validation procedure through the delegate: ServicePointManager.ServerCertificateValidationCallback.
-Doing so is often used to disable certificate validation to connect easily to a host that is not signed by a root certificate authority. https://en.wikipedia.org/wiki/Root_certificate
-This might create a vulnerability to man-in-the-middle attacks since the client will trust any certificate. https://en.wikipedia.org/wiki/Man-in-the-middle_attack
-
-
- • How to Fix Issues of this Rule:
-Don't rely on a weak custom certificate validation.
-If a legitimate custom certificate validation procedure must be subscribed, you can chose to suppress related issue(s).
-
-
- • How to Suppress an Issue of this Rule:
-In source code, tag the concerned code element with this attribute:
-[SuppressMessage("NDepend", "ND3103:DontDisableCertificateValidation", Justification="...")]
-This attribute requires the compilation symbol CODE_ANALYSIS to be set on each Visual Studio project relying on it. Without CODE_ANALYSIS symbol defined, the attribute is not compiled and the issues are not suppressed.
3 methods matched
- Formatting: bold✱ means added ● means code was changed strike-bold means removed (since baseline)
-
Rule Violated:ND1807 Avoid public methods not publicly visible
• Rule Description:
-This rule warns about methods declared as public whose parent type is not declared as public.
-In such situation public means, can be accessed from anywhere my parent type is visible. Some developers think this is an elegant language construct, some others find it misleading.
-This rule can be deactivated if you don't agree with it. Read the whole debate here: http://ericlippert.com/2014/09/15/internal-or-public/
-By default issues of this rule have a Low severity because they reflect more an advice than a problem.
-
-
- • How to Fix Issues of this Rule:
-Declare the method as internal if it is used outside of its type, else declare it as private.
-
-
- • How to Suppress an Issue of this Rule:
-In source code, tag the concerned code element with this attribute:
-[SuppressMessage("NDepend", "ND1807:AvoidPublicMethodsNotPubliclyVisible", Justification="...")]
-This attribute requires the compilation symbol CODE_ANALYSIS to be set on each Visual Studio project relying on it. Without CODE_ANALYSIS symbol defined, the attribute is not compiled and the issues are not suppressed.
3 methods matched
- Formatting: bold✱ means added ● means code was changed strike-bold means removed (since baseline)
-
Rule Violated:ND1803 Types that could be declared as private, nested in a parent type
• Rule Description:
-This rule matches types that can be potentially nested and declared private into another type.
-The conditions for a type to be potentially nested into a parent type are:
-• the parent type is the only type consuming it,
-• the type and the parent type are declared in the same namespace.
-Declaring a type as private into a parent type improves encapsulation. The scope from which the type can be consumed is then reduced to a minimum.
-This rule doesn't match classes with extension methods because such class cannot be nested in another type.
-
-
- • How to Fix Issues of this Rule:
-Nest each matched type into the specified parent type and declare it as private.
-However nested private types are hardly testable. Hence this rule might not be applied to types consumed directly by tests.
-
-
- • How to Suppress an Issue of this Rule:
-In source code, tag the concerned code element with this attribute:
-[SuppressMessage("NDepend", "ND1803:TypesThatCouldBeDeclaredAsPrivateNestedInAParentType", Justification="...")]
-This attribute requires the compilation symbol CODE_ANALYSIS to be set on each Visual Studio project relying on it. Without CODE_ANALYSIS symbol defined, the attribute is not compiled and the issues are not suppressed.
1 type matched
- Formatting: bold✱ means added ● means code was changed strike-bold means removed (since baseline)
-
Rule Violated:ND2100 Avoid referencing source file out of the project directory
• Rule Description:
-A source file located outside of the VS project directory can be added through: > Add > Existing Items… > Add As Link
-Doing so can be used to share types definitions across several assemblies. This provokes type duplication at binary level. Hence maintainability is degraded and subtle versioning bug can appear.
-This rule matches types whose source files are not declared under the directory that contains the related Visual Studio project file, or under any sub-directory of this directory.
-This practice can be tolerated for certain types shared across executable assemblies. Such type can be responsible for startup related concerns, such as registering custom assembly resolving handlers or checking the .NET Framework version before loading any custom library.
-
-
- • How to Fix Issues of this Rule:
-To fix a violation of this rule, prefer referencing from a VS project only source files defined in sub-directories of the VS project file location.
-By default issues of this rule have a Low severity because they reflect more an advice than a problem.
-
-
- • How to Suppress an Issue of this Rule:
-In source code, tag the concerned code element with this attribute:
-[SuppressMessage("NDepend", "ND2100:AvoidReferencingSourceFileOutOfVisualStudioProjectDirectory", Justification="...")]
-This attribute requires the compilation symbol CODE_ANALYSIS to be set on each Visual Studio project relying on it. Without CODE_ANALYSIS symbol defined, the attribute is not compiled and the issues are not suppressed.
4 types matched
- Formatting: bold✱ means added ● means code was changed strike-bold means removed (since baseline)
-
Rule Violated:ND2104 Types with source files stored in the same directory, should be declared in the same namespace
• Rule Description:
-To maintain a robust code structure and organization, it is advisable to synchronize the namespaces hierarchy with the directory hierarchy that contains the source files.
-Following this practice is a widely accepted convention, and failing to adhere to it can result in source code that is less maintainable and harder to navigate.
-Respecting this convention means that types with source files stored in the same directory, should be declared in the same namespace.
-For each directory that contains several source files, where most types are declared in a namespace (what we call the main namespace) and a few types are declared out of the main namespace, this code rule matches:
-• The main namespace
-• typesOutOfMainNamespace: Types declared in source files in the main namespace's directory but that are not in the main namespace.
-• typesInMainNamespace: And for informational purposes, types declared in source files in the main namespace's directory, and that are in the main namespace.
-
-
- • How to Fix Issues of this Rule:
-Violations of this rule are types in the typesOutOfMainNamespace column. Typically such type …
-• … is contained in the wrong namespace but its source file is stored in the right directory. In such situation the type should be contained in main namespace.
-• … is contained in the right namespace but its source file is stored in the wrong directory In such situation the source file of the type must be moved to the proper parent namespace directory.
-• … is declared in multiple source files, stored in different directories. In such situation it is preferable that all source files are stored in a single directory.
-The estimated Debt, which means the effort to fix such issue, is equal to 2 minutes plus 5 minutes per type in typesOutOfMainNamespace.
-
-
- • How to Suppress an Issue of this Rule:
-In source code, tag the concerned code element with this attribute:
-[SuppressMessage("NDepend", "ND2104:TypesWithSourceFilesStoredInTheSameDirectoryShouldBeDeclaredInTheSameNamespace", Justification="...")]
-This attribute requires the compilation symbol CODE_ANALYSIS to be set on each Visual Studio project relying on it. Without CODE_ANALYSIS symbol defined, the attribute is not compiled and the issues are not suppressed.
1 namespace matched
- Formatting: bold✱ means added ● means code was changed strike-bold means removed (since baseline)
-
• Query Description:
-This query lists types with most Debt, or in other words, types with issues that would need the largest effort to get fixed.
-Both issues on the type and its members are taken account.
-Since untested code often generates a lot of Debt, the type size and percentage coverage is shown (just uncomment t.PercentageCoverage in the query source code once you've imported the coverage data).
-The Debt Rating and Debt Ratio are also shown for informational purpose.
---
-The amount of Debt is not a measure to prioritize the effort to fix issues, it is an estimation of how far the team is from clean code that abides by the rules set.
-For each issue the Annual Interest estimates the annual cost to leave the issues unfixed. The Severity of an issue is estimated through thresholds from the Annual Interest.
-The Debt Breaking Point represents the duration from now when the estimated cost to leave the issue unfixed costs as much as the estimated effort to fix it.
-Hence the shorter the Debt Breaking Point the largest the Return on Investment for fixing the issue. The Breaking Point is the right metric to prioritize issues fix.
TestClearstreamAPIEndpoint .DiTemplateList} violates rule 'Class with no descendant should be sealed if possible'
TestClearstreamAPIEndpoint .DiTemplateList} violates rule 'Types that could be declared as private, nested in a parent type'
|m0|2| 2min 0s
|m16|1| 1y 273d
|m0|2| 0
0D
|m100|0| 20.25
TestClearstreamAPIEndpoint .DiTemplateList
Code Query: Types to Fix Priority
• Query Description:
-This query lists types per increasing Debt Breaking Point.
-For each issue the Debt estimates the effort to fix the issue, and the Annual Interest estimates the annual cost to leave the issue unfixed. The Severity of an issue is estimated through thresholds from the Annual Interest of the issue.
-The Debt Breaking Point represents the duration from now when the estimated cost to leave the issue unfixed costs as much as the estimated effort to fix it.
-Hence the shorter the Debt Breaking Point the largest the Return on Investment for fixing the issues.
-Often new and refactored types since baseline will be listed first, because issues on these types get a higher Annual Interest because it is important to focus first on new issues.
---
-Both issues on the type and its members are taken account.
-Only types with at least 30 minutes of Debt are listed to avoid polluting the list with the numerous types with small Debt, on which the Breaking Point value makes less sense.
-The Annual Interest estimates the cost per year in man-days to leave these issues unfixed.
-Since untested code often generates a lot of Debt, the type size and percentage coverage is shown (just uncomment t.PercentageCoverage in the query source code once you've imported the coverage data).
-The Debt Rating and Debt Ratio are also shown for informational purpose.
• Query Description:
-This query lists issues per increasing Debt Breaking Point.
-Double-click an issue to edit its rule and select the issue in the rule result. This way you can view all information concerning the issue.
-For each issue the Debt estimates the effort to fix the issue, and the Annual Interest estimates the annual cost to leave the issue unfixed. The Severity of an issue is estimated through thresholds from the Annual Interest of the issue.
-The Debt Breaking Point represents the duration from now when the estimated cost to leave the issue unfixed costs as much as the estimated effort to fix it.
-Hence the shorter the Debt Breaking Point the largest the Return on Investment for fixing the issue.
-Often issues on new and refactored code elements since baseline will be listed first, because such issues get a higher Annual Interest because it is important to focus first on new issues on recent code.
-More documentation: https://www.ndepend.com/docs/technical-debt
Rule violated: Avoid referencing source file out of the project directory
Code Query: Debt and Issues per Rule
• Query Description:
-This query lists violated rules with most Debt first.
-A rule violated has issues. For each issue the Debt estimates the effort to fix the issue.
---
-The amount of Debt is not a measure to prioritize the effort to fix issues, it is an estimation of how far the team is from clean code that abides by the rules set.
-For each issue the Annual Interest estimates the annual cost to leave the issues unfixed. The Severity of an issue is estimated through thresholds from the Annual Interest.
-The Debt Breaking Point represents the duration from now when the estimated cost to leave the issue unfixed costs as much as the estimated effort to fix it.
-Hence the shorter the Debt Breaking Point the largest the Return on Investment for fixing the issue. The Breaking Point is the right metric to prioritize issues fix.
---
-Notice that rules can be grouped in Rule Category. This way you'll see categories that generate most Debt.
-Typically the rules that generate most Debt are the ones related to Code Coverage by Tests, Architecture and Code Smells.
-More documentation: https://www.ndepend.com/docs/technical-debt
• Query Description:
-This query lists violated rules that have new issues since baseline, with most new Debt first.
-A rule violated has issues. For each issue the Debt estimates the effort to fix the issue.
---
-New issues since the baseline are consequence of recent code refactoring sessions. They represent good opportunities of fix because the code recently refactored is fresh in the developers mind, which means fixing now costs less than fixing later.
-Fixing issues on recently touched code is also a good way to foster practices that will lead to higher code quality and maintainability, including writing unit-tests and avoiding unnecessary complex code.
---
-Notice that rules can be grouped in Rule Category. This way you'll see categories that generate most Debt.
-Typically the rules that generate most Debt are the ones related to Code Coverage by Tests, Architecture and Code Smells.
-More documentation: https://www.ndepend.com/docs/technical-debt
- No rule matched
Code Query: Debt and Issues per Code Element
• Query Description:
-This query lists code elements that have issues, with most Debt first.
-For each code element the Debt estimates the effort to fix the element issues.
-The amount of Debt is not a measure to prioritize the effort to fix issues, it is an estimation of how far the team is from clean code that abides by the rules set.
-For each element the Annual Interest estimates the annual cost to leave the elements issues unfixed. The Severity of an issue is estimated through thresholds from the Annual Interest of the issue.
-The Debt Breaking Point represents the duration from now when the estimated cost to leave the issues unfixed costs as much as the estimated effort to fix it.
-Hence the shorter the Debt Breaking Point the largest the Return on Investment for fixing the issue. The Breaking Point is the right metric to prioritize issues fix.
• Query Description:
-This query lists code elements that have new issues since baseline, with most new Debt first.
-For each code element the Debt estimates the effort to fix the element issues.
-New issues since the baseline are consequence of recent code refactoring sessions. They represent good opportunities of fix because the code recently refactored is fresh in the developers mind, which means fixing now costs less than fixing later.
-Fixing issues on recently touched code is also a good way to foster practices that will lead to higher code quality and maintainability, including writing unit-tests and avoiding unnecessary complex code.
• Rule Description:
-This rule matches interfaces with more than 14 methods, properties or events. Interfaces are abstractions and are meant to simplify the code. They should have a single responsibility, and when they become overly large and complex, it means they have too many responsibilities.
-The Interface Segregation Principle (ISP) advises us that when a large interface is used by various consumers, each of which only requires specific methods, unnecessarily coupling those consumers through the same interface can occur.
-Furthermore, when dealing with large interfaces, we often end up with larger classes that attempt to handle too many unrelated tasks.
-A property with a getter or setter or both count as one member. An event count as one member.
-
-
- • How to Fix Issues of this Rule:
-Typically to fix such issue, the interface must be refactored in a grape of smaller single-responsibility interfaces.
-For example if an interface IFoo handles both read and write operations, it can be split into two interfaces: IFooReader and IFooWriter.
-A usual problem for a large public interface is that it has many clients that consume it. As a consequence splitting it in smaller interfaces has an important impact and it is not always feasible.
-The estimated Debt, which means the effort to fix such issue, varies linearly from 20 minutes for an interface with 10 methods, up to 7 hours for an interface with 100 or more methods. The Debt is divided by two if the interface is not publicly visible, because in such situation only the current project is impacted by the refactoring.
-
-
- • How to Suppress an Issue of this Rule:
-In source code, tag the concerned code element with this attribute:
-[SuppressMessage("NDepend", "ND1200:AvoidInterfacesTooBig", Justification="...")]
-This attribute requires the compilation symbol CODE_ANALYSIS to be set on each Visual Studio project relying on it. Without CODE_ANALYSIS symbol defined, the attribute is not compiled and the issues are not suppressed.
- No type matched
Validated Rule: Base class should not use derivatives
• Rule Description:
-In Object-Oriented Programming, the open/closed principle states: software entities (components, classes, methods, etc.) should be open for extension, but closed for modification. http://en.wikipedia.org/wiki/Open/closed_principle
-Hence a base class should be designed properly to make it easy to derive from, this is extension. But creating a new derived class, or modifying an existing one, shouldn't provoke any modification in the base class. And if a base class is using some derivative classes somehow, there are good chances that such modification will be needed.
-Extending the base class is not anymore a simple operation, this is not good design.
-Note that this rule doesn't warn when a base class is using a derived class that is nested in the base class and declared as private. In such situation we consider that the derived class is an encapsulated implementation detail of the base class.
-
-
- • How to Fix Issues of this Rule:
-Understand the need for using derivatives, then imagine a new design, and then refactor.
-Typically an algorithm in the base class needs to access something from derived classes. You can try to encapsulate this access behind an abstract or a virtual method.
-If you see in the base class some conditions on typeof(DerivedClass) not only urgent refactoring is needed. Such condition can easily be replaced through an abstract or a virtual method.
-Sometime you'll see a base class that creates instance of some derived classes. In such situation, certainly using the factory method patternhttp://en.wikipedia.org/wiki/Factory_method_pattern or the abstract factory patternhttp://en.wikipedia.org/wiki/Abstract_factory_pattern will improve the design.
-The estimated Debt, which means the effort to fix such issue, is equal to 3 minutes per derived class used by the base class + 3 minutes per member of a derived class used by the base class.
-
-
- • How to Suppress an Issue of this Rule:
-In source code, tag the concerned code element with this attribute:
-[SuppressMessage("NDepend", "ND1201:BaseClassShouldNotUseDerivatives", Justification="...")]
-This attribute requires the compilation symbol CODE_ANALYSIS to be set on each Visual Studio project relying on it. Without CODE_ANALYSIS symbol defined, the attribute is not compiled and the issues are not suppressed.
- No type matched
Validated Rule: Class shouldn't be too deep in inheritance tree
• Rule Description:
-This rule warns about classes having 4 or more base classes. Notice that third-party base classes are not counted because this rule is about your code design, not third-party libraries consumed design.
-In theory, there is nothing wrong having a long inheritance chain, if the modeling has been well thought out, if each base class is a well-designed refinement of the domain.
-In practice, modeling properly a domain demands a lot of effort and experience and more often than not, a long inheritance chain is a sign of confused design, that is hard to work with and maintain.
-
-
- • How to Fix Issues of this Rule:
-In Object-Oriented Programming, a well-known motto is Favor Composition over Inheritance.
-This is because inheritance comes with pitfalls. In general, the implementation of a derived class is very bound up with the base class implementation. Also a base class exposes implementation details to its derived classes, that's why it's often said that inheritance breaks encapsulation.
-On the other hands, Composition favors binding with interfaces over binding with implementations. Hence, not only the encapsulation is preserved, but the design is clearer, because interfaces make it explicit and less coupled.
-Hence, to break a long inheritance chain, Composition is often a powerful way to enhance the design of the refactored underlying logic.
-You can also read: http://en.wikipedia.org/wiki/Composition_over_inheritance and http://stackoverflow.com/questions/49002/prefer-composition-over-inheritance
-The estimated Debt, which means the effort to fix such issue, depends linearly upon the depth of inheritance.
-
-
- • How to Suppress an Issue of this Rule:
-In source code, tag the concerned code element with this attribute:
-[SuppressMessage("NDepend", "ND1202:ClassShouldntBeTooDeepInInheritanceTree", Justification="...")]
-This attribute requires the compilation symbol CODE_ANALYSIS to be set on each Visual Studio project relying on it. Without CODE_ANALYSIS symbol defined, the attribute is not compiled and the issues are not suppressed.
- No type matched
Rule Violated:ND1203 Class with no descendant should be sealed if possible
• Rule Description:
-If a non-static class isn't declared with the keyword sealed, it means that it can be subclassed everywhere the non-sealed class is visible.
-Making a class a base class requires significant design effort. Subclassing a non-sealed class, not initially designed to be subclassed, will lead to unanticipated design issue.
-Most classes are non-sealed because developers don't care about the keyword sealed, not because the primary intention was to write a class that can be subclassed.
-There are performance gain in declaring a class as sealed. See a benchmark here: https://www.meziantou.net/performance-benefits-of-sealed-class.htm
-But the real benefit of doing so, is actually to express the intention: this class has not be designed to be a base class, hence it is not allowed to subclass it.
-Notice that by default this rule doesn't match public class to avoid matching classes that are intended to be sub-classed by third-party code using your library. If you are developing an application and not a library, just uncomment the clause !t.IsPubliclyVisible.
-
-
- • How to Fix Issues of this Rule:
-For each matched class, take the time to assess if it is really meant to be subclassed. Certainly most matched class will end up being declared as sealed.
-
-
- • How to Suppress an Issue of this Rule:
-In source code, tag the concerned code element with this attribute:
-[SuppressMessage("NDepend", "ND1203:ClassWithNoDescendantShouldBeSealedIfPossible", Justification="...")]
-This attribute requires the compilation symbol CODE_ANALYSIS to be set on each Visual Studio project relying on it. Without CODE_ANALYSIS symbol defined, the attribute is not compiled and the issues are not suppressed.
3 types matched
- Formatting: bold✱ means added ● means code was changed strike-bold means removed (since baseline)
-
Validated Rule: Overrides of Method() should call base.Method()
• Rule Description:
-Typically overrides of a base method, should refine or complete the behavior of the base method. If the base method is not called, the base behavior is not refined but it is replaced.
-Violations of this rule are a sign of design flaw, especially if the actual design provides valid reasons that advocates that the base behavior must be replaced and not refined.
-
-
- • How to Fix Issues of this Rule:
-You should investigate if inheritance is the right choice to bind the base class implementation with the derived classes implementations. Does presenting the method with polymorphic behavior through an interface, would be a better design choice?
-In such situation, often using the design pattern template methodhttp://en.wikipedia.org/wiki/Template_method_pattern might help improving the design.
-
-
- • How to Suppress an Issue of this Rule:
-In source code, tag the concerned code element with this attribute:
-[SuppressMessage("NDepend", "ND1204:OverridesOfMethodShouldCallBaseMethod", Justification="...")]
-This attribute requires the compilation symbol CODE_ANALYSIS to be set on each Visual Studio project relying on it. Without CODE_ANALYSIS symbol defined, the attribute is not compiled and the issues are not suppressed.
- No method matched
Validated Rule: Do not hide base class methods
• Rule Description:
-Method hiding is when a base class defines non-virtual method M(), and a derived class has also a method M() with the same signature. In such situation, calling base.M() does something different than calling derived.M().
-Notice that this is not polymorphic behavior. With polymorphic behavior, calling both base.M() and derived.M() on an instance object of derived, invoke the same implementation.
-This situation should be avoided because it obviously leads to confusion. This rule warns about all method hiding cases in the code base.
-
-
- • How to Fix Issues of this Rule:
-To fix a violation of this rule, remove or rename the method, or change the parameter signature so that the method does not hide the base method.
-However method hiding is for those times when you need to have two things to have the same name but different behavior. This is a very rare situations, described here: https://learn.microsoft.com/en-us/archive/blogs/ericlippert/method-hiding-apologia
-
-
- • How to Suppress an Issue of this Rule:
-In source code, tag the concerned code element with this attribute:
-[SuppressMessage("NDepend", "ND1205:DoNotHideBaseClassMethods", Justification="...")]
-This attribute requires the compilation symbol CODE_ANALYSIS to be set on each Visual Studio project relying on it. Without CODE_ANALYSIS symbol defined, the attribute is not compiled and the issues are not suppressed.
- No method matched
Validated Rule: A stateless class or structure might be turned into a static type
• Rule Description:
-This rule matches classes and structures that are not static, nor generic, that doesn't have any instance fields, that doesn't implement any interface nor has a base class (different than System.Object).
-Such class or structure is a stateless collection of pure functions, that doesn't act on any this object data. Such collection of pure functions is better hosted in a static class. Doing so simplifies the client code that doesn't have to create an object anymore to invoke the pure functions.
-
-
- • How to Fix Issues of this Rule:
-Declare all methods as static and transform the class or structure into a static class.
-By default issues of this rule have a Low severity because they reflect more an advice than a problem.
-
-
- • How to Suppress an Issue of this Rule:
-In source code, tag the concerned code element with this attribute:
-[SuppressMessage("NDepend", "ND1206:AStatelessClassOrStructureMightBeTurnedIntoAStaticType", Justification="...")]
-This attribute requires the compilation symbol CODE_ANALYSIS to be set on each Visual Studio project relying on it. Without CODE_ANALYSIS symbol defined, the attribute is not compiled and the issues are not suppressed.
- No type matched
Validated Rule: Non-static classes should be instantiated or turned to static
• Rule Description:
-If the constructors of a class are never called, the class is never instantiated, and should be defined as a static class.
-However this rule doesn't match instantiation through reflection. As a consequence, plug-in root classes, instantiated through reflection via IoC frameworks, can be false positives for this rule.
-This rule doesn't match also classes instantiated by the ASP.NET infrastructure, ASP.NET view model classes and Entity Framework ModelSnapshot, DbContext and Migration classes.
-Notice that by default this rule matches also public class. If you are developing a framework with classes that are intended to be instantiated by your clients, just uncomment the line !t.IsPublic.
-
-
- • How to Fix Issues of this Rule:
-First it is important to investigate why the class is never instantiated. If the reason is the class hosts only static methods then the class can be safely declared as static.
-Others reasons like, the class is meant to be instantiated via reflection, or is meant to be instantiated only by client code should lead to adapt this rule code to avoid these matches.
-
-
- • How to Suppress an Issue of this Rule:
-In source code, tag the concerned code element with this attribute:
-[SuppressMessage("NDepend", "ND1207:NonStaticClassesShouldBeInstantiatedOrTurnedToStatic", Justification="...")]
-This attribute requires the compilation symbol CODE_ANALYSIS to be set on each Visual Studio project relying on it. Without CODE_ANALYSIS symbol defined, the attribute is not compiled and the issues are not suppressed.
- No type matched
Validated Rule: Methods should be declared static if possible
• Rule Description:
-When an instance method can be safely declared as static you should declare it as static.
-Whenever you write a method, you fulfill a contract in a given scope. The narrower the scope is, the smaller the chance is that you write a bug.
-When a method is static, you can't access non-static members; hence, your scope is narrower. So, if you don't need and will never need (even in subclasses) instance fields to fulfill your contract, why give access to these fields to your method? Declaring the method static in this case will let the compiler check that you don't use members that you do not intend to use.
-Declaring a method as static if possible is also good practice because clients can tell from the method signature that calling the method can't alter the object's state.
-Doing so, is also a micro performance optimization, since a static method is a bit cheaper to invoke than an instance method, because the this reference* doesn't need anymore to be passed.
-Notice that if a matched method is a handler, bound to an event through code generated by a designer, declaring it as static might break the designer generated code, if the generated code use the this invocation syntax, (like this.Method()).
-
-
- • How to Fix Issues of this Rule:
-Declare matched methods as static.
-Since such method doesn't use any instance fields and methods of its type and base-types, you should consider if it makes sense, to move such a method to a static utility class.
-
-
- • How to Suppress an Issue of this Rule:
-In source code, tag the concerned code element with this attribute:
-[SuppressMessage("NDepend", "ND1208:MethodsShouldBeDeclaredStaticIfPossible", Justification="...")]
-This attribute requires the compilation symbol CODE_ANALYSIS to be set on each Visual Studio project relying on it. Without CODE_ANALYSIS symbol defined, the attribute is not compiled and the issues are not suppressed.
- No method matched
Validated Rule: Constructor should not call a virtual method
• Rule Description:
-This rule matches constructors of a non-sealed class that call one or several virtual methods.
-During the construction of a .NET object at runtime, constructors execute sequentially, starting from the base class and progressing to the most derived class.
-Objects maintain their type throughout construction; they begin as the most derived type with the method table corresponding to that type. Consequently, virtual method calls always execute on the most derived type, even when called from within the constructor.
-Combining these two observations leads to the issue that when you invoke a virtual method within a constructor and the current class is not the most derived type in its inheritance hierarchy, the method will execute on a class whose constructor hasn't been executed yet. This may result in an unsuitable state for the method to be called.
-Therefore, this situation renders the class error-prone when deriving from it.
-
-
- • How to Fix Issues of this Rule:
-Issues reported can be solved by re-designing object initialisation or by declaring the parent class as sealed, if possible.
-A constructor should primarily focus on initializing the state of its own class. Additional setup can be handled in constructors of derived classes or in dedicated methods called after object construction.
-
-
- • How to Suppress an Issue of this Rule:
-In source code, tag the concerned code element with this attribute:
-[SuppressMessage("NDepend", "ND1209:ConstructorShouldNotCallAVirtualMethod", Justification="...")]
-This attribute requires the compilation symbol CODE_ANALYSIS to be set on each Visual Studio project relying on it. Without CODE_ANALYSIS symbol defined, the attribute is not compiled and the issues are not suppressed.
- No method matched
Validated Rule: Avoid the Singleton pattern
• Rule Description:
-The singleton pattern ensures a class has only one instance during runtime: http://en.wikipedia.org/wiki/Singleton_pattern Initially, this pattern may seem attractive due to its simplicity and applicability to common scenarios, making it widely adopted.
-We advise against using singleton classes because they tend to produce code that is less testable and harder to maintain. Singleton, by design, is not conducive to testing, as it enforces the use of the same instance object across multiple unit tests, limiting the flexibility required for effective testing and maintenance.
-Additionally, the static Instance getter method of the singleton pattern provides convenient but uncontrolled access to the single object and its state, leading to code that can become disorganized and messy over time, often requiring refactoring efforts.
-This rule applies specifically to singleton types with mutable instance fields because the pitfalls of singletons arise from unregulated access and modification of instance data.
-More details available in these discussions: https://blog.ndepend.com/the-proper-usages-of-the-keyword-static-in-c/
-
-
- • How to Fix Issues of this Rule:
-This rule pertains to the usual syntax of singletons, where a single static field holds the instance of the parent class. We emphasize that the issue lies in this specific syntax, which hinders testability. The concern is not having a single instance of the class during runtime.
-To address matches for this rule, create the single instance at the program's startup and pass it explicitly to all classes and methods requiring access.
-When dealing with multiple singletons, consider consolidating them into a single program execution context. This unified context simplifies propagation across various program units.
-The estimated Debt, which means the effort to fix such issue, is equal to 3 minutes per method relying on the singleton. It is not rare that hundreds of methods rely on the singleton and that it takes hours to get rid of a singleton, refactoring the way just explained above.
-The severity of each singleton issue is Critical because as explained, using a the singleton pattern can really prevent the whole program to be testable and maintained.
-
-
- • How to Suppress an Issue of this Rule:
-In source code, tag the concerned code element with this attribute:
-[SuppressMessage("NDepend", "ND1210:AvoidTheSingletonPattern", Justification="...")]
-This attribute requires the compilation symbol CODE_ANALYSIS to be set on each Visual Studio project relying on it. Without CODE_ANALYSIS symbol defined, the attribute is not compiled and the issues are not suppressed.
- No type matched
Validated Rule: Don't assign static fields from instance methods
• Rule Description:
-Assigning static fields from instance methods leads to poorly maintainable and non-thread-safe code.
-More discussion on the topic can be found here: https://blog.ndepend.com/the-proper-usages-of-the-keyword-static-in-c/
-
-
- • How to Fix Issues of this Rule:
-If the static field is just assigned once in the program lifetime, make sure to declare it as readonly and assign it inline, or from the static constructor.
-In Object-Oriented-Programming the natural artifact to hold states that can be modified is instance fields.
-Hence to fix violations of this rule, make sure to hold assignable states through instance fields, not through static fields.
-
-
- • How to Suppress an Issue of this Rule:
-In source code, tag the concerned code element with this attribute:
-[SuppressMessage("NDepend", "ND1211:DontAssignStaticFieldsFromInstanceMethods", Justification="...")]
-This attribute requires the compilation symbol CODE_ANALYSIS to be set on each Visual Studio project relying on it. Without CODE_ANALYSIS symbol defined, the attribute is not compiled and the issues are not suppressed.
- No field matched
Validated Rule: Avoid empty interfaces
• Rule Description:
-Interfaces define members that provide a behavior or usage contract. The functionality that is described by the interface can be adopted by any type, regardless of where the type appears in the inheritance hierarchy. A type implements an interface by providing implementations for the members of the interface. An empty interface does not define any members. Therefore, it does not define a contract that can be implemented.
-If your design includes empty interfaces that types are expected to implement, you are probably using an interface as a marker or a way to identify a group of types. If this identification will occur at run time, the correct way to accomplish this is to use a custom attribute. Use the presence or absence of the attribute, or the properties of the attribute, to identify the target types. If the identification must occur at compile time, then it is acceptable to use an empty interface.
-Note that if an interface is empty but implements at least one other interface, it won't be matched by this rule. Such interface can be considered as not empty, since implementing it means that sub-interfaces members must be implemented.
-
-
- • How to Fix Issues of this Rule:
-Remove the interface or add members to it. If the empty interface is being used to mark a set of types, replace the interface with a custom attribute.
-The estimated Debt, which means the effort to fix such issue, is equal to 10 minutes to discard an empty interface plus 3 minutes per type implementing an empty interface.
-
-
- • How to Suppress an Issue of this Rule:
-In source code, tag the concerned code element with this attribute:
-[SuppressMessage("NDepend", "ND1212:AvoidEmptyInterfaces", Justification="...")]
-This attribute requires the compilation symbol CODE_ANALYSIS to be set on each Visual Studio project relying on it. Without CODE_ANALYSIS symbol defined, the attribute is not compiled and the issues are not suppressed.
- No type matched
Validated Rule: Avoid types initialization cycles
• Rule Description:
-The class constructor, also known as the static constructor and labeled as cctor in IL code, is executed by the runtime the first time a type is utilized. A cctor doesn't need to be explicitly declared in source code to exist in compiled IL code. Having a static field inline initialization is enough to have the cctor implicitly declared in the parent class or structure.
-If the cctor of a type t1 is using the type t2 and if the cctor of t2 is using t1, some type initialization unexpected and hard-to-diagnose buggy behavior can occur. Such a cyclic chain of initialization is not necessarily limited to two types and can embrace N types in the general case. More information on types initialization cycles can be found here: http://codeblog.jonskeet.uk/2012/04/07/type-initializer-circular-dependencies/
-The present code rule enumerates types initialization cycles. Some false positives can appear if some lambda expressions are defined in cctors or in methods called by cctors. In such situation, this rule considers these lambda expressions as executed at type initialization time, while it is not necessarily the case.
-
-
- • How to Fix Issues of this Rule:
-Types initialization cycles create confusion and unexpected behaviors. If several states hold by several classes must be initialized during the first access of any of those classes, a better design option is to create a dedicated class whose responsibility is to initialize and hold all these states.
-The estimated Debt, which means the effort to fix such issue, is equal to 20 minutes per cycle plus 10 minutes per type class constructor involved in the cycle.
-
-
- • How to Suppress an Issue of this Rule:
-In source code, tag the concerned code element with this attribute:
-[SuppressMessage("NDepend", "ND1213:AvoidTypesInitializationCycles", Justification="...")]
-This attribute requires the compilation symbol CODE_ANALYSIS to be set on each Visual Studio project relying on it. Without CODE_ANALYSIS symbol defined, the attribute is not compiled and the issues are not suppressed.
• Rule Description:
-This rule is executed only if a baseline for comparison is defined (diff mode).
-This rule warns if a type publicly visible in the baseline, is not publicly visible anymore or if it has been removed. Clients code using such type will be broken.
-
-
- • How to Fix Issues of this Rule:
-Make sure that public types that used to be presented to clients, still remain public now, and in the future.
-If a public type must really be removed, you can tag it with System.ObsoleteAttribute with a workaround message during a few public releases, until it gets removed definitely. Notice that this rule doesn't match types removed that were tagged as obsolete.
-Issues of this rule have a severity equal to High because an API Breaking change can provoque significant friction with consumers of the API.
-
-
- • How to Suppress an Issue of this Rule:
-In source code, tag the concerned code element with this attribute:
-[SuppressMessage("NDepend", "ND1500:APIBreakingChangesTypes", Justification="...")]
-This attribute requires the compilation symbol CODE_ANALYSIS to be set on each Visual Studio project relying on it. Without CODE_ANALYSIS symbol defined, the attribute is not compiled and the issues are not suppressed.
- No type matched
Validated Rule: API Breaking Changes: Methods
• Rule Description:
-This rule is executed only if a baseline for comparison is defined (diff mode).
-This rule warns if a method publicly visible in the baseline, is not publicly visible anymore or if it has been removed. Clients code using such method will be broken.
-
-
- • How to Fix Issues of this Rule:
-Make sure that public methods that used to be presented to clients, still remain public now, and in the future.
-If a public method must really be removed, you can tag it with System.ObsoleteAttribute with a workaround message during a few public releases, until it gets removed definitely. Notice that this rule doesn't match methods removed that were tagged as obsolete.
-Issues of this rule have a severity equal to High because an API Breaking change can provoque significant friction with consumers of the API.
-
-
- • How to Suppress an Issue of this Rule:
-In source code, tag the concerned code element with this attribute:
-[SuppressMessage("NDepend", "ND1501:APIBreakingChangesMethods", Justification="...")]
-This attribute requires the compilation symbol CODE_ANALYSIS to be set on each Visual Studio project relying on it. Without CODE_ANALYSIS symbol defined, the attribute is not compiled and the issues are not suppressed.
- No method matched
Validated Rule: API Breaking Changes: Fields
• Rule Description:
-This rule is executed only if a baseline for comparison is defined (diff mode).
-This rule warns if a field publicly visible in the baseline, is not publicly visible anymore or if it has been removed. Clients code using such field will be broken.
-
-
- • How to Fix Issues of this Rule:
-Make sure that public fields that used to be presented to clients, still remain public now, and in the future.
-If a public field must really be removed, you can tag it with System.ObsoleteAttribute with a workaround message during a few public releases, until it gets removed definitely. Notice that this rule doesn't match fields removed that were tagged as obsolete.
-Issues of this rule have a severity equal to High because an API Breaking change can provoque significant friction with consumers of the API.
-
-
- • How to Suppress an Issue of this Rule:
-In source code, tag the concerned code element with this attribute:
-[SuppressMessage("NDepend", "ND1502:APIBreakingChangesFields", Justification="...")]
-This attribute requires the compilation symbol CODE_ANALYSIS to be set on each Visual Studio project relying on it. Without CODE_ANALYSIS symbol defined, the attribute is not compiled and the issues are not suppressed.
- No field matched
Validated Rule: API Breaking Changes: Interfaces and Abstract Classes
• Rule Description:
-This rule is executed only if a baseline for comparison is defined (diff mode).
-This rule warns if a publicly visible interface or abstract class has been changed and contains new abstract methods or if some abstract methods have been removed.
-Clients code that implement such interface or derive from such abstract class will be broken.
-
-
- • How to Fix Issues of this Rule:
-Make sure that the public contracts of interfaces and abstract classes that used to be presented to clients, remain stable now, and in the future.
-If a public contract must really be changed, you can tag abstract methods that will be removed with System.ObsoleteAttribute with a workaround message during a few public releases, until it gets removed definitely.
-Issues of this rule have a severity equal to High because an API Breaking change can provoque significant friction with consummers of the API. The severity is not set to Critical because an interface is not necessarily meant to be implemented by the consummer of the API.
-
-
- • How to Suppress an Issue of this Rule:
-In source code, tag the concerned code element with this attribute:
-[SuppressMessage("NDepend", "ND1503:APIBreakingChangesInterfacesAndAbstractClasses", Justification="...")]
-This attribute requires the compilation symbol CODE_ANALYSIS to be set on each Visual Studio project relying on it. Without CODE_ANALYSIS symbol defined, the attribute is not compiled and the issues are not suppressed.
- No type matched
Validated Rule: Broken serializable types
• Rule Description:
-This rule is executed only if a baseline for comparison is defined (diff mode).
-This rule warns about breaking changes in types tagged with SerializableAttribute.
-To do so, this rule searches for serializable type with serializable instance fields added or removed. Notice that it doesn't take account of fields tagged with NonSerializedAttribute.
-From http://msdn.microsoft.com/library/system.serializableattribute.aspx : "All the public and private fields in a type that are marked by the SerializableAttribute are serialized by default, unless the type implements the ISerializable interface to override the serialization process. The default serialization process excludes fields that are marked with the NonSerializedAttribute attribute."
-
-
- • How to Fix Issues of this Rule:
-Make sure that the serialization process of serializable types remains stable now, and in the future.
-Else you'll have to deal with Version Tolerant Serialization that is explained here: https://msdn.microsoft.com/en-us/library/ms229752(v=vs.110).aspx
-Issues of this rule have a severity equal to High because an API Breaking change can provoque significant friction with consummers of the API.
-
-
- • How to Suppress an Issue of this Rule:
-In source code, tag the concerned code element with this attribute:
-[SuppressMessage("NDepend", "ND1504:BrokenSerializableTypes", Justification="...")]
-This attribute requires the compilation symbol CODE_ANALYSIS to be set on each Visual Studio project relying on it. Without CODE_ANALYSIS symbol defined, the attribute is not compiled and the issues are not suppressed.
- No type matched
Validated Rule: Avoid changing enumerations Flags status
• Rule Description:
-This rule is executed only if a baseline for comparison is defined (diff mode).
-This rule matches enumeration types that used to be tagged with FlagsAttribute in the baseline, and not anymore. It also matches the opposite, enumeration types that are now tagged with FlagsAttribute, and were not tagged in the baseline.
-Being tagged with FlagsAttribute is a strong property for an enumeration. Not so much in terms of behavior (only the enum.ToString() method behavior changes when an enumeration is tagged with FlagsAttribute) but in terms of meaning: is the enumeration a range of values or a range of flags?
-As a consequence, changing the FlagsAttributes status of an enumeration can have significant impact for its clients.
-
-
- • How to Fix Issues of this Rule:
-Make sure the FlagsAttribute status of each enumeration remains stable now, and in the future.
-
-
- • How to Suppress an Issue of this Rule:
-In source code, tag the concerned code element with this attribute:
-[SuppressMessage("NDepend", "ND1505:AvoidChangingEnumerationsFlagsStatus", Justification="...")]
-This attribute requires the compilation symbol CODE_ANALYSIS to be set on each Visual Studio project relying on it. Without CODE_ANALYSIS symbol defined, the attribute is not compiled and the issues are not suppressed.
• Rule Description:
-This rule lists methods not covered at all by test or partially covered by tests. When a type is 0% covered by tested, the type is matched instead of all its methods to reduce the number of issues.
-For each match, the rules estimates the technical debt, i.e the effort to write unit and integration tests for the method. The estimation is based on the effort to develop the code element multiplied by factors in the range ]0,1.3] based on
-• the method code size and complexity
-• the actual percentage coverage
-• the abstractness of types used, because relying on classes instead of interfaces makes the code more difficult to test
-• the method visibility because testing private or protected methods is more difficult than testing public and internal ones
-• the fields used by the method, because is is more complicated to write tests for methods that read mutable static fields whose changing state is shared across tests executions.
-• whether the method is considered JustMyCode or not because NotMyCode is often generated easier to get tested since tests can be generated as well.
-This rule is necessarily a large source of technical debt, since the code left untested is by definition part of the technical debt.
-This rule also estimates the annual interest, i.e the annual cost to let the code uncovered, based on the effort to develop the code element, multiplied by factors based on usage of the code element.
-When methods are aggregated within their parent type, the estimated debt and annual interest is aggregated as well.
-
-
- • How to Fix Issues of this Rule:
-Write unit tests to test and cover the methods and their parent types matched by this rule.
-
-
- • How to Suppress an Issue of this Rule:
-In source code, tag the concerned code element with this attribute:
-[SuppressMessage("NDepend", "ND1600:CodeShouldBeTested", Justification="...")]
-This attribute requires the compilation symbol CODE_ANALYSIS to be set on each Visual Studio project relying on it. Without CODE_ANALYSIS symbol defined, the attribute is not compiled and the issues are not suppressed.
Validated Rule: New Types and Methods should be tested
• Rule Description:
-This rule is executed only if a baseline for comparison is defined (diff mode). This rule operates only on types and methods added or refactored since the baseline.
-This rule is executed only if some code coverage data is imported from some code coverage files.
-It is important to write code mostly covered by tests to achieve maintainable and non-error-prone code.
-In real-world, many code bases are poorly covered by tests. However it is not practicable to stop the development for months to refactor and write tests to achieve high code coverage ratio.
-Hence it is recommended that each time a method (or a type) gets added, the developer takes the time to write associated unit-tests to cover it.
-Doing so will help to increase significantly the maintainability of the code base. You'll notice that quickly, refactoring will also be driven by testability, and as a consequence, the overall code structure and design will increase as well.
-Issues of this rule have a High severity because they reflect an actual trend to not care about writing tests on refactored code.
-
-
- • How to Fix Issues of this Rule:
-Write unit-tests to cover the code of most methods and types added since the baseline.
-
-
- • How to Suppress an Issue of this Rule:
-In source code, tag the concerned code element with this attribute:
-[SuppressMessage("NDepend", "ND1601:NewMethodsShouldBeTested", Justification="...")]
-This attribute requires the compilation symbol CODE_ANALYSIS to be set on each Visual Studio project relying on it. Without CODE_ANALYSIS symbol defined, the attribute is not compiled and the issues are not suppressed.
Validated Rule: Methods refactored should be tested
• Rule Description:
-This rule is executed only if a baseline for comparison is defined (diff mode). This rule operates only on methods added or refactored since the baseline.
-This rule is executed only if some code coverage data is imported from some code coverage files.
-It is important to write code mostly covered by tests to achieve maintainable and non-error-prone code.
-In real-world, many code bases are poorly covered by tests. However it is not practicable to stop the development for months to refactor and write tests to achieve high code coverage ratio.
-Hence it is recommended that each time a method (or a type) gets refactored, the developer takes the time to write associated unit-tests to cover it.
-Doing so will help to increase significantly the maintainability of the code base. You'll notice that quickly, refactoring will also be driven by testability, and as a consequence, the overall code structure and design will increase as well.
-Issues of this rule have a High severity because they reflect an actual trend to not care about writing tests on refactored code.
-
-
- • How to Fix Issues of this Rule:
-Write unit-tests to cover the code of most methods and classes refactored.
-
-
- • How to Suppress an Issue of this Rule:
-In source code, tag the concerned code element with this attribute:
-[SuppressMessage("NDepend", "ND1602:MethodsRefactoredShouldBeTested", Justification="...")]
-This attribute requires the compilation symbol CODE_ANALYSIS to be set on each Visual Studio project relying on it. Without CODE_ANALYSIS symbol defined, the attribute is not compiled and the issues are not suppressed.
Validated Rule: Assemblies and Namespaces should be tested
• Rule Description:
-This rule lists assemblies and namespaces that are not covered at all by unit tests.
-If an assembly is matched its children namespaces are not matched.
-This rule goal is not to collide with the Code should be tested rule that lists uncovered code for each method and infer the effort to write unit tests (the Debt) and the annual cost to let the code untested (the Annual Interest).
-This rule goal is to inform of large code elements left untested. As a consequence the Debt per issue is only 4 minutes and the severity of the issues is Low.
-
-
- • How to Fix Issues of this Rule:
-Write unit and integration tests to cover, even partially, code elements matched by this rule.
-Then use issues of the rules Code should be tested, New Types and Methods should be tested and Methods refactored should be tested to write more tests where it matters most, and eventually refactor some code to make it more testable.
-
-
- • How to Suppress an Issue of this Rule:
-In source code, tag the concerned code element with this attribute:
-[SuppressMessage("NDepend", "ND1603:AssembliesNamespacesAndTypesShouldBeTested", Justification="...")]
-This attribute requires the compilation symbol CODE_ANALYSIS to be set on each Visual Studio project relying on it. Without CODE_ANALYSIS symbol defined, the attribute is not compiled and the issues are not suppressed.
Validated Rule: Types almost 100% tested should be 100% tested
• Rule Description:
-This rule is executed only if some code coverage data is imported from some code coverage files.
-Often covering the few percents of remaining uncovered code of a class, requires as much work as covering the first 90%. For this reason, often teams estimate that 90% coverage is enough. However untestable code usually means poorly written code which usually leads to error prone code. So it might be worth refactoring and making sure to cover the few uncovered lines of code because most tricky bugs might come from this small portion of hard-to-test code.
-Not all classes should be 100% covered by tests (like UI code can be hard to test) but you should make sure that most of the logic of your application is defined in some easy-to-test classes, 100% covered by tests.
-Issues of this rule have a High severity because as explained, such situation is bug-prone.
-
-
- • How to Fix Issues of this Rule:
-Write more unit-tests dedicated to cover code not covered yet. If you find some hard-to-test code, it is certainly a sign that this code is not well designed and hence, needs refactoring.
-
-
- • How to Suppress an Issue of this Rule:
-In source code, tag the concerned code element with this attribute:
-[SuppressMessage("NDepend", "ND1604:TypesAlmost100PercentTestedShouldBe100PercentTested", Justification="...")]
-This attribute requires the compilation symbol CODE_ANALYSIS to be set on each Visual Studio project relying on it. Without CODE_ANALYSIS symbol defined, the attribute is not compiled and the issues are not suppressed.
Validated Rule: Namespaces almost 100% tested should be 100% tested
• Rule Description:
-This rule is executed only if some code coverage data is imported from some code coverage files.
-Often covering the few percents of remaining uncovered code of one or several classes in a namespace requires as much work as covering the first 90%. For this reason, often teams estimate that 90% coverage is enough. However untestable code usually means poorly written code which usually leads to error prone code. So it might be worth refactoring and making sure to cover the few uncovered lines of code because most tricky bugs might come from this small portion of hard-to-test code.
-Not all classes should be 100% covered by tests (like UI code can be hard to test) but you should make sure that most of the logic of your application is defined in some easy-to-test classes, 100% covered by tests.
-Issues of this rule have a High severity because as explained, such situation is bug-prone.
-
-
- • How to Fix Issues of this Rule:
-Write more unit-tests dedicated to cover code not covered yet in the namespace. If you find some hard-to-test code, it is certainly a sign that this code is not well designed and hence, needs refactoring.
-
-
- • How to Suppress an Issue of this Rule:
-In source code, tag the concerned code element with this attribute:
-[SuppressMessage("NDepend", "ND1605:NamespacesAlmost100PercentTestedShouldBe100PercentTested", Justification="...")]
-This attribute requires the compilation symbol CODE_ANALYSIS to be set on each Visual Studio project relying on it. Without CODE_ANALYSIS symbol defined, the attribute is not compiled and the issues are not suppressed.
Validated Rule: Types that used to be 100% covered by tests should still be 100% covered
• Rule Description:
-This rule is executed only if a baseline for comparison is defined (diff mode).
-This rule is executed only if some code coverage data is imported from some code coverage files.
-Often covering 10% of remaining uncovered code of a class, requires as much work as covering the first 90%. For this reason, typically teams estimate that 90% coverage is enough. However untestable code usually means poorly written code which usually leads to error prone code. So it might be worth refactoring and making sure to cover the 10% remaining code because most tricky bugs might come from this small portion of hard-to-test code.
-Not all classes should be 100% covered by tests (like UI code can be hard to test) but you should make sure that most of the logic of your application is defined in some easy-to-test classes, 100% covered by tests.
-In this context, this rule warns when a type fully covered by tests is now only partially covered.
-Issues of this rule have a High severity because often, a type that used to be 100% and is not covered anymore is a bug-prone situation that should be carefully handled.
-
-
- • How to Fix Issues of this Rule:
-Write more unit-tests dedicated to cover code not covered anymore. If you find some hard-to-test code, it is certainly a sign that this code is not well designed and hence, needs refactoring.
-You'll find code impossible to cover by unit-tests, like calls to MessageBox.Show(). An infrastructure must be defined to be able to mock such code at test-time.
-
-
- • How to Suppress an Issue of this Rule:
-In source code, tag the concerned code element with this attribute:
-[SuppressMessage("NDepend", "ND1606:TypesThatUsedToBe100PercentCoveredByTestsShouldStillBe100PercentCovered", Justification="...")]
-This attribute requires the compilation symbol CODE_ANALYSIS to be set on each Visual Studio project relying on it. Without CODE_ANALYSIS symbol defined, the attribute is not compiled and the issues are not suppressed.
Validated Rule: Types tagged with FullCoveredAttribute should be 100% covered
• Rule Description:
-This rule lists methods partially covered by tests, of types tagged with FullCoveredAttribute.
-This rule is executed only if some code coverage data is imported from some code coverage files.
-By using a FullCoveredAttribute, you can express in source code the intention that a class is 100% covered by tests, and should remain 100% covered in the future. If you don't want to link NDepend.API.dll, you can use your own attribute and adapt the source code of this rule.
-Benefits of using a FullCoveredAttribute are twofold: Not only the intention is expressed in source code, but it is also continuously checked by the present rule.
-Often covering 10% of remaining uncovered code of a class, requires as much work as covering the first 90%. For this reason, often teams estimate that 90% coverage is enough. However untestable code usually means poorly written code which usually means error prone code. So it might be worth refactoring and making sure to cover the 10% remaining code because most tricky bugs might come from this small portion of hard-to-test code.
-Not all classes should be 100% covered by tests (like UI code can be hard to test) but you should make sure that most of the logic of your application is defined in some easy-to-test classes, 100% covered by tests.
-Issues of this rule have a High severity because often, a type that used to be 100% and is not covered anymore is a bug-prone situation that should be carefully handled.
-
-
- • How to Fix Issues of this Rule:
-Write more unit-tests dedicated to cover code of matched classes not covered yet. If you find some hard-to-test code, it is certainly a sign that this code is not well designed and hence, needs refactoring.
-
-
- • How to Suppress an Issue of this Rule:
-In source code, tag the concerned code element with this attribute:
-[SuppressMessage("NDepend", "ND1607:TypesTaggedWithFullCoveredAttributeShouldBe100PercentCovered", Justification="...")]
-This attribute requires the compilation symbol CODE_ANALYSIS to be set on each Visual Studio project relying on it. Without CODE_ANALYSIS symbol defined, the attribute is not compiled and the issues are not suppressed.
Validated Rule: Types 100% covered should be tagged with FullCoveredAttribute
• Rule Description:
-This rule is executed only if some code coverage data is imported from some code coverage files.
-By using an attribute class named FullCoveredAttribute, you can express in source code the intention that a class is 100% covered by tests, and should remain 100% covered in the future.
-Benefits of using a FullCoveredAttribute are twofold: Not only the intention is expressed in source code, but it is also continuously checked by the rule Types tagged with FullCoveredAttribute should be 100% covered.
-Issues of this rule have an Low severity because they don't reflect a problem, but provide an advice for potential improvement.
-
-
- • How to Fix Issues of this Rule:
-Just tag types 100% covered by tests with the FullCoveredAttribute class that can be found in NDepend.API.dll, or by an attribute of yours with this name defined in any namespace in your own code.
-
-
- • How to Suppress an Issue of this Rule:
-In source code, tag the concerned code element with this attribute:
-[SuppressMessage("NDepend", "ND1608:Types100PercentCoveredShouldBeTaggedWithFullCoveredAttribute", Justification="...")]
-This attribute requires the compilation symbol CODE_ANALYSIS to be set on each Visual Studio project relying on it. Without CODE_ANALYSIS symbol defined, the attribute is not compiled and the issues are not suppressed.
Validated Rule: Methods should have a low C.R.A.P score
• Rule Description:
-This rule is executed only if some code coverage data is imported from some code coverage files.
-So far this rule is disabled because other code coverage rules assess properly code coverage issues.
-Change Risk Analyzer and Predictor (i.e. CRAP) is a code metric that helps in pinpointing overly both complex and untested code. Is has been first defined here: http://www.artima.com/weblogs/viewpost.jsp?thread=215899
-The Formula is: CRAP(m) = CC(m)^2 * (1 – cov(m)/100)^3 + CC(m)
-• where CC(m) is the cyclomatic complexity of the method m
-• and cov(m) is the percentage coverage by tests of the method m
-Matched methods cumulates two highly error prone code smells:
-• A complex method, difficult to develop and maintain.
-• Non 100% covered code, difficult to refactor without introducing any regression bug.
-The higher the CRAP score, the more painful to maintain and error prone is the method.
-An arbitrary threshold of 30 is fixed for this code rule as suggested by inventors.
-Notice that no amount of testing will keep methods with a Cyclomatic Complexity higher than 30, out of CRAP territory.
-Notice that this rule doesn't match too short method with less than 10 lines of code.
-
-
- • How to Fix Issues of this Rule:
-In such situation, it is recommended to both refactor the complex method logic into several smaller and less complex methods (that might belong to some new types especially created), and also write unit-tests to full cover the refactored logic.
-You'll find code impossible to cover by unit-tests, like calls to MessageBox.Show(). An infrastructure must be defined to be able to mock such code at test-time.
-
-
- • How to Suppress an Issue of this Rule:
-In source code, tag the concerned code element with this attribute:
-[SuppressMessage("NDepend", "ND1609:MethodsShouldHaveALowCRAPScore", Justification="...")]
-This attribute requires the compilation symbol CODE_ANALYSIS to be set on each Visual Studio project relying on it. Without CODE_ANALYSIS symbol defined, the attribute is not compiled and the issues are not suppressed.
• Rule Description:
-This rule lists potentiallydead types. A dead type is a type that can be removed because it is never used by the program.
-This rule lists not only types not used anywhere in code, but also types used only by types not used anywhere in code. This is why this rule comes with a column TypesusingMe and this is why there is a code metric named depth:
-• A depth value of 0 means the type is not used.
-• A depth value of 1 means the type is used only by types not used.
-• etc…
-By reading the source code of this rule, you'll see that by default, public types are not matched, because such type might not be used by the analyzed code, but still be used by client code, not analyzed by NDepend. This default behavior can be easily changed.
-Note that this rule doesn't match Entity Framework ModelSnapshot classes that are used ony by the EF infrastructure.
-
-
- • How to Fix Issues of this Rule:
-Static analysis cannot provide an exact list of dead types, because there are several ways to use a type dynamically (like through reflection).
-For each type matched by this query, first investigate if the type is used somehow (like through reflection). If the type is really never used, it is important to remove it to avoid maintaining useless code. If you estimate the code of the type might be used in the future, at least comment it, and provide an explanatory comment about the future intentions.
-If a type is used somehow, but still is matched by this rule, you can tag it with the attribute IsNotDeadCodeAttribute found in NDepend.API.dll to avoid matching the type again. You can also provide your own attribute for this need, but then you'll need to adapt this code rule.
-Issues of this rule have a Debt equal to 15 minutes because it only takes a short while to investigate if a type can be safely discarded. The Annual Interest of issues of this rule, the annual cost to not fix such issue, is proportional to the type #lines of code, because the bigger the type is, the more it slows down maintenance.
-
-
- • How to Suppress an Issue of this Rule:
-In source code, tag the concerned code element with this attribute:
-[SuppressMessage("NDepend", "ND1700:PotentiallyDeadTypes", Justification="...")]
-This attribute requires the compilation symbol CODE_ANALYSIS to be set on each Visual Studio project relying on it. Without CODE_ANALYSIS symbol defined, the attribute is not compiled and the issues are not suppressed.
- No type matched
Rule Violated:ND1701 Potentially Dead Methods
• Rule Description:
-This rule lists potentiallydead methods. A dead method is a method that can be removed because it is never called by the program.
-This rule lists not only methods not called anywhere in code, but also methods called only by methods not called anywhere in code. This is why this rule comes with a column MethodsCallingMe and this is why there is a code metric named depth:
-• A depth value of 0 means the method is not called.
-• A depth value of 1 means the method is called only by methods not called.
-• etc…
-By reading the source code of this rule, you'll see that by default, public methods are not matched, because such method might not be called by the analyzed code, but still be called by client code, not analyzed by NDepend. This default behavior can be easily changed.
-
-
- • How to Fix Issues of this Rule:
-Static analysis cannot provide an exact list of dead methods, because there are several ways to invoke a method dynamically (like through reflection).
-For each method matched by this query, first investigate if the method is invoked somehow (like through reflection). If the method is really never invoked, it is important to remove it to avoid maintaining useless code. If you estimate the code of the method might be used in the future, at least comment it, and provide an explanatory comment about the future intentions.
-If a method is invoked somehow, but still is matched by this rule, you can tag it with the attribute IsNotDeadCodeAttribute found in NDepend.API.dll to avoid matching the method again. You can also provide your own attribute for this need, but then you'll need to adapt this code rule.
-Issues of this rule have a Debt equal to 10 minutes because it only takes a short while to investigate if a method can be safely discarded. On top of these 10 minutes, the depth of usage of such method adds up 3 minutes per unity because dead method only called by dead code takes a bit more time to be investigated.
-The Annual Interest of issues of this rule, the annual cost to not fix such issue, is proportional to the type #lines of code, because the bigger the method is, the more it slows down maintenance.
-
-
- • How to Suppress an Issue of this Rule:
-In source code, tag the concerned code element with this attribute:
-[SuppressMessage("NDepend", "ND1701:PotentiallyDeadMethods", Justification="...")]
-This attribute requires the compilation symbol CODE_ANALYSIS to be set on each Visual Studio project relying on it. Without CODE_ANALYSIS symbol defined, the attribute is not compiled and the issues are not suppressed.
3 methods matched
- Formatting: bold✱ means added ● means code was changed strike-bold means removed (since baseline)
-
• Rule Description:
-This rule lists potentiallydead fields. A dead field is a field that can be removed because it is never used by the program.
-By reading the source code of this rule, you'll see that by default, public fields are not matched, because such field might not be used by the analyzed code, but still be used by client code, not analyzed by NDepend. This default behavior can be easily changed. Some others default rules in the Visibility group, warn about public fields.
-More restrictions are applied by this rule because of some by-design limitations. NDepend mostly analyzes compiled IL code, and the information that an enumeration value or a literal constant (which are fields) is used is lost in IL code. Hence by default this rule won't match such field.
-
-
- • How to Fix Issues of this Rule:
-Static analysis cannot provide an exact list of dead fields, because there are several ways to assign or read a field dynamically (like through reflection).
-For each field matched by this query, first investigate if the field is used somehow (like through reflection). If the field is really never used, it is important to remove it to avoid maintaining a useless code element.
-If a field is used somehow, but still is matched by this rule, you can tag it with the attribute IsNotDeadCodeAttribute found in NDepend.API.dll to avoid matching the field again. You can also provide your own attribute for this need, but then you'll need to adapt this code rule.
-Issues of this rule have a Debt equal to 10 minutes because it only takes a short while to investigate if a method can be safely discarded. The Annual Interest of issues of this rule, the annual cost to not fix such issue, is set by default to 8 minutes per unused field matched.
-
-
- • How to Suppress an Issue of this Rule:
-In source code, tag the concerned code element with this attribute:
-[SuppressMessage("NDepend", "ND1702:PotentiallyDeadFields", Justification="...")]
-This attribute requires the compilation symbol CODE_ANALYSIS to be set on each Visual Studio project relying on it. Without CODE_ANALYSIS symbol defined, the attribute is not compiled and the issues are not suppressed.
- No field matched
Validated Rule: Wrong usage of IsNotDeadCodeAttribute
• Rule Description:
-The attribute NDepend.Attributes.IsNotDeadCodeAttribute is defined in NDepend.API.dll. This attribute is used to mean that a code element is not used directly, but is used somehow, like through reflection.
-This attribute is used in the dead code rules, Potentially dead Types, Potentially dead Methods and Potentially dead Fields. If you don't want to link NDepend.API.dll, you can use your own IsNotDeadCodeAttribute and adapt the source code of this rule, and the source code of the dead code rules.
-In this context, this code rule matches code elements (types, methods, fields) that are tagged with this attribute, but still used directly somewhere in the code.
-
-
- • How to Fix Issues of this Rule:
-Just remove IsNotDeadCodeAttribute tagging of types, methods and fields matched by this rule because this tag is not useful anymore.
-
-
- • How to Suppress an Issue of this Rule:
-In source code, tag the concerned code element with this attribute:
-[SuppressMessage("NDepend", "ND1703:WrongUsageOfIsNotDeadCodeAttribute", Justification="...")]
-This attribute requires the compilation symbol CODE_ANALYSIS to be set on each Visual Studio project relying on it. Without CODE_ANALYSIS symbol defined, the attribute is not compiled and the issues are not suppressed.
- No member matched
Code Diff Summary
- » Baseline : Baseline is same code base snapshot.
• Query Description:
-This query is executed only if a baseline for comparison is defined (diff mode).
-This code query lists assemblies that have been added since the baseline.
- No assembly matched
Code Query: Assemblies removed
• Query Description:
-This query is executed only if a baseline for comparison is defined (diff mode).
-This code query lists assemblies that have been removed since the baseline.
- No assembly matched
Code Query: Assemblies where code was changed
• Query Description:
-This query is executed only if a baseline for comparison is defined (diff mode).
-This code query lists assemblies in which, code has been changed since the baseline.
- No assembly matched
Code Query: New namespaces
• Query Description:
-This query is executed only if a baseline for comparison is defined (diff mode).
-This code query lists namespaces that have been added since the baseline.
- No namespace matched
Code Query: Namespaces removed
• Query Description:
-This query is executed only if a baseline for comparison is defined (diff mode).
-This code query lists namespaces that have been removed since the baseline.
- No namespace matched
Code Query: Namespaces where code was changed
• Query Description:
-This query is executed only if a baseline for comparison is defined (diff mode).
-This code query lists namespaces in which, code has been changed since the baseline.
- No namespace matched
Code Query: New types
• Query Description:
-This query is executed only if a baseline for comparison is defined (diff mode).
-This code query lists types that have been added since the baseline.
- No type matched
Code Query: Types removed
• Query Description:
-This query is executed only if a baseline for comparison is defined (diff mode).
-This code query lists types that have been removed since the baseline.
- No type matched
Code Query: Types where code was changed
• Query Description:
-This query is executed only if a baseline for comparison is defined (diff mode).
-This code query lists types in which, code has been changed since the baseline.
-To visualize changes in code, right-click a matched type and select:
-• Compare older and newer versions of source file
-• Compare older and newer versions decompiled with Reflector
- No type matched
Code Query: Heuristic to find types moved from one namespace or assembly to another
• Query Description:
-This query is executed only if a baseline for comparison is defined (diff mode).
-This code query lists types moved from one namespace or assembly to another. The heuristic implemented consists in making a join LINQ query on type name (without namespace prefix), applied to the two sets of types added and types removed.
- No type matched
Code Query: Types directly using one or several types changed
• Query Description:
-This query is executed only if a baseline for comparison is defined (diff mode).
-This code query lists types unchanged since the baseline but that use directly some types where code has been changed since the baseline.
-For such matched type, the code hasen't been changed, but still the overall behavior might have been changed.
-The query result includes types changed directly used,
- No type matched
Code Query: Types indirectly using one or several types changed
• Query Description:
-This query is executed only if a baseline for comparison is defined (diff mode).
-This code query lists types unchanged since the baseline but that use directly or indirectly some types where code has been changed since the baseline.
-For such matched type, the code hasen't been changed, but still the overall behavior might have been changed.
-The query result includes types changed directly used, and the depth of usage of types indirectly used, depth of usage as defined in the documentation of DepthOfIsUsingAny() NDepend API method: https://www.ndepend.com/api/webframe.html#NDepend.API~NDepend.CodeModel.ExtensionMethodsSequenceUsage~DepthOfIsUsingAny.html
- No type matched
Code Query: New methods
• Query Description:
-This query is executed only if a baseline for comparison is defined (diff mode).
-This code query lists methods that have been added since the baseline.
- No method matched
Code Query: Methods removed
• Query Description:
-This query is executed only if a baseline for comparison is defined (diff mode).
-This code query lists methods that have been removed since the baseline.
- No method matched
Code Query: Methods where code was changed
• Query Description:
-This query is executed only if a baseline for comparison is defined (diff mode).
-This code query lists methods in which, code has been changed since the baseline.
-To visualize changes in code, right-click a matched method and select:
-• Compare older and newer versions of source file
-• Compare older and newer versions decompiled with Reflector
- No method matched
Code Query: Methods directly calling one or several methods changed
• Query Description:
-This query is executed only if a baseline for comparison is defined (diff mode).
-This code query lists methods unchanged since the baseline but that call directly some methods where code has been changed since the baseline.
-For such matched method, the code hasen't been changed, but still the overall behavior might have been changed.
-The query result includes methods changed directly used,
- No method matched
Code Query: Methods indirectly calling one or several methods changed
• Query Description:
-This query is executed only if a baseline for comparison is defined (diff mode).
-This code query lists methods unchanged since the baseline but that use directly or indirectly some methods where code has been changed since the baseline.
-For such matched method, the code hasen't been changed, but still the overall behavior might have been changed.
-The query result includes methods changed directly used, and the depth of usage of methods indirectly used, depth of usage as defined in the documentation of DepthOfIsUsingAny() NDepend API method: https://www.ndepend.com/api/webframe.html#NDepend.API~NDepend.CodeModel.ExtensionMethodsSequenceUsage~DepthOfIsUsingAny.html
- No method matched
Code Query: New fields
• Query Description:
-This query is executed only if a baseline for comparison is defined (diff mode).
-This code query lists fields that have been added since the baseline.
- No field matched
Code Query: Fields removed
• Query Description:
-This query is executed only if a baseline for comparison is defined (diff mode).
-This code query lists fields that have been removed since the baseline.
- No field matched
Code Query: Third party types that were not used and that are now used
• Query Description:
-This query is executed only if a baseline for comparison is defined (diff mode).
-This code query lists types defined in third-party assemblies, that were not used at baseline time, and that are now used.
- No type matched
Code Query: Third party types that were used and that are not used anymore
• Query Description:
-This query is executed only if a baseline for comparison is defined (diff mode).
-This code query lists types defined in third-party assemblies, that were used at baseline time, and that are not used anymore.
- No type matched
Code Query: Third party methods that were not used and that are now used
• Query Description:
-This query is executed only if a baseline for comparison is defined (diff mode).
-This code query lists methods defined in third-party assemblies, that were not used at baseline time, and that are now used.
- No method matched
Code Query: Third party methods that were used and that are not used anymore
• Query Description:
-This query is executed only if a baseline for comparison is defined (diff mode).
-This code query lists methods defined in third-party assemblies, that were used at baseline time, and that are not used anymore.
- No method matched
Code Query: Third party fields that were not used and that are now used
• Query Description:
-This query is executed only if a baseline for comparison is defined (diff mode).
-This code query lists fields defined in third-party assemblies, that were not used at baseline time, and that are now used.
- No field matched
Code Query: Third party fields that were used and that are not used anymore
• Query Description:
-This query is executed only if a baseline for comparison is defined (diff mode).
-This code query lists fields defined in third-party assemblies, that were used at baseline time, and that are not used anymore.
- The Abstractness versus Instability Diagram helps to detect which assemblies are potentially painful to maintain (i.e concrete and stable) and which assemblies are potentially useless (i.e abstract and instable).
-
Abstractness:
- If an assembly contains many abstract types (i.e interfaces and abstract classes) and few concrete types, it is considered as abstract.
Instability:
- An assembly is considered stable if its types are used by a lot of types from other assemblies. In this context stable means painful to modify.
-
a";cd=b3.getElementsByTagName("*")||[];cb=b3.getElementsByTagName("a")[0];if(!cb||!cb.style||!cd.length){return ce}cc=l.createElement("select");b5=cc.appendChild(l.createElement("option"));ca=b3.getElementsByTagName("input")[0];cb.style.cssText="top:1px;float:left;opacity:.5";ce.getSetAttribute=b3.className!=="t";ce.leadingWhitespace=b3.firstChild.nodeType===3;ce.tbody=!b3.getElementsByTagName("tbody").length;ce.htmlSerialize=!!b3.getElementsByTagName("link").length;ce.style=/top/.test(cb.getAttribute("style"));ce.hrefNormalized=cb.getAttribute("href")==="/a";ce.opacity=/^0.5/.test(cb.style.opacity);ce.cssFloat=!!cb.style.cssFloat;ce.checkOn=!!ca.value;ce.optSelected=b5.selected;ce.enctype=!!l.createElement("form").enctype;ce.html5Clone=l.createElement("nav").cloneNode(true).outerHTML!=="<:nav>";ce.inlineBlockNeedsLayout=false;ce.shrinkWrapBlocks=false;ce.pixelPosition=false;ce.deleteExpando=true;ce.noCloneEvent=true;ce.reliableMarginRight=true;ce.boxSizingReliable=true;ca.checked=true;ce.noCloneChecked=ca.cloneNode(true).checked;cc.disabled=true;ce.optDisabled=!b5.disabled;try{delete b3.test}catch(b8){ce.deleteExpando=false}ca=l.createElement("input");ca.setAttribute("value","");ce.input=ca.getAttribute("value")==="";ca.value="t";ca.setAttribute("type","radio");ce.radioValue=ca.value==="t";ca.setAttribute("checked","t");ca.setAttribute("name","t");b9=l.createDocumentFragment();b9.appendChild(ca);ce.appendChecked=ca.checked;ce.checkClone=b9.cloneNode(true).cloneNode(true).lastChild.checked;if(b3.attachEvent){b3.attachEvent("onclick",function(){ce.noCloneEvent=false});b3.cloneNode(true).click()}for(b6 in {submit:true,change:true,focusin:true}){b3.setAttribute(b7="on"+b6,"t");ce[b6+"Bubbles"]=b7 in a1||b3.attributes[b7].expando===false}b3.style.backgroundClip="content-box";b3.cloneNode(true).style.backgroundClip="";ce.clearCloneStyle=b3.style.backgroundClip==="content-box";for(b6 in bI(ce)){break}ce.ownLast=b6!=="0";bI(function(){var cf,ci,ch,cg="padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",e=l.getElementsByTagName("body")[0];if(!e){return}cf=l.createElement("div");cf.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px";e.appendChild(cf).appendChild(b3);b3.innerHTML="
").append(bI.parseHTML(ca)).find(e):ca)}).complete(b9&&function(cb,ca){b3.each(b9,b4||[cb.responseText,ca,cb])})}return this};bI.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,b3){bI.fn[b3]=function(b4){return this.on(b3,b4)}});bI.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:W,type:"GET",isLocal:A.test(b1[1]),global:true,processData:true,async:true,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":aU,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":true,"text json":bI.parseJSON,"text xml":bI.parseXML},flatOptions:{url:true,context:true}},ajaxSetup:function(b3,e){return e?r(r(b3,bI.ajaxSettings),e):r(bI.ajaxSettings,b3)},ajaxPrefilter:bK(v),ajaxTransport:bK(a6),ajax:function(b7,b4){if(typeof b7==="object"){b4=b7;b7=aE}b4=b4||{};var cg,ci,b8,cn,cc,b3,cj,b5,cb=bI.ajaxSetup({},b4),cp=cb.context||cb,ce=cb.context&&(cp.nodeType||cp.jquery)?bI(cp):bI.event,co=bI.Deferred(),cl=bI.Callbacks("once memory"),b9=cb.statusCode||{},cf={},cm={},b6=0,ca="canceled",ch={readyState:0,getResponseHeader:function(cq){var e;if(b6===2){if(!b5){b5={};while((e=ae.exec(cn))){b5[e[1].toLowerCase()]=e[2]}}e=b5[cq.toLowerCase()]}return e==null?null:e},getAllResponseHeaders:function(){return b6===2?cn:null},setRequestHeader:function(cq,cr){var e=cq.toLowerCase();if(!b6){cq=cm[e]=cm[e]||cq;cf[cq]=cr}return this},overrideMimeType:function(e){if(!b6){cb.mimeType=e}return this},statusCode:function(cq){var e;if(cq){if(b6<2){for(e in cq){b9[e]=[b9[e],cq[e]]}}else{ch.always(cq[ch.status])}}return this},abort:function(cq){var e=cq||ca;if(cj){cj.abort(e)}cd(0,e);return this}};co.promise(ch).complete=cl.add;ch.success=ch.done;ch.error=ch.fail;cb.url=((b7||cb.url||W)+"").replace(an,"").replace(aF,b1[1]+"//");cb.type=b4.method||b4.type||cb.method||cb.type;cb.dataTypes=bI.trim(cb.dataType||"*").toLowerCase().match(aa)||[""];if(cb.crossDomain==null){cg=aS.exec(cb.url.toLowerCase());cb.crossDomain=!!(cg&&(cg[1]!==b1[1]||cg[2]!==b1[2]||(cg[3]||(cg[1]==="http:"?"80":"443"))!==(b1[3]||(b1[1]==="http:"?"80":"443"))))}if(cb.data&&cb.processData&&typeof cb.data!=="string"){cb.data=bI.param(cb.data,cb.traditional)}n(v,cb,b4,ch);if(b6===2){return ch}b3=cb.global;if(b3&&bI.active++===0){bI.event.trigger("ajaxStart")}cb.type=cb.type.toUpperCase();cb.hasContent=!o.test(cb.type);b8=cb.url;if(!cb.hasContent){if(cb.data){b8=(cb.url+=(ax.test(b8)?"&":"?")+cb.data);delete cb.data}if(cb.cache===false){cb.url=M.test(b8)?b8.replace(M,"$1_="+bN++):b8+(ax.test(b8)?"&":"?")+"_="+bN++}}if(cb.ifModified){if(bI.lastModified[b8]){ch.setRequestHeader("If-Modified-Since",bI.lastModified[b8])}if(bI.etag[b8]){ch.setRequestHeader("If-None-Match",bI.etag[b8])}}if(cb.data&&cb.hasContent&&cb.contentType!==false||b4.contentType){ch.setRequestHeader("Content-Type",cb.contentType)}ch.setRequestHeader("Accept",cb.dataTypes[0]&&cb.accepts[cb.dataTypes[0]]?cb.accepts[cb.dataTypes[0]]+(cb.dataTypes[0]!=="*"?", "+aU+"; q=0.01":""):cb.accepts["*"]);for(ci in cb.headers){ch.setRequestHeader(ci,cb.headers[ci])}if(cb.beforeSend&&(cb.beforeSend.call(cp,ch,cb)===false||b6===2)){return ch.abort()}ca="abort";for(ci in {success:1,error:1,complete:1}){ch[ci](cb[ci])}cj=n(a6,cb,b4,ch);if(!cj){cd(-1,"No Transport")}else{ch.readyState=1;if(b3){ce.trigger("ajaxSend",[ch,cb])}if(cb.async&&cb.timeout>0){cc=setTimeout(function(){ch.abort("timeout")},cb.timeout)}try{b6=1;cj.send(cf,cd)}catch(ck){if(b6<2){cd(-1,ck)}else{throw ck}}}function cd(cu,cq,cv,cs){var e,cy,cw,ct,cx,cr=cq;if(b6===2){return}b6=2;if(cc){clearTimeout(cc)}cj=aE;cn=cs||"";ch.readyState=cu>0?4:0;e=cu>=200&&cu<300||cu===304;if(cv){ct=g(cb,ch,cv)}ct=ad(cb,ct,ch,e);if(e){if(cb.ifModified){cx=ch.getResponseHeader("Last-Modified");if(cx){bI.lastModified[b8]=cx}cx=ch.getResponseHeader("etag");if(cx){bI.etag[b8]=cx}}if(cu===204||cb.type==="HEAD"){cr="nocontent"}else{if(cu===304){cr="notmodified"}else{cr=ct.state;cy=ct.data;cw=ct.error;e=!cw}}}else{cw=cr;if(cu||!cr){cr="error";if(cu<0){cu=0}}}ch.status=cu;ch.statusText=(cq||cr)+"";if(e){co.resolveWith(cp,[cy,cr,ch])}else{co.rejectWith(cp,[ch,cr,cw])}ch.statusCode(b9);b9=aE;if(b3){ce.trigger(e?"ajaxSuccess":"ajaxError",[ch,cb,e?cy:cw])}cl.fireWith(cp,[ch,cr]);if(b3){ce.trigger("ajaxComplete",[ch,cb]);if(!(--bI.active)){bI.event.trigger("ajaxStop")}}}return ch},getJSON:function(e,b3,b4){return bI.get(e,b3,b4,"json")},getScript:function(e,b3){return bI.get(e,aE,b3,"script")}});bI.each(["get","post"],function(e,b3){bI[b3]=function(b4,b6,b7,b5){if(bI.isFunction(b6)){b5=b5||b7;b7=b6;b6=aE}return bI.ajax({url:b4,type:b3,dataType:b5,data:b6,success:b7})}});function g(ca,b9,b6){var e,b5,b4,b7,b3=ca.contents,b8=ca.dataTypes;while(b8[0]==="*"){b8.shift();if(b5===aE){b5=ca.mimeType||b9.getResponseHeader("Content-Type")}}if(b5){for(b7 in b3){if(b3[b7]&&b3[b7].test(b5)){b8.unshift(b7);break}}}if(b8[0] in b6){b4=b8[0]}else{for(b7 in b6){if(!b8[0]||ca.converters[b7+" "+b8[0]]){b4=b7;break}if(!e){e=b7}}b4=b4||e}if(b4){if(b4!==b8[0]){b8.unshift(b4)}return b6[b4]}}function ad(ce,b6,cb,b4){var b3,b9,cc,b7,b5,cd={},ca=ce.dataTypes.slice();if(ca[1]){for(cc in ce.converters){cd[cc.toLowerCase()]=ce.converters[cc]}}b9=ca.shift();while(b9){if(ce.responseFields[b9]){cb[ce.responseFields[b9]]=b6}if(!b5&&b4&&ce.dataFilter){b6=ce.dataFilter(b6,ce.dataType)}b5=b9;b9=ca.shift();if(b9){if(b9==="*"){b9=b5}else{if(b5!=="*"&&b5!==b9){cc=cd[b5+" "+b9]||cd["* "+b9];if(!cc){for(b3 in cd){b7=b3.split(" ");if(b7[1]===b9){cc=cd[b5+" "+b7[0]]||cd["* "+b7[0]];if(cc){if(cc===true){cc=cd[b3]}else{if(cd[b3]!==true){b9=b7[0];ca.unshift(b7[1])}}break}}}}if(cc!==true){if(cc&&ce["throws"]){b6=cc(b6)}else{try{b6=cc(b6)}catch(b8){return{state:"parsererror",error:cc?b8:"No conversion from "+b5+" to "+b9}}}}}}}}return{state:"success",data:b6}}bI.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(e){bI.globalEval(e);return e}}});bI.ajaxPrefilter("script",function(e){if(e.cache===aE){e.cache=false}if(e.crossDomain){e.type="GET";e.global=false}});bI.ajaxTransport("script",function(b4){if(b4.crossDomain){var e,b3=l.head||bI("head")[0]||l.documentElement;return{send:function(b5,b6){e=l.createElement("script");e.async=true;if(b4.scriptCharset){e.charset=b4.scriptCharset}e.src=b4.url;e.onload=e.onreadystatechange=function(b8,b7){if(b7||!e.readyState||/loaded|complete/.test(e.readyState)){e.onload=e.onreadystatechange=null;if(e.parentNode){e.parentNode.removeChild(e)}e=null;if(!b7){b6(200,"success")}}};b3.insertBefore(e,b3.firstChild)},abort:function(){if(e){e.onload(aE,true)}}}}});var bp=[],a4=/(=)\?(?=&|$)|\?\?/;bI.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=bp.pop()||(bI.expando+"_"+(bN++));this[e]=true;return e}});bI.ajaxPrefilter("json jsonp",function(b5,e,b6){var b8,b3,b4,b7=b5.jsonp!==false&&(a4.test(b5.url)?"url":typeof b5.data==="string"&&!(b5.contentType||"").indexOf("application/x-www-form-urlencoded")&&a4.test(b5.data)&&"data");if(b7||b5.dataTypes[0]==="jsonp"){b8=b5.jsonpCallback=bI.isFunction(b5.jsonpCallback)?b5.jsonpCallback():b5.jsonpCallback;if(b7){b5[b7]=b5[b7].replace(a4,"$1"+b8)}else{if(b5.jsonp!==false){b5.url+=(ax.test(b5.url)?"&":"?")+b5.jsonp+"="+b8}}b5.converters["script json"]=function(){if(!b4){bI.error(b8+" was not called")}return b4[0]};b5.dataTypes[0]="json";b3=a1[b8];a1[b8]=function(){b4=arguments};b6.always(function(){a1[b8]=b3;if(b5[b8]){b5.jsonpCallback=e.jsonpCallback;bp.push(b8)}if(b4&&bI.isFunction(b3)){b3(b4[0])}b4=b3=aE});return"script"}});var af,av,aw=0,aN=a1.ActiveXObject&&function(){var e;for(e in af){af[e](aE,true)}};function bC(){try{return new a1.XMLHttpRequest()}catch(b3){}}function bd(){try{return new a1.ActiveXObject("Microsoft.XMLHTTP")}catch(b3){}}bI.ajaxSettings.xhr=a1.ActiveXObject?function(){return !this.isLocal&&bC()||bd()}:bC;av=bI.ajaxSettings.xhr();bI.support.cors=!!av&&("withCredentials" in av);av=bI.support.ajax=!!av;if(av){bI.ajaxTransport(function(e){if(!e.crossDomain||bI.support.cors){var b3;return{send:function(b9,b4){var b7,b5,b8=e.xhr();if(e.username){b8.open(e.type,e.url,e.async,e.username,e.password)}else{b8.open(e.type,e.url,e.async)}if(e.xhrFields){for(b5 in e.xhrFields){b8[b5]=e.xhrFields[b5]}}if(e.mimeType&&b8.overrideMimeType){b8.overrideMimeType(e.mimeType)}if(!e.crossDomain&&!b9["X-Requested-With"]){b9["X-Requested-With"]="XMLHttpRequest"}try{for(b5 in b9){b8.setRequestHeader(b5,b9[b5])}}catch(b6){}b8.send((e.hasContent&&e.data)||null);b3=function(cc,cb){var ca,cd,cg,ce;try{if(b3&&(cb||b8.readyState===4)){b3=aE;if(b7){b8.onreadystatechange=bI.noop;if(aN){delete af[b7]}}if(cb){if(b8.readyState!==4){b8.abort()}}else{ce={};ca=b8.status;cd=b8.getAllResponseHeaders();if(typeof b8.responseText==="string"){ce.text=b8.responseText}try{cg=b8.statusText}catch(cf){cg=""}if(!ca&&e.isLocal&&!e.crossDomain){ca=ce.text?200:404}else{if(ca===1223){ca=204}}}}}catch(ch){if(!cb){b4(-1,ch)}}if(ce){b4(ca,cg,ce,cd)}};if(!e.async){b3()}else{if(b8.readyState===4){setTimeout(b3)}else{b7=++aw;if(aN){if(!af){af={};bI(a1).unload(aN)}af[b7]=b3}b8.onreadystatechange=b3}}},abort:function(){if(b3){b3(aE,true)}}}}})}var J,ab,bQ=/^(?:toggle|show|hide)$/,bJ=new RegExp("^(?:([+-])=|)("+bz+")([a-z%]*)$","i"),bP=/queueHooks$/,az=[h],aY={"*":[function(e,b8){var ca=this.createTween(e,b8),b6=ca.cur(),b5=bJ.exec(b8),b9=b5&&b5[3]||(bI.cssNumber[e]?"":"px"),b3=(bI.cssNumber[e]||b9!=="px"&&+b6)&&bJ.exec(bI.css(ca.elem,e)),b4=1,b7=20;if(b3&&b3[3]!==b9){b9=b9||b3[3];b5=b5||[];b3=+b6||1;do{b4=b4||".5";b3=b3/b4;bI.style(ca.elem,e,b3+b9)}while(b4!==(b4=ca.cur()/b6)&&b4!==1&&--b7)}if(b5){b3=ca.start=+b3||+b6||0;ca.unit=b9;ca.end=b5[1]?b3+(b5[1]+1)*b5[2]:+b5[2]}return ca}]};function bl(){setTimeout(function(){J=aE});return(J=bI.now())}function ba(b6,b8,b5){var b3,b7=(aY[b8]||[]).concat(aY["*"]),e=0,b4=b7.length;for(;e-1,cb={},ca={},b4,b6;if(cd){ca=b7.position();b4=ca.top;b6=ca.left}else{b4=parseFloat(e)||0;b6=parseFloat(cc)||0}if(bI.isFunction(ce)){ce=ce.call(b5,b8,b3)}if(ce.top!=null){cb.top=(ce.top-b3.top)+b4}if(ce.left!=null){cb.left=(ce.left-b3.left)+b6}if("using" in ce){ce.using.call(b5,cb)}else{b7.css(cb)}}};bI.fn.extend({position:function(){if(!this[0]){return}var b4,b5,e={top:0,left:0},b3=this[0];if(bI.css(b3,"position")==="fixed"){b5=b3.getBoundingClientRect()}else{b4=this.offsetParent();b5=this.offset();if(!bI.nodeName(b4[0],"html")){e=b4.offset()}e.top+=bI.css(b4[0],"borderTopWidth",true);e.left+=bI.css(b4[0],"borderLeftWidth",true)}return{top:b5.top-e.top-bI.css(b3,"marginTop",true),left:b5.left-e.left-bI.css(b3,"marginLeft",true)}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||bV;while(e&&(!bI.nodeName(e,"html")&&bI.css(e,"position")==="static")){e=e.offsetParent}return e||bV})}});bI.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(b4,b3){var e=/Y/.test(b3);bI.fn[b4]=function(b5){return bI.access(this,function(b6,b9,b8){var b7=bo(b6);if(b8===aE){return b7?(b3 in b7)?b7[b3]:b7.document.documentElement[b9]:b6[b9]}if(b7){b7.scrollTo(!e?b8:bI(b7).scrollLeft(),e?b8:bI(b7).scrollTop())}else{b6[b9]=b8}},b4,b5,arguments.length,null)}});function bo(e){return bI.isWindow(e)?e:e.nodeType===9?e.defaultView||e.parentWindow:false}bI.each({Height:"height",Width:"width"},function(e,b3){bI.each({padding:"inner"+e,content:b3,"":"outer"+e},function(b4,b5){bI.fn[b5]=function(b9,b8){var b7=arguments.length&&(b4||typeof b9!=="boolean"),b6=b4||(b9===true||b8===true?"margin":"border");return bI.access(this,function(cb,ca,cc){var cd;if(bI.isWindow(cb)){return cb.document.documentElement["client"+e]}if(cb.nodeType===9){cd=cb.documentElement;return Math.max(cb.body["scroll"+e],cd["scroll"+e],cb.body["offset"+e],cd["offset"+e],cd["client"+e])}return cc===aE?bI.css(cb,ca,b6):bI.style(cb,ca,cc,b6)},b3,b7?b9:aE,b7,null)}})});bI.fn.size=function(){return this.length};bI.fn.andSelf=bI.fn.addBack;if(typeof module==="object"&&module&&typeof module.exports==="object"){module.exports=bI}else{a1.jQuery=a1.$=bI;if(typeof define==="function"&&define.amd){define("jquery",[],function(){return bI})}}})(window);
-/*
- * jQuery Migrate - v1.2.1 - 2013-05-08
- * https://github.com/jquery/jquery-migrate
- * Copyright 2005, 2013 jQuery Foundation, Inc. and other contributors; Licensed MIT
- */
-(function(s,p,i){var D={};s.migrateWarnings=[];if(!s.migrateMute&&p.console&&p.console.log){p.console.log("JQMIGRATE: Logging is active")}if(s.migrateTrace===i){s.migrateTrace=true}s.migrateReset=function(){D={};s.migrateWarnings.length=0};function h(H){var G=p.console;if(!D[H]){D[H]=true;s.migrateWarnings.push(H);if(G&&G.warn&&!s.migrateMute){G.warn("JQMIGRATE: "+H);if(s.migrateTrace&&G.trace){G.trace()}}}}function a(I,K,H,J){if(Object.defineProperty){try{Object.defineProperty(I,K,{configurable:true,enumerable:true,get:function(){h(J);return H},set:function(L){h(J);H=L}});return}catch(G){}}s._definePropertyBroken=true;I[K]=H}if(document.compatMode==="BackCompat"){h("jQuery is not compatible with Quirks Mode")}var f=s("",{size:1}).attr("size")&&s.attrFn,x=s.attr,w=s.attrHooks.value&&s.attrHooks.value.get||function(){return null},j=s.attrHooks.value&&s.attrHooks.value.set||function(){return i},t=/^(?:input|button)$/i,y=/^[238]$/,B=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,k=/^(?:checked|selected)$/i;a(s,"attrFn",f||{},"jQuery.attrFn is deprecated");s.attr=function(K,I,L,J){var H=I.toLowerCase(),G=K&&K.nodeType;if(J){if(x.length<4){h("jQuery.fn.attr( props, pass ) is deprecated")}if(K&&!y.test(G)&&(f?I in f:s.isFunction(s.fn[I]))){return s(K)[I](L)}}if(I==="type"&&L!==i&&t.test(K.nodeName)&&K.parentNode){h("Can't change the 'type' of an input or button in IE 6/7/8")}if(!s.attrHooks[H]&&B.test(H)){s.attrHooks[H]={get:function(N,M){var P,O=s.prop(N,M);return O===true||typeof O!=="boolean"&&(P=N.getAttributeNode(M))&&P.nodeValue!==false?M.toLowerCase():i},set:function(N,P,M){var O;if(P===false){s.removeAttr(N,M)}else{O=s.propFix[M]||M;if(O in N){N[O]=true}N.setAttribute(M,M.toLowerCase())}return M}};if(k.test(H)){h("jQuery.fn.attr('"+H+"') may use property instead of attribute")}}return x.call(s,K,I,L)};s.attrHooks.value={get:function(H,G){var I=(H.nodeName||"").toLowerCase();if(I==="button"){return w.apply(this,arguments)}if(I!=="input"&&I!=="option"){h("jQuery.fn.attr('value') no longer gets properties")}return G in H?H.value:null},set:function(G,H){var I=(G.nodeName||"").toLowerCase();if(I==="button"){return j.apply(this,arguments)}if(I!=="input"&&I!=="option"){h("jQuery.fn.attr('value', val) no longer sets properties")}G.value=H}};var q,E,z=s.fn.init,A=s.parseJSON,v=/^([^<]*)(<[\w\W]+>)([^>]*)$/;s.fn.init=function(G,J,I){var H;if(G&&typeof G==="string"&&!s.isPlainObject(J)&&(H=v.exec(s.trim(G)))&&H[0]){if(G.charAt(0)!=="<"){h("$(html) HTML strings must start with '<' character")}if(H[3]){h("$(html) HTML text after last tag is ignored")}if(H[0].charAt(0)==="#"){h("HTML string cannot start with a '#' character");s.error("JQMIGRATE: Invalid selector string (XSS)")}if(J&&J.context){J=J.context}if(s.parseHTML){return z.call(this,s.parseHTML(H[2],J,true),J,I)}}return z.apply(this,arguments)};s.fn.init.prototype=s.fn;s.parseJSON=function(G){if(!G&&G!==null){h("jQuery.parseJSON requires a valid JSON string");return null}return A.apply(this,arguments)};s.uaMatch=function(H){H=H.toLowerCase();var G=/(chrome)[ \/]([\w.]+)/.exec(H)||/(webkit)[ \/]([\w.]+)/.exec(H)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(H)||/(msie) ([\w.]+)/.exec(H)||H.indexOf("compatible")<0&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(H)||[];return{browser:G[1]||"",version:G[2]||"0"}};if(!s.browser){q=s.uaMatch(navigator.userAgent);E={};if(q.browser){E[q.browser]=true;E.version=q.version}if(E.chrome){E.webkit=true}else{if(E.webkit){E.safari=true}}s.browser=E}a(s,"browser",s.browser,"jQuery.browser is deprecated");s.sub=function(){function G(J,K){return new G.fn.init(J,K)}s.extend(true,G,this);G.superclass=this;G.fn=G.prototype=this();G.fn.constructor=G;G.sub=this.sub;G.fn.init=function I(J,K){if(K&&K instanceof s&&!(K instanceof G)){K=G(K)}return s.fn.init.call(this,J,K,H)};G.fn.init.prototype=G.fn;var H=G(document);h("jQuery.sub() is deprecated");return G};s.ajaxSetup({converters:{"text json":s.parseJSON}});var n=s.fn.data;s.fn.data=function(I){var H,G,J=this[0];if(J&&I==="events"&&arguments.length===1){H=s.data(J,I);G=s._data(J,I);if((H===i||H===G)&&G!==i){h("Use of jQuery.fn.data('events') is deprecated");return G}}return n.apply(this,arguments)};var o=/\/(java|ecma)script/i,u=s.fn.andSelf||s.fn.addBack;s.fn.andSelf=function(){h("jQuery.fn.andSelf() replaced by jQuery.fn.addBack()");return u.apply(this,arguments)};if(!s.clean){s.clean=function(G,H,N,J){H=H||document;H=!H.nodeType&&H[0]||H;H=H.ownerDocument||H;h("jQuery.clean() is deprecated");var K,I,L,O,M=[];s.merge(M,s.buildFragment(G,H).childNodes);if(N){L=function(P){if(!P.type||o.test(P.type)){return J?J.push(P.parentNode?P.parentNode.removeChild(P):P):N.appendChild(P)}};for(K=0;(I=M[K])!=null;K++){if(!(s.nodeName(I,"script")&&L(I))){N.appendChild(I);if(typeof I.getElementsByTagName!=="undefined"){O=s.grep(s.merge([],I.getElementsByTagName("script")),L);M.splice.apply(M,[K+1,0].concat(O));K+=O.length}}}}return M}}var c=s.event.add,b=s.event.remove,g=s.event.trigger,r=s.fn.toggle,d=s.fn.live,m=s.fn.die,C="ajaxStart|ajaxStop|ajaxSend|ajaxComplete|ajaxError|ajaxSuccess",e=new RegExp("\\b(?:"+C+")\\b"),F=/(?:^|\s)hover(\.\S+|)\b/,l=function(G){if(typeof(G)!=="string"||s.event.special.hover){return G}if(F.test(G)){h("'hover' pseudo-event is deprecated, use 'mouseenter mouseleave'")}return G&&G.replace(F,"mouseenter$1 mouseleave$1")};if(s.event.props&&s.event.props[0]!=="attrChange"){s.event.props.unshift("attrChange","attrName","relatedNode","srcElement")}if(s.event.dispatch){a(s.event,"handle",s.event.dispatch,"jQuery.event.handle is undocumented and deprecated")}s.event.add=function(J,H,I,K,G){if(J!==document&&e.test(H)){h("AJAX events should be attached to document: "+H)}c.call(this,J,l(H||""),I,K,G)};s.event.remove=function(K,I,J,G,H){b.call(this,K,l(I)||"",J,G,H)};s.fn.error=function(){var G=Array.prototype.slice.call(arguments,0);h("jQuery.fn.error() is deprecated");G.splice(0,0,"error");if(arguments.length){return this.bind.apply(this,G)}this.triggerHandler.apply(this,G);return this};s.fn.toggle=function(K,I){if(!s.isFunction(K)||!s.isFunction(I)){return r.apply(this,arguments)}h("jQuery.fn.toggle(handler, handler...) is deprecated");var H=arguments,G=K.guid||s.guid++,J=0,L=function(M){var N=(s._data(this,"lastToggle"+K.guid)||0)%J;s._data(this,"lastToggle"+K.guid,N+1);M.preventDefault();return H[N].apply(this,arguments)||false};L.guid=G;while(J"),aj,an,m,g,a,w,L,n,D,ac,P,A,O,ai="div",ah,G=0,ad={},af;function J(ao,ar,aq){var ap=l.createElement(ao);if(ar){ap.id=V+ar}if(aq){ap.style.cssText=aq}return M(ap)}function s(){return aa.innerHeight?aa.innerHeight:M(aa).height()}function F(ap){var ao=c.length,aq=(L+ap)%ao;return(aq<0)?ao+aq:aq}function R(ao,ap){return Math.round((/%/.test(ao)?((ap==="x"?ae.width():s())/100):1)*parseInt(ao,10))}function C(ap,ao){return ap.photo||ap.photoRegex.test(ao)}function E(ap,ao){return ap.retinaUrl&&aa.devicePixelRatio>1?ao.replace(ap.photoRegex,ap.retinaSuffix):ao}function ak(ao){if("contains" in al[0]&&!al[0].contains(ao.target)){ao.stopPropagation();al.focus()}}function W(){var ao,ap=M.data(w,x);if(ap==null){aj=M.extend({},N);if(console&&console.log){console.log("Error: cboxElement missing settings object")}}else{aj=M.extend({},ap)}for(ao in aj){if(M.isFunction(aj[ao])&&ao.slice(0,2)!=="on"){aj[ao]=aj[ao].call(w)}}aj.rel=aj.rel||w.rel||M(w).data("rel")||"nofollow";aj.href=aj.href||M(w).attr("href");aj.title=aj.title||w.title;if(typeof aj.href==="string"){aj.href=M.trim(aj.href)}}function H(ao,ap){M(l).trigger(ao);I.trigger(ao);if(M.isFunction(ap)){ap.call(w)}}var y=(function(){var at=V+"Slideshow_",au="click."+V,ap=false,aq;function ao(){clearTimeout(aq)}function aw(){if(aj.loop||c[L+1]){ao();aq=setTimeout(O.next,aj.slideshowSpeed)}}function av(){ab.html(aj.slideshowStop).unbind(au).one(au,ar);I.bind(X,aw).bind(e,ao).bind(v,ar);al.removeClass(at+"off").addClass(at+"on")}function ar(){ao();I.unbind(X,aw).unbind(e,ao).unbind(v,ar);ab.html(aj.slideshowStart).unbind(au).one(au,function(){O.next();av()});al.removeClass(at+"on").addClass(at+"off")}return function(){if(ap){if(aj.slideshow){return}else{ap=false;ab.hide();ao();I.unbind(X,aw).unbind(e,ao).unbind(v,ar);al.removeClass(at+"off "+at+"on")}}else{if(aj.slideshow&&c[1]){ap=true;if(aj.slideshowAuto){av()}else{ar()}ab.show()}}}}());function f(ao){if(!P){w=ao;W();c=M(w);L=0;if(aj.rel!=="nofollow"){c=M("."+r).filter(function(){var aq=M.data(this,x),ap;if(aq){ap=M(this).data("rel")||aq.rel||this.rel}return(ap===aj.rel)});L=c.index(w);if(L===-1){c=c.add(w);L=c.length-1}}T.css({opacity:parseFloat(aj.opacity),cursor:aj.overlayClose?"pointer":"auto",visibility:"visible"}).show();if(ah){al.add(T).removeClass(ah)}if(aj.className){al.add(T).addClass(aj.className)}ah=aj.className;if(aj.closeButton){z.html(aj.close).appendTo(d)}else{z.appendTo("")}if(!D){D=ac=true;al.css({visibility:"hidden",display:"block"});Q=J(ai,"LoadedContent","width:0; height:0; overflow:hidden");d.css({width:"",height:""}).append(Q);an=K.height()+S.height()+d.outerHeight(true)-d.height();m=p.width()+b.width()+d.outerWidth(true)-d.width();g=Q.outerHeight(true);a=Q.outerWidth(true);aj.w=R(aj.initialWidth,"x");aj.h=R(aj.initialHeight,"y");O.position();H(Z,aj.onOpen);B.add(o).hide();al.focus();if(aj.trapFocus){if(l.addEventListener){l.addEventListener("focus",ak,true);I.one(ag,function(){l.removeEventListener("focus",ak,true)})}}if(aj.returnFocus){I.one(ag,function(){M(w).focus()})}}Y()}}function q(){if(!al&&l.body){af=false;ae=M(aa);al=J(ai).attr({id:x,"class":M.support.opacity===false?V+"IE":"",role:"dialog",tabindex:"-1"}).hide();T=J(ai,"Overlay").hide();h=M([J(ai,"LoadingOverlay")[0],J(ai,"LoadingGraphic")[0]]);am=J(ai,"Wrapper");d=J(ai,"Content").append(o=J(ai,"Title"),u=J(ai,"Current"),U=M('').attr({id:V+"Previous"}),t=M('').attr({id:V+"Next"}),ab=J("button","Slideshow"),h);z=M('').attr({id:V+"Close"});am.append(J(ai).append(J(ai,"TopLeft"),K=J(ai,"TopCenter"),J(ai,"TopRight")),J(ai,false,"clear:left").append(p=J(ai,"MiddleLeft"),d,b=J(ai,"MiddleRight")),J(ai,false,"clear:left").append(J(ai,"BottomLeft"),S=J(ai,"BottomCenter"),J(ai,"BottomRight"))).find("div div").css({"float":"left"});k=J(ai,false,"position:absolute; width:9999px; visibility:hidden; display:none");B=t.add(U).add(u).add(ab);M(l.body).append(T,al.append(am,k))}}function j(){function ao(ap){if(!(ap.which>1||ap.shiftKey||ap.altKey||ap.metaKey||ap.ctrlKey)){ap.preventDefault();f(this)}}if(al){if(!af){af=true;t.click(function(){O.next()});U.click(function(){O.prev()});z.click(function(){O.close()});T.click(function(){if(aj.overlayClose){O.close()}});M(l).bind("keydown."+V,function(aq){var ap=aq.keyCode;if(D&&aj.escKey&&ap===27){aq.preventDefault();O.close()}if(D&&aj.arrowKey&&c[1]&&!aq.altKey){if(ap===37){aq.preventDefault();U.click()}else{if(ap===39){aq.preventDefault();t.click()}}}});if(M.isFunction(M.fn.on)){M(l).on("click."+V,"."+r,ao)}else{M("."+r).live("click."+V,ao)}}return true}return false}if(M.colorbox){return}M(q);O=M.fn[x]=M[x]=function(ao,aq){var ap=this;ao=ao||{};q();if(j()){if(M.isFunction(ap)){ap=M("");ao.open=true}else{if(!ap[0]){return ap}}if(aq){ao.onComplete=aq}ap.each(function(){M.data(this,x,M.extend({},M.data(this,x)||N,ao))}).addClass(r);if((M.isFunction(ao.open)&&ao.open.call(ap))||ao.open){f(ap[0])}}return ap};O.position=function(aq,at){var aw,ay=0,ap=0,au=al.offset(),ao,ar;ae.unbind("resize."+V);al.css({top:-90000,left:-90000});ao=ae.scrollTop();ar=ae.scrollLeft();if(aj.fixed){au.top-=ao;au.left-=ar;al.css({position:"fixed"})}else{ay=ao;ap=ar;al.css({position:"absolute"})}if(aj.right!==false){ap+=Math.max(ae.width()-aj.w-a-m-R(aj.right,"x"),0)}else{if(aj.left!==false){ap+=R(aj.left,"x")}else{ap+=Math.round(Math.max(ae.width()-aj.w-a-m,0)/2)}}if(aj.bottom!==false){ay+=Math.max(s()-aj.h-g-an-R(aj.bottom,"y"),0)}else{if(aj.top!==false){ay+=R(aj.top,"y")}else{ay+=Math.round(Math.max(s()-aj.h-g-an,0)/2)}}al.css({top:au.top,left:au.left,visibility:"visible"});am[0].style.width=am[0].style.height="9999px";function ax(){K[0].style.width=S[0].style.width=d[0].style.width=(parseInt(al[0].style.width,10)-m)+"px";d[0].style.height=p[0].style.height=b[0].style.height=(parseInt(al[0].style.height,10)-an)+"px"}aw={width:aj.w+a+m,height:aj.h+g+an,top:ay,left:ap};if(aq){var av=0;M.each(aw,function(az){if(aw[az]!==ad[az]){av=aq;return}});aq=av}ad=aw;if(!aq){al.css(aw)}al.dequeue().animate(aw,{duration:aq||0,complete:function(){ax();ac=false;am[0].style.width=(aj.w+a+m)+"px";am[0].style.height=(aj.h+g+an)+"px";if(aj.reposition){setTimeout(function(){ae.bind("resize."+V,O.position)},1)}if(at){at()}},step:ax})};O.resize=function(ap){var ao;if(D){ap=ap||{};if(ap.width){aj.w=R(ap.width,"x")-a-m}if(ap.innerWidth){aj.w=R(ap.innerWidth,"x")}Q.css({width:aj.w});if(ap.height){aj.h=R(ap.height,"y")-g-an}if(ap.innerHeight){aj.h=R(ap.innerHeight,"y")}if(!ap.innerHeight&&!ap.height){ao=Q.scrollTop();Q.css({height:"auto"});aj.h=Q.height()}Q.css({height:aj.h});if(ao){Q.scrollTop(ao)}O.position(aj.transition==="none"?0:aj.speed)}};O.prep=function(ap){if(!D){return}var at,aq=aj.transition==="none"?0:aj.speed;Q.empty().remove();Q=J(ai,"LoadedContent").append(ap);function ao(){aj.w=aj.w||Q.width();aj.w=aj.mw&&aj.mw1){if(typeof aj.current==="string"){u.html(aj.current.replace("{current}",L+1).replace("{total}",ay)).show()}t[(aj.loop||L1){n.height=n.height/aa.devicePixelRatio;n.width=n.width/aa.devicePixelRatio}if(aj.scalePhotos){ar=function(){n.height-=n.height*au;n.width-=n.width*au};if(aj.mw&&n.width>aj.mw){au=(n.width-aj.mw)/n.width;ar()}if(aj.mh&&n.height>aj.mh){au=(n.height-aj.mh)/n.height;ar()}}if(aj.h){n.style.marginTop=Math.max(aj.mh-n.height,0)/2+"px"}if(c[1]&&(aj.loop||c[L+1])){n.style.cursor="pointer";n.onclick=function(){O.next()}}n.style.width=n.width+"px";n.style.height=n.height+"px";setTimeout(function(){ap(n)},1)});setTimeout(function(){n.src=aq},1)}else{if(aq){k.load(aq,aj.data,function(av,au){if(at===G){ap(au==="error"?J(ai,"Error").html(aj.xhrError):M(this).contents())}})}}}}}}O.next=function(){if(!ac&&c[1]&&(aj.loop||c[L+1])){L=F(1);f(c[L])}};O.prev=function(){if(!ac&&c[1]&&(aj.loop||L)){L=F(-1);f(c[L])}};O.close=function(){if(D&&!P){P=true;D=false;H(v,aj.onCleanup);ae.unbind("."+V);T.fadeTo(aj.fadeOut||0,0);al.stop().fadeTo(aj.fadeOut||0,0,function(){al.add(T).css({opacity:1,cursor:"auto"}).hide();H(i);Q.empty().remove();setTimeout(function(){P=false;H(ag,aj.onClosed)},1)})}};O.remove=function(){if(!al){return}al.stop();M.colorbox.close();al.stop().remove();T.remove();P=false;al=null;M("."+r).removeData(x).removeClass(r);M(l).unbind("click."+V)};O.element=function(){return M(w)};O.settings=N}(jQuery,document,window));(function(window,document,undefined){(function(factory){if(typeof define==="function"&&define.amd){define(["jquery"],factory)}else{if(jQuery&&!jQuery.fn.dataTable){factory(jQuery)}}}(function($){var DataTable=function(oInit){function _fnAddColumn(oSettings,nTh){var oDefaults=DataTable.defaults.columns;var iCol=oSettings.aoColumns.length;var oCol=$.extend({},DataTable.models.oColumn,oDefaults,{sSortingClass:oSettings.oClasses.sSortable,sSortingClassJUI:oSettings.oClasses.sSortJUI,nTh:nTh?nTh:document.createElement("th"),sTitle:oDefaults.sTitle?oDefaults.sTitle:nTh?nTh.innerHTML:"",aDataSort:oDefaults.aDataSort?oDefaults.aDataSort:[iCol],mData:oDefaults.mData?oDefaults.oDefaults:iCol});oSettings.aoColumns.push(oCol);if(oSettings.aoPreSearchCols[iCol]===undefined||oSettings.aoPreSearchCols[iCol]===null){oSettings.aoPreSearchCols[iCol]=$.extend({},DataTable.models.oSearch)}else{var oPre=oSettings.aoPreSearchCols[iCol];if(oPre.bRegex===undefined){oPre.bRegex=true}if(oPre.bSmart===undefined){oPre.bSmart=true}if(oPre.bCaseInsensitive===undefined){oPre.bCaseInsensitive=true}}_fnColumnOptions(oSettings,iCol,null)}function _fnColumnOptions(oSettings,iCol,oOptions){var oCol=oSettings.aoColumns[iCol];if(oOptions!==undefined&&oOptions!==null){if(oOptions.mDataProp&&!oOptions.mData){oOptions.mData=oOptions.mDataProp}if(oOptions.sType!==undefined){oCol.sType=oOptions.sType;oCol._bAutoType=false}$.extend(oCol,oOptions);_fnMap(oCol,oOptions,"sWidth","sWidthOrig");if(oOptions.iDataSort!==undefined){oCol.aDataSort=[oOptions.iDataSort]}_fnMap(oCol,oOptions,"aDataSort")}var mRender=oCol.mRender?_fnGetObjectDataFn(oCol.mRender):null;var mData=_fnGetObjectDataFn(oCol.mData);oCol.fnGetData=function(oData,sSpecific){var innerData=mData(oData,sSpecific);if(oCol.mRender&&(sSpecific&&sSpecific!=="")){return mRender(innerData,sSpecific,oData)}return innerData};oCol.fnSetData=_fnSetObjectDataFn(oCol.mData);if(!oSettings.oFeatures.bSort){oCol.bSortable=false}if(!oCol.bSortable||($.inArray("asc",oCol.asSorting)==-1&&$.inArray("desc",oCol.asSorting)==-1)){oCol.sSortingClass=oSettings.oClasses.sSortableNone;oCol.sSortingClassJUI=""}else{if($.inArray("asc",oCol.asSorting)==-1&&$.inArray("desc",oCol.asSorting)==-1){oCol.sSortingClass=oSettings.oClasses.sSortable;oCol.sSortingClassJUI=oSettings.oClasses.sSortJUI}else{if($.inArray("asc",oCol.asSorting)!=-1&&$.inArray("desc",oCol.asSorting)==-1){oCol.sSortingClass=oSettings.oClasses.sSortableAsc;oCol.sSortingClassJUI=oSettings.oClasses.sSortJUIAscAllowed}else{if($.inArray("asc",oCol.asSorting)==-1&&$.inArray("desc",oCol.asSorting)!=-1){oCol.sSortingClass=oSettings.oClasses.sSortableDesc;oCol.sSortingClassJUI=oSettings.oClasses.sSortJUIDescAllowed}}}}}function _fnAdjustColumnSizing(oSettings){if(oSettings.oFeatures.bAutoWidth===false){return false}_fnCalculateColumnWidths(oSettings);for(var i=0,iLen=oSettings.aoColumns.length;i=0;i--){var aTargets=aoColDefs[i].aTargets;if(!$.isArray(aTargets)){_fnLog(oSettings,1,"aTargets must be an array of targets, not a "+(typeof aTargets))}for(j=0,jLen=aTargets.length;j=0){while(oSettings.aoColumns.length<=aTargets[j]){_fnAddColumn(oSettings)}fn(aTargets[j],aoColDefs[i])}else{if(typeof aTargets[j]==="number"&&aTargets[j]<0){fn(oSettings.aoColumns.length+aTargets[j],aoColDefs[i])}else{if(typeof aTargets[j]==="string"){for(k=0,kLen=oSettings.aoColumns.length;kiTarget){a[i]--}}}if(iTargetIndex!=-1){a.splice(iTargetIndex,1)}}function _fnRender(oSettings,iRow,iCol){var oCol=oSettings.aoColumns[iCol];return oCol.fnRender({iDataRow:iRow,iDataColumn:iCol,oSettings:oSettings,aData:oSettings.aoData[iRow]._aData,mDataProp:oCol.mData},_fnGetCellData(oSettings,iRow,iCol,"display"))}function _fnCreateTr(oSettings,iRow){var oData=oSettings.aoData[iRow];var nTd;if(oData.nTr===null){oData.nTr=document.createElement("tr");oData.nTr._DT_RowIndex=iRow;if(oData._aData.DT_RowId){oData.nTr.id=oData._aData.DT_RowId}if(oData._aData.DT_RowClass){oData.nTr.className=oData._aData.DT_RowClass}for(var i=0,iLen=oSettings.aoColumns.length;i=0;j--){if(!oSettings.aoColumns[j].bVisible&&!bIncludeHidden){aoLocal[i].splice(j,1)}}aApplied.push([])}for(i=0,iLen=aoLocal.length;i=oSettings.fnRecordsDisplay())?0:oSettings.iInitDisplayStart}oSettings.iInitDisplayStart=-1;_fnCalculateEnd(oSettings)}if(oSettings.bDeferLoading){oSettings.bDeferLoading=false;oSettings.iDraw++}else{if(!oSettings.oFeatures.bServerSide){oSettings.iDraw++}else{if(!oSettings.bDestroying&&!_fnAjaxUpdate(oSettings)){return}}}if(oSettings.aiDisplay.length!==0){var iStart=oSettings._iDisplayStart;var iEnd=oSettings._iDisplayEnd;if(oSettings.oFeatures.bServerSide){iStart=0;iEnd=oSettings.aoData.length}for(var j=iStart;j
")[0];oSettings.nTable.parentNode.insertBefore(nHolding,oSettings.nTable);oSettings.nTableWrapper=$('')[0];oSettings.nTableReinsertBefore=oSettings.nTable.nextSibling;var nInsertNode=oSettings.nTableWrapper;var aDom=oSettings.sDom.split("");var nTmp,iPushFeature,cOption,nNewNode,cNext,sAttr,j;for(var i=0;i")[0];cNext=aDom[i+1];if(cNext=="'"||cNext=='"'){sAttr="";j=2;while(aDom[i+j]!=cNext){sAttr+=aDom[i+j];j++}if(sAttr=="H"){sAttr=oSettings.oClasses.sJUIHeader}else{if(sAttr=="F"){sAttr=oSettings.oClasses.sJUIFooter}}if(sAttr.indexOf(".")!=-1){var aSplit=sAttr.split(".");nNewNode.id=aSplit[0].substr(1,aSplit[0].length-1);nNewNode.className=aSplit[1]}else{if(sAttr.charAt(0)=="#"){nNewNode.id=sAttr.substr(1,sAttr.length-1)}else{nNewNode.className=sAttr}}i+=j}nInsertNode.appendChild(nNewNode);nInsertNode=nNewNode}else{if(cOption==">"){nInsertNode=nInsertNode.parentNode}else{if(cOption=="l"&&oSettings.oFeatures.bPaginate&&oSettings.oFeatures.bLengthChange){nTmp=_fnFeatureHtmlLength(oSettings);iPushFeature=1}else{if(cOption=="f"&&oSettings.oFeatures.bFilter){nTmp=_fnFeatureHtmlFilter(oSettings);iPushFeature=1}else{if(cOption=="r"&&oSettings.oFeatures.bProcessing){nTmp=_fnFeatureHtmlProcessing(oSettings);iPushFeature=1}else{if(cOption=="t"){nTmp=_fnFeatureHtmlTable(oSettings);iPushFeature=1}else{if(cOption=="i"&&oSettings.oFeatures.bInfo){nTmp=_fnFeatureHtmlInfo(oSettings);iPushFeature=1}else{if(cOption=="p"&&oSettings.oFeatures.bPaginate){nTmp=_fnFeatureHtmlPaginate(oSettings);iPushFeature=1}else{if(DataTable.ext.aoFeatures.length!==0){var aoFeatures=DataTable.ext.aoFeatures;for(var k=0,kLen=aoFeatures.length;k'):sSearchStr===""?'':sSearchStr+' ';var nFilter=document.createElement("div");nFilter.className=oSettings.oClasses.sFilter;nFilter.innerHTML="";if(!oSettings.aanFeatures.f){nFilter.id=oSettings.sTableId+"_filter"}var jqFilter=$('input[type="text"]',nFilter);nFilter._DT_Input=jqFilter[0];jqFilter.val(oPreviousSearch.sSearch.replace('"',"""));jqFilter.bind("keyup.DT",function(e){var n=oSettings.aanFeatures.f;var val=this.value===""?"":this.value;for(var i=0,iLen=n.length;i=0;i--){var sData=_fnDataToSearch(_fnGetCellData(oSettings,oSettings.aiDisplay[i],iColumn,"filter"),oSettings.aoColumns[iColumn].sType);if(!rpSearch.test(sData)){oSettings.aiDisplay.splice(i,1);iIndexCorrector++}}}function _fnFilter(oSettings,sInput,iForce,bRegex,bSmart,bCaseInsensitive){var i;var rpSearch=_fnFilterCreateSearch(sInput,bRegex,bSmart,bCaseInsensitive);var oPrevSearch=oSettings.oPreviousSearch;if(!iForce){iForce=0}if(DataTable.ext.afnFiltering.length!==0){iForce=1}if(sInput.length<=0){oSettings.aiDisplay.splice(0,oSettings.aiDisplay.length);oSettings.aiDisplay=oSettings.aiDisplayMaster.slice()}else{if(oSettings.aiDisplay.length==oSettings.aiDisplayMaster.length||oPrevSearch.sSearch.length>sInput.length||iForce==1||sInput.indexOf(oPrevSearch.sSearch)!==0){oSettings.aiDisplay.splice(0,oSettings.aiDisplay.length);_fnBuildSearchArray(oSettings,1);for(i=0;i").html(sSearch).text()}return sSearch.replace(/[\n\r]/g," ")}function _fnFilterCreateSearch(sSearch,bRegex,bSmart,bCaseInsensitive){var asSearch,sRegExpString;if(bSmart){asSearch=bRegex?sSearch.split(" "):_fnEscapeRegex(sSearch).split(" ");sRegExpString="^(?=.*?"+asSearch.join(")(?=.*?")+").*$";return new RegExp(sRegExpString,bCaseInsensitive?"i":"")}else{sSearch=bRegex?sSearch:_fnEscapeRegex(sSearch);return new RegExp(sSearch,bCaseInsensitive?"i":"")}}function _fnDataToSearch(sData,sType){if(typeof DataTable.ext.ofnSearch[sType]==="function"){return DataTable.ext.ofnSearch[sType](sData)}else{if(sData===null){return""}else{if(sType=="html"){return sData.replace(/[\r\n]/g," ").replace(/<.*?>/g,"")}else{if(typeof sData==="string"){return sData.replace(/[\r\n]/g," ")}}}}return sData}function _fnEscapeRegex(sVal){var acEscape=["/",".","*","+","?","|","(",")","[","]","{","}","\\","$","^","-"];var reReplace=new RegExp("(\\"+acEscape.join("|\\")+")","g");return sVal.replace(reReplace,"\\$1")}function _fnFeatureHtmlInfo(oSettings){var nInfo=document.createElement("div");nInfo.className=oSettings.oClasses.sInfo;if(!oSettings.aanFeatures.i){oSettings.aoDrawCallback.push({fn:_fnUpdateInfo,sName:"information"});nInfo.id=oSettings.sTableId+"_info"}oSettings.nTable.setAttribute("aria-describedby",oSettings.sTableId+"_info");return nInfo}function _fnUpdateInfo(oSettings){if(!oSettings.oFeatures.bInfo||oSettings.aanFeatures.i.length===0){return}var oLang=oSettings.oLanguage,iStart=oSettings._iDisplayStart+1,iEnd=oSettings.fnDisplayEnd(),iMax=oSettings.fnRecordsTotal(),iTotal=oSettings.fnRecordsDisplay(),sOut;if(iTotal===0){sOut=oLang.sInfoEmpty}else{sOut=oLang.sInfo}if(iTotal!=iMax){sOut+=" "+oLang.sInfoFiltered}sOut+=oLang.sInfoPostFix;sOut=_fnInfoMacros(oSettings,sOut);if(oLang.fnInfoCallback!==null){sOut=oLang.fnInfoCallback.call(oSettings.oInstance,oSettings,iStart,iEnd,iMax,iTotal,sOut)}var n=oSettings.aanFeatures.i;for(var i=0,iLen=n.length;i";var i,iLen;var aLengthMenu=oSettings.aLengthMenu;if(aLengthMenu.length==2&&typeof aLengthMenu[0]==="object"&&typeof aLengthMenu[1]==="object"){for(i=0,iLen=aLengthMenu[0].length;i'+aLengthMenu[1][i]+""}}else{for(i=0,iLen=aLengthMenu.length;i'+aLengthMenu[i]+""}}sStdMenu+="";var nLength=document.createElement("div");if(!oSettings.aanFeatures.l){nLength.id=oSettings.sTableId+"_length"}nLength.className=oSettings.oClasses.sLength;nLength.innerHTML="";$('select option[value="'+oSettings._iDisplayLength+'"]',nLength).attr("selected",true);$("select",nLength).bind("change.DT",function(e){var iVal=$(this).val();var n=oSettings.aanFeatures.l;for(i=0,iLen=n.length;ioSettings.aiDisplay.length||oSettings._iDisplayLength==-1){oSettings._iDisplayEnd=oSettings.aiDisplay.length}else{oSettings._iDisplayEnd=oSettings._iDisplayStart+oSettings._iDisplayLength}}}function _fnFeatureHtmlPaginate(oSettings){if(oSettings.oScroll.bInfinite){return null}var nPaginate=document.createElement("div");nPaginate.className=oSettings.oClasses.sPaging+oSettings.sPaginationType;DataTable.ext.oPagination[oSettings.sPaginationType].fnInit(oSettings,nPaginate,function(oSettings){_fnCalculateEnd(oSettings);_fnDraw(oSettings)});if(!oSettings.aanFeatures.p){oSettings.aoDrawCallback.push({fn:function(oSettings){DataTable.ext.oPagination[oSettings.sPaginationType].fnUpdate(oSettings,function(oSettings){_fnCalculateEnd(oSettings);_fnDraw(oSettings)})},sName:"pagination"})}return nPaginate}function _fnPageChange(oSettings,mAction){var iOldStart=oSettings._iDisplayStart;if(typeof mAction==="number"){oSettings._iDisplayStart=mAction*oSettings._iDisplayLength;if(oSettings._iDisplayStart>oSettings.fnRecordsDisplay()){oSettings._iDisplayStart=0}}else{if(mAction=="first"){oSettings._iDisplayStart=0}else{if(mAction=="previous"){oSettings._iDisplayStart=oSettings._iDisplayLength>=0?oSettings._iDisplayStart-oSettings._iDisplayLength:0;if(oSettings._iDisplayStart<0){oSettings._iDisplayStart=0}}else{if(mAction=="next"){if(oSettings._iDisplayLength>=0){if(oSettings._iDisplayStart+oSettings._iDisplayLength=0){var iPages=parseInt((oSettings.fnRecordsDisplay()-1)/oSettings._iDisplayLength,10)+1;oSettings._iDisplayStart=(iPages-1)*oSettings._iDisplayLength}else{oSettings._iDisplayStart=0}}else{_fnLog(oSettings,0,"Unknown paging action: "+mAction)}}}}}$(oSettings.oInstance).trigger("page",oSettings);return iOldStart!=oSettings._iDisplayStart}function _fnFeatureHtmlProcessing(oSettings){var nProcessing=document.createElement("div");if(!oSettings.aanFeatures.r){nProcessing.id=oSettings.sTableId+"_processing"}nProcessing.innerHTML=oSettings.oLanguage.sProcessing;nProcessing.className=oSettings.oClasses.sProcessing;oSettings.nTable.parentNode.insertBefore(nProcessing,oSettings.nTable);return nProcessing}function _fnProcessingDisplay(oSettings,bShow){if(oSettings.oFeatures.bProcessing){var an=oSettings.aanFeatures.r;for(var i=0,iLen=an.length;i0){nCaption=nCaption[0];if(nCaption._captionSide==="top"){nScrollHeadTable.appendChild(nCaption)}else{if(nCaption._captionSide==="bottom"&&nTfoot){nScrollFootTable.appendChild(nCaption)}}}if(oSettings.oScroll.sX!==""){nScrollHead.style.width=_fnStringToCss(oSettings.oScroll.sX);nScrollBody.style.width=_fnStringToCss(oSettings.oScroll.sX);if(nTfoot!==null){nScrollFoot.style.width=_fnStringToCss(oSettings.oScroll.sX)}$(nScrollBody).scroll(function(e){nScrollHead.scrollLeft=this.scrollLeft;if(nTfoot!==null){nScrollFoot.scrollLeft=this.scrollLeft}})}if(oSettings.oScroll.sY!==""){nScrollBody.style.height=_fnStringToCss(oSettings.oScroll.sY)}oSettings.aoDrawCallback.push({fn:_fnScrollDraw,sName:"scrolling"});if(oSettings.oScroll.bInfinite){$(nScrollBody).scroll(function(){if(!oSettings.bDrawing&&$(this).scrollTop()!==0){if($(this).scrollTop()+$(this).height()>$(oSettings.nTable).height()-oSettings.oScroll.iLoadGap){if(oSettings.fnDisplayEnd()nScrollBody.offsetHeight||$(nScrollBody).css("overflow-y")=="scroll")){o.nTable.style.width=_fnStringToCss($(o.nTable).outerWidth()-o.oScroll.iBarWidth)}}else{if(o.oScroll.sXInner!==""){o.nTable.style.width=_fnStringToCss(o.oScroll.sXInner)}else{if(iSanityWidth==$(nScrollBody).width()&&$(nScrollBody).height()<$(o.nTable).height()){o.nTable.style.width=_fnStringToCss(iSanityWidth-o.oScroll.iBarWidth);if($(o.nTable).outerWidth()>iSanityWidth-o.oScroll.iBarWidth){o.nTable.style.width=_fnStringToCss(iSanityWidth)}}else{o.nTable.style.width=_fnStringToCss(iSanityWidth)}}}iSanityWidth=$(o.nTable).outerWidth();_fnApplyToChildren(zeroOut,anHeadSizers);_fnApplyToChildren(function(nSizer){aApplied.push(_fnStringToCss($(nSizer).width()))},anHeadSizers);_fnApplyToChildren(function(nToSize,i){nToSize.style.width=aApplied[i]},anHeadToSize);$(anHeadSizers).height(0);if(o.nTFoot!==null){_fnApplyToChildren(zeroOut,anFootSizers);_fnApplyToChildren(function(nSizer){aAppliedFooter.push(_fnStringToCss($(nSizer).width()))},anFootSizers);_fnApplyToChildren(function(nToSize,i){nToSize.style.width=aAppliedFooter[i]},anFootToSize);$(anFootSizers).height(0)}_fnApplyToChildren(function(nSizer,i){nSizer.innerHTML="";nSizer.style.width=aApplied[i]},anHeadSizers);if(o.nTFoot!==null){_fnApplyToChildren(function(nSizer,i){nSizer.innerHTML="";nSizer.style.width=aAppliedFooter[i]},anFootSizers)}if($(o.nTable).outerWidth()nScrollBody.offsetHeight||$(nScrollBody).css("overflow-y")=="scroll"))?iSanityWidth+o.oScroll.iBarWidth:iSanityWidth;if(ie67&&(nScrollBody.scrollHeight>nScrollBody.offsetHeight||$(nScrollBody).css("overflow-y")=="scroll")){o.nTable.style.width=_fnStringToCss(iCorrection-o.oScroll.iBarWidth)}nScrollBody.style.width=_fnStringToCss(iCorrection);o.nScrollHead.style.width=_fnStringToCss(iCorrection);if(o.nTFoot!==null){o.nScrollFoot.style.width=_fnStringToCss(iCorrection)}if(o.oScroll.sX===""){_fnLog(o,1,"The table cannot fit into the current element which will cause column misalignment. The table has been drawn at its minimum possible width.")}else{if(o.oScroll.sXInner!==""){_fnLog(o,1,"The table cannot fit into the current element which will cause column misalignment. Increase the sScrollXInner value or remove it to allow automatic calculation")}}}else{nScrollBody.style.width=_fnStringToCss("100%");o.nScrollHead.style.width=_fnStringToCss("100%");if(o.nTFoot!==null){o.nScrollFoot.style.width=_fnStringToCss("100%")}}if(o.oScroll.sY===""){if(ie67){nScrollBody.style.height=_fnStringToCss(o.nTable.offsetHeight+o.oScroll.iBarWidth)}}if(o.oScroll.sY!==""&&o.oScroll.bCollapse){nScrollBody.style.height=_fnStringToCss(o.oScroll.sY);var iExtra=(o.oScroll.sX!==""&&o.nTable.offsetWidth>nScrollBody.offsetWidth)?o.oScroll.iBarWidth:0;if(o.nTable.offsetHeightnScrollBody.clientHeight||$(nScrollBody).css("overflow-y")=="scroll";nScrollHeadInner.style.paddingRight=bScrolling?o.oScroll.iBarWidth+"px":"0px";if(o.nTFoot!==null){nScrollFootTable.style.width=_fnStringToCss(iOuterWidth);nScrollFootInner.style.width=_fnStringToCss(iOuterWidth);nScrollFootInner.style.paddingRight=bScrolling?o.oScroll.iBarWidth+"px":"0px"}$(nScrollBody).scroll();if(o.bSorted||o.bFiltered){nScrollBody.scrollTop=0}}function _fnApplyToChildren(fn,an1,an2){var index=0,i=0,iLen=an1.length;var nNode1,nNode2;while(itd",nCalcTmp)}var nThs=_fnGetUniqueThs(oSettings,nTheadClone);iCorrector=0;for(i=0;i0){oSettings.aoColumns[i].sWidth=_fnStringToCss(iWidth)}iCorrector++}}var cssWidth=$(nCalcTmp).css("width");oSettings.nTable.style.width=(cssWidth.indexOf("%")!==-1)?cssWidth:_fnStringToCss($(nCalcTmp).outerWidth());nCalcTmp.parentNode.removeChild(nCalcTmp)}if(widthAttr){oSettings.nTable.style.width=_fnStringToCss(widthAttr)}}function _fnScrollingWidthAdjust(oSettings,n){if(oSettings.oScroll.sX===""&&oSettings.oScroll.sY!==""){var iOrigWidth=$(n).width();n.style.width=_fnStringToCss($(n).outerWidth()-oSettings.oScroll.iBarWidth)}else{if(oSettings.oScroll.sX!==""){n.style.width=_fnStringToCss($(n).outerWidth())}}}function _fnGetWidestNode(oSettings,iCol){var iMaxIndex=_fnGetMaxLenString(oSettings,iCol);if(iMaxIndex<0){return null}if(oSettings.aoData[iMaxIndex].nTr===null){var n=document.createElement("td");n.innerHTML=_fnGetCellData(oSettings,iMaxIndex,iCol,"");return n}return _fnGetTdNodes(oSettings,iMaxIndex)[iCol]}function _fnGetMaxLenString(oSettings,iCol){var iMax=-1;var iMaxIndex=-1;for(var i=0;i/g,"");if(s.length>iMax){iMax=s.length;iMaxIndex=i}}return iMaxIndex}function _fnStringToCss(s){if(s===null){return"0px"}if(typeof s=="number"){if(s<0){return"0px"}return s+"px"}var c=s.charCodeAt(s.length-1);if(c<48||c>57){return s}return s+"px"}function _fnScrollBarWidth(){var inner=document.createElement("p");var style=inner.style;style.width="100%";style.height="200px";style.padding="0px";var outer=document.createElement("div");style=outer.style;style.position="absolute";style.top="0px";style.left="0px";style.visibility="hidden";style.width="200px";style.height="150px";style.padding="0px";style.overflow="hidden";outer.appendChild(inner);document.body.appendChild(outer);var w1=inner.offsetWidth;outer.style.overflow="scroll";var w2=inner.offsetWidth;if(w1==w2){w2=outer.clientWidth}document.body.removeChild(outer);return(w1-w2)}function _fnSort(oSettings,bApplyClasses){var i,iLen,j,jLen,k,kLen,sDataType,nTh,aaSort=[],aiOrig=[],oSort=DataTable.ext.oSort,aoData=oSettings.aoData,aoColumns=oSettings.aoColumns,oAria=oSettings.oLanguage.oAria;if(!oSettings.oFeatures.bServerSide&&(oSettings.aaSorting.length!==0||oSettings.aaSortingFixed!==null)){aaSort=(oSettings.aaSortingFixed!==null)?oSettings.aaSortingFixed.concat(oSettings.aaSorting):oSettings.aaSorting.slice();for(i=0;i/g,"");nTh=aoColumns[i].nTh;nTh.removeAttribute("aria-sort");nTh.removeAttribute("aria-label");if(aoColumns[i].bSortable){if(aaSort.length>0&&aaSort[0][0]==i){nTh.setAttribute("aria-sort",aaSort[0][1]=="asc"?"ascending":"descending");var nextSort=(aoColumns[i].asSorting[aaSort[0][2]+1])?aoColumns[i].asSorting[aaSort[0][2]+1]:aoColumns[i].asSorting[0];nTh.setAttribute("aria-label",sTitle+(nextSort=="asc"?oAria.sSortAscending:oAria.sSortDescending))}else{nTh.setAttribute("aria-label",sTitle+(aoColumns[i].asSorting[0]=="asc"?oAria.sSortAscending:oAria.sSortDescending))}}else{nTh.setAttribute("aria-label",sTitle)}}oSettings.bSorted=true;$(oSettings.oInstance).trigger("sort",oSettings);if(oSettings.oFeatures.bFilter){_fnFilterComplete(oSettings,oSettings.oPreviousSearch,1)}else{oSettings.aiDisplay=oSettings.aiDisplayMaster.slice();oSettings._iDisplayStart=0;_fnCalculateEnd(oSettings);_fnDraw(oSettings)}}function _fnSortAttachListener(oSettings,nNode,iDataIndex,fnCallback){_fnBindAction(nNode,{},function(e){if(oSettings.aoColumns[iDataIndex].bSortable===false){return}var fnInnerSorting=function(){var iColumn,iNextSort;if(e.shiftKey){var bFound=false;for(var i=0;i0&&sCurrentClass.indexOf(sNewClass)==-1){nTds[i].className=sCurrentClass+" "+sNewClass}}}}}function _fnSaveState(oSettings){if(!oSettings.oFeatures.bStateSave||oSettings.bDestroying){return}var i,iLen,bInfinite=oSettings.oScroll.bInfinite;var oState={iCreate:new Date().getTime(),iStart:(bInfinite?0:oSettings._iDisplayStart),iEnd:(bInfinite?oSettings._iDisplayLength:oSettings._iDisplayEnd),iLength:oSettings._iDisplayLength,aaSorting:$.extend(true,[],oSettings.aaSorting),oSearch:$.extend(true,{},oSettings.oPreviousSearch),aoSearchCols:$.extend(true,[],oSettings.aoPreSearchCols),abVisCols:[]};for(i=0,iLen=oSettings.aoColumns.length;i4096){for(var i=0,iLen=aCookies.length;i4096){if(aOldCookies.length===0){return}var old=aOldCookies.pop();document.cookie=old.name+"=; expires=Thu, 01-Jan-1970 00:00:01 GMT; path="+aParts.join("/")+"/"}}document.cookie=sFullCookie}function _fnReadCookie(sName){var aParts=window.location.pathname.split("/"),sNameEQ=sName+"_"+aParts[aParts.length-1].replace(/[\/:]/g,"").toLowerCase()+"=",sCookieContents=document.cookie.split(";");for(var i=0;i=0;i--){aRet.push(aoStore[i].fn.apply(oSettings.oInstance,aArgs))}if(sTrigger!==null){$(oSettings.oInstance).trigger(sTrigger,aArgs)}return aRet}var _fnJsonString=(window.JSON)?JSON.stringify:function(o){var sType=typeof o;if(sType!=="object"||o===null){if(sType==="string"){o='"'+o+'"'}return o+""}var sProp,mValue,json=[],bArr=$.isArray(o);for(sProp in o){mValue=o[sProp];sType=typeof mValue;if(sType==="string"){mValue='"'+mValue+'"'}else{if(sType==="object"&&mValue!==null){mValue=_fnJsonString(mValue)}}json.push((bArr?"":'"'+sProp+'":')+mValue)}return(bArr?"[":"{")+json+(bArr?"]":"}")};function _fnBrowserDetect(oSettings){var n=$('
')[0];document.body.appendChild(n);oSettings.oBrowser.bScrollOversize=$("#DT_BrowserTest",n)[0].offsetWidth===100?true:false;document.body.removeChild(n)}this.$=function(sSelector,oOpts){var i,iLen,a=[],tr;var oSettings=_fnSettingsFromNode(this[DataTable.ext.iApiIndex]);var aoData=oSettings.aoData;var aiDisplay=oSettings.aiDisplay;var aiDisplayMaster=oSettings.aiDisplayMaster;if(!oOpts){oOpts={}}oOpts=$.extend({},{filter:"none",order:"current",page:"all"},oOpts);if(oOpts.page=="current"){for(i=oSettings._iDisplayStart,iLen=oSettings.fnDisplayEnd();i=oSettings.fnRecordsDisplay()){oSettings._iDisplayStart-=oSettings._iDisplayLength;if(oSettings._iDisplayStart<0){oSettings._iDisplayStart=0}}if(bRedraw===undefined||bRedraw){_fnCalculateEnd(oSettings);_fnDraw(oSettings)}return oData};this.fnDestroy=function(bRemove){var oSettings=_fnSettingsFromNode(this[DataTable.ext.iApiIndex]);var nOrig=oSettings.nTableWrapper.parentNode;var nBody=oSettings.nTBody;var i,iLen;bRemove=(bRemove===undefined)?false:bRemove;oSettings.bDestroying=true;_fnCallbackFire(oSettings,"aoDestroyCallback","destroy",[oSettings]);if(!bRemove){for(i=0,iLen=oSettings.aoColumns.length;itr>td."+oSettings.oClasses.sRowEmpty,oSettings.nTable).parent().remove();if(oSettings.nTable!=oSettings.nTHead.parentNode){$(oSettings.nTable).children("thead").remove();oSettings.nTable.appendChild(oSettings.nTHead)}if(oSettings.nTFoot&&oSettings.nTable!=oSettings.nTFoot.parentNode){$(oSettings.nTable).children("tfoot").remove();oSettings.nTable.appendChild(oSettings.nTFoot)}oSettings.nTable.parentNode.removeChild(oSettings.nTable);$(oSettings.nTableWrapper).remove();oSettings.aaSorting=[];oSettings.aaSortingFixed=[];_fnSortingClasses(oSettings);$(_fnGetTrNodes(oSettings)).removeClass(oSettings.asStripeClasses.join(" "));$("th, td",oSettings.nTHead).removeClass([oSettings.oClasses.sSortable,oSettings.oClasses.sSortableAsc,oSettings.oClasses.sSortableDesc,oSettings.oClasses.sSortableNone].join(" "));if(oSettings.bJUI){$("th span."+oSettings.oClasses.sSortIcon+", td span."+oSettings.oClasses.sSortIcon,oSettings.nTHead).remove();$("th, td",oSettings.nTHead).each(function(){var jqWrapper=$("div."+oSettings.oClasses.sSortJUIWrapper,this);var kids=jqWrapper.contents();$(this).append(kids);jqWrapper.remove()})}if(!bRemove&&oSettings.nTableReinsertBefore){nOrig.insertBefore(oSettings.nTable,oSettings.nTableReinsertBefore)}else{if(!bRemove){nOrig.appendChild(oSettings.nTable)}}for(i=0,iLen=oSettings.aoData.length;i=_fnVisbleColumns(oSettings));if(!bAppend){for(i=iCol;it<"F"ip>'}}else{$.extend(oSettings.oClasses,DataTable.ext.oStdClasses)}$(this).addClass(oSettings.oClasses.sTable);if(oSettings.oScroll.sX!==""||oSettings.oScroll.sY!==""){oSettings.oScroll.iBarWidth=_fnScrollBarWidth()}if(oSettings.iInitDisplayStart===undefined){oSettings.iInitDisplayStart=oInit.iDisplayStart;oSettings._iDisplayStart=oInit.iDisplayStart}if(oInit.bStateSave){oSettings.oFeatures.bStateSave=true;_fnLoadState(oSettings,oInit);_fnCallbackReg(oSettings,"aoDrawCallback",_fnSaveState,"state_save")}if(oInit.iDeferLoading!==null){oSettings.bDeferLoading=true;var tmp=$.isArray(oInit.iDeferLoading);oSettings._iRecordsDisplay=tmp?oInit.iDeferLoading[0]:oInit.iDeferLoading;oSettings._iRecordsTotal=tmp?oInit.iDeferLoading[1]:oInit.iDeferLoading}if(oInit.aaData!==null){bUsePassedData=true}if(oInit.oLanguage.sUrl!==""){oSettings.oLanguage.sUrl=oInit.oLanguage.sUrl;$.getJSON(oSettings.oLanguage.sUrl,null,function(json){_fnLanguageCompat(json);$.extend(true,oSettings.oLanguage,oInit.oLanguage,json);_fnInitialise(oSettings)});bInitHandedOff=true}else{$.extend(true,oSettings.oLanguage,oInit.oLanguage)}if(oInit.asStripeClasses===null){oSettings.asStripeClasses=[oSettings.oClasses.sStripeOdd,oSettings.oClasses.sStripeEven]}iLen=oSettings.asStripeClasses.length;oSettings.asDestroyStripes=[];if(iLen){var bStripeRemove=false;var anRows=$(this).children("tbody").children("tr:lt("+iLen+")");for(i=0;i=oSettings.aoColumns.length){oSettings.aaSorting[i][0]=0}var oColumn=oSettings.aoColumns[oSettings.aaSorting[i][0]];if(oSettings.aaSorting[i][2]===undefined){oSettings.aaSorting[i][2]=0}if(oInit.aaSorting===undefined&&oSettings.saved_aaSorting===undefined){oSettings.aaSorting[i][1]=oColumn.asSorting[0]}for(j=0,jLen=oColumn.asSorting.length;j0&&(oSettings.oScroll.sX!==""||oSettings.oScroll.sY!=="")){tfoot=[document.createElement("tfoot")];this.appendChild(tfoot[0])}if(tfoot.length>0){oSettings.nTFoot=tfoot[0];_fnDetectHeader(oSettings.aoFooter,oSettings.nTFoot)}if(bUsePassedData){for(i=0;i=parseInt(sThat,10)};DataTable.fnIsDataTable=function(nTable){var o=DataTable.settings;for(var i=0;i'+oLang.sPrevious+''+oLang.sNext+"":'';$(nPaging).append(sAppend);var els=$("a",nPaging);var nPrevious=els[0],nNext=els[1];oSettings.oApi._fnBindAction(nPrevious,{action:"previous"},fnClickHandler);oSettings.oApi._fnBindAction(nNext,{action:"next"},fnClickHandler);if(!oSettings.aanFeatures.p){nPaging.id=oSettings.sTableId+"_paginate";nPrevious.id=oSettings.sTableId+"_previous";nNext.id=oSettings.sTableId+"_next";nPrevious.setAttribute("aria-controls",oSettings.sTableId);nNext.setAttribute("aria-controls",oSettings.sTableId)}},fnUpdate:function(oSettings,fnCallbackDraw){if(!oSettings.aanFeatures.p){return}var oClasses=oSettings.oClasses;var an=oSettings.aanFeatures.p;var nNode;for(var i=0,iLen=an.length;i'+oLang.sFirst+''+oLang.sPrevious+''+oLang.sNext+''+oLang.sLast+"");var els=$("a",nPaging);var nFirst=els[0],nPrev=els[1],nNext=els[2],nLast=els[3];oSettings.oApi._fnBindAction(nFirst,{action:"first"},fnClickHandler);oSettings.oApi._fnBindAction(nPrev,{action:"previous"},fnClickHandler);oSettings.oApi._fnBindAction(nNext,{action:"next"},fnClickHandler);oSettings.oApi._fnBindAction(nLast,{action:"last"},fnClickHandler);if(!oSettings.aanFeatures.p){nPaging.id=oSettings.sTableId+"_paginate";nFirst.id=oSettings.sTableId+"_first";nPrev.id=oSettings.sTableId+"_previous";nNext.id=oSettings.sTableId+"_next";nLast.id=oSettings.sTableId+"_last"}},fnUpdate:function(oSettings,fnCallbackDraw){if(!oSettings.aanFeatures.p){return}var iPageCount=DataTable.ext.oPagination.iFullNumbersShowPages;var iPageCountHalf=Math.floor(iPageCount/2);var iPages=Math.ceil((oSettings.fnRecordsDisplay())/oSettings._iDisplayLength);var iCurrentPage=Math.ceil(oSettings._iDisplayStart/oSettings._iDisplayLength)+1;var sList="";var iStartButton,iEndButton,i,iLen;var oClasses=oSettings.oClasses;var anButtons,anStatic,nPaginateList,nNode;var an=oSettings.aanFeatures.p;var fnBind=function(j){oSettings.oApi._fnBindAction(this,{page:j+iStartButton-1},function(e){oSettings.oApi._fnPageChange(oSettings,e.data.page);fnCallbackDraw(oSettings);e.preventDefault()})};if(oSettings._iDisplayLength===-1){iStartButton=1;iEndButton=1;iCurrentPage=1}else{if(iPages=(iPages-iPageCountHalf)){iStartButton=iPages-iPageCount+1;iEndButton=iPages}else{iStartButton=iCurrentPage-Math.ceil(iPageCount/2)+1;iEndButton=iStartButton+iPageCount-1}}}}for(i=iStartButton;i<=iEndButton;i++){sList+=(iCurrentPage!==i)?''+oSettings.fnFormatNumber(i)+"":''+oSettings.fnFormatNumber(i)+""}for(i=0,iLen=an.length;iy)?1:0))},"string-desc":function(x,y){return((xy)?-1:0))},"html-pre":function(a){return a.replace(/<.*?>/g,"").toLowerCase()},"html-asc":function(x,y){return((xy)?1:0))},"html-desc":function(x,y){return((xy)?-1:0))},"date-pre":function(a){var x=Date.parse(a);if(isNaN(x)||x===""){x=Date.parse("01/01/1970 00:00:00")}return x},"date-asc":function(x,y){return x-y},"date-desc":function(x,y){return y-x},"numeric-pre":function(a){return(a=="-"||a==="")?0:a*1},"numeric-asc":function(x,y){return x-y},"numeric-desc":function(x,y){return y-x}});$.extend(DataTable.ext.aTypes,[function(sData){if(typeof sData==="number"){return"numeric"}else{if(typeof sData!=="string"){return null}}var sValidFirstChars="0123456789-";var sValidChars="0123456789.";var Char;var bDecimal=false;Char=sData.charAt(0);if(sValidFirstChars.indexOf(Char)==-1){return null}for(var i=1;i")!=-1){return"html"}return null}]);$.fn.DataTable=DataTable;$.fn.dataTable=DataTable;$.fn.dataTableSettings=DataTable.settings;$.fn.dataTableExt=DataTable.ext}))}(window,document));
-/*
- * jQuery Nearest plugin v1.2.2
- *
- * Finds elements closest to a single point based on screen location and pixel dimensions
- * http://gilmoreorless.github.io/jquery-nearest/
- * Open source under the MIT licence: http://gilmoreorless.mit-license.org/2011/
- *
- * Requires jQuery 1.4 or above
- * Also supports Ben Alman's "each2" plugin for faster looping (if available)
- */
-(function(c,d){var a=/^([\d.]+)%$/;function b(z,h,H){z||(z="div");var x=c(h.container),k=x.offset()||{left:0,top:0},y=[k.left+x.width(),k.top+x.height()],o={x:0,y:1,w:0,h:1},f,m;for(f in o){if(o.hasOwnProperty(f)){m=a.exec(h[f]);if(m){h[f]=y[o[f]]*m[1]/100}}}var p=x.find(z),r=[],q=!!h.furthest,t=!!h.checkHoriz,s=!!h.checkVert,e=q?0:Infinity,G=parseFloat(h.x)||0,E=parseFloat(h.y)||0,j=parseFloat(G+h.w)||G,g=parseFloat(E+h.h)||E,D=h.tolerance||0,n=!!c.fn.each2,v=Math.min,B=Math.max;if(!h.includeSelf&&H){p=p.not(H)}if(D<0){D=0}p[n?"each2":"each"](function(V,Y){var J=n?Y:c(this),Z=J.offset(),M=Z.left,L=Z.top,N=J.outerWidth(),W=J.outerHeight(),X=M+N,I=L+W,ab=B(M,G),S=v(X,j),K=B(L,E),aa=v(I,g),R=S>=ab,Q=aa>=K,P,O,T,U;if((t&&s)||(!t&&!s&&R&&Q)||(t&&Q)||(s&&R)||(t&&h.onlyX)||(s&&h.onlyY)){P=R?0:ab-S;O=Q?0:K-aa;if(h.onlyX){T=P}else{if(h.onlyY){T=O}else{T=R||Q?B(P,O):Math.sqrt(P*P+O*O)}}U=q?T>=e-D:T<=e+D;if(U){e=q?B(e,T):v(e,T);r.push({node:this,dist:T})}}});var C=r.length,l=[],u,w,A,F;if(C){if(q){u=e-D;w=e}else{u=e;w=e+D}for(A=0;A=u&&F.dist<=w){l.push(F.node)}}}return l}c.each(["nearest","furthest","touching"],function(f,e){var g={x:0,y:0,w:0,h:0,tolerance:1,container:document,furthest:e=="furthest",includeSelf:false,checkHoriz:e!="touching",checkVert:e!="touching"};c[e]=function(i,h,j){if(!i||i.x===d||i.y===d){return c([])}var k=c.extend({},g,i,j||{});return c(b(h,k))};c.fn[e]=function(h,i){var k;if(h&&c.isPlainObject(h)){k=c.extend({},g,h,i||{});return this.pushStack(b(this,k))}var l=this.offset(),j={x:l.left,y:l.top,w:this.outerWidth(),h:this.outerHeight()};k=c.extend({},g,j,i||{});return this.pushStack(b(h,k,this))}})})(jQuery);var aidata;var chart;function navigateToAIDiagramm(){window.location.hash="#AbstractnessVsInstability"}(function(a){var b={init:function(){a(document).ready(b.ready);b.customSort()},ready:function(){b.handleMenu();b.navigatePages();b.initDatatables();b.initColorbox();b.handleCodeQuery();b.handleAI();a(window).on("hashchange",b.navigatePages)},customSort:function(){jQuery.fn.dataTableExt.aTypes.unshift(function(c){var d=c.replace(/[^\d\-\.\/a-zA-Z]/g,"");d=d.replace("N/A",-999999);if(a.isNumeric(d)||d==="-"){return"formatted-num"}return null});jQuery.extend(jQuery.fn.dataTableExt.oSort,{"formatted-num-pre":function(c){if(c==="-"){return 0}if(c==="N/A"){return 999999}c=c.replace(/[^\d\-\.]/g,"");return parseFloat(c)},"formatted-num-asc":function(d,c){return d-c},"formatted-num-desc":function(d,c){return c-d}})},handleAddSourceFileFilterButtons:function(){if(addSourceFileFilterButtonsDone){return}var e=document.getElementById("NbCQLinqRules").value;var i=document.getElementById("NbRoslynAnalyzers").value;var f=findInputNodeRules();if(f!==null){j(f,[[e,"CQLinq Rules ●","Click to select only the rules written with the NDepend CQLinq language (Code Query over C# LINQ)."],[i,"Roslyn Analyzers ✱",'Click to select only the imported Rosly Analyzers. Here is the documentation about importing Roslyn Analyzers\'s issues.']])}var h=document.getElementById("NbNewSourceFiles").value;var g=document.getElementById("NbModifiedSourceFiles").value;var l=findInputNodeSourceFiles();if(l!==null){j(l,[[h,"New Files ✱","Click to select only the source files added since the baseline"],[g,"Modified Files ●","Click to select only the source files modified since the baseline"]])}var c=document.getElementById("NbNewProjects").value;var d=document.getElementById("NbModifiedProjects").value;var k=findInputNode("divProjects");if(k!==null){j(k,[[c,"New Projects ✱","Click to select only the projects added since the baseline"],[d,"Modified Projects ●","Click to select only the projects modified since the baseline"]])}addSourceFileFilterButtonsDone=true;function j(w,o){function p(z,y){z.onclick=function(){var A=y.slice(-1);setTextOfInput(w,A)};a(z).hover(function(){a(z).addClass("buttonfilehover")},function(){a(z).removeClass("buttonfilehover")})}for(var r=0;r=0){e.push(aidata[d])}}if(e.length==0){e=[{key:"empty",values:[{x:2,y:2,}]}]}d3.select("#AIContainer svg").datum(e);chart.update()})},handleMenu:function(){b.cache.menu=a("#Menu");b.cache.menuli=a("#Menu").find("li");b.cache.menu.on("click","a",function(c){c.preventDefault()});b.cache.menu.prepend("