diff --git a/.gitignore b/.gitignore index de190950..08910a3f 100644 --- a/.gitignore +++ b/.gitignore @@ -197,3 +197,4 @@ temp/gh-pages /plotly-gource.x264.avi /plotly-gource.ppm /tests/InteractiveTests/pkg +/tests/VersoTests/pkg diff --git a/Plotly.NET.sln b/Plotly.NET.sln index fa1bb8d0..16d1bf7d 100644 --- a/Plotly.NET.sln +++ b/Plotly.NET.sln @@ -234,6 +234,12 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "data", "data", "{0D955C86-2 EndProject Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "InteractiveTests", "tests\ExtensionLibsTests\InteractiveTests\InteractiveTests.fsproj", "{04BC8CE5-B096-46AD-AB1D-674305BAF59A}" EndProject +Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Plotly.NET.Verso", "src\Plotly.NET.Verso\Plotly.NET.Verso.fsproj", "{4E9DAEE7-0162-4E01-A690-CBA668F26B19}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ExtensionLibsTests", "ExtensionLibsTests", "{B97B26B6-548F-4656-B980-20BD04D168C7}" +EndProject +Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "VersoTests", "tests\ExtensionLibsTests\VersoTests\VersoTests.fsproj", "{30EDCE67-AAEC-4138-A24C-D752012F03F3}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -325,6 +331,18 @@ Global {04BC8CE5-B096-46AD-AB1D-674305BAF59A}.Dotnet|Any CPU.Build.0 = Debug|Any CPU {04BC8CE5-B096-46AD-AB1D-674305BAF59A}.Release|Any CPU.ActiveCfg = Release|Any CPU {04BC8CE5-B096-46AD-AB1D-674305BAF59A}.Release|Any CPU.Build.0 = Release|Any CPU + {4E9DAEE7-0162-4E01-A690-CBA668F26B19}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4E9DAEE7-0162-4E01-A690-CBA668F26B19}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4E9DAEE7-0162-4E01-A690-CBA668F26B19}.Dotnet|Any CPU.ActiveCfg = Debug|Any CPU + {4E9DAEE7-0162-4E01-A690-CBA668F26B19}.Dotnet|Any CPU.Build.0 = Debug|Any CPU + {4E9DAEE7-0162-4E01-A690-CBA668F26B19}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4E9DAEE7-0162-4E01-A690-CBA668F26B19}.Release|Any CPU.Build.0 = Release|Any CPU + {30EDCE67-AAEC-4138-A24C-D752012F03F3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {30EDCE67-AAEC-4138-A24C-D752012F03F3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {30EDCE67-AAEC-4138-A24C-D752012F03F3}.Dotnet|Any CPU.ActiveCfg = Debug|Any CPU + {30EDCE67-AAEC-4138-A24C-D752012F03F3}.Dotnet|Any CPU.Build.0 = Debug|Any CPU + {30EDCE67-AAEC-4138-A24C-D752012F03F3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {30EDCE67-AAEC-4138-A24C-D752012F03F3}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -367,6 +385,9 @@ Global {2DF92AB2-7B8C-48D5-B779-26BA1F31BCA1} = {A9025690-FABC-4BD3-AC94-F31B60A948B4} {0D955C86-2E86-4D50-828A-6CF5AD99A119} = {7B09CC0A-F1E1-4094-9DE4-B047581E01F0} {04BC8CE5-B096-46AD-AB1D-674305BAF59A} = {02886FBB-DB32-4BBB-A93C-E13EBF453ACC} + {4E9DAEE7-0162-4E01-A690-CBA668F26B19} = {0E87E47E-9EDC-4525-AF72-F0E139D54236} + {B97B26B6-548F-4656-B980-20BD04D168C7} = {EAE25A1F-86FC-426B-803F-1006D1AD06A8} + {30EDCE67-AAEC-4138-A24C-D752012F03F3} = {B97B26B6-548F-4656-B980-20BD04D168C7} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {7177F1E1-341C-48AB-9864-6B525FFF7633} diff --git a/build/Build.fs b/build/Build.fs index 80ad0442..77f749b6 100644 --- a/build/Build.fs +++ b/build/Build.fs @@ -36,6 +36,7 @@ let sourceFiles = !! "src/Plotly.NET/**/*.fs" ++ "src/Plotly.NET.ImageExport/**/*.fs" ++ "src/Plotly.NET.Interactive/**/*.fs" + ++ "src/Plotly.NET.Verso/**/*.fs" ++ "build/*.fs" -- "**/obj/**/*.*" -- "**/bin/**/*.*" diff --git a/build/ProjectInfo.fs b/build/ProjectInfo.fs index 4aa18309..e4aed8de 100644 --- a/build/ProjectInfo.fs +++ b/build/ProjectInfo.fs @@ -81,11 +81,13 @@ let testProjectsCore = [ let ImageExportTestProject = ProjectInfo.create("ImageExportTests", "tests/ExtensionLibsTests/ImageExportTests/ImageExportTests.fsproj") let CSharpTestProject = ProjectInfo.create("CSharpTests", "tests/ExtensionLibsTests/CSharpTests/CSharpTests.csproj") +let VersoTestProject = ProjectInfo.create("VersoTests", "tests/ExtensionLibsTests/VersoTests/VersoTests.fsproj") /// let testProjectsExtensionsLibs = [ ImageExportTestProject CSharpTestProject + VersoTestProject ] // test projects (.NET framework) @@ -99,6 +101,7 @@ let CoreProject = ProjectInfo.create("Plotly.NET", "src/Plotly.NET/Plotly.NET.fs let InteractiveProject = ProjectInfo.create("Plotly.NET.Interactive", "src/Plotly.NET.Interactive/Plotly.NET.Interactive.fsproj", "src/Plotly.NET.Interactive/RELEASE_NOTES.md") let ImageExportProject = ProjectInfo.create("Plotly.NET.ImageExport", "src/Plotly.NET.ImageExport/Plotly.NET.ImageExport.fsproj", "src/Plotly.NET.ImageExport/RELEASE_NOTES.md") let CSharpProject = ProjectInfo.create("Plotly.NET.CSharp", "src/Plotly.NET.CSharp/Plotly.NET.CSharp.csproj", "src/Plotly.NET.CSharp/RELEASE_NOTES.md") +let VersoProject = ProjectInfo.create("Plotly.NET.Verso", "src/Plotly.NET.Verso/Plotly.NET.Verso.fsproj", "src/Plotly.NET.Verso/RELEASE_NOTES.md") /// contains project info about all projects let projects = [ @@ -106,6 +109,7 @@ let projects = [ InteractiveProject ImageExportProject CSharpProject + VersoProject ] /// docs are always targeting the version of the core project diff --git a/src/Plotly.NET.Verso/Extension.fs b/src/Plotly.NET.Verso/Extension.fs new file mode 100644 index 00000000..93a5461e --- /dev/null +++ b/src/Plotly.NET.Verso/Extension.fs @@ -0,0 +1,31 @@ +namespace Plotly.NET.Verso + +open System +open System.Collections.Generic +open System.Threading.Tasks +open Verso.Abstractions +open Plotly.NET + +[] +type GenericChartFormatter() = + + interface IExtension with + member _.ExtensionId = "net.plotly.plotly-net-verso" + member _.Name = "Plotly.NET" + member _.Version = "1.0.0" + member _.Author = "Plotly.NET Contributors" + member _.Description = "Renders Plotly.NET GenericChart objects as interactive charts in Verso notebooks." + member _.OnLoadedAsync(_ctx) = Task.CompletedTask + member _.OnUnloadedAsync() = Task.CompletedTask + + interface IDataFormatter with + member _.SupportedTypes: IReadOnlyList = + [| typeof |] :> IReadOnlyList + + member _.Priority = 100 + + member _.CanFormat(value, _ctx) = value :? GenericChart + + member _.FormatAsync(value, _ctx) = + let html = Formatters.toVersoHTML (value :?> GenericChart) + Task.FromResult(CellOutput(MimeType = "text/html", Content = html)) diff --git a/src/Plotly.NET.Verso/Formatters.fs b/src/Plotly.NET.Verso/Formatters.fs new file mode 100644 index 00000000..30f9f86e --- /dev/null +++ b/src/Plotly.NET.Verso/Formatters.fs @@ -0,0 +1,21 @@ +namespace Plotly.NET.Verso + +open Plotly.NET + +module Formatters = + + /// Converts a GenericChart to its HTML representation for display in Verso notebook environments. + /// Uses RequireJS to dynamically load plotly.js from CDN with a fallback that loads RequireJS itself if not present. + let toVersoHTML gChart = + gChart + |> Chart.withDisplayOptionsStyle ( + PlotlyJSReference = Require $"https://cdn.plot.ly/plotly-{Globals.PLOTLYJS_VERSION}.min" + ) + |> GenericChart.toChartHTML + + /// Converts a GenericChart to a fully self-contained HTML document with plotly.js embedded inline (~3MB). + /// Works completely offline without internet access. + let toVersoHTMLOffline gChart = + gChart + |> Chart.withDisplayOptionsStyle (PlotlyJSReference = Full) + |> GenericChart.toEmbeddedHTML diff --git a/src/Plotly.NET.Verso/Plotly.NET.Verso.fsproj b/src/Plotly.NET.Verso/Plotly.NET.Verso.fsproj new file mode 100644 index 00000000..5d17c3d0 --- /dev/null +++ b/src/Plotly.NET.Verso/Plotly.NET.Verso.fsproj @@ -0,0 +1,64 @@ + + + + net8.0 + Library + true + true + true + true + snupkg + $(AllowedOutputExtensionsInPackageBuildOutputFolder);.pdb + + + + Gregor Beyerle, Timo Mühlhaus, Kevin Schneider, F# open source contributors + A Verso Notebook Extension for displaying Plotly.NET charts. + A Verso Notebook Extension for displaying Plotly.NET charts. + MIT + https://plotly.net + logo.png + visualization charting plotly fsharp csharp verso notebook + https://github.com/plotly/Plotly.NET/ + git + https://github.com/plotly/Plotly.NET/blob/dev/LICENSE + https://github.com/plotly/Plotly.NET/blob/dev/RELEASE_NOTES.md + + + + + + + + + + + + + + + + + + + + + + + + + + <_ProjectReferenceWithExplicitPackageVersion Include="@(ProjectReference->'%(FullPath)')" Condition="'%(ProjectReference.PackageVersion)' != ''" /> + <_ProjectReferenceWithExactPackageVersion Include="@(ProjectReference->'%(FullPath)')" Condition="'%(ProjectReference.ExactVersion)' == 'true'" /> + <_ProjectReferenceWithReassignedVersion Include="@(_ProjectReferencesWithVersions)" Condition="'%(Identity)' != '' And '@(_ProjectReferenceWithExplicitPackageVersion)' == '@(_ProjectReferencesWithVersions)'"> + @(_ProjectReferenceWithExplicitPackageVersion->'%(PackageVersion)') + + <_ProjectReferenceWithReassignedVersion Include="@(_ProjectReferencesWithVersions)" Condition="'%(Identity)' != '' And '@(_ProjectReferenceWithExactPackageVersion)' == '@(_ProjectReferencesWithVersions)'"> + [@(_ProjectReferencesWithVersions->'%(ProjectVersion)')] + + <_ProjectReferencesWithVersions Remove="@(_ProjectReferenceWithReassignedVersion)" /> + <_ProjectReferencesWithVersions Include="@(_ProjectReferenceWithReassignedVersion)" /> + + + + diff --git a/src/Plotly.NET.Verso/RELEASE_NOTES.md b/src/Plotly.NET.Verso/RELEASE_NOTES.md new file mode 100644 index 00000000..9da17ac2 --- /dev/null +++ b/src/Plotly.NET.Verso/RELEASE_NOTES.md @@ -0,0 +1,5 @@ +## 1.0.0 - TBD + +- Initial release of Plotly.NET.Verso +- Renders GenericChart objects as interactive Plotly charts in Verso notebooks +- Supports online (CDN) and offline (embedded) rendering modes diff --git a/tests/ExtensionLibsTests/VersoTests/Main.fs b/tests/ExtensionLibsTests/VersoTests/Main.fs new file mode 100644 index 00000000..ae3a3e1b --- /dev/null +++ b/tests/ExtensionLibsTests/VersoTests/Main.fs @@ -0,0 +1,7 @@ +module Plotly.NET.Verso.Tests + +open Expecto + +[] +let main argv = + Tests.runTestsInAssemblyWithCLIArgs [] argv diff --git a/tests/ExtensionLibsTests/VersoTests/VersoFormatterTests.fs b/tests/ExtensionLibsTests/VersoTests/VersoFormatterTests.fs new file mode 100644 index 00000000..a15597f5 --- /dev/null +++ b/tests/ExtensionLibsTests/VersoTests/VersoFormatterTests.fs @@ -0,0 +1,130 @@ +module Tests.VersoFormatterTests + +open Expecto +open Plotly.NET +open Plotly.NET.Verso +open Verso.Abstractions +open Verso.Testing +open Verso.Testing.Stubs + +open TestUtils.HtmlCodegen + +let formatter = GenericChartFormatter() :> IDataFormatter +let context = StubFormatterContext() + +let sampleChart = + Chart.Line(x = [1; 2; 3], y = [4; 6; 5], UseDefaults = false) + |> Chart.withDisplayOptions ( + DisplayOptions.init ( + PlotlyJSReference = Require $"https://cdn.plot.ly/plotly-{Globals.PLOTLYJS_VERSION}.min" + ) + ) + +let sampleChartOffline = + Chart.Line(x = [1; 2; 3], y = [4; 6; 5], UseDefaults = false) + |> Chart.withDisplayOptions ( + DisplayOptions.init ( + PlotlyJSReference = Full + ) + ) + +[] +let ``GenericChartFormatter tests`` = + testList "Verso.GenericChartFormatter" [ + + testCase "SupportedTypes contains GenericChart" (fun () -> + Expect.contains + formatter.SupportedTypes + (typeof) + "SupportedTypes should contain GenericChart" + ) + + testCase "CanFormat returns true for GenericChart" (fun () -> + let chart = Chart.Point(x = [1; 2], y = [3; 4], UseDefaults = false) + Expect.isTrue + (formatter.CanFormat(chart, context)) + "CanFormat should return true for a GenericChart value" + ) + + testCase "CanFormat returns false for non-GenericChart" (fun () -> + Expect.isFalse + (formatter.CanFormat("not a chart", context)) + "CanFormat should return false for a string value" + ) + + testCase "CanFormat returns false for null" (fun () -> + Expect.isFalse + (formatter.CanFormat(null, context)) + "CanFormat should return false for null" + ) + + testCase "Priority is 100" (fun () -> + Expect.equal + formatter.Priority + 100 + "Priority should be 100" + ) + + testAsync "FormatAsync returns text/html CellOutput" { + let! output = formatter.FormatAsync(sampleChart, context) |> Async.AwaitTask + Expect.equal + output.MimeType + "text/html" + "MimeType should be text/html" + } + + testAsync "FormatAsync output contains chart div" { + let! output = formatter.FormatAsync(sampleChart, context) |> Async.AwaitTask + Expect.stringContains + output.Content + "Plotly chart will be drawn inside this DIV" + "HTML should contain chart div placeholder" + } + + testAsync "FormatAsync output is not an error" { + let! output = formatter.FormatAsync(sampleChart, context) |> Async.AwaitTask + Expect.isFalse + output.IsError + "Output should not be an error" + } + ] + +[] +let ``toVersoHTML tests`` = + testList "Verso.Formatters.toVersoHTML" [ + + testCase "require: Expecting cloudflare link" (fun () -> + """https://cdnjs.cloudflare.com/ajax/libs/require.js""" + |> chartGeneratedContains sampleChart + ) + + testCase "require: Expecting require config" (fun () -> + sprintf """var fsharpPlotlyRequire = requirejs.config({context:'fsharp-plotly',paths:{plotly:'https://cdn.plot.ly/plotly-%s.min'}}) || require;""" Globals.PLOTLYJS_VERSION + |> chartGeneratedContains sampleChart + ) + + testCase "Contains chart data script" (fun () -> + "Plotly.newPlot" + |> chartGeneratedContains sampleChart + ) + ] + +[] +let ``toVersoHTMLOffline tests`` = + testList "Verso.Formatters.toVersoHTMLOffline" [ + + testCase "Contains inline plotly.js source" (fun () -> + "Plotly.newPlot" + |> substringIsInChart sampleChartOffline GenericChart.toEmbeddedHTML + ) + + testCase "Contains full HTML document structure" (fun () -> + [""; ""; ""; ""; ""; ""] + |> substringListIsInChart sampleChartOffline GenericChart.toEmbeddedHTML + ) + + testCase "Contains full plotly.js source" (fun () -> + getFullPlotlyJS() + |> substringIsInChart sampleChartOffline GenericChart.toEmbeddedHTML + ) + ] diff --git a/tests/ExtensionLibsTests/VersoTests/VersoTests.fsproj b/tests/ExtensionLibsTests/VersoTests/VersoTests.fsproj new file mode 100644 index 00000000..49ba4cf0 --- /dev/null +++ b/tests/ExtensionLibsTests/VersoTests/VersoTests.fsproj @@ -0,0 +1,26 @@ + + + + Exe + net8.0 + false + false + + + + + + + + + + + + + + + + + + + diff --git a/tests/VersoTests/Repack.ps1 b/tests/VersoTests/Repack.ps1 new file mode 100644 index 00000000..92454a85 --- /dev/null +++ b/tests/VersoTests/Repack.ps1 @@ -0,0 +1,11 @@ +# Clean up the previously-cached NuGet packages. +# Lower-case is intentional (that's how nuget stores those packages). +Remove-Item -Recurse ~\.nuget\packages\plotly.net.verso* -Force +Remove-Item -Recurse ~\.nuget\packages\plotly.net -Force -ErrorAction SilentlyContinue + +# build and pack Plotly.NET + Plotly.NET.Verso +cd ../../ +./build.cmd +dotnet pack src/Plotly.NET/Plotly.NET.fsproj -tl -c Release -p:PackageVersion=6.0.0 -o "./tests/VersoTests/pkg" +dotnet pack src/Plotly.NET.Verso/Plotly.NET.Verso.fsproj -tl -c Release -p:PackageVersion=0.0.1-dev -o "./tests/VersoTests/pkg" +cd tests/VersoTests diff --git a/tests/VersoTests/test.verso b/tests/VersoTests/test.verso new file mode 100644 index 00000000..f6643186 --- /dev/null +++ b/tests/VersoTests/test.verso @@ -0,0 +1,65 @@ +{ + "verso": "1.0", + "metadata": { + "defaultKernel": "csharp", + "activeLayout": "notebook" + }, + "cells": [ + { + "id": "c8574c87-813c-4039-8beb-ae3dddc0c38a", + "type": "code", + "language": "fsharp", + "source": "// be advised, that you always should set absolute paths for local nuget packages - change this to reflect your own setup\r\n#i \u0022nuget: G:/source/repos/plotly/Plotly.NET/tests/VersoTests/pkg\u0022\r\n#r \u0022nuget: Plotly.NET.Verso, 0.0.1-dev\u0022", + "outputs": [ + { + "mimeType": "text/html", + "content": "\u003Cdiv\u003E\u003Cb\u003EInstalled Packages\u003C/b\u003E\u003Cul\u003E\u003Cli\u003E\u003Cspan\u003EPlotly.NET.Verso, 0.0.1-dev\u003C/span\u003E\u003C/li\u003E\u003C/ul\u003E\u003C/div\u003E" + } + ] + }, + { + "id": "849ab99b-1968-40a7-9a0a-cbd2e2f35b14", + "type": "code", + "language": "fsharp", + "source": "\r\n#!extension Plotly.NET.Verso 0.0.1-dev\r\nopen Plotly.NET\r\n\r\nChart.Point([1,2])", + "outputs": [ + { + "mimeType": "text/plain", + "content": "Resolving extension package \u0027Plotly.NET.Verso\u0027 version \u00270.0.1-dev\u0027..." + }, + { + "mimeType": "text/plain", + "content": "Installed \u0027Plotly.NET.Verso\u0027 0.0.1-dev (1 extension registered)" + }, + { + "mimeType": "text/html", + "content": "\u003Cdiv\u003E\u003Cdiv id=\u002250e40176-fb37-4637-8829-d22a50f6db56\u0022\u003E\u003C!-- Plotly chart will be drawn inside this DIV --\u003E\u003C/div\u003E\u003Cscript type=\u0022text/javascript\u0022\u003E\nvar renderPlotly_50e40176fb3746378829d22a50f6db56 = function() {\n var fsharpPlotlyRequire = requirejs.config({context:\u0027fsharp-plotly\u0027,paths:{plotly:\u0027https://cdn.plot.ly/plotly-2.27.1.min\u0027}}) || require;\n fsharpPlotlyRequire([\u0027plotly\u0027], function(Plotly) {\n var data = [{\u0022type\u0022:\u0022scatter\u0022,\u0022mode\u0022:\u0022markers\u0022,\u0022x\u0022:[1],\u0022y\u0022:[2],\u0022marker\u0022:{},\u0022line\u0022:{}}];\n var layout = {\u0022width\u0022:600,\u0022height\u0022:600,\u0022template\u0022:{\u0022layout\u0022:{\u0022title\u0022:{\u0022x\u0022:0.05},\u0022font\u0022:{\u0022color\u0022:\u0022rgba(42, 63, 95, 1.0)\u0022},\u0022paper_bgcolor\u0022:\u0022rgba(255, 255, 255, 1.0)\u0022,\u0022plot_bgcolor\u0022:\u0022rgba(229, 236, 246, 1.0)\u0022,\u0022autotypenumbers\u0022:\u0022strict\u0022,\u0022colorscale\u0022:{\u0022diverging\u0022:[[0.0,\u0022#8e0152\u0022],[0.1,\u0022#c51b7d\u0022],[0.2,\u0022#de77ae\u0022],[0.3,\u0022#f1b6da\u0022],[0.4,\u0022#fde0ef\u0022],[0.5,\u0022#f7f7f7\u0022],[0.6,\u0022#e6f5d0\u0022],[0.7,\u0022#b8e186\u0022],[0.8,\u0022#7fbc41\u0022],[0.9,\u0022#4d9221\u0022],[1.0,\u0022#276419\u0022]],\u0022sequential\u0022:[[0.0,\u0022#0d0887\u0022],[0.1111111111111111,\u0022#46039f\u0022],[0.2222222222222222,\u0022#7201a8\u0022],[0.3333333333333333,\u0022#9c179e\u0022],[0.4444444444444444,\u0022#bd3786\u0022],[0.5555555555555556,\u0022#d8576b\u0022],[0.6666666666666666,\u0022#ed7953\u0022],[0.7777777777777778,\u0022#fb9f3a\u0022],[0.8888888888888888,\u0022#fdca26\u0022],[1.0,\u0022#f0f921\u0022]],\u0022sequentialminus\u0022:[[0.0,\u0022#0d0887\u0022],[0.1111111111111111,\u0022#46039f\u0022],[0.2222222222222222,\u0022#7201a8\u0022],[0.3333333333333333,\u0022#9c179e\u0022],[0.4444444444444444,\u0022#bd3786\u0022],[0.5555555555555556,\u0022#d8576b\u0022],[0.6666666666666666,\u0022#ed7953\u0022],[0.7777777777777778,\u0022#fb9f3a\u0022],[0.8888888888888888,\u0022#fdca26\u0022],[1.0,\u0022#f0f921\u0022]]},\u0022hovermode\u0022:\u0022closest\u0022,\u0022hoverlabel\u0022:{\u0022align\u0022:\u0022left\u0022},\u0022coloraxis\u0022:{\u0022colorbar\u0022:{\u0022outlinewidth\u0022:0.0,\u0022ticks\u0022:\u0022\u0022}},\u0022geo\u0022:{\u0022showland\u0022:true,\u0022landcolor\u0022:\u0022rgba(229, 236, 246, 1.0)\u0022,\u0022showlakes\u0022:true,\u0022lakecolor\u0022:\u0022rgba(255, 255, 255, 1.0)\u0022,\u0022subunitcolor\u0022:\u0022rgba(255, 255, 255, 1.0)\u0022,\u0022bgcolor\u0022:\u0022rgba(255, 255, 255, 1.0)\u0022},\u0022mapbox\u0022:{\u0022style\u0022:\u0022light\u0022},\u0022polar\u0022:{\u0022bgcolor\u0022:\u0022rgba(229, 236, 246, 1.0)\u0022,\u0022radialaxis\u0022:{\u0022linecolor\u0022:\u0022rgba(255, 255, 255, 1.0)\u0022,\u0022gridcolor\u0022:\u0022rgba(255, 255, 255, 1.0)\u0022,\u0022ticks\u0022:\u0022\u0022},\u0022angularaxis\u0022:{\u0022linecolor\u0022:\u0022rgba(255, 255, 255, 1.0)\u0022,\u0022gridcolor\u0022:\u0022rgba(255, 255, 255, 1.0)\u0022,\u0022ticks\u0022:\u0022\u0022}},\u0022scene\u0022:{\u0022xaxis\u0022:{\u0022ticks\u0022:\u0022\u0022,\u0022linecolor\u0022:\u0022rgba(255, 255, 255, 1.0)\u0022,\u0022gridcolor\u0022:\u0022rgba(255, 255, 255, 1.0)\u0022,\u0022gridwidth\u0022:2.0,\u0022zerolinecolor\u0022:\u0022rgba(255, 255, 255, 1.0)\u0022,\u0022backgroundcolor\u0022:\u0022rgba(229, 236, 246, 1.0)\u0022,\u0022showbackground\u0022:true},\u0022yaxis\u0022:{\u0022ticks\u0022:\u0022\u0022,\u0022linecolor\u0022:\u0022rgba(255, 255, 255, 1.0)\u0022,\u0022gridcolor\u0022:\u0022rgba(255, 255, 255, 1.0)\u0022,\u0022gridwidth\u0022:2.0,\u0022zerolinecolor\u0022:\u0022rgba(255, 255, 255, 1.0)\u0022,\u0022backgroundcolor\u0022:\u0022rgba(229, 236, 246, 1.0)\u0022,\u0022showbackground\u0022:true},\u0022zaxis\u0022:{\u0022ticks\u0022:\u0022\u0022,\u0022linecolor\u0022:\u0022rgba(255, 255, 255, 1.0)\u0022,\u0022gridcolor\u0022:\u0022rgba(255, 255, 255, 1.0)\u0022,\u0022gridwidth\u0022:2.0,\u0022zerolinecolor\u0022:\u0022rgba(255, 255, 255, 1.0)\u0022,\u0022backgroundcolor\u0022:\u0022rgba(229, 236, 246, 1.0)\u0022,\u0022showbackground\u0022:true}},\u0022ternary\u0022:{\u0022aaxis\u0022:{\u0022ticks\u0022:\u0022\u0022,\u0022linecolor\u0022:\u0022rgba(255, 255, 255, 1.0)\u0022,\u0022gridcolor\u0022:\u0022rgba(255, 255, 255, 1.0)\u0022},\u0022baxis\u0022:{\u0022ticks\u0022:\u0022\u0022,\u0022linecolor\u0022:\u0022rgba(255, 255, 255, 1.0)\u0022,\u0022gridcolor\u0022:\u0022rgba(255, 255, 255, 1.0)\u0022},\u0022caxis\u0022:{\u0022ticks\u0022:\u0022\u0022,\u0022linecolor\u0022:\u0022rgba(255, 255, 255, 1.0)\u0022,\u0022gridcolor\u0022:\u0022rgba(255, 255, 255, 1.0)\u0022},\u0022bgcolor\u0022:\u0022rgba(229, 236, 246, 1.0)\u0022},\u0022xaxis\u0022:{\u0022title\u0022:{\u0022standoff\u0022:15},\u0022ticks\u0022:\u0022\u0022,\u0022automargin\u0022:\u0022height\u002Bwidth\u002Bleft\u002Bright\u002Btop\u002Bbottom\u0022,\u0022linecolor\u0022:\u0022rgba(255, 255, 255, 1.0)\u0022,\u0022gridcolor\u0022:\u0022rgba(255, 255, 255, 1.0)\u0022,\u0022zerolinecolor\u0022:\u0022rgba(255, 255, 255, 1.0)\u0022,\u0022zerolinewidth\u0022:2.0},\u0022yaxis\u0022:{\u0022title\u0022:{\u0022standoff\u0022:15},\u0022ticks\u0022:\u0022\u0022,\u0022automargin\u0022:\u0022height\u002Bwidth\u002Bleft\u002Bright\u002Btop\u002Bbottom\u0022,\u0022linecolor\u0022:\u0022rgba(255, 255, 255, 1.0)\u0022,\u0022gridcolor\u0022:\u0022rgba(255, 255, 255, 1.0)\u0022,\u0022zerolinecolor\u0022:\u0022rgba(255, 255, 255, 1.0)\u0022,\u0022zerolinewidth\u0022:2.0},\u0022annotationdefaults\u0022:{\u0022arrowcolor\u0022:\u0022#2a3f5f\u0022,\u0022arrowhead\u0022:0,\u0022arrowwidth\u0022:1},\u0022shapedefaults\u0022:{\u0022line\u0022:{\u0022color\u0022:\u0022rgba(42, 63, 95, 1.0)\u0022}},\u0022colorway\u0022:[\u0022rgba(99, 110, 250, 1.0)\u0022,\u0022rgba(239, 85, 59, 1.0)\u0022,\u0022rgba(0, 204, 150, 1.0)\u0022,\u0022rgba(171, 99, 250, 1.0)\u0022,\u0022rgba(255, 161, 90, 1.0)\u0022,\u0022rgba(25, 211, 243, 1.0)\u0022,\u0022rgba(255, 102, 146, 1.0)\u0022,\u0022rgba(182, 232, 128, 1.0)\u0022,\u0022rgba(255, 151, 255, 1.0)\u0022,\u0022rgba(254, 203, 82, 1.0)\u0022]},\u0022data\u0022:{\u0022bar\u0022:[{\u0022type\u0022:\u0022bar\u0022,\u0022marker\u0022:{\u0022line\u0022:{\u0022color\u0022:\u0022rgba(229, 236, 246, 1.0)\u0022,\u0022width\u0022:0.5},\u0022pattern\u0022:{\u0022fillmode\u0022:\u0022overlay\u0022,\u0022size\u0022:10,\u0022solidity\u0022:0.2}},\u0022error_x\u0022:{\u0022color\u0022:\u0022rgba(42, 63, 95, 1.0)\u0022},\u0022error_y\u0022:{\u0022color\u0022:\u0022rgba(42, 63, 95, 1.0)\u0022}}],\u0022barpolar\u0022:[{\u0022type\u0022:\u0022barpolar\u0022,\u0022marker\u0022:{\u0022line\u0022:{\u0022color\u0022:\u0022rgba(229, 236, 246, 1.0)\u0022,\u0022width\u0022:0.5},\u0022pattern\u0022:{\u0022fillmode\u0022:\u0022overlay\u0022,\u0022size\u0022:10,\u0022solidity\u0022:0.2}}}],\u0022carpet\u0022:[{\u0022type\u0022:\u0022carpet\u0022,\u0022aaxis\u0022:{\u0022linecolor\u0022:\u0022rgba(255, 255, 255, 1.0)\u0022,\u0022gridcolor\u0022:\u0022rgba(255, 255, 255, 1.0)\u0022,\u0022endlinecolor\u0022:\u0022rgba(42, 63, 95, 1.0)\u0022,\u0022minorgridcolor\u0022:\u0022rgba(255, 255, 255, 1.0)\u0022,\u0022startlinecolor\u0022:\u0022rgba(42, 63, 95, 1.0)\u0022},\u0022baxis\u0022:{\u0022linecolor\u0022:\u0022rgba(255, 255, 255, 1.0)\u0022,\u0022gridcolor\u0022:\u0022rgba(255, 255, 255, 1.0)\u0022,\u0022endlinecolor\u0022:\u0022rgba(42, 63, 95, 1.0)\u0022,\u0022minorgridcolor\u0022:\u0022rgba(255, 255, 255, 1.0)\u0022,\u0022startlinecolor\u0022:\u0022rgba(42, 63, 95, 1.0)\u0022}}],\u0022choropleth\u0022:[{\u0022type\u0022:\u0022choropleth\u0022,\u0022colorbar\u0022:{\u0022outlinewidth\u0022:0.0,\u0022ticks\u0022:\u0022\u0022},\u0022colorscale\u0022:[[0.0,\u0022#0d0887\u0022],[0.1111111111111111,\u0022#46039f\u0022],[0.2222222222222222,\u0022#7201a8\u0022],[0.3333333333333333,\u0022#9c179e\u0022],[0.4444444444444444,\u0022#bd3786\u0022],[0.5555555555555556,\u0022#d8576b\u0022],[0.6666666666666666,\u0022#ed7953\u0022],[0.7777777777777778,\u0022#fb9f3a\u0022],[0.8888888888888888,\u0022#fdca26\u0022],[1.0,\u0022#f0f921\u0022]]}],\u0022contour\u0022:[{\u0022type\u0022:\u0022contour\u0022,\u0022colorbar\u0022:{\u0022outlinewidth\u0022:0.0,\u0022ticks\u0022:\u0022\u0022},\u0022colorscale\u0022:[[0.0,\u0022#0d0887\u0022],[0.1111111111111111,\u0022#46039f\u0022],[0.2222222222222222,\u0022#7201a8\u0022],[0.3333333333333333,\u0022#9c179e\u0022],[0.4444444444444444,\u0022#bd3786\u0022],[0.5555555555555556,\u0022#d8576b\u0022],[0.6666666666666666,\u0022#ed7953\u0022],[0.7777777777777778,\u0022#fb9f3a\u0022],[0.8888888888888888,\u0022#fdca26\u0022],[1.0,\u0022#f0f921\u0022]]}],\u0022contourcarpet\u0022:[{\u0022type\u0022:\u0022contourcarpet\u0022,\u0022colorbar\u0022:{\u0022outlinewidth\u0022:0.0,\u0022ticks\u0022:\u0022\u0022}}],\u0022heatmap\u0022:[{\u0022type\u0022:\u0022heatmap\u0022,\u0022colorbar\u0022:{\u0022outlinewidth\u0022:0.0,\u0022ticks\u0022:\u0022\u0022},\u0022colorscale\u0022:[[0.0,\u0022#0d0887\u0022],[0.1111111111111111,\u0022#46039f\u0022],[0.2222222222222222,\u0022#7201a8\u0022],[0.3333333333333333,\u0022#9c179e\u0022],[0.4444444444444444,\u0022#bd3786\u0022],[0.5555555555555556,\u0022#d8576b\u0022],[0.6666666666666666,\u0022#ed7953\u0022],[0.7777777777777778,\u0022#fb9f3a\u0022],[0.8888888888888888,\u0022#fdca26\u0022],[1.0,\u0022#f0f921\u0022]]}],\u0022heatmapgl\u0022:[{\u0022type\u0022:\u0022heatmapgl\u0022,\u0022colorbar\u0022:{\u0022outlinewidth\u0022:0.0,\u0022ticks\u0022:\u0022\u0022},\u0022colorscale\u0022:[[0.0,\u0022#0d0887\u0022],[0.1111111111111111,\u0022#46039f\u0022],[0.2222222222222222,\u0022#7201a8\u0022],[0.3333333333333333,\u0022#9c179e\u0022],[0.4444444444444444,\u0022#bd3786\u0022],[0.5555555555555556,\u0022#d8576b\u0022],[0.6666666666666666,\u0022#ed7953\u0022],[0.7777777777777778,\u0022#fb9f3a\u0022],[0.8888888888888888,\u0022#fdca26\u0022],[1.0,\u0022#f0f921\u0022]]}],\u0022histogram\u0022:[{\u0022type\u0022:\u0022histogram\u0022,\u0022marker\u0022:{\u0022pattern\u0022:{\u0022fillmode\u0022:\u0022overlay\u0022,\u0022size\u0022:10,\u0022solidity\u0022:0.2}}}],\u0022histogram2d\u0022:[{\u0022type\u0022:\u0022histogram2d\u0022,\u0022colorbar\u0022:{\u0022outlinewidth\u0022:0.0,\u0022ticks\u0022:\u0022\u0022},\u0022colorscale\u0022:[[0.0,\u0022#0d0887\u0022],[0.1111111111111111,\u0022#46039f\u0022],[0.2222222222222222,\u0022#7201a8\u0022],[0.3333333333333333,\u0022#9c179e\u0022],[0.4444444444444444,\u0022#bd3786\u0022],[0.5555555555555556,\u0022#d8576b\u0022],[0.6666666666666666,\u0022#ed7953\u0022],[0.7777777777777778,\u0022#fb9f3a\u0022],[0.8888888888888888,\u0022#fdca26\u0022],[1.0,\u0022#f0f921\u0022]]}],\u0022histogram2dcontour\u0022:[{\u0022type\u0022:\u0022histogram2dcontour\u0022,\u0022colorbar\u0022:{\u0022outlinewidth\u0022:0.0,\u0022ticks\u0022:\u0022\u0022},\u0022colorscale\u0022:[[0.0,\u0022#0d0887\u0022],[0.1111111111111111,\u0022#46039f\u0022],[0.2222222222222222,\u0022#7201a8\u0022],[0.3333333333333333,\u0022#9c179e\u0022],[0.4444444444444444,\u0022#bd3786\u0022],[0.5555555555555556,\u0022#d8576b\u0022],[0.6666666666666666,\u0022#ed7953\u0022],[0.7777777777777778,\u0022#fb9f3a\u0022],[0.8888888888888888,\u0022#fdca26\u0022],[1.0,\u0022#f0f921\u0022]]}],\u0022mesh3d\u0022:[{\u0022type\u0022:\u0022mesh3d\u0022,\u0022colorbar\u0022:{\u0022outlinewidth\u0022:0.0,\u0022ticks\u0022:\u0022\u0022}}],\u0022parcoords\u0022:[{\u0022type\u0022:\u0022parcoords\u0022,\u0022line\u0022:{\u0022colorbar\u0022:{\u0022outlinewidth\u0022:0.0,\u0022ticks\u0022:\u0022\u0022}}}],\u0022pie\u0022:[{\u0022type\u0022:\u0022pie\u0022,\u0022automargin\u0022:true}],\u0022scatter\u0022:[{\u0022type\u0022:\u0022scatter\u0022,\u0022marker\u0022:{\u0022colorbar\u0022:{\u0022outlinewidth\u0022:0.0,\u0022ticks\u0022:\u0022\u0022}}}],\u0022scatter3d\u0022:[{\u0022type\u0022:\u0022scatter3d\u0022,\u0022marker\u0022:{\u0022colorbar\u0022:{\u0022outlinewidth\u0022:0.0,\u0022ticks\u0022:\u0022\u0022}},\u0022line\u0022:{\u0022colorbar\u0022:{\u0022outlinewidth\u0022:0.0,\u0022ticks\u0022:\u0022\u0022}}}],\u0022scattercarpet\u0022:[{\u0022type\u0022:\u0022scattercarpet\u0022,\u0022marker\u0022:{\u0022colorbar\u0022:{\u0022outlinewidth\u0022:0.0,\u0022ticks\u0022:\u0022\u0022}}}],\u0022scattergeo\u0022:[{\u0022type\u0022:\u0022scattergeo\u0022,\u0022marker\u0022:{\u0022colorbar\u0022:{\u0022outlinewidth\u0022:0.0,\u0022ticks\u0022:\u0022\u0022}}}],\u0022scattergl\u0022:[{\u0022type\u0022:\u0022scattergl\u0022,\u0022marker\u0022:{\u0022colorbar\u0022:{\u0022outlinewidth\u0022:0.0,\u0022ticks\u0022:\u0022\u0022}}}],\u0022scattermapbox\u0022:[{\u0022type\u0022:\u0022scattermapbox\u0022,\u0022marker\u0022:{\u0022colorbar\u0022:{\u0022outlinewidth\u0022:0.0,\u0022ticks\u0022:\u0022\u0022}}}],\u0022scatterpolar\u0022:[{\u0022type\u0022:\u0022scatterpolar\u0022,\u0022marker\u0022:{\u0022colorbar\u0022:{\u0022outlinewidth\u0022:0.0,\u0022ticks\u0022:\u0022\u0022}}}],\u0022scatterpolargl\u0022:[{\u0022type\u0022:\u0022scatterpolargl\u0022,\u0022marker\u0022:{\u0022colorbar\u0022:{\u0022outlinewidth\u0022:0.0,\u0022ticks\u0022:\u0022\u0022}}}],\u0022scatterternary\u0022:[{\u0022type\u0022:\u0022scatterternary\u0022,\u0022marker\u0022:{\u0022colorbar\u0022:{\u0022outlinewidth\u0022:0.0,\u0022ticks\u0022:\u0022\u0022}}}],\u0022surface\u0022:[{\u0022type\u0022:\u0022surface\u0022,\u0022colorbar\u0022:{\u0022outlinewidth\u0022:0.0,\u0022ticks\u0022:\u0022\u0022},\u0022colorscale\u0022:[[0.0,\u0022#0d0887\u0022],[0.1111111111111111,\u0022#46039f\u0022],[0.2222222222222222,\u0022#7201a8\u0022],[0.3333333333333333,\u0022#9c179e\u0022],[0.4444444444444444,\u0022#bd3786\u0022],[0.5555555555555556,\u0022#d8576b\u0022],[0.6666666666666666,\u0022#ed7953\u0022],[0.7777777777777778,\u0022#fb9f3a\u0022],[0.8888888888888888,\u0022#fdca26\u0022],[1.0,\u0022#f0f921\u0022]]}],\u0022table\u0022:[{\u0022type\u0022:\u0022table\u0022,\u0022cells\u0022:{\u0022fill\u0022:{\u0022color\u0022:\u0022rgba(235, 240, 248, 1.0)\u0022},\u0022line\u0022:{\u0022color\u0022:\u0022rgba(255, 255, 255, 1.0)\u0022}},\u0022header\u0022:{\u0022fill\u0022:{\u0022color\u0022:\u0022rgba(200, 212, 227, 1.0)\u0022},\u0022line\u0022:{\u0022color\u0022:\u0022rgba(255, 255, 255, 1.0)\u0022}}}]}}};\n var config = {\u0022responsive\u0022:true};\n Plotly.newPlot(\u002750e40176-fb37-4637-8829-d22a50f6db56\u0027, data, layout, config);\n });\n};\nif ((typeof(requirejs) !== typeof(Function)) || (typeof(requirejs.config) !== typeof(Function))) {\n var script = document.createElement(\u0022script\u0022);\n script.setAttribute(\u0022charset\u0022, \u0022utf-8\u0022);\n script.setAttribute(\u0022src\u0022, \u0022https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js\u0022);\n script.onload = function(){\n renderPlotly_50e40176fb3746378829d22a50f6db56();\n };\n document.getElementsByTagName(\u0022head\u0022)[0].appendChild(script);\n}\nelse {\n renderPlotly_50e40176fb3746378829d22a50f6db56();\n}\n\u003C/script\u003E\u003C/div\u003E" + } + ] + }, + { + "id": "230d2888-7572-47c8-8010-c03999f0d790", + "type": "code", + "language": "fsharp", + "source": "open Plotly.NET\r\n\r\nChart.Point([1,2])", + "outputs": [ + { + "mimeType": "text/html", + "content": "\u003Cdiv\u003E\u003Cdiv id=\u0022084dd93b-0a7f-4cef-9f11-db36bee5bb10\u0022\u003E\u003C!-- Plotly chart will be drawn inside this DIV --\u003E\u003C/div\u003E\u003Cscript type=\u0022text/javascript\u0022\u003E\nvar renderPlotly_084dd93b0a7f4cef9f11db36bee5bb10 = function() {\n var fsharpPlotlyRequire = requirejs.config({context:\u0027fsharp-plotly\u0027,paths:{plotly:\u0027https://cdn.plot.ly/plotly-2.27.1.min\u0027}}) || require;\n fsharpPlotlyRequire([\u0027plotly\u0027], function(Plotly) {\n var data = [{\u0022type\u0022:\u0022scatter\u0022,\u0022mode\u0022:\u0022markers\u0022,\u0022x\u0022:[1],\u0022y\u0022:[2],\u0022marker\u0022:{},\u0022line\u0022:{}}];\n var layout = {\u0022width\u0022:600,\u0022height\u0022:600,\u0022template\u0022:{\u0022layout\u0022:{\u0022title\u0022:{\u0022x\u0022:0.05},\u0022font\u0022:{\u0022color\u0022:\u0022rgba(42, 63, 95, 1.0)\u0022},\u0022paper_bgcolor\u0022:\u0022rgba(255, 255, 255, 1.0)\u0022,\u0022plot_bgcolor\u0022:\u0022rgba(229, 236, 246, 1.0)\u0022,\u0022autotypenumbers\u0022:\u0022strict\u0022,\u0022colorscale\u0022:{\u0022diverging\u0022:[[0.0,\u0022#8e0152\u0022],[0.1,\u0022#c51b7d\u0022],[0.2,\u0022#de77ae\u0022],[0.3,\u0022#f1b6da\u0022],[0.4,\u0022#fde0ef\u0022],[0.5,\u0022#f7f7f7\u0022],[0.6,\u0022#e6f5d0\u0022],[0.7,\u0022#b8e186\u0022],[0.8,\u0022#7fbc41\u0022],[0.9,\u0022#4d9221\u0022],[1.0,\u0022#276419\u0022]],\u0022sequential\u0022:[[0.0,\u0022#0d0887\u0022],[0.1111111111111111,\u0022#46039f\u0022],[0.2222222222222222,\u0022#7201a8\u0022],[0.3333333333333333,\u0022#9c179e\u0022],[0.4444444444444444,\u0022#bd3786\u0022],[0.5555555555555556,\u0022#d8576b\u0022],[0.6666666666666666,\u0022#ed7953\u0022],[0.7777777777777778,\u0022#fb9f3a\u0022],[0.8888888888888888,\u0022#fdca26\u0022],[1.0,\u0022#f0f921\u0022]],\u0022sequentialminus\u0022:[[0.0,\u0022#0d0887\u0022],[0.1111111111111111,\u0022#46039f\u0022],[0.2222222222222222,\u0022#7201a8\u0022],[0.3333333333333333,\u0022#9c179e\u0022],[0.4444444444444444,\u0022#bd3786\u0022],[0.5555555555555556,\u0022#d8576b\u0022],[0.6666666666666666,\u0022#ed7953\u0022],[0.7777777777777778,\u0022#fb9f3a\u0022],[0.8888888888888888,\u0022#fdca26\u0022],[1.0,\u0022#f0f921\u0022]]},\u0022hovermode\u0022:\u0022closest\u0022,\u0022hoverlabel\u0022:{\u0022align\u0022:\u0022left\u0022},\u0022coloraxis\u0022:{\u0022colorbar\u0022:{\u0022outlinewidth\u0022:0.0,\u0022ticks\u0022:\u0022\u0022}},\u0022geo\u0022:{\u0022showland\u0022:true,\u0022landcolor\u0022:\u0022rgba(229, 236, 246, 1.0)\u0022,\u0022showlakes\u0022:true,\u0022lakecolor\u0022:\u0022rgba(255, 255, 255, 1.0)\u0022,\u0022subunitcolor\u0022:\u0022rgba(255, 255, 255, 1.0)\u0022,\u0022bgcolor\u0022:\u0022rgba(255, 255, 255, 1.0)\u0022},\u0022mapbox\u0022:{\u0022style\u0022:\u0022light\u0022},\u0022polar\u0022:{\u0022bgcolor\u0022:\u0022rgba(229, 236, 246, 1.0)\u0022,\u0022radialaxis\u0022:{\u0022linecolor\u0022:\u0022rgba(255, 255, 255, 1.0)\u0022,\u0022gridcolor\u0022:\u0022rgba(255, 255, 255, 1.0)\u0022,\u0022ticks\u0022:\u0022\u0022},\u0022angularaxis\u0022:{\u0022linecolor\u0022:\u0022rgba(255, 255, 255, 1.0)\u0022,\u0022gridcolor\u0022:\u0022rgba(255, 255, 255, 1.0)\u0022,\u0022ticks\u0022:\u0022\u0022}},\u0022scene\u0022:{\u0022xaxis\u0022:{\u0022ticks\u0022:\u0022\u0022,\u0022linecolor\u0022:\u0022rgba(255, 255, 255, 1.0)\u0022,\u0022gridcolor\u0022:\u0022rgba(255, 255, 255, 1.0)\u0022,\u0022gridwidth\u0022:2.0,\u0022zerolinecolor\u0022:\u0022rgba(255, 255, 255, 1.0)\u0022,\u0022backgroundcolor\u0022:\u0022rgba(229, 236, 246, 1.0)\u0022,\u0022showbackground\u0022:true},\u0022yaxis\u0022:{\u0022ticks\u0022:\u0022\u0022,\u0022linecolor\u0022:\u0022rgba(255, 255, 255, 1.0)\u0022,\u0022gridcolor\u0022:\u0022rgba(255, 255, 255, 1.0)\u0022,\u0022gridwidth\u0022:2.0,\u0022zerolinecolor\u0022:\u0022rgba(255, 255, 255, 1.0)\u0022,\u0022backgroundcolor\u0022:\u0022rgba(229, 236, 246, 1.0)\u0022,\u0022showbackground\u0022:true},\u0022zaxis\u0022:{\u0022ticks\u0022:\u0022\u0022,\u0022linecolor\u0022:\u0022rgba(255, 255, 255, 1.0)\u0022,\u0022gridcolor\u0022:\u0022rgba(255, 255, 255, 1.0)\u0022,\u0022gridwidth\u0022:2.0,\u0022zerolinecolor\u0022:\u0022rgba(255, 255, 255, 1.0)\u0022,\u0022backgroundcolor\u0022:\u0022rgba(229, 236, 246, 1.0)\u0022,\u0022showbackground\u0022:true}},\u0022ternary\u0022:{\u0022aaxis\u0022:{\u0022ticks\u0022:\u0022\u0022,\u0022linecolor\u0022:\u0022rgba(255, 255, 255, 1.0)\u0022,\u0022gridcolor\u0022:\u0022rgba(255, 255, 255, 1.0)\u0022},\u0022baxis\u0022:{\u0022ticks\u0022:\u0022\u0022,\u0022linecolor\u0022:\u0022rgba(255, 255, 255, 1.0)\u0022,\u0022gridcolor\u0022:\u0022rgba(255, 255, 255, 1.0)\u0022},\u0022caxis\u0022:{\u0022ticks\u0022:\u0022\u0022,\u0022linecolor\u0022:\u0022rgba(255, 255, 255, 1.0)\u0022,\u0022gridcolor\u0022:\u0022rgba(255, 255, 255, 1.0)\u0022},\u0022bgcolor\u0022:\u0022rgba(229, 236, 246, 1.0)\u0022},\u0022xaxis\u0022:{\u0022title\u0022:{\u0022standoff\u0022:15},\u0022ticks\u0022:\u0022\u0022,\u0022automargin\u0022:\u0022height\u002Bwidth\u002Bleft\u002Bright\u002Btop\u002Bbottom\u0022,\u0022linecolor\u0022:\u0022rgba(255, 255, 255, 1.0)\u0022,\u0022gridcolor\u0022:\u0022rgba(255, 255, 255, 1.0)\u0022,\u0022zerolinecolor\u0022:\u0022rgba(255, 255, 255, 1.0)\u0022,\u0022zerolinewidth\u0022:2.0},\u0022yaxis\u0022:{\u0022title\u0022:{\u0022standoff\u0022:15},\u0022ticks\u0022:\u0022\u0022,\u0022automargin\u0022:\u0022height\u002Bwidth\u002Bleft\u002Bright\u002Btop\u002Bbottom\u0022,\u0022linecolor\u0022:\u0022rgba(255, 255, 255, 1.0)\u0022,\u0022gridcolor\u0022:\u0022rgba(255, 255, 255, 1.0)\u0022,\u0022zerolinecolor\u0022:\u0022rgba(255, 255, 255, 1.0)\u0022,\u0022zerolinewidth\u0022:2.0},\u0022annotationdefaults\u0022:{\u0022arrowcolor\u0022:\u0022#2a3f5f\u0022,\u0022arrowhead\u0022:0,\u0022arrowwidth\u0022:1},\u0022shapedefaults\u0022:{\u0022line\u0022:{\u0022color\u0022:\u0022rgba(42, 63, 95, 1.0)\u0022}},\u0022colorway\u0022:[\u0022rgba(99, 110, 250, 1.0)\u0022,\u0022rgba(239, 85, 59, 1.0)\u0022,\u0022rgba(0, 204, 150, 1.0)\u0022,\u0022rgba(171, 99, 250, 1.0)\u0022,\u0022rgba(255, 161, 90, 1.0)\u0022,\u0022rgba(25, 211, 243, 1.0)\u0022,\u0022rgba(255, 102, 146, 1.0)\u0022,\u0022rgba(182, 232, 128, 1.0)\u0022,\u0022rgba(255, 151, 255, 1.0)\u0022,\u0022rgba(254, 203, 82, 1.0)\u0022]},\u0022data\u0022:{\u0022bar\u0022:[{\u0022type\u0022:\u0022bar\u0022,\u0022marker\u0022:{\u0022line\u0022:{\u0022color\u0022:\u0022rgba(229, 236, 246, 1.0)\u0022,\u0022width\u0022:0.5},\u0022pattern\u0022:{\u0022fillmode\u0022:\u0022overlay\u0022,\u0022size\u0022:10,\u0022solidity\u0022:0.2}},\u0022error_x\u0022:{\u0022color\u0022:\u0022rgba(42, 63, 95, 1.0)\u0022},\u0022error_y\u0022:{\u0022color\u0022:\u0022rgba(42, 63, 95, 1.0)\u0022}}],\u0022barpolar\u0022:[{\u0022type\u0022:\u0022barpolar\u0022,\u0022marker\u0022:{\u0022line\u0022:{\u0022color\u0022:\u0022rgba(229, 236, 246, 1.0)\u0022,\u0022width\u0022:0.5},\u0022pattern\u0022:{\u0022fillmode\u0022:\u0022overlay\u0022,\u0022size\u0022:10,\u0022solidity\u0022:0.2}}}],\u0022carpet\u0022:[{\u0022type\u0022:\u0022carpet\u0022,\u0022aaxis\u0022:{\u0022linecolor\u0022:\u0022rgba(255, 255, 255, 1.0)\u0022,\u0022gridcolor\u0022:\u0022rgba(255, 255, 255, 1.0)\u0022,\u0022endlinecolor\u0022:\u0022rgba(42, 63, 95, 1.0)\u0022,\u0022minorgridcolor\u0022:\u0022rgba(255, 255, 255, 1.0)\u0022,\u0022startlinecolor\u0022:\u0022rgba(42, 63, 95, 1.0)\u0022},\u0022baxis\u0022:{\u0022linecolor\u0022:\u0022rgba(255, 255, 255, 1.0)\u0022,\u0022gridcolor\u0022:\u0022rgba(255, 255, 255, 1.0)\u0022,\u0022endlinecolor\u0022:\u0022rgba(42, 63, 95, 1.0)\u0022,\u0022minorgridcolor\u0022:\u0022rgba(255, 255, 255, 1.0)\u0022,\u0022startlinecolor\u0022:\u0022rgba(42, 63, 95, 1.0)\u0022}}],\u0022choropleth\u0022:[{\u0022type\u0022:\u0022choropleth\u0022,\u0022colorbar\u0022:{\u0022outlinewidth\u0022:0.0,\u0022ticks\u0022:\u0022\u0022},\u0022colorscale\u0022:[[0.0,\u0022#0d0887\u0022],[0.1111111111111111,\u0022#46039f\u0022],[0.2222222222222222,\u0022#7201a8\u0022],[0.3333333333333333,\u0022#9c179e\u0022],[0.4444444444444444,\u0022#bd3786\u0022],[0.5555555555555556,\u0022#d8576b\u0022],[0.6666666666666666,\u0022#ed7953\u0022],[0.7777777777777778,\u0022#fb9f3a\u0022],[0.8888888888888888,\u0022#fdca26\u0022],[1.0,\u0022#f0f921\u0022]]}],\u0022contour\u0022:[{\u0022type\u0022:\u0022contour\u0022,\u0022colorbar\u0022:{\u0022outlinewidth\u0022:0.0,\u0022ticks\u0022:\u0022\u0022},\u0022colorscale\u0022:[[0.0,\u0022#0d0887\u0022],[0.1111111111111111,\u0022#46039f\u0022],[0.2222222222222222,\u0022#7201a8\u0022],[0.3333333333333333,\u0022#9c179e\u0022],[0.4444444444444444,\u0022#bd3786\u0022],[0.5555555555555556,\u0022#d8576b\u0022],[0.6666666666666666,\u0022#ed7953\u0022],[0.7777777777777778,\u0022#fb9f3a\u0022],[0.8888888888888888,\u0022#fdca26\u0022],[1.0,\u0022#f0f921\u0022]]}],\u0022contourcarpet\u0022:[{\u0022type\u0022:\u0022contourcarpet\u0022,\u0022colorbar\u0022:{\u0022outlinewidth\u0022:0.0,\u0022ticks\u0022:\u0022\u0022}}],\u0022heatmap\u0022:[{\u0022type\u0022:\u0022heatmap\u0022,\u0022colorbar\u0022:{\u0022outlinewidth\u0022:0.0,\u0022ticks\u0022:\u0022\u0022},\u0022colorscale\u0022:[[0.0,\u0022#0d0887\u0022],[0.1111111111111111,\u0022#46039f\u0022],[0.2222222222222222,\u0022#7201a8\u0022],[0.3333333333333333,\u0022#9c179e\u0022],[0.4444444444444444,\u0022#bd3786\u0022],[0.5555555555555556,\u0022#d8576b\u0022],[0.6666666666666666,\u0022#ed7953\u0022],[0.7777777777777778,\u0022#fb9f3a\u0022],[0.8888888888888888,\u0022#fdca26\u0022],[1.0,\u0022#f0f921\u0022]]}],\u0022heatmapgl\u0022:[{\u0022type\u0022:\u0022heatmapgl\u0022,\u0022colorbar\u0022:{\u0022outlinewidth\u0022:0.0,\u0022ticks\u0022:\u0022\u0022},\u0022colorscale\u0022:[[0.0,\u0022#0d0887\u0022],[0.1111111111111111,\u0022#46039f\u0022],[0.2222222222222222,\u0022#7201a8\u0022],[0.3333333333333333,\u0022#9c179e\u0022],[0.4444444444444444,\u0022#bd3786\u0022],[0.5555555555555556,\u0022#d8576b\u0022],[0.6666666666666666,\u0022#ed7953\u0022],[0.7777777777777778,\u0022#fb9f3a\u0022],[0.8888888888888888,\u0022#fdca26\u0022],[1.0,\u0022#f0f921\u0022]]}],\u0022histogram\u0022:[{\u0022type\u0022:\u0022histogram\u0022,\u0022marker\u0022:{\u0022pattern\u0022:{\u0022fillmode\u0022:\u0022overlay\u0022,\u0022size\u0022:10,\u0022solidity\u0022:0.2}}}],\u0022histogram2d\u0022:[{\u0022type\u0022:\u0022histogram2d\u0022,\u0022colorbar\u0022:{\u0022outlinewidth\u0022:0.0,\u0022ticks\u0022:\u0022\u0022},\u0022colorscale\u0022:[[0.0,\u0022#0d0887\u0022],[0.1111111111111111,\u0022#46039f\u0022],[0.2222222222222222,\u0022#7201a8\u0022],[0.3333333333333333,\u0022#9c179e\u0022],[0.4444444444444444,\u0022#bd3786\u0022],[0.5555555555555556,\u0022#d8576b\u0022],[0.6666666666666666,\u0022#ed7953\u0022],[0.7777777777777778,\u0022#fb9f3a\u0022],[0.8888888888888888,\u0022#fdca26\u0022],[1.0,\u0022#f0f921\u0022]]}],\u0022histogram2dcontour\u0022:[{\u0022type\u0022:\u0022histogram2dcontour\u0022,\u0022colorbar\u0022:{\u0022outlinewidth\u0022:0.0,\u0022ticks\u0022:\u0022\u0022},\u0022colorscale\u0022:[[0.0,\u0022#0d0887\u0022],[0.1111111111111111,\u0022#46039f\u0022],[0.2222222222222222,\u0022#7201a8\u0022],[0.3333333333333333,\u0022#9c179e\u0022],[0.4444444444444444,\u0022#bd3786\u0022],[0.5555555555555556,\u0022#d8576b\u0022],[0.6666666666666666,\u0022#ed7953\u0022],[0.7777777777777778,\u0022#fb9f3a\u0022],[0.8888888888888888,\u0022#fdca26\u0022],[1.0,\u0022#f0f921\u0022]]}],\u0022mesh3d\u0022:[{\u0022type\u0022:\u0022mesh3d\u0022,\u0022colorbar\u0022:{\u0022outlinewidth\u0022:0.0,\u0022ticks\u0022:\u0022\u0022}}],\u0022parcoords\u0022:[{\u0022type\u0022:\u0022parcoords\u0022,\u0022line\u0022:{\u0022colorbar\u0022:{\u0022outlinewidth\u0022:0.0,\u0022ticks\u0022:\u0022\u0022}}}],\u0022pie\u0022:[{\u0022type\u0022:\u0022pie\u0022,\u0022automargin\u0022:true}],\u0022scatter\u0022:[{\u0022type\u0022:\u0022scatter\u0022,\u0022marker\u0022:{\u0022colorbar\u0022:{\u0022outlinewidth\u0022:0.0,\u0022ticks\u0022:\u0022\u0022}}}],\u0022scatter3d\u0022:[{\u0022type\u0022:\u0022scatter3d\u0022,\u0022marker\u0022:{\u0022colorbar\u0022:{\u0022outlinewidth\u0022:0.0,\u0022ticks\u0022:\u0022\u0022}},\u0022line\u0022:{\u0022colorbar\u0022:{\u0022outlinewidth\u0022:0.0,\u0022ticks\u0022:\u0022\u0022}}}],\u0022scattercarpet\u0022:[{\u0022type\u0022:\u0022scattercarpet\u0022,\u0022marker\u0022:{\u0022colorbar\u0022:{\u0022outlinewidth\u0022:0.0,\u0022ticks\u0022:\u0022\u0022}}}],\u0022scattergeo\u0022:[{\u0022type\u0022:\u0022scattergeo\u0022,\u0022marker\u0022:{\u0022colorbar\u0022:{\u0022outlinewidth\u0022:0.0,\u0022ticks\u0022:\u0022\u0022}}}],\u0022scattergl\u0022:[{\u0022type\u0022:\u0022scattergl\u0022,\u0022marker\u0022:{\u0022colorbar\u0022:{\u0022outlinewidth\u0022:0.0,\u0022ticks\u0022:\u0022\u0022}}}],\u0022scattermapbox\u0022:[{\u0022type\u0022:\u0022scattermapbox\u0022,\u0022marker\u0022:{\u0022colorbar\u0022:{\u0022outlinewidth\u0022:0.0,\u0022ticks\u0022:\u0022\u0022}}}],\u0022scatterpolar\u0022:[{\u0022type\u0022:\u0022scatterpolar\u0022,\u0022marker\u0022:{\u0022colorbar\u0022:{\u0022outlinewidth\u0022:0.0,\u0022ticks\u0022:\u0022\u0022}}}],\u0022scatterpolargl\u0022:[{\u0022type\u0022:\u0022scatterpolargl\u0022,\u0022marker\u0022:{\u0022colorbar\u0022:{\u0022outlinewidth\u0022:0.0,\u0022ticks\u0022:\u0022\u0022}}}],\u0022scatterternary\u0022:[{\u0022type\u0022:\u0022scatterternary\u0022,\u0022marker\u0022:{\u0022colorbar\u0022:{\u0022outlinewidth\u0022:0.0,\u0022ticks\u0022:\u0022\u0022}}}],\u0022surface\u0022:[{\u0022type\u0022:\u0022surface\u0022,\u0022colorbar\u0022:{\u0022outlinewidth\u0022:0.0,\u0022ticks\u0022:\u0022\u0022},\u0022colorscale\u0022:[[0.0,\u0022#0d0887\u0022],[0.1111111111111111,\u0022#46039f\u0022],[0.2222222222222222,\u0022#7201a8\u0022],[0.3333333333333333,\u0022#9c179e\u0022],[0.4444444444444444,\u0022#bd3786\u0022],[0.5555555555555556,\u0022#d8576b\u0022],[0.6666666666666666,\u0022#ed7953\u0022],[0.7777777777777778,\u0022#fb9f3a\u0022],[0.8888888888888888,\u0022#fdca26\u0022],[1.0,\u0022#f0f921\u0022]]}],\u0022table\u0022:[{\u0022type\u0022:\u0022table\u0022,\u0022cells\u0022:{\u0022fill\u0022:{\u0022color\u0022:\u0022rgba(235, 240, 248, 1.0)\u0022},\u0022line\u0022:{\u0022color\u0022:\u0022rgba(255, 255, 255, 1.0)\u0022}},\u0022header\u0022:{\u0022fill\u0022:{\u0022color\u0022:\u0022rgba(200, 212, 227, 1.0)\u0022},\u0022line\u0022:{\u0022color\u0022:\u0022rgba(255, 255, 255, 1.0)\u0022}}}]}}};\n var config = {\u0022responsive\u0022:true};\n Plotly.newPlot(\u0027084dd93b-0a7f-4cef-9f11-db36bee5bb10\u0027, data, layout, config);\n });\n};\nif ((typeof(requirejs) !== typeof(Function)) || (typeof(requirejs.config) !== typeof(Function))) {\n var script = document.createElement(\u0022script\u0022);\n script.setAttribute(\u0022charset\u0022, \u0022utf-8\u0022);\n script.setAttribute(\u0022src\u0022, \u0022https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js\u0022);\n script.onload = function(){\n renderPlotly_084dd93b0a7f4cef9f11db36bee5bb10();\n };\n document.getElementsByTagName(\u0022head\u0022)[0].appendChild(script);\n}\nelse {\n renderPlotly_084dd93b0a7f4cef9f11db36bee5bb10();\n}\n\u003C/script\u003E\u003C/div\u003E" + } + ] + }, + { + "id": "0359818b-6d8b-4508-bd93-65dddb98e299", + "type": "html", + "language": "csharp", + "source": "\u003Ch1\u003Eawdawd\u003C/h1\u003E", + "outputs": [ + { + "mimeType": "text/html", + "content": "\u003Ch1\u003Eawdawd\u003C/h1\u003E" + } + ] + } + ] +} \ No newline at end of file