diff --git a/.gitignore b/.gitignore index ee5f51a..2f295e9 100644 --- a/.gitignore +++ b/.gitignore @@ -146,4 +146,6 @@ cython_debug/ /output # Pycache -*.pyc \ No newline at end of file +*.pyc +# AgentOps session artifacts +.agents/ diff --git a/drillholes-demo/app.py b/drillholes-demo/app.py new file mode 100644 index 0000000..4b5ec83 --- /dev/null +++ b/drillholes-demo/app.py @@ -0,0 +1,116 @@ +import dash +from dash import dcc, html, Input, Output, callback, clientside_callback +import dash_mantine_components as dmc + +from pages import cross_section, downhole_logs, comparison, explorer, block_model +from utils import create_header, create_nav_sidebar, NAV_ITEMS +import callbacks.cross_section # noqa: F401 — registers callbacks +import callbacks.downhole # noqa: F401 +import callbacks.comparison # noqa: F401 +import callbacks.block_model # noqa: F401 +# Explorer page is fully driven by assets/explorer.js — no Python callbacks. + +app = dash.Dash( + __name__, + meta_tags=[{"name": "viewport", "content": "width=device-width, initial-scale=1"}], + external_stylesheets=dmc.styles.ALL, + suppress_callback_exceptions=True, +) +app.title = "Drillhole Visualizer — WA Au-Cu Porphyry" +server = app.server + +app.layout = dmc.MantineProvider( + id="mantine-provider", + forceColorScheme="light", + children=[ + dcc.Location(id="url", refresh=False), + dcc.Store(id="measure-store"), + dmc.AppShell( + [ + dmc.AppShellHeader(create_header(), withBorder=True), + dmc.AppShellMain( + html.Div( + [ + create_nav_sidebar(), + dmc.Container(id="page-content", fluid=True, p="md", className="main-content"), + ], + className="main-layout", + ), + ), + ], + header={"height": 60}, + padding=0, + ), + ], +) + +clientside_callback( + """ + function(n_clicks) { + if (n_clicks === undefined || n_clicks === null) { + var nu = window.dash_clientside.no_update; + return [nu, nu, nu, nu, nu, nu, nu, nu]; + } + var collapsed = (n_clicks % 2) !== 0; + if (collapsed) { + return [ + "filter-sidebar collapsed", + "pad-0 justify-center", + "basil:caret-right-solid", + {"display": "none"}, + null, + {"display": "none"}, + {"display": "none"}, + {"display": "none"} + ]; + } + return [ + "filter-sidebar", + "title-pad space-between", + "charm:cross", + null, + {"display": "none"}, + null, + null, + null + ]; + } + """, + Output("filter-sidebar", "className"), + Output("sidebar-title-div", "className"), + Output("sidebar-btn-icon", "icon"), + Output("sidebar-title", "style"), + Output("sidebar-collapsed-title-div", "style"), + Output("sidebar-outer-div", "style"), + Output("sidebar-inner-div", "style"), + Output("sidebar-btn-div", "style"), + Input("sidebar-btn", "n_clicks"), +) + + +@callback(Output("page-content", "children"), Input("url", "pathname")) +def display_page(pathname): + if pathname == "/downhole-logs": + return downhole_logs.layout() + elif pathname == "/comparison": + return comparison.layout() + elif pathname == "/explorer": + return explorer.layout() + elif pathname == "/block-model": + return block_model.layout() + else: + return cross_section.layout() + + +@callback( + [Output(item["id"], "active") for item in NAV_ITEMS], + Input("url", "pathname"), +) +def update_nav_active(pathname): + path = pathname or "/" + return [item["href"] == path for item in NAV_ITEMS] + + +if __name__ == "__main__": + app.run(debug=True, port=8051) + diff --git a/drillholes-demo/assets/explorer.js b/drillholes-demo/assets/explorer.js new file mode 100644 index 0000000..4fbfa75 --- /dev/null +++ b/drillholes-demo/assets/explorer.js @@ -0,0 +1,588 @@ +/* + * Drill-Hole Cross-Section Explorer — port of the CodePen of the same name. + * + * The CodePen renders into a single #chart div with raw Plotly.js. Dash + * unmounts/remounts the page on every SPA route change, so we wrap the + * codepen body in a MutationObserver-driven init() that re-binds whenever + * the #explorer-chart div appears in the DOM. assets/*.js loads on every + * Dash page; the early-out at the top of init() makes this a no-op when + * the explorer page isn't mounted. + */ +(function () { + var initialized = false; + var retryTimer = null; + + function scheduleRetry() { + if (retryTimer) return; + retryTimer = setTimeout(function () { + retryTimer = null; + init(); + }, 100); + } + + function init() { + var gd = document.getElementById("explorer-chart"); + if (!gd) { + initialized = false; + return; + } + if (initialized) return; + // Dash 4 lazy-loads Plotly.js when a dcc.Graph mounts. Poll until it's + // available rather than bailing once. + if (!window.Plotly) { + scheduleRetry(); + return; + } + initialized = true; + + /* ===== begin verbatim CodePen JS ===== */ + var holeNames = ["DH-001", "DH-002", "DH-003", "DH-004"]; + var holeColors = ["#2563eb", "#16a34a", "#d97706", "#9333ea"]; + var yAxes = ["y", "y2", "y3", "y4"]; + var xAxes = ["x", "x2", "x3", "x4"]; + var domainXs = [ + [0.05, 0.22], + [0.3, 0.47], + [0.55, 0.72], + [0.8, 0.97], + ]; + + function makeLog(seed, nPoints) { + var depths = [], + values = []; + var v = 30 + seed * 5; + for (var i = 0; i <= nPoints; i++) { + var d = i * (100 / nPoints); + depths.push(d); + v += + Math.sin(d * 0.12 + seed) * 3 + + Math.cos(d * 0.07 - seed * 2) * 2 + + (Math.random() - 0.5) * 4; + v = Math.max(5, Math.min(95, v)); + if (d > 35 + seed * 3 && d < 70 - seed * 2) v += 15; + values.push(v); + } + return { depths: depths, values: values }; + } + + var units = [ + { + name: "Overburden", + tops: [0, 0, 0, 0], + bots: [10, 8, 13, 9], + fill: "rgba(139,90,43,0.22)", + line: "rgba(139,90,43,0.7)", + }, + { + name: "Upper Sandstone", + tops: [10, 8, 13, 9], + bots: [28, 25, 30, 26], + fill: "rgba(194,178,128,0.22)", + line: "rgba(194,178,128,0.7)", + }, + { + name: "Ore Zone", + tops: [28, 25, 30, 26], + bots: [68, 64, 72, 66], + fill: "rgba(220,50,50,0.18)", + line: "rgba(220,50,50,0.7)", + }, + { + name: "Lower Shale", + tops: [68, 64, 72, 66], + bots: [85, 82, 88, 84], + fill: "rgba(80,120,80,0.18)", + line: "rgba(80,120,80,0.7)", + }, + { + name: "Basement Gneiss", + tops: [85, 82, 88, 84], + bots: [100, 100, 100, 100], + fill: "rgba(100,100,160,0.18)", + line: "rgba(100,100,160,0.7)", + }, + ]; + + var traces = []; + for (var h = 0; h < 4; h++) { + var log = makeLog(h, 80); + var c = holeColors[h]; + var r = parseInt(c.slice(1, 3), 16), + g = parseInt(c.slice(3, 5), 16), + b = parseInt(c.slice(5, 7), 16); + traces.push({ + x: log.values, + y: log.depths, + xaxis: xAxes[h], + yaxis: yAxes[h], + type: "scatter", + mode: "lines", + name: holeNames[h], + line: { color: c, width: 1.5 }, + fill: "tozerox", + fillcolor: "rgba(" + r + "," + g + "," + b + ",0.18)", + hoverinfo: "none", + }); + } + + var baseShapes = []; + + units.forEach(function (u) { + for (var i = 0; i < 3; i++) { + baseShapes.push({ + type: "path", + xref: "paper", + yref: [yAxes[i], yAxes[i + 1], yAxes[i + 1], yAxes[i]], + path: + "M " + + domainXs[i][1] + + " " + + u.tops[i] + + " L " + + domainXs[i + 1][0] + + " " + + u.tops[i + 1] + + " L " + + domainXs[i + 1][0] + + " " + + u.bots[i + 1] + + " L " + + domainXs[i][1] + + " " + + u.bots[i] + + " Z", + fillcolor: u.fill, + line: { color: u.line, width: 1 }, + }); + } + }); + + for (var hh = 0; hh < 4; hh++) { + baseShapes.push({ + type: "rect", + xref: xAxes[hh], + yref: yAxes[hh], + x0: 0, + x1: 100, + y0: units[2].tops[hh], + y1: units[2].bots[hh], + fillcolor: "rgba(220,50,50,0.10)", + line: { width: 0 }, + layer: "below", + }); + } + + var depthRange = [105, -5]; + var valRange = [0, 100]; + + function yAxisCfg(extra) { + return Object.assign( + { + range: depthRange, + gridcolor: "#ecedf0", + zerolinecolor: "#e2e4e9", + linecolor: "#d1d5db", + tickfont: { color: "#6b7280", size: 9 }, + }, + extra || {} + ); + } + + function xAxisCfg(domain, anchor, title) { + return { + domain: domain, + anchor: anchor, + range: valRange, + gridcolor: "#ecedf0", + zerolinecolor: "#e2e4e9", + linecolor: "#d1d5db", + tickfont: { color: "#6b7280", size: 9 }, + title: { + text: title, + font: { size: 11, color: "#4b5563" }, + standoff: 6, + }, + }; + } + + var layout = { + paper_bgcolor: "#fff", + plot_bgcolor: "#fafbfc", + font: { color: "#1e2028" }, + margin: { l: 55, r: 16, t: 44, b: 44 }, + showlegend: true, + legend: { + x: 0.5, + y: 1.07, + xanchor: "center", + orientation: "h", + bgcolor: "rgba(255,255,255,0)", + font: { color: "#4b5563", size: 11 }, + }, + + hoveranywhere: true, + clickanywhere: true, + hovermode: "closest", + + shapes: baseShapes.slice(), + + yaxis: yAxisCfg({ + domain: [0, 1], + anchor: "x", + title: { + text: "Depth (m)", + font: { size: 11, color: "#4b5563" }, + standoff: 6, + }, + }), + yaxis2: yAxisCfg({ + domain: [0, 1], + anchor: "x2", + title: { + text: "Depth (m)", + font: { size: 11, color: "#4b5563" }, + standoff: 6, + }, + }), + yaxis3: yAxisCfg({ + domain: [0, 1], + anchor: "x3", + title: { + text: "Depth (m)", + font: { size: 11, color: "#4b5563" }, + standoff: 6, + }, + }), + yaxis4: yAxisCfg({ + domain: [0, 1], + anchor: "x4", + title: { + text: "Depth (m)", + font: { size: 11, color: "#4b5563" }, + standoff: 6, + }, + }), + + xaxis: xAxisCfg(domainXs[0], "y", "DH-001"), + xaxis2: xAxisCfg(domainXs[1], "y2", "DH-002"), + xaxis3: xAxisCfg(domainXs[2], "y3", "DH-003"), + xaxis4: xAxisCfg(domainXs[3], "y4", "DH-004"), + + annotations: [], + }; + + var clicks = []; + + function dot(xa, ya, xval, depth) { + var axObj = + gd._fullLayout[ya === "y" ? "yaxis" : "yaxis" + ya.slice(1)]; + var xAxObj = + gd._fullLayout[xa === "x" ? "xaxis" : "xaxis" + xa.slice(1)]; + var px = 4; + var rx = + (px * (xAxObj.range[1] - xAxObj.range[0])) / (xAxObj._length || 1); + var ry = + (px * (axObj.range[1] - axObj.range[0])) / (axObj._length || 1); + return { + type: "circle", + xref: xa, + yref: ya, + x0: xval - rx, + x1: xval + rx, + y0: depth - ry, + y1: depth + ry, + fillcolor: "rgba(220,38,38,0.5)", + line: { color: "#dc2626", width: 1.5 }, + }; + } + + function getClickInfo(data) { + var depth, xval, holeIdx; + if (data.points && data.points.length > 0) { + var pt = data.points[0]; + depth = pt.y; + xval = pt.x; + var traceXa = pt.data.xaxis || "x"; + holeIdx = + traceXa === "x" ? 0 : parseInt(traceXa.replace("x", "")) - 1; + } else if (data.yvals && data.yvals.length > 0) { + depth = data.yvals[0]; + xval = data.xvals ? data.xvals[0] : 50; + if (data.xaxes && data.xaxes.length > 0) { + var axId = data.xaxes[0]._id || ""; + holeIdx = axId === "x" ? 0 : parseInt(axId.replace("x", "")) - 1; + } + } + if (depth !== undefined && holeIdx !== undefined) { + return { depth: depth, xval: xval, holeIdx: holeIdx }; + } + return null; + } + + Plotly.newPlot(gd, traces, layout, { + responsive: true, + displayModeBar: true, + modeBarButtonsToRemove: ["lasso2d", "select2d"], + displaylogo: false, + }).then(function () { + gd.on("plotly_hover", function (d) { + var gs = gd._fullLayout._size; + var layer = gd._fullLayout._hoverlayer; + + layer.selectAll(".pseudo-spike").remove(); + + var yPos = d.event.offsetY; + + layer + .insert("line", ":first-child") + .attr({ + x1: gs.l, + x2: gs.l + gs.w, + y1: yPos, + y2: yPos, + "stroke-width": 1, + stroke: "rgba(100,100,100,0.4)", + "stroke-dasharray": "4,3", + }) + .classed("pseudo-spike", true); + + var depthVal = d.yvals + ? d.yvals[0] + : d.points && d.points.length > 0 + ? d.points[0].y + : null; + if (depthVal !== null) { + layer + .append("rect") + .attr({ + x: gs.l - 52, + y: yPos - 9, + width: 48, + height: 18, + rx: 3, + fill: "#4b5563", + }) + .classed("pseudo-spike", true); + layer + .append("text") + .attr({ + x: gs.l - 48, + y: yPos + 4, + fill: "white", + "font-size": "10px", + "font-family": "Inter, Segoe UI, system-ui, sans-serif", + }) + .text(depthVal.toFixed(1) + " m") + .classed("pseudo-spike", true); + } + + if (d.points && d.points.length > 0) { + var pt = d.points[0]; + var tc = pt.data.line.color; + var xax = pt.xaxis; + var yax = pt.yaxis; + + var mkX = + xax._offset + + ((pt.x - xax.range[0]) / (xax.range[1] - xax.range[0])) * + xax._length; + var mkY = + yax._offset + + ((pt.y - yax.range[1]) / (yax.range[0] - yax.range[1])) * + yax._length; + + layer + .append("circle") + .attr({ + cx: mkX, + cy: mkY, + r: 4.5, + fill: tc, + stroke: "white", + "stroke-width": 2, + }) + .classed("pseudo-spike", true); + + var yStr = pt.y.toFixed(1) + " m"; + var lblW = yStr.length * 6.5 + 18; + var lblH = 20; + var gap = 10; + var lx = mkX + gap; + if (lx + lblW > gs.l + gs.w) lx = mkX - lblW - gap; + var ly = mkY - lblH / 2; + + layer + .append("rect") + .attr({ x: lx, y: ly, width: lblW, height: lblH, rx: 10, fill: tc }) + .classed("pseudo-spike", true); + + layer + .append("text") + .attr({ + x: lx + lblW / 2, + y: ly + 13, + fill: "white", + "font-size": "10.5px", + "font-family": "Inter, Segoe UI, system-ui, sans-serif", + "font-weight": "600", + "text-anchor": "middle", + }) + .text(yStr) + .classed("pseudo-spike", true); + } + + var depth, holeName, xval; + if (d.points && d.points.length > 0) { + var pt2 = d.points[0]; + depth = pt2.y; + xval = pt2.x; + holeName = pt2.data.name; + } else if (d.yvals && d.yvals.length > 0) { + depth = d.yvals[0]; + xval = d.xvals ? d.xvals[0] : null; + if (d.xaxes && d.xaxes.length > 0) { + var axId = d.xaxes[0]._id || ""; + var hIdx = axId === "x" ? 0 : parseInt(axId.replace("x", "")) - 1; + holeName = holeNames[hIdx] || "--"; + } + } + if (depth !== undefined) { + var depthEl = document.getElementById("cursor-depth"); + var holeEl = document.getElementById("cursor-hole"); + var valueEl = document.getElementById("cursor-value"); + if (depthEl) depthEl.textContent = depth.toFixed(1) + " m"; + if (holeEl) holeEl.textContent = holeName || "--"; + if (valueEl) + valueEl.textContent = + xval !== null && xval !== undefined ? xval.toFixed(1) : "--"; + } + }); + + gd.on("plotly_unhover", function () { + if (gd._fullLayout && gd._fullLayout._hoverlayer) { + gd._fullLayout._hoverlayer.selectAll(".pseudo-spike").remove(); + } + var depthEl = document.getElementById("cursor-depth"); + var holeEl = document.getElementById("cursor-hole"); + var valueEl = document.getElementById("cursor-value"); + if (depthEl) depthEl.textContent = "--"; + if (holeEl) holeEl.textContent = "--"; + if (valueEl) valueEl.textContent = "--"; + }); + + gd.on("plotly_click", function (data) { + var info = getClickInfo(data); + if (!info) return; + + var distEl = document.getElementById("distance-result"); + var xa = xAxes[info.holeIdx]; + var ya = yAxes[info.holeIdx]; + + if (clicks.length >= 2) { + clicks = []; + Plotly.relayout(gd, { + shapes: baseShapes.slice(), + annotations: [], + }); + if (distEl) distEl.style.display = "none"; + return; + } + + clicks.push({ + depth: info.depth, + xval: info.xval, + holeIdx: info.holeIdx, + xa: xa, + ya: ya, + }); + + if (clicks.length === 1) { + if (distEl) { + distEl.style.display = "block"; + distEl.innerHTML = + "Point 1: " + + info.depth.toFixed(1) + + " m on " + + holeNames[info.holeIdx]; + } + Plotly.relayout(gd, { + shapes: baseShapes.concat([dot(xa, ya, info.xval, info.depth)]), + annotations: [], + }); + } else { + var a = clicks[0], + b = clicks[1]; + + if (a.holeIdx !== b.holeIdx) { + clicks.pop(); + return; + } + + var dist = Math.abs(b.depth - a.depth); + var mx = (a.xval + b.xval) / 2; + var my = (a.depth + b.depth) / 2; + + if (distEl) { + distEl.style.display = "block"; + distEl.innerHTML = + "" + + dist.toFixed(1) + + " m on " + + holeNames[a.holeIdx]; + } + + Plotly.relayout(gd, { + shapes: baseShapes.concat([ + dot(a.xa, a.ya, a.xval, a.depth), + dot(b.xa, b.ya, b.xval, b.depth), + { + type: "line", + xref: a.xa, + yref: a.ya, + x0: a.xval, + y0: a.depth, + x1: b.xval, + y1: b.depth, + line: { color: "#dc2626", width: 2 }, + }, + ]), + annotations: [ + { + x: mx, + y: my, + xref: a.xa, + yref: a.ya, + text: dist.toFixed(1) + " m", + showarrow: false, + font: { color: "#dc2626", size: 12 }, + bgcolor: "rgba(255,255,255,0.9)", + bordercolor: "#dc2626", + borderwidth: 1, + borderpad: 4, + }, + ], + }); + } + }); + }); + /* ===== end verbatim CodePen JS ===== */ + } + + var observer = new MutationObserver(function () { + if (!document.getElementById("explorer-chart")) { + initialized = false; + return; + } + init(); + }); + + if (document.body) { + observer.observe(document.body, { childList: true, subtree: true }); + } else { + document.addEventListener("DOMContentLoaded", function () { + observer.observe(document.body, { childList: true, subtree: true }); + init(); + }); + } + init(); +})(); diff --git a/drillholes-demo/assets/plotly-logo-old.png b/drillholes-demo/assets/plotly-logo-old.png new file mode 100644 index 0000000..653c836 Binary files /dev/null and b/drillholes-demo/assets/plotly-logo-old.png differ diff --git a/drillholes-demo/assets/plotly-logo.png b/drillholes-demo/assets/plotly-logo.png new file mode 100644 index 0000000..a037590 Binary files /dev/null and b/drillholes-demo/assets/plotly-logo.png differ diff --git a/drillholes-demo/assets/styles.css b/drillholes-demo/assets/styles.css new file mode 100644 index 0000000..2b36734 --- /dev/null +++ b/drillholes-demo/assets/styles.css @@ -0,0 +1,390 @@ +/* ===== Base ===== */ +*, *::before, *::after { box-sizing: border-box; } + +body { + background-color: #f8f9fa; + color: #495057; + font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; + margin: 0; + padding: 0; + min-height: 100vh; +} + +/* ===== Scrollbars ===== */ +::-webkit-scrollbar { + width: 8px; + height: 8px; +} + +::-webkit-scrollbar-track { + background: rgba(0, 0, 0, 0.05); + border-radius: 4px; +} + +::-webkit-scrollbar-thumb { + background: rgba(0, 0, 0, 0.2); + border-radius: 4px; +} + +::-webkit-scrollbar-thumb:hover { + background: rgba(0, 0, 0, 0.3); +} + +/* ===== AppShell header ===== */ +.app-header { + background: #ffffff; + border-bottom: 1px solid #dee2e6; +} + +.brand-title { + font-size: 1.05rem; + font-weight: 700; + color: #212529; + letter-spacing: -0.01em; + margin: 0; +} + +.brand-subtitle { + font-size: 0.78rem; + color: #6c757d; + margin: 0; +} + +/* ===== Collapsible Nav Sidebar ===== */ +.filter-sidebar { + width: 220px; + min-width: 220px; + flex-shrink: 0; + transition: width 0.2s ease; + display: flex !important; + flex-direction: column !important; + background-color: #ffffff !important; + border-right: 1px solid #dee2e6 !important; +} + +.filter-sidebar.collapsed { + width: 50px !important; + min-width: 50px !important; +} + +.sidebar-outer { + overflow-y: auto; + flex: 1; + padding: 4px 0; +} + +.sidebar-inner { + overflow-x: hidden; + scrollbar-width: thin; +} + +.sidebar-collapsed-title { + width: 150px; + color: #adb5bd; + font-size: 12px; + white-space: pre; + letter-spacing: 0.04em; +} + +.sidebar-btn { + border-radius: 4px !important; +} + +.title-pad { + padding: 22px 12px 10px 12px !important; + border-bottom: 1px solid #f1f3f5; +} + +/* Layout helpers */ +.flex-column { flex-direction: column; } +.justify-center { justify-content: center; } +.space-between { justify-content: space-between; } +.pad-0 { padding: 0 !important; } + +/* Main content flex wrapper */ +.main-layout { + display: flex; + height: 100%; + min-height: 0; +} + +.main-content { + flex: 1; + min-width: 0; + overflow: auto; +} + +/* Sidebar NavLink styling */ +.filter-sidebar .mantine-NavLink-root { + border-radius: 6px; + font-size: 0.85rem; + color: #6c757d; + margin: 1px 6px; + padding: 8px 10px; +} + +.filter-sidebar .mantine-NavLink-root:hover { + background-color: #f1f3f5; + color: #343a40; +} + +.filter-sidebar .mantine-NavLink-root[data-active="true"] { + background-color: #fff7e6; + color: #d48806; + font-weight: 600; + border-left: 3px solid #e8a020; + border-radius: 0 6px 6px 0; + padding-left: 7px; +} + +/* ===== Paper hover elevation ===== */ +.mantine-Paper-root { + transition: box-shadow 0.2s ease; +} + +.mantine-Paper-root:hover { + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08); +} + +/* ===== KPI cards ===== */ +.kpi-card { + background: #ffffff !important; + border: 1px solid #dee2e6 !important; + border-top: 3px solid #e8a020 !important; +} + +/* ===== Chart containers ===== */ +.chart-paper { + background: #ffffff !important; + border: 1px solid #dee2e6 !important; +} + +/* ===== Strip log panels ===== */ +.strip-log-panel { + border-right: 1px solid #dee2e6; +} + +/* ===== Measurement readout ===== */ +.measure-readout { + font-family: 'JetBrains Mono', 'Fira Code', monospace; + font-size: 0.85rem; + color: #d48806; + background: #fff7e6; + border: 1px solid #ffd666; + border-radius: 6px; + padding: 8px 12px; + min-height: 36px; + display: flex; + align-items: center; +} + +/* ===== Table ===== */ +.data-table { + width: 100%; + border-collapse: collapse; + font-size: 0.8rem; +} + +.data-table th { + background: #f1f3f5; + color: #6c757d; + text-transform: uppercase; + font-size: 0.7rem; + font-weight: 600; + letter-spacing: 0.05em; + padding: 8px 10px; + text-align: left; + border-bottom: 2px solid #dee2e6; +} + +.data-table td { + padding: 6px 10px; + border-bottom: 1px solid #e9ecef; + color: #495057; +} + +.data-table tr:hover td { + background: #f8f9fa; +} + +/* ===== Scrollable table wrapper ===== */ +.table-scroll { + max-height: 420px; + overflow-y: auto; +} + +.table-scroll::-webkit-scrollbar { width: 5px; } +.table-scroll::-webkit-scrollbar-track { background: #f1f3f5; } +.table-scroll::-webkit-scrollbar-thumb { background: #ced4da; border-radius: 3px; } + +/* ===== Section titles ===== */ +.section-title { + font-size: 0.9rem; + font-weight: 600; + color: #212529; + margin: 0 0 4px; +} + +.section-description { + font-size: 0.75rem; + color: #6c757d; + margin: 0 0 12px; +} + +/* ===== Legend swatch ===== */ +.lith-swatch { + display: inline-block; + width: 12px; + height: 12px; + border-radius: 2px; + margin-right: 6px; + vertical-align: middle; + border: 1px solid rgba(0, 0, 0, 0.1); +} + +/* ===== Depth cursor line — targeted via JS class injection ===== */ +.depth-cursor-line { + stroke: #e8a020 !important; + stroke-width: 1.5px !important; + stroke-dasharray: 5, 3 !important; + opacity: 0.85 !important; +} + +/* ===== Mantine overrides ===== */ +.mantine-Badge-root { + text-transform: none; +} + +.mantine-NavLink-root[data-active="true"] { + font-weight: 600; +} + +/* ===== Plotly modebar ===== */ +.js-plotly-plot .plotly .modebar { + top: 5px !important; + right: 5px !important; +} + +.js-plotly-plot .plotly .modebar-btn { + font-size: 14px !important; +} + +/* ===== Tip paper (accent left border) ===== */ +.tip-paper { + display: none !important; + border-left: 3px solid #e8a020 !important; +} + +/* ===== Y-axis interaction hint overlay ===== */ +.y-axis-hint { + position: absolute; + left: 62px; + top: 54px; + font-size: 9px; + color: #adb5bd; + background: rgba(255, 255, 255, 0.93); + padding: 2px 8px; + border-radius: 10px; + border: 1px solid #dee2e6; + pointer-events: none; + z-index: 10; + display: flex; + align-items: center; + gap: 4px; + white-space: nowrap; + font-family: Inter, sans-serif; + animation: hint-fade-in 0.9s ease-out; +} + +@keyframes hint-fade-in { + from { opacity: 0; transform: translateY(-4px); } + to { opacity: 1; transform: translateY(0); } +} + +/* ===== Feature chip badges ===== */ +.feature-chips .mantine-Badge-root { + cursor: help; +} + +/* ===== DashTour overrides ===== */ +[data-tour-elem="helper"] { + font-family: Inter, -apple-system, sans-serif !important; + font-size: 0.875rem !important; + color: #212529 !important; + line-height: 1.5 !important; + max-width: 320px !important; +} + +[data-tour-elem="badge"] { + background: #e8a020 !important; +} + +/* ===== Responsive ===== */ +@media (max-width: 768px) { + .brand-title { font-size: 0.95rem; } + .brand-subtitle { display: none; } + .horizontal-nav .mantine-NavLink-root { padding: 6px 10px; font-size: 0.8rem; } + .horizontal-nav .mantine-NavLink-label { font-size: 0.8rem; } +} + +@media print { + .mantine-AppShell-header, + .mantine-Button-root, + .mantine-Select-root, + .mantine-MultiSelect-root { + display: none !important; + } + + .mantine-Paper-root { + break-inside: avoid; + box-shadow: none !important; + border: 1px solid #dee2e6 !important; + } +} + +/* ===== Explorer page sidebar (CodePen port) ===== */ +.explorer-info-panel { + background: #f8f9fb !important; +} + +.explorer-panel-title { + font-size: 10px; + text-transform: uppercase; + letter-spacing: 0.8px; + color: #8b8fa3; + font-weight: 600; + margin: 0 0 8px; +} + +.explorer-info-row { + display: flex; + justify-content: space-between; + padding: 6px 0; + font-size: 12px; + border-bottom: 1px solid #ecedf0; +} + +.explorer-info-row:last-child { + border-bottom: none; +} + +.explorer-info-label { + color: #8b8fa3; +} + +.explorer-info-value { + color: #1e2028; + font-weight: 500; + font-variant-numeric: tabular-nums; +} + +.explorer-distance-result { + background: #eef4ff; + border: 1px solid #b6d0f7; + border-radius: 6px; + padding: 8px 12px; + margin-top: 6px; + font-size: 12px; + color: #2563eb; + display: none; +} diff --git a/drillholes-demo/callbacks/__init__.py b/drillholes-demo/callbacks/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/drillholes-demo/callbacks/block_model.py b/drillholes-demo/callbacks/block_model.py new file mode 100644 index 0000000..a1be587 --- /dev/null +++ b/drillholes-demo/callbacks/block_model.py @@ -0,0 +1,30 @@ +from dash import callback, Input, Output, Patch, no_update + + +@callback( + Output("bm-grid", "dashGridOptions"), + Input("bm-quick-filter", "value"), +) +def update_quick_filter(search_value): + patch = Patch() + patch["quickFilterText"] = search_value or "" + return patch + + +@callback( + Output("bm-row-count", "children"), + Input("bm-grid", "virtualRowData"), +) +def update_row_count(virtual_rows): + if virtual_rows is None: + return no_update + return f"{len(virtual_rows):,} rows" + + +@callback( + Output("bm-grid", "exportDataAsCsv"), + Input("bm-export-btn", "n_clicks"), + prevent_initial_call=True, +) +def export_csv(n_clicks): + return True diff --git a/drillholes-demo/callbacks/comparison.py b/drillholes-demo/callbacks/comparison.py new file mode 100644 index 0000000..5cbec8d --- /dev/null +++ b/drillholes-demo/callbacks/comparison.py @@ -0,0 +1,31 @@ +from dash import Input, Output, callback +from pages.comparison import build_comparison_figure +from utils import load_data, GRADE_LABELS + + +@callback( + Output("comparison-chart", "figure"), + [Input("hole-checklist", "value"), + Input("grade-selector", "value")], +) +def update_comparison(selected_holes, grade_col): + holes = (selected_holes or [])[:10] + return build_comparison_figure(holes, grade_col) + + +@callback( + [Output("badge-hole-count", "children"), + Output("badge-total-meters", "children"), + Output("badge-grade", "children")], + [Input("hole-checklist", "value"), + Input("grade-selector", "value")], +) +def update_comparison_badges(selected_holes, grade_col): + holes = (selected_holes or [])[:10] + collar, _, _, _ = load_data() + total_m = int(collar.loc[collar["HOLEID"].isin(holes), "TOTDEPTH"].sum()) + return ( + f"Holes selected: {len(holes)}", + f"Combined meters: {total_m:,} m", + f"Grade: {GRADE_LABELS.get(grade_col, grade_col)}", + ) diff --git a/drillholes-demo/callbacks/cross_section.py b/drillholes-demo/callbacks/cross_section.py new file mode 100644 index 0000000..81ee873 --- /dev/null +++ b/drillholes-demo/callbacks/cross_section.py @@ -0,0 +1,102 @@ +from dash import Input, Output, State, callback, clientside_callback + +from pages.cross_section import _build_figure +from utils import load_data + + +@callback( + Output("cross-section-chart", "figure"), + Input("section-orientation", "value"), +) +def update_cross_section(orientation): + collar, _, _, survey = load_data() + return _build_figure(collar, survey, orientation) + + +@callback( + Output("cs-tour", "isOpen"), + Input("cs-tour-btn", "n_clicks"), + prevent_initial_call=True, +) +def open_cs_tour(_): + return True + + +# Hide the Y-axis hint on first meaningful chart interaction (pan, zoom). +clientside_callback( + """ + function(relayoutData, currentStyle) { + if (!relayoutData) return currentStyle || {"display": "flex"}; + var ignored = {"autosize": 1, "width": 1, "height": 1}; + var keys = Object.keys(relayoutData).filter(function(k) { + return !ignored[k]; + }); + if (keys.length > 0) { + return {"display": "none"}; + } + return currentStyle || {"display": "flex"}; + } + """, + Output("cs-yaxis-hint", "style"), + Input("cross-section-chart", "relayoutData"), + State("cs-yaxis-hint", "style"), + prevent_initial_call=True, +) + + +# Elevation cursor — tracks mouse elevation across all three panels. +clientside_callback( + """ + function(hoverData, figure) { + if (!hoverData || !hoverData.points || !hoverData.points.length) { + return window.dash_clientside.no_update; + } + var elev = hoverData.points[0].y; + if (elev == null) return window.dash_clientside.no_update; + var fig = JSON.parse(JSON.stringify(figure)); + if (!fig.layout.shapes) return window.dash_clientside.no_update; + for (var i = 0; i < fig.layout.shapes.length; i++) { + var n = fig.layout.shapes[i].name || ""; + if (n === "elev-cursor-1" || n === "elev-cursor-2" || n === "elev-cursor-3") { + fig.layout.shapes[i].y0 = elev; + fig.layout.shapes[i].y1 = elev; + fig.layout.shapes[i].visible = true; + } + } + return fig; + } + """, + Output("cross-section-chart", "figure", allow_duplicate=True), + Input("cross-section-chart", "hoverData"), + State("cross-section-chart", "figure"), + prevent_initial_call=True, +) + + +# Click to pin a marker line at the clicked elevation across all three panels. +clientside_callback( + """ + function(clickData, figure) { + if (!clickData || !clickData.points || !clickData.points.length) { + return window.dash_clientside.no_update; + } + var elev = clickData.points[0].y; + if (elev == null) return window.dash_clientside.no_update; + var fig = JSON.parse(JSON.stringify(figure)); + if (!fig.layout.shapes) return window.dash_clientside.no_update; + for (var i = 0; i < fig.layout.shapes.length; i++) { + var n = fig.layout.shapes[i].name || ""; + if (n.indexOf("measure-span-") === 0) { + fig.layout.shapes[i].y0 = elev - 0.5; + fig.layout.shapes[i].y1 = elev + 0.5; + fig.layout.shapes[i].visible = true; + } + } + return fig; + } + """, + Output("cross-section-chart", "figure", allow_duplicate=True), + Input("cross-section-chart", "clickData"), + State("cross-section-chart", "figure"), + prevent_initial_call=True, +) diff --git a/drillholes-demo/callbacks/downhole.py b/drillholes-demo/callbacks/downhole.py new file mode 100644 index 0000000..63d751f --- /dev/null +++ b/drillholes-demo/callbacks/downhole.py @@ -0,0 +1,177 @@ +""" +Downhole callbacks: +1. Hole selector → rebuild strip log figure +2. Clientside callback: hoverData → update depth cursor shape (zero Python round-trip) +3. Python callback: clickData → click-to-measure state machine +4. Clear button → reset measurement +""" + +import json +import plotly.graph_objects as go +from dash import Input, Output, State, callback, clientside_callback, no_update, ctx +import dash + +from pages.downhole_logs import _strip_log_figure +from utils import load_data + + +@callback( + Output("strip-log-chart", "figure"), + Input("hole-selector", "value"), +) +def update_strip_log(hole_id): + collar, assay, lith, survey = load_data() + return _strip_log_figure(hole_id, collar, assay, lith, survey) + + +@callback( + [Output("kpi-hole-depth", "children"), + Output("kpi-lith-count", "children")], + Input("hole-selector", "value"), +) +def update_hole_kpis(hole_id): + collar, _, lith, _ = load_data() + row = collar.loc[collar["HOLEID"] == hole_id] + depth = int(row["TOTDEPTH"].iloc[0]) if not row.empty else 0 + lith_count = int(lith[lith["HOLEID"] == hole_id].shape[0]) + return f"{depth} m", str(lith_count) + + +# ── Depth cursor — clientside for zero latency ────────────────────────────── +# Plot-wide hover events fire even over empty plot areas (not just data points). +# The transparent sentinel traces in each panel ensure hoverData is populated +# anywhere along the depth axis. +clientside_callback( + """ + function(hoverData, figure) { + if (!hoverData || !hoverData.points || hoverData.points.length === 0) { + return window.dash_clientside.no_update; + } + var depth = hoverData.points[0].y; + if (depth === undefined || depth === null) { + return window.dash_clientside.no_update; + } + // Deep-copy so Dash detects the change + var fig = JSON.parse(JSON.stringify(figure)); + if (!fig.layout.shapes) return window.dash_clientside.no_update; + for (var i = 0; i < fig.layout.shapes.length; i++) { + if (fig.layout.shapes[i].name === 'depth-cursor') { + fig.layout.shapes[i].y0 = depth; + fig.layout.shapes[i].y1 = depth; + fig.layout.shapes[i].visible = true; + } + } + return fig; + } + """, + Output("strip-log-chart", "figure", allow_duplicate=True), + Input("strip-log-chart", "hoverData"), + State("strip-log-chart", "figure"), + prevent_initial_call=True, +) + + +# ── Click-to-measure state machine ────────────────────────────────────────── +@callback( + [Output("measure-readout", "children"), + Output("measure-store", "data"), + Output("strip-log-chart", "figure", allow_duplicate=True)], + [Input("strip-log-chart", "clickData"), + Input("measure-clear-btn", "n_clicks")], + [State("measure-store", "data"), + State("strip-log-chart", "figure")], + prevent_initial_call=True, +) +def handle_click_measure(click_data, clear_clicks, store, current_fig): + triggered = ctx.triggered_id + + # Clear button + if triggered == "measure-clear-btn": + fig = go.Figure(current_fig) + for shape in fig.layout.shapes: + if shape.name == "measure-span": + shape.visible = False + fig.layout.annotations = [ + a for a in fig.layout.annotations if "click again" not in (a.text or "") + ] + return "Click a depth to start measuring", None, fig + + # Click events + if not click_data or not click_data.get("points"): + return no_update, no_update, no_update + + depth = click_data["points"][0].get("y") + if depth is None: + return no_update, no_update, no_update + + fig = go.Figure(current_fig) + + # Strip any pending "click again" prompt before updating + fig.layout.annotations = [ + a for a in fig.layout.annotations if "click again" not in (a.text or "") + ] + + if store is None or store.get("first_depth") is None: + # First click: store depth + new_store = {"first_depth": float(depth)} + readout = f"From: {depth:.1f} m — click again to set end depth" + + # Show a thin line at the first click depth + for shape in fig.layout.shapes: + if shape.name == "measure-span": + shape.y0 = float(depth) + shape.y1 = float(depth) + 0.5 + shape.visible = True + + # On-chart prompt so user knows a second click is needed + fig.add_annotation( + x=0.5, y=float(depth) + 10, + xref="paper", yref="y", + text="↓ click again to set end depth", + showarrow=True, arrowhead=2, + arrowcolor="#e8a020", ax=0, ay=22, + font=dict(size=10, color="#e8a020", family="monospace"), + bgcolor="rgba(255,255,255,0.9)", + bordercolor="#e8a020", borderwidth=1, + xanchor="center", + ) + + return readout, new_store, fig + + else: + # Second click: compute interval, draw span + d1 = store["first_depth"] + d2 = float(depth) + lo, hi = min(d1, d2), max(d1, d2) + thickness = hi - lo + + for shape in fig.layout.shapes: + if shape.name == "measure-span": + shape.y0 = lo + shape.y1 = hi + shape.visible = True + + # Add annotation showing the thickness + fig.add_annotation( + x=0.98, y=(lo + hi) / 2, + xref="paper", yref="y", + text=f" {thickness:.1f} m ", + showarrow=False, + font=dict(size=11, color="#d48806", family="monospace"), + bgcolor="rgba(255,255,255,0.9)", + bordercolor="#e8a020", + borderwidth=1, + xanchor="right", + ) + + readout = f"{lo:.1f} m — {hi:.1f} m = {thickness:.1f} m interval" + return readout, None, fig # reset store for next measurement + + +@callback( + Output("dl-tour", "isOpen"), + Input("dl-tour-btn", "n_clicks"), + prevent_initial_call=True, +) +def open_dl_tour(_): + return True diff --git a/drillholes-demo/components/__init__.py b/drillholes-demo/components/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/drillholes-demo/components/overview_widgets.py b/drillholes-demo/components/overview_widgets.py new file mode 100644 index 0000000..373a1f0 --- /dev/null +++ b/drillholes-demo/components/overview_widgets.py @@ -0,0 +1,132 @@ +"""Reusable widgets sourced from the retired Overview page.""" + +import pandas as pd +import plotly.graph_objects as go +from dash import html + +from utils import CHART_LAYOUT + + +def best_au_intercept(assay: pd.DataFrame, min_width: float = 4.0) -> str: + """Best consecutive Au composite across all holes (min cumulative width in m).""" + best_grade, best_hole, best_from, best_to = 0.0, "", 0.0, 0.0 + for hole_id, grp in assay.groupby("HOLEID"): + grp = grp.sort_values("FROM").reset_index(drop=True) + for i in range(len(grp)): + for j in range(i + 1, min(i + 20, len(grp) + 1)): + sub = grp.iloc[i:j] + width = sub["TO"].iloc[-1] - sub["FROM"].iloc[0] + if width < min_width: + continue + avg = sub["Au_ppm"].mean() + if avg > best_grade: + best_grade = avg + best_hole = hole_id + best_from = sub["FROM"].iloc[0] + best_to = sub["TO"].iloc[-1] + width = best_to - best_from + return f"{best_grade:.2f} g/t / {width:.0f}m ({best_hole})" + + +def collar_map(collar: pd.DataFrame) -> go.Figure: + fig = go.Figure() + fig.add_trace(go.Scatter( + x=collar["EAST"], + y=collar["NORTH"], + mode="markers+text", + text=collar["HOLEID"], + textposition="top center", + textfont=dict(size=8, color="#6c757d"), + marker=dict( + size=10, + color=collar["TOTDEPTH"], + colorscale="Viridis", + showscale=True, + colorbar=dict( + title=dict(text="Total Depth (m)", font=dict(color="#495057")), + tickfont=dict(color="#495057"), + bgcolor="#ffffff", + bordercolor="#dee2e6", + ), + line=dict(width=1, color="#dee2e6"), + ), + hovertemplate=( + "%{text}
" + "Easting: %{x:.1f} m MGA94
" + "Northing: %{y:.1f} m MGA94
" + "Total Depth: %{marker.color:.0f} m" + "" + ), + )) + fig.update_layout(**{ + **CHART_LAYOUT, + "margin": dict(l=60, r=20, t=20, b=50), + "height": 460, + "xaxis": dict( + title="Easting (m MGA94 Zone 50)", + showgrid=True, gridcolor="#e9ecef", + tickfont=dict(color="#6c757d"), + title_font=dict(color="#495057"), + ), + "yaxis": dict( + title="Northing (m MGA94 Zone 50)", + showgrid=True, gridcolor="#e9ecef", + tickfont=dict(color="#6c757d"), + title_font=dict(color="#495057"), + scaleanchor="x", scaleratio=1, + ), + "hoverlabel": dict(bgcolor="#ffffff", font_color="#212529", bordercolor="#dee2e6"), + }) + return fig + + +def summary_table(collar: pd.DataFrame, n: int = 20): + cols = ["HOLEID", "EAST", "NORTH", "ELEV", "TOTDEPTH", "AZ", "DIP"] + rows = [] + for _, r in collar[cols].head(n).iterrows(): + rows.append(html.Tr([ + html.Td(str(r["HOLEID"]), style={"color": "#d48806", "fontWeight": "600"}), + html.Td(f"{r['EAST']:.0f}"), + html.Td(f"{r['NORTH']:.0f}"), + html.Td(f"{r['ELEV']:.0f} m RL"), + html.Td(f"{r['TOTDEPTH']:.0f} m"), + html.Td(f"{r['AZ']:.0f}°"), + html.Td(f"{r['DIP']:.0f}°"), + ])) + return html.Table( + [html.Thead(html.Tr([html.Th(c) for c in ["Hole", "East", "North", "RL", "Depth", "Az", "Dip"]]))] + + [html.Tbody(rows)], + className="data-table", + ) + + +def depth_histogram(collar: pd.DataFrame) -> go.Figure: + fig = go.Figure() + fig.add_trace(go.Histogram( + x=collar["TOTDEPTH"], + nbinsx=15, + marker=dict(color="#e8a020", line=dict(color="#ffffff", width=1)), + hovertemplate="Depth: %{x:.0f} m
Number of holes: %{y}", + name="", + )) + fig.update_layout(**{ + **CHART_LAYOUT, + "height": 200, + "margin": dict(l=50, r=20, t=10, b=40), + "xaxis": dict( + title="Total Depth (m)", + showgrid=True, gridcolor="#e9ecef", + tickfont=dict(color="#6c757d"), + title_font=dict(color="#495057"), + ), + "yaxis": dict( + title="Number of Holes", + showgrid=True, gridcolor="#e9ecef", + tickfont=dict(color="#6c757d"), + title_font=dict(color="#495057"), + ), + "bargap": 0.05, + "showlegend": False, + "hoverlabel": dict(bgcolor="#ffffff", font_color="#212529", bordercolor="#dee2e6"), + }) + return fig diff --git a/drillholes-demo/data/assay.csv b/drillholes-demo/data/assay.csv new file mode 100644 index 0000000..8f3d860 --- /dev/null +++ b/drillholes-demo/data/assay.csv @@ -0,0 +1,7665 @@ +HOLEID,FROM,TO,Au_ppm,Cu_pct,Ag_ppm +DH001,0.0,2.0,0.093,0.0104,0.112 +DH001,2.0,4.0,0.089,0.0057,0.092 +DH001,4.0,6.0,0.257,0.0146,0.293 +DH001,6.0,8.0,0.152,0.0169,0.199 +DH001,8.0,10.0,0.021,0.0252,0.013 +DH001,10.0,12.0,0.045,0.0195,0.064 +DH001,12.0,14.0,0.06,0.0248,0.043 +DH001,14.0,16.0,0.154,0.0091,0.088 +DH001,16.0,18.0,0.26,0.0322,0.165 +DH001,18.0,20.0,0.047,0.0141,0.059 +DH001,20.0,22.0,0.084,0.0175,0.096 +DH001,22.0,24.0,0.072,0.0089,0.068 +DH001,24.0,26.0,0.142,0.0092,0.095 +DH001,26.0,28.0,0.05,0.0194,0.033 +DH001,28.0,30.0,0.199,0.0236,0.165 +DH001,30.0,32.0,0.123,0.0124,0.071 +DH001,32.0,34.0,0.099,0.0143,0.071 +DH001,34.0,36.0,0.052,0.0134,0.041 +DH001,36.0,38.0,0.058,0.0317,0.062 +DH001,38.0,40.0,0.229,0.0569,0.257 +DH001,40.0,42.0,0.086,0.0102,0.101 +DH001,42.0,44.0,0.056,0.0108,0.053 +DH001,44.0,46.0,0.075,0.01,0.054 +DH001,46.0,48.0,0.047,0.0746,0.035 +DH001,48.0,50.0,0.068,0.0146,0.086 +DH001,50.0,52.0,0.038,0.043,0.042 +DH001,52.0,54.0,0.098,0.0093,0.101 +DH001,54.0,56.0,0.042,0.0381,0.024 +DH001,56.0,58.0,0.087,0.0054,0.124 +DH001,58.0,60.0,0.124,0.0336,0.181 +DH001,60.0,62.0,0.032,0.0213,0.023 +DH001,62.0,64.0,0.03,0.0182,0.028 +DH001,64.0,66.0,0.069,0.0073,0.036 +DH001,66.0,68.0,0.067,0.017,0.097 +DH001,68.0,70.0,0.063,0.018,0.052 +DH001,70.0,72.0,0.068,0.0149,0.086 +DH001,72.0,74.0,0.026,0.0232,0.026 +DH001,74.0,76.0,0.084,0.0296,0.126 +DH001,76.0,78.0,0.025,0.021,0.019 +DH001,78.0,80.0,0.091,0.0145,0.136 +DH001,80.0,82.0,6.815,0.3286,16.756 +DH001,82.0,84.0,0.177,0.4129,0.32 +DH001,84.0,86.0,4.823,0.1104,9.429 +DH001,86.0,88.0,6.25,0.7765,18.611 +DH001,88.0,90.0,1.696,0.4057,3.229 +DH001,90.0,92.0,0.582,0.3109,1.363 +DH001,92.0,94.0,2.473,0.266,5.225 +DH001,94.0,96.0,13.117,0.1085,26.182 +DH001,96.0,98.0,2.255,0.4508,6.26 +DH001,98.0,100.0,0.462,0.0437,1.219 +DH001,100.0,102.0,0.582,0.164,1.148 +DH001,102.0,104.0,1.031,0.2685,1.971 +DH001,104.0,106.0,4.986,0.3263,11.829 +DH001,106.0,108.0,1.818,0.5143,3.15 +DH001,108.0,110.0,0.416,0.377,0.901 +DH001,110.0,112.0,12.122,0.5063,34.421 +DH001,112.0,114.0,2.688,0.1888,7.676 +DH001,114.0,116.0,1.426,0.2694,2.573 +DH001,116.0,118.0,1.134,0.1363,2.721 +DH001,118.0,120.0,0.62,0.0517,1.21 +DH001,120.0,122.0,19.506,0.6979,35.824 +DH001,122.0,124.0,5.311,0.6961,13.635 +DH001,124.0,126.0,2.514,0.0448,6.199 +DH001,126.0,128.0,0.621,0.2618,1.687 +DH001,128.0,130.0,4.269,0.5064,9.446 +DH001,130.0,132.0,0.569,0.0398,0.889 +DH001,132.0,134.0,1.107,0.0645,2.349 +DH001,134.0,136.0,1.297,0.0944,3.746 +DH001,136.0,138.0,8.049,0.3614,12.289 +DH001,138.0,140.0,4.678,0.0881,7.102 +DH001,140.0,142.0,2.656,0.1532,7.593 +DH001,142.0,144.0,0.872,0.3355,1.411 +DH001,144.0,146.0,0.067,0.5782,0.163 +DH001,146.0,148.0,1.063,0.5068,1.839 +DH001,148.0,150.0,0.383,0.093,0.994 +DH001,150.0,152.0,0.222,0.5506,0.502 +DH001,152.0,154.0,0.532,0.1399,1.383 +DH001,154.0,156.0,6.293,0.4009,11.513 +DH001,156.0,158.0,1.371,0.1119,3.567 +DH001,158.0,160.0,0.44,0.8052,0.91 +DH001,160.0,162.0,0.552,0.1298,1.34 +DH001,162.0,164.0,0.482,0.2407,1.224 +DH001,164.0,166.0,0.163,0.1647,0.265 +DH001,166.0,168.0,0.902,0.1078,1.45 +DH001,168.0,170.0,24.561,0.2334,47.346 +DH001,170.0,172.0,0.264,0.1322,0.602 +DH001,172.0,174.0,0.651,0.4614,1.907 +DH001,174.0,176.0,1.578,0.1396,4.463 +DH001,176.0,178.0,1.032,0.1797,1.784 +DH001,178.0,180.0,0.922,0.3289,1.779 +DH001,180.0,182.0,2.001,0.1581,4.245 +DH001,182.0,184.0,1.677,0.1746,2.596 +DH001,184.0,186.0,17.046,0.0764,42.222 +DH001,186.0,188.0,0.23,0.2655,0.43 +DH001,188.0,190.0,4.0,0.2558,10.863 +DH001,190.0,192.0,2.31,0.1824,5.522 +DH001,192.0,194.0,1.572,0.2615,3.17 +DH001,194.0,196.0,0.846,0.0752,2.262 +DH001,196.0,198.0,4.282,0.2686,10.285 +DH001,198.0,200.0,2.473,0.3053,6.631 +DH001,200.0,202.0,1.994,0.1459,5.925 +DH001,202.0,204.0,1.294,0.131,3.002 +DH001,204.0,206.0,3.011,0.0725,8.977 +DH001,206.0,208.0,1.988,0.0917,5.494 +DH001,208.0,210.0,4.715,0.0811,13.991 +DH001,210.0,212.0,4.906,0.2213,14.318 +DH001,212.0,214.0,2.694,0.2182,4.408 +DH001,214.0,216.0,4.474,0.3267,10.082 +DH001,216.0,218.0,0.862,0.2476,1.946 +DH001,218.0,220.0,0.449,0.0687,0.862 +DH001,220.0,222.0,0.098,0.263,0.225 +DH001,222.0,224.0,10.696,0.1504,20.88 +DH001,224.0,226.0,1.382,0.2444,2.488 +DH001,226.0,228.0,1.278,0.4952,3.209 +DH001,228.0,230.0,3.169,0.4668,6.412 +DH001,230.0,232.0,22.192,0.1211,45.315 +DH001,232.0,234.0,0.675,0.3785,1.229 +DH001,234.0,236.0,2.516,0.0909,3.921 +DH001,236.0,238.0,0.512,0.5639,0.951 +DH001,238.0,240.0,3.455,0.3558,10.037 +DH001,240.0,242.0,0.254,0.1378,0.652 +DH001,242.0,244.0,0.392,0.885,0.684 +DH001,244.0,246.0,3.51,0.1743,6.202 +DH001,246.0,248.0,7.081,0.2174,20.476 +DH001,248.0,250.0,1.759,0.1697,2.924 +DH001,250.0,252.0,0.025,0.0161,0.013 +DH001,252.0,254.0,0.058,0.0096,0.051 +DH001,254.0,256.0,0.085,0.0062,0.07 +DH001,256.0,258.0,0.105,0.0222,0.074 +DH001,258.0,260.0,0.09,0.0305,0.129 +DH001,260.0,262.0,0.078,0.0145,0.063 +DH001,262.0,264.0,0.109,0.0202,0.146 +DH001,264.0,266.0,0.089,0.0276,0.113 +DH001,266.0,268.0,0.131,0.0283,0.188 +DH001,268.0,270.0,0.028,0.0396,0.035 +DH001,270.0,272.0,0.029,0.0128,0.016 +DH001,272.0,274.0,0.069,0.0142,0.077 +DH001,274.0,276.0,0.044,0.0123,0.034 +DH001,276.0,278.0,0.104,0.0235,0.098 +DH001,278.0,280.0,0.092,0.0234,0.086 +DH001,280.0,282.0,0.085,0.0193,0.119 +DH001,282.0,284.0,0.13,0.0242,0.131 +DH001,284.0,286.0,0.051,0.0189,0.051 +DH001,286.0,288.0,0.092,0.0552,0.098 +DH001,288.0,290.0,0.106,0.0312,0.08 +DH001,290.0,292.0,0.334,0.0152,0.49 +DH001,292.0,294.0,0.051,0.0154,0.052 +DH001,294.0,296.0,0.136,0.0215,0.148 +DH001,296.0,298.0,0.078,0.0155,0.048 +DH001,298.0,300.0,0.104,0.0128,0.058 +DH001,300.0,302.0,0.047,0.0293,0.026 +DH001,302.0,304.0,0.089,0.0177,0.103 +DH001,304.0,306.0,0.049,0.0107,0.069 +DH001,306.0,308.0,0.118,0.0216,0.128 +DH001,308.0,310.0,0.123,0.0126,0.081 +DH001,310.0,312.0,0.047,0.0351,0.046 +DH001,312.0,314.0,0.118,0.0342,0.072 +DH001,314.0,316.0,0.029,0.0127,0.024 +DH001,316.0,318.0,0.049,0.0107,0.045 +DH001,318.0,320.0,0.04,0.0217,0.03 +DH001,320.0,322.0,0.11,0.0236,0.059 +DH001,322.0,324.0,0.066,0.0529,0.076 +DH001,324.0,326.0,0.027,0.0111,0.034 +DH001,326.0,328.0,0.083,0.0172,0.068 +DH001,328.0,330.0,0.274,0.0241,0.219 +DH001,330.0,332.0,0.047,0.0111,0.035 +DH001,332.0,334.0,0.091,0.0072,0.069 +DH001,334.0,336.0,0.083,0.0164,0.07 +DH001,336.0,338.0,0.059,0.0168,0.052 +DH001,338.0,340.0,0.118,0.0314,0.121 +DH001,340.0,342.0,0.062,0.0228,0.035 +DH001,342.0,344.0,0.063,0.0272,0.094 +DH001,344.0,346.0,0.178,0.0446,0.189 +DH001,346.0,348.0,0.083,0.0184,0.083 +DH001,348.0,350.0,0.056,0.0087,0.063 +DH001,350.0,352.0,0.052,0.0191,0.069 +DH001,352.0,354.0,0.042,0.0206,0.045 +DH001,354.0,356.0,0.116,0.0546,0.133 +DH001,356.0,358.0,0.11,0.0107,0.092 +DH001,358.0,360.0,0.212,0.0115,0.126 +DH001,360.0,362.0,0.08,0.0175,0.056 +DH001,362.0,364.0,0.068,0.0339,0.083 +DH001,364.0,366.0,0.036,0.0293,0.028 +DH001,366.0,368.0,0.057,0.0083,0.031 +DH001,368.0,370.0,0.079,0.0328,0.115 +DH001,370.0,372.0,0.078,0.0257,0.077 +DH001,372.0,374.0,0.153,0.0101,0.156 +DH001,374.0,376.0,0.095,0.0315,0.133 +DH001,376.0,378.0,0.02,0.0124,0.017 +DH001,378.0,380.0,0.073,0.0233,0.058 +DH001,380.0,382.0,0.118,0.0165,0.118 +DH001,382.0,384.0,0.062,0.0226,0.035 +DH001,384.0,386.0,0.12,0.0288,0.091 +DH001,386.0,388.0,0.013,0.0097,0.009 +DH001,388.0,390.0,0.059,0.0068,0.064 +DH001,390.0,392.0,0.083,0.0318,0.053 +DH001,392.0,394.0,0.108,0.022,0.148 +DH001,394.0,396.0,0.322,0.0298,0.183 +DH001,396.0,398.0,0.107,0.0324,0.132 +DH002,0.0,2.0,0.064,0.0328,0.036 +DH002,2.0,4.0,0.384,0.0126,0.226 +DH002,4.0,6.0,0.068,0.0143,0.092 +DH002,6.0,8.0,0.016,0.0147,0.014 +DH002,8.0,10.0,0.061,0.0482,0.061 +DH002,10.0,12.0,0.178,0.0209,0.237 +DH002,12.0,14.0,0.097,0.0363,0.135 +DH002,14.0,16.0,0.111,0.022,0.084 +DH002,16.0,18.0,0.105,0.056,0.107 +DH002,18.0,20.0,0.106,0.0344,0.085 +DH002,20.0,22.0,0.083,0.0056,0.054 +DH002,22.0,24.0,0.022,0.0382,0.014 +DH002,24.0,26.0,0.15,0.0117,0.11 +DH002,26.0,28.0,0.096,0.018,0.053 +DH002,28.0,30.0,0.086,0.0731,0.047 +DH002,30.0,32.0,0.154,0.0279,0.168 +DH002,32.0,34.0,0.073,0.0066,0.037 +DH002,34.0,36.0,0.134,0.0113,0.101 +DH002,36.0,38.0,0.054,0.0388,0.057 +DH002,38.0,40.0,0.121,0.025,0.152 +DH002,40.0,42.0,0.092,0.0101,0.069 +DH002,42.0,44.0,0.09,0.0215,0.075 +DH002,44.0,46.0,0.211,0.0402,0.311 +DH002,46.0,48.0,0.066,0.0233,0.066 +DH002,48.0,50.0,0.2,0.0321,0.205 +DH002,50.0,52.0,0.048,0.0272,0.03 +DH002,52.0,54.0,0.071,0.0173,0.042 +DH002,54.0,56.0,0.066,0.0054,0.038 +DH002,56.0,58.0,0.054,0.0187,0.068 +DH002,58.0,60.0,0.07,0.0272,0.076 +DH002,60.0,62.0,0.06,0.0258,0.088 +DH002,62.0,64.0,0.031,0.0256,0.029 +DH002,64.0,66.0,0.08,0.0069,0.053 +DH002,66.0,68.0,0.03,0.0214,0.03 +DH002,68.0,70.0,0.041,0.0147,0.037 +DH002,70.0,72.0,0.056,0.0246,0.065 +DH002,72.0,74.0,0.148,0.0211,0.191 +DH002,74.0,76.0,0.049,0.008,0.038 +DH002,76.0,78.0,0.066,0.0056,0.078 +DH002,78.0,80.0,0.048,0.0403,0.035 +DH002,80.0,82.0,0.395,0.5423,0.943 +DH002,82.0,84.0,0.91,0.1346,1.975 +DH002,84.0,86.0,0.136,0.0503,0.311 +DH002,86.0,88.0,14.294,0.1575,24.508 +DH002,88.0,90.0,8.676,1.2038,25.301 +DH002,90.0,92.0,2.181,0.9585,3.618 +DH002,92.0,94.0,7.638,0.0988,15.848 +DH002,94.0,96.0,1.663,0.1037,2.772 +DH002,96.0,98.0,0.298,0.1016,0.626 +DH002,98.0,100.0,7.35,0.2011,20.766 +DH002,100.0,102.0,4.417,0.1026,8.028 +DH002,102.0,104.0,5.949,1.7912,9.226 +DH002,104.0,106.0,1.284,0.4128,3.524 +DH002,106.0,108.0,1.171,0.1616,3.408 +DH002,108.0,110.0,0.824,0.1607,2.031 +DH002,110.0,112.0,7.353,0.1376,12.347 +DH002,112.0,114.0,0.223,0.0815,0.615 +DH002,114.0,116.0,1.849,0.0862,4.294 +DH002,116.0,118.0,0.879,0.1569,2.061 +DH002,118.0,120.0,4.925,0.226,14.127 +DH002,120.0,122.0,1.323,0.29,3.776 +DH002,122.0,124.0,0.749,0.2297,1.82 +DH002,124.0,126.0,2.869,0.4105,4.375 +DH002,126.0,128.0,19.685,0.1103,52.601 +DH002,128.0,130.0,2.132,0.2059,4.828 +DH002,130.0,132.0,2.531,0.4397,5.086 +DH002,132.0,134.0,2.22,0.4284,3.905 +DH002,134.0,136.0,5.58,0.1213,12.917 +DH002,136.0,138.0,31.588,0.2024,92.394 +DH002,138.0,140.0,1.153,0.5978,1.773 +DH002,140.0,142.0,3.0,0.5,4.64 +DH002,142.0,144.0,9.595,0.4656,25.141 +DH002,144.0,146.0,3.423,0.4603,7.168 +DH002,146.0,148.0,1.081,0.8741,2.685 +DH002,148.0,150.0,5.847,0.2463,13.66 +DH002,150.0,152.0,2.255,0.7038,5.227 +DH002,152.0,154.0,0.285,0.1878,0.796 +DH002,154.0,156.0,1.722,0.0528,2.781 +DH002,156.0,158.0,5.047,0.211,10.942 +DH002,158.0,160.0,8.157,0.1446,17.754 +DH002,160.0,162.0,4.266,0.2714,12.114 +DH002,162.0,164.0,1.804,0.5151,5.178 +DH002,164.0,166.0,0.318,0.3648,0.926 +DH002,166.0,168.0,3.96,0.3092,9.905 +DH002,168.0,170.0,5.726,0.2151,8.86 +DH002,170.0,172.0,1.531,1.1236,2.83 +DH002,172.0,174.0,4.054,0.0582,11.473 +DH002,174.0,176.0,1.323,0.0421,3.517 +DH002,176.0,178.0,1.411,0.0416,2.534 +DH002,178.0,180.0,12.454,0.735,35.533 +DH002,180.0,182.0,2.352,0.6457,4.334 +DH002,182.0,184.0,8.674,0.1051,18.507 +DH002,184.0,186.0,3.771,0.0525,7.289 +DH002,186.0,188.0,34.042,0.3723,76.419 +DH002,188.0,190.0,2.772,0.2104,6.324 +DH002,190.0,192.0,0.836,0.1032,1.517 +DH002,192.0,194.0,11.551,0.101,29.744 +DH002,194.0,196.0,2.005,0.2928,5.603 +DH002,196.0,198.0,7.339,0.2384,19.039 +DH002,198.0,200.0,3.226,0.3676,8.935 +DH002,200.0,202.0,29.678,0.3249,80.749 +DH002,202.0,204.0,0.323,0.1155,0.934 +DH002,204.0,206.0,3.14,0.0483,5.209 +DH002,206.0,208.0,1.159,0.6901,2.428 +DH002,208.0,210.0,2.845,0.573,6.366 +DH002,210.0,212.0,0.676,0.1907,1.085 +DH002,212.0,214.0,0.451,0.0588,1.091 +DH002,214.0,216.0,1.079,0.163,2.383 +DH002,216.0,218.0,0.985,0.2218,2.176 +DH002,218.0,220.0,0.882,0.8402,1.775 +DH002,220.0,222.0,0.98,0.7633,1.696 +DH002,222.0,224.0,1.147,0.1971,2.994 +DH002,224.0,226.0,12.929,0.1161,24.341 +DH002,226.0,228.0,2.48,0.1014,5.138 +DH002,228.0,230.0,2.24,0.5555,6.299 +DH002,230.0,232.0,5.08,0.5862,7.864 +DH002,232.0,234.0,1.722,0.3796,4.361 +DH002,234.0,236.0,4.51,0.208,12.261 +DH002,236.0,238.0,0.706,0.7101,2.004 +DH002,238.0,240.0,15.934,0.1479,39.263 +DH002,240.0,242.0,39.3,0.0958,73.667 +DH002,242.0,244.0,2.705,0.6245,4.976 +DH002,244.0,246.0,2.171,0.1396,3.296 +DH002,246.0,248.0,0.711,0.1932,1.928 +DH002,248.0,250.0,0.664,0.1274,1.163 +DH002,250.0,252.0,0.035,0.0148,0.022 +DH002,252.0,254.0,0.065,0.016,0.032 +DH002,254.0,256.0,0.055,0.0259,0.046 +DH002,256.0,258.0,0.062,0.0233,0.042 +DH002,258.0,260.0,0.102,0.0401,0.11 +DH002,260.0,262.0,0.028,0.023,0.019 +DH002,262.0,264.0,0.072,0.0301,0.092 +DH002,264.0,266.0,0.034,0.0197,0.034 +DH002,266.0,268.0,0.071,0.0349,0.087 +DH002,268.0,270.0,0.038,0.0109,0.053 +DH002,270.0,272.0,0.066,0.0369,0.079 +DH002,272.0,274.0,0.11,0.0197,0.127 +DH002,274.0,276.0,0.049,0.0281,0.04 +DH002,276.0,278.0,0.136,0.0331,0.128 +DH002,278.0,280.0,0.074,0.0224,0.11 +DH002,280.0,282.0,0.098,0.0173,0.137 +DH002,282.0,284.0,0.125,0.0176,0.107 +DH002,284.0,286.0,0.075,0.0189,0.057 +DH002,286.0,288.0,0.09,0.0308,0.055 +DH002,288.0,290.0,0.091,0.0349,0.065 +DH002,290.0,292.0,0.091,0.0137,0.095 +DH002,292.0,294.0,0.048,0.0168,0.064 +DH002,294.0,296.0,0.038,0.0102,0.057 +DH002,296.0,298.0,0.231,0.0145,0.261 +DH002,298.0,300.0,0.064,0.0114,0.082 +DH002,300.0,302.0,0.359,0.0367,0.201 +DH002,302.0,304.0,0.121,0.0121,0.09 +DH002,304.0,306.0,0.151,0.0327,0.103 +DH002,306.0,308.0,0.062,0.0169,0.085 +DH002,308.0,310.0,0.044,0.0223,0.023 +DH002,310.0,312.0,0.031,0.0194,0.034 +DH002,312.0,314.0,0.04,0.0252,0.032 +DH002,314.0,316.0,0.129,0.0283,0.187 +DH002,316.0,318.0,0.031,0.014,0.03 +DH002,318.0,320.0,0.059,0.0129,0.073 +DH002,320.0,322.0,0.235,0.0277,0.226 +DH002,322.0,324.0,0.147,0.0244,0.168 +DH002,324.0,326.0,0.074,0.0148,0.065 +DH002,326.0,328.0,0.115,0.0145,0.107 +DH002,328.0,330.0,0.045,0.0389,0.032 +DH002,330.0,332.0,0.111,0.0312,0.063 +DH002,332.0,334.0,0.087,0.0184,0.076 +DH002,334.0,336.0,0.058,0.0146,0.048 +DH002,336.0,338.0,0.077,0.0124,0.089 +DH002,338.0,340.0,0.159,0.0257,0.145 +DH002,340.0,342.0,0.07,0.0244,0.042 +DH002,342.0,344.0,0.07,0.0297,0.064 +DH002,344.0,346.0,0.046,0.0119,0.024 +DH002,346.0,348.0,0.231,0.007,0.12 +DH002,348.0,350.0,0.036,0.0133,0.028 +DH002,350.0,352.0,0.064,0.014,0.032 +DH002,352.0,354.0,0.06,0.0088,0.062 +DH002,354.0,356.0,0.129,0.0279,0.093 +DH002,356.0,358.0,0.098,0.0257,0.06 +DH002,358.0,360.0,0.083,0.0173,0.122 +DH002,360.0,362.0,0.26,0.008,0.387 +DH002,362.0,364.0,0.047,0.0299,0.033 +DH002,364.0,366.0,0.045,0.0234,0.04 +DH002,366.0,368.0,0.114,0.0206,0.171 +DH002,368.0,370.0,0.086,0.0168,0.126 +DH002,370.0,372.0,0.116,0.0264,0.124 +DH002,372.0,374.0,0.044,0.0138,0.045 +DH002,374.0,376.0,0.132,0.0298,0.086 +DH002,376.0,378.0,0.194,0.0363,0.104 +DH002,378.0,380.0,0.05,0.0403,0.025 +DH002,380.0,382.0,0.089,0.0155,0.05 +DH002,382.0,384.0,0.034,0.0251,0.037 +DH002,384.0,386.0,0.515,0.0106,0.563 +DH002,386.0,388.0,0.111,0.0393,0.154 +DH002,388.0,390.0,0.116,0.0073,0.095 +DH002,390.0,392.0,0.043,0.0071,0.022 +DH002,392.0,394.0,0.021,0.0095,0.028 +DH002,394.0,396.0,0.05,0.0223,0.046 +DH002,396.0,398.0,0.14,0.0267,0.205 +DH002,398.0,400.0,0.082,0.0213,0.105 +DH002,400.0,402.0,0.089,0.015,0.091 +DH002,402.0,404.0,0.05,0.0226,0.026 +DH002,404.0,406.0,0.055,0.0132,0.033 +DH002,406.0,408.0,0.148,0.019,0.154 +DH002,408.0,410.0,0.133,0.0138,0.143 +DH002,410.0,412.0,0.151,0.014,0.174 +DH002,412.0,414.0,0.084,0.0324,0.085 +DH002,414.0,416.0,0.04,0.024,0.048 +DH002,416.0,418.0,0.255,0.0183,0.284 +DH002,418.0,419.0,0.102,0.0484,0.113 +DH003,0.0,2.0,0.246,0.011,0.138 +DH003,2.0,4.0,0.053,0.0205,0.059 +DH003,4.0,6.0,0.056,0.0131,0.045 +DH003,6.0,8.0,0.133,0.021,0.129 +DH003,8.0,10.0,0.068,0.0126,0.101 +DH003,10.0,12.0,0.166,0.0311,0.182 +DH003,12.0,14.0,0.016,0.0076,0.009 +DH003,14.0,16.0,0.065,0.0126,0.039 +DH003,16.0,18.0,0.175,0.0185,0.139 +DH003,18.0,20.0,0.076,0.0205,0.091 +DH003,20.0,22.0,0.106,0.0263,0.153 +DH003,22.0,24.0,0.041,0.0267,0.03 +DH003,24.0,26.0,0.067,0.0052,0.066 +DH003,26.0,28.0,0.045,0.0239,0.029 +DH003,28.0,30.0,0.092,0.0486,0.101 +DH003,30.0,32.0,0.081,0.0213,0.046 +DH003,32.0,34.0,0.083,0.0082,0.124 +DH003,34.0,36.0,0.055,0.0506,0.028 +DH003,36.0,38.0,0.152,0.0178,0.134 +DH003,38.0,40.0,0.058,0.0194,0.055 +DH003,40.0,42.0,0.051,0.0172,0.073 +DH003,42.0,44.0,0.326,0.0175,0.195 +DH003,44.0,46.0,0.073,0.0209,0.081 +DH003,46.0,48.0,0.063,0.0203,0.045 +DH003,48.0,50.0,0.094,0.0366,0.088 +DH003,50.0,52.0,0.218,0.0178,0.19 +DH003,52.0,54.0,0.061,0.0125,0.042 +DH003,54.0,56.0,0.332,0.0276,0.172 +DH003,56.0,58.0,0.174,0.0258,0.212 +DH003,58.0,60.0,0.032,0.016,0.027 +DH003,60.0,62.0,0.025,0.0311,0.019 +DH003,62.0,64.0,0.128,0.0596,0.148 +DH003,64.0,66.0,0.064,0.0194,0.052 +DH003,66.0,68.0,0.058,0.0134,0.061 +DH003,68.0,70.0,0.103,0.0066,0.151 +DH003,70.0,72.0,0.202,0.0224,0.118 +DH003,72.0,74.0,0.074,0.0184,0.108 +DH003,74.0,76.0,0.036,0.012,0.046 +DH003,76.0,78.0,0.077,0.0244,0.064 +DH003,78.0,80.0,0.102,0.0316,0.146 +DH003,80.0,82.0,2.63,0.2067,6.75 +DH003,82.0,84.0,2.041,0.6113,4.999 +DH003,84.0,86.0,0.765,0.1505,1.458 +DH003,86.0,88.0,1.422,0.329,2.841 +DH003,88.0,90.0,6.467,0.6969,11.548 +DH003,90.0,92.0,0.725,0.1083,1.228 +DH003,92.0,94.0,1.295,0.0898,2.772 +DH003,94.0,96.0,1.259,0.1304,1.97 +DH003,96.0,98.0,9.154,0.2617,25.306 +DH003,98.0,100.0,2.731,0.1769,5.639 +DH003,100.0,102.0,3.028,0.3161,9.065 +DH003,102.0,104.0,0.807,0.4436,1.985 +DH003,104.0,106.0,0.338,0.4134,0.942 +DH003,106.0,108.0,0.796,0.2215,1.908 +DH003,108.0,110.0,0.491,0.516,0.874 +DH003,110.0,112.0,0.588,0.2681,0.933 +DH003,112.0,114.0,1.265,0.4031,3.761 +DH003,114.0,116.0,0.751,0.2524,1.932 +DH003,116.0,118.0,9.833,0.1311,16.169 +DH003,118.0,120.0,0.869,0.9617,2.09 +DH003,120.0,122.0,10.959,0.132,28.123 +DH003,122.0,124.0,4.525,0.099,7.06 +DH003,124.0,126.0,5.683,0.5179,8.561 +DH003,126.0,128.0,2.348,0.4093,4.428 +DH003,128.0,130.0,0.471,0.1164,0.748 +DH003,130.0,132.0,9.569,0.8128,26.757 +DH003,132.0,134.0,3.142,0.4062,5.632 +DH003,134.0,136.0,1.852,0.1154,4.722 +DH003,136.0,138.0,3.321,0.2588,7.746 +DH003,138.0,140.0,4.286,0.2709,12.419 +DH003,140.0,142.0,2.114,0.3105,6.079 +DH003,142.0,144.0,3.468,0.3809,7.37 +DH003,144.0,146.0,2.368,0.1355,3.942 +DH003,146.0,148.0,0.577,0.6142,1.472 +DH003,148.0,150.0,4.242,1.0809,7.294 +DH003,150.0,152.0,84.615,0.186,162.536 +DH003,152.0,154.0,1.381,0.3006,3.753 +DH003,154.0,156.0,1.941,0.9244,3.317 +DH003,156.0,158.0,3.079,0.1078,5.518 +DH003,158.0,160.0,1.895,0.1372,4.091 +DH003,160.0,162.0,54.933,0.1807,90.634 +DH003,162.0,164.0,0.963,0.2141,2.822 +DH003,164.0,166.0,4.331,0.3834,8.589 +DH003,166.0,168.0,3.349,0.1107,9.64 +DH003,168.0,170.0,0.74,0.0862,1.727 +DH003,170.0,172.0,5.085,0.4874,14.336 +DH003,172.0,174.0,5.653,0.0545,13.169 +DH003,174.0,176.0,2.753,0.3685,4.283 +DH003,176.0,178.0,0.681,0.0673,1.337 +DH003,178.0,180.0,4.384,0.3875,7.097 +DH003,180.0,182.0,0.686,0.1251,1.519 +DH003,182.0,184.0,0.434,0.0715,0.774 +DH003,184.0,186.0,2.468,0.0868,4.221 +DH003,186.0,188.0,7.927,0.0788,19.52 +DH003,188.0,190.0,7.612,0.1597,20.778 +DH003,190.0,192.0,8.991,0.1747,17.853 +DH004,0.0,2.0,0.106,0.0154,0.057 +DH004,2.0,4.0,0.099,0.0305,0.069 +DH004,4.0,6.0,0.084,0.0178,0.077 +DH004,6.0,8.0,0.044,0.0305,0.038 +DH004,8.0,10.0,0.037,0.0335,0.037 +DH004,10.0,12.0,0.15,0.0374,0.188 +DH004,12.0,14.0,0.03,0.0073,0.016 +DH004,14.0,16.0,0.058,0.0116,0.044 +DH004,16.0,18.0,0.119,0.0089,0.062 +DH004,18.0,20.0,0.203,0.0107,0.291 +DH004,20.0,22.0,0.061,0.0241,0.069 +DH004,22.0,24.0,0.128,0.0289,0.158 +DH004,24.0,26.0,0.16,0.012,0.13 +DH004,26.0,28.0,0.096,0.0233,0.116 +DH004,28.0,30.0,0.049,0.0093,0.067 +DH004,30.0,32.0,0.092,0.0325,0.092 +DH004,32.0,34.0,0.035,0.0297,0.027 +DH004,34.0,36.0,0.101,0.0133,0.087 +DH004,36.0,38.0,0.049,0.0155,0.067 +DH004,38.0,40.0,0.043,0.0216,0.036 +DH004,40.0,42.0,0.061,0.0223,0.037 +DH004,42.0,44.0,0.08,0.0157,0.104 +DH004,44.0,46.0,0.157,0.0156,0.14 +DH004,46.0,48.0,0.065,0.007,0.035 +DH004,48.0,50.0,0.146,0.0064,0.125 +DH004,50.0,52.0,0.065,0.0438,0.076 +DH004,52.0,54.0,0.059,0.0352,0.05 +DH004,54.0,56.0,0.15,0.0093,0.123 +DH004,56.0,58.0,0.064,0.011,0.074 +DH004,58.0,60.0,0.097,0.0143,0.135 +DH004,60.0,62.0,0.058,0.025,0.038 +DH004,62.0,64.0,0.079,0.0147,0.04 +DH004,64.0,66.0,0.114,0.0513,0.166 +DH004,66.0,68.0,0.147,0.0858,0.21 +DH004,68.0,70.0,0.11,0.026,0.13 +DH004,70.0,72.0,0.063,0.0142,0.059 +DH004,72.0,74.0,0.074,0.0196,0.089 +DH004,74.0,76.0,0.138,0.0169,0.171 +DH004,76.0,78.0,0.162,0.027,0.099 +DH004,78.0,80.0,0.068,0.0199,0.039 +DH004,80.0,82.0,6.633,0.28,18.977 +DH004,82.0,84.0,2.404,0.1301,5.465 +DH004,84.0,86.0,2.277,0.217,3.76 +DH004,86.0,88.0,1.381,0.2334,3.131 +DH004,88.0,90.0,1.655,0.3297,3.059 +DH004,90.0,92.0,0.315,0.1689,0.5 +DH004,92.0,94.0,16.862,0.4172,33.95 +DH004,94.0,96.0,1.684,0.274,2.915 +DH004,96.0,98.0,4.251,0.1071,11.978 +DH004,98.0,100.0,3.685,0.4319,8.638 +DH004,100.0,102.0,1.471,0.0257,2.753 +DH004,102.0,104.0,10.093,0.1467,20.117 +DH004,104.0,106.0,2.715,0.2134,6.5 +DH004,106.0,108.0,2.882,0.1062,4.498 +DH004,108.0,110.0,0.478,0.2286,0.958 +DH004,110.0,112.0,3.202,0.2465,6.379 +DH004,112.0,114.0,0.352,0.0684,0.824 +DH004,114.0,116.0,2.204,0.1372,6.58 +DH004,116.0,118.0,1.592,0.1031,4.542 +DH004,118.0,120.0,2.918,0.2894,6.353 +DH004,120.0,122.0,0.997,0.2104,1.927 +DH004,122.0,124.0,2.164,0.1495,5.257 +DH004,124.0,126.0,1.206,0.0945,3.557 +DH004,126.0,128.0,0.857,0.0966,1.995 +DH004,128.0,130.0,4.578,0.1083,9.836 +DH004,130.0,132.0,0.239,0.1502,0.694 +DH004,132.0,134.0,5.989,0.1261,15.319 +DH004,134.0,136.0,0.361,0.0822,0.921 +DH004,136.0,138.0,16.533,0.3311,37.158 +DH004,138.0,140.0,0.348,0.216,0.97 +DH004,140.0,142.0,0.197,0.2475,0.535 +DH004,142.0,144.0,0.59,0.2351,1.233 +DH004,144.0,146.0,6.912,0.2489,16.284 +DH004,146.0,148.0,2.247,0.2035,5.791 +DH004,148.0,150.0,0.688,2.1203,1.868 +DH004,150.0,152.0,3.515,0.3396,10.329 +DH004,152.0,154.0,5.76,0.0618,17.033 +DH004,154.0,156.0,1.478,0.2431,3.569 +DH004,156.0,158.0,4.185,0.1325,11.081 +DH004,158.0,160.0,1.583,1.0408,2.634 +DH004,160.0,162.0,2.353,0.2348,5.056 +DH004,162.0,164.0,8.391,0.1715,23.13 +DH004,164.0,166.0,7.202,0.1451,10.981 +DH004,166.0,168.0,0.334,0.3919,0.853 +DH004,168.0,170.0,5.288,0.7185,12.63 +DH004,170.0,172.0,2.955,0.1049,8.373 +DH004,172.0,174.0,5.622,0.2421,10.332 +DH004,174.0,176.0,0.459,0.0739,1.02 +DH004,176.0,178.0,26.488,0.6636,73.581 +DH004,178.0,180.0,12.247,0.472,24.691 +DH004,180.0,182.0,1.547,0.536,4.174 +DH004,182.0,184.0,0.463,0.3637,1.126 +DH004,184.0,186.0,1.703,0.5545,3.843 +DH004,186.0,188.0,1.223,0.4545,3.62 +DH004,188.0,190.0,10.719,0.4491,23.844 +DH004,190.0,192.0,5.363,0.2759,14.174 +DH004,192.0,194.0,1.674,0.0846,3.63 +DH004,194.0,196.0,1.587,0.2707,4.332 +DH004,196.0,198.0,2.117,0.498,3.409 +DH004,198.0,200.0,1.686,0.3591,3.545 +DH004,200.0,202.0,10.876,0.3711,29.377 +DH004,202.0,204.0,2.702,0.834,7.211 +DH004,204.0,206.0,3.809,0.3453,7.587 +DH004,206.0,208.0,4.108,0.0732,6.435 +DH004,208.0,210.0,8.092,0.2968,17.458 +DH004,210.0,212.0,3.803,0.2127,8.563 +DH004,212.0,214.0,4.895,0.1247,7.372 +DH004,214.0,216.0,1.53,0.0628,2.752 +DH004,216.0,218.0,14.612,0.3035,29.097 +DH004,218.0,220.0,0.35,0.204,0.843 +DH004,220.0,222.0,1.779,0.6348,3.094 +DH004,222.0,224.0,3.918,0.0766,9.531 +DH004,224.0,226.0,1.489,0.4451,4.1 +DH004,226.0,228.0,2.752,0.2957,7.783 +DH004,228.0,230.0,3.616,0.1803,6.454 +DH004,230.0,232.0,15.281,0.5164,36.647 +DH004,232.0,234.0,4.402,0.1232,7.012 +DH004,234.0,236.0,7.695,0.0571,20.829 +DH004,236.0,238.0,1.643,0.1884,2.539 +DH004,238.0,240.0,4.47,0.1152,7.053 +DH004,240.0,242.0,2.55,0.0817,5.314 +DH004,242.0,244.0,11.676,0.8532,22.721 +DH004,244.0,246.0,0.533,0.3304,0.963 +DH004,246.0,248.0,5.317,0.4181,9.239 +DH004,248.0,250.0,2.04,0.1371,3.711 +DH004,250.0,252.0,0.101,0.0201,0.119 +DH004,252.0,254.0,0.037,0.0253,0.026 +DH004,254.0,256.0,0.086,0.0178,0.093 +DH004,256.0,258.0,0.278,0.011,0.221 +DH004,258.0,260.0,0.051,0.0139,0.07 +DH004,260.0,262.0,0.184,0.0451,0.143 +DH004,262.0,264.0,0.065,0.0637,0.044 +DH004,264.0,266.0,0.058,0.0075,0.04 +DH004,266.0,268.0,0.147,0.0614,0.213 +DH004,268.0,270.0,0.197,0.019,0.106 +DH004,270.0,272.0,0.031,0.0382,0.032 +DH004,272.0,274.0,0.08,0.0253,0.064 +DH004,274.0,276.0,0.058,0.0145,0.054 +DH004,276.0,278.0,0.089,0.0073,0.095 +DH004,278.0,280.0,0.168,0.0129,0.11 +DH004,280.0,282.0,0.07,0.0216,0.066 +DH004,282.0,284.0,0.048,0.031,0.061 +DH004,284.0,286.0,0.276,0.0187,0.373 +DH004,286.0,288.0,0.171,0.0251,0.223 +DH004,288.0,290.0,0.168,0.0132,0.191 +DH004,290.0,292.0,0.074,0.0096,0.069 +DH004,292.0,294.0,0.183,0.0206,0.268 +DH004,294.0,296.0,0.032,0.0421,0.041 +DH004,296.0,298.0,0.056,0.016,0.06 +DH004,298.0,300.0,0.193,0.015,0.284 +DH004,300.0,302.0,0.085,0.0374,0.11 +DH004,302.0,304.0,0.137,0.0262,0.094 +DH004,304.0,306.0,0.101,0.0163,0.06 +DH004,306.0,308.0,0.048,0.0184,0.066 +DH004,308.0,310.0,0.105,0.0148,0.061 +DH004,310.0,312.0,0.074,0.0083,0.093 +DH004,312.0,314.0,0.042,0.0077,0.032 +DH004,314.0,316.0,0.11,0.0238,0.073 +DH005,0.0,2.0,0.026,0.0093,0.015 +DH005,2.0,4.0,0.044,0.0249,0.056 +DH005,4.0,6.0,0.086,0.0133,0.1 +DH005,6.0,8.0,0.089,0.0146,0.13 +DH005,8.0,10.0,0.096,0.01,0.125 +DH005,10.0,12.0,0.397,0.036,0.23 +DH005,12.0,14.0,0.078,0.0069,0.046 +DH005,14.0,16.0,0.177,0.0123,0.129 +DH005,16.0,18.0,0.074,0.0108,0.109 +DH005,18.0,20.0,0.08,0.0117,0.095 +DH005,20.0,22.0,0.051,0.0238,0.027 +DH005,22.0,24.0,0.074,0.0247,0.085 +DH005,24.0,26.0,0.069,0.0232,0.064 +DH005,26.0,28.0,0.075,0.0191,0.053 +DH005,28.0,30.0,0.049,0.0269,0.025 +DH005,30.0,32.0,0.108,0.0211,0.122 +DH005,32.0,34.0,0.125,0.0292,0.133 +DH005,34.0,36.0,0.077,0.0366,0.043 +DH005,36.0,38.0,0.12,0.0211,0.111 +DH005,38.0,40.0,0.053,0.026,0.071 +DH005,40.0,42.0,0.066,0.019,0.068 +DH005,42.0,44.0,0.061,0.0396,0.064 +DH005,44.0,46.0,0.062,0.0083,0.089 +DH005,46.0,48.0,0.029,0.0251,0.033 +DH005,48.0,50.0,0.066,0.008,0.052 +DH005,50.0,52.0,0.053,0.0351,0.029 +DH005,52.0,54.0,0.056,0.0168,0.066 +DH005,54.0,56.0,0.072,0.0143,0.079 +DH005,56.0,58.0,0.075,0.0097,0.091 +DH005,58.0,60.0,0.028,0.0147,0.026 +DH005,60.0,62.0,0.098,0.0246,0.088 +DH005,62.0,64.0,0.166,0.0291,0.216 +DH005,64.0,66.0,0.143,0.0267,0.083 +DH005,66.0,68.0,0.037,0.0226,0.043 +DH005,68.0,70.0,0.158,0.0115,0.13 +DH005,70.0,72.0,0.108,0.0177,0.121 +DH005,72.0,74.0,0.103,0.0073,0.072 +DH005,74.0,76.0,0.185,0.0456,0.277 +DH005,76.0,78.0,0.067,0.0187,0.098 +DH005,78.0,80.0,0.061,0.0144,0.074 +DH005,80.0,82.0,1.419,0.3976,3.116 +DH005,82.0,84.0,1.812,0.0592,5.027 +DH005,84.0,86.0,6.092,0.2144,10.44 +DH005,86.0,88.0,0.906,0.187,2.07 +DH005,88.0,90.0,7.239,0.0273,14.236 +DH005,90.0,92.0,2.694,0.2062,4.818 +DH005,92.0,94.0,3.068,0.1748,7.846 +DH005,94.0,96.0,1.658,0.5593,4.508 +DH005,96.0,98.0,2.064,0.2584,5.634 +DH005,98.0,100.0,1.552,0.4805,4.343 +DH005,100.0,102.0,2.062,0.1885,4.035 +DH005,102.0,104.0,1.637,0.4419,4.078 +DH005,104.0,106.0,2.952,0.0907,8.265 +DH005,106.0,108.0,29.141,0.1935,52.775 +DH005,108.0,110.0,12.395,0.2796,34.0 +DH005,110.0,112.0,1.886,0.1729,4.332 +DH005,112.0,114.0,0.423,0.208,0.658 +DH005,114.0,116.0,20.503,0.239,41.293 +DH005,116.0,118.0,1.988,1.9969,3.26 +DH005,118.0,120.0,0.841,0.358,1.502 +DH005,120.0,122.0,0.438,0.1689,1.237 +DH005,122.0,124.0,0.235,0.089,0.662 +DH005,124.0,126.0,1.364,0.306,4.007 +DH005,126.0,128.0,5.243,0.0866,8.407 +DH005,128.0,130.0,0.284,0.0931,0.829 +DH005,130.0,132.0,16.397,0.2871,32.356 +DH005,132.0,134.0,2.273,0.0982,4.343 +DH005,134.0,136.0,0.52,0.0802,1.168 +DH005,136.0,138.0,1.371,0.0909,2.351 +DH005,138.0,140.0,0.467,0.2828,1.065 +DH005,140.0,142.0,12.036,0.2891,21.707 +DH005,142.0,144.0,0.899,0.2334,2.013 +DH005,144.0,146.0,1.355,0.1809,2.928 +DH005,146.0,148.0,0.518,0.072,1.065 +DH005,148.0,150.0,0.626,0.3686,1.378 +DH005,150.0,152.0,0.431,0.9349,1.28 +DH005,152.0,154.0,3.272,0.373,6.495 +DH005,154.0,156.0,0.358,0.1855,0.588 +DH005,156.0,158.0,41.912,0.0623,74.207 +DH005,158.0,160.0,0.638,0.0674,1.773 +DH005,160.0,162.0,40.729,0.1525,72.343 +DH005,162.0,164.0,0.152,0.1835,0.265 +DH005,164.0,166.0,1.019,0.2664,1.791 +DH005,166.0,168.0,3.28,0.1733,7.699 +DH005,168.0,170.0,4.948,0.2254,10.783 +DH005,170.0,172.0,5.744,0.0715,10.525 +DH005,172.0,174.0,0.899,0.0958,2.565 +DH005,174.0,176.0,3.393,0.5376,8.406 +DH005,176.0,178.0,2.859,0.5826,8.17 +DH005,178.0,180.0,2.415,0.7293,5.942 +DH005,180.0,182.0,1.545,0.1141,3.043 +DH005,182.0,183.0,9.82,0.2143,26.833 +DH006,0.0,2.0,0.025,0.0178,0.016 +DH006,2.0,4.0,0.053,0.0603,0.04 +DH006,4.0,6.0,0.064,0.0186,0.078 +DH006,6.0,8.0,0.052,0.0299,0.054 +DH006,8.0,10.0,0.05,0.0353,0.067 +DH006,10.0,12.0,0.112,0.0146,0.1 +DH006,12.0,14.0,0.051,0.0111,0.061 +DH006,14.0,16.0,0.057,0.0109,0.035 +DH006,16.0,18.0,0.094,0.0206,0.112 +DH006,18.0,20.0,0.055,0.0212,0.049 +DH006,20.0,22.0,0.07,0.0266,0.048 +DH006,22.0,24.0,0.1,0.0161,0.115 +DH006,24.0,26.0,0.036,0.0122,0.034 +DH006,26.0,28.0,0.042,0.0228,0.051 +DH006,28.0,30.0,0.048,0.0211,0.068 +DH006,30.0,32.0,0.068,0.013,0.039 +DH006,32.0,34.0,0.055,0.0304,0.069 +DH006,34.0,36.0,0.056,0.0098,0.04 +DH006,36.0,38.0,0.14,0.021,0.158 +DH006,38.0,40.0,0.194,0.0157,0.154 +DH006,40.0,42.0,0.109,0.012,0.088 +DH006,42.0,44.0,0.102,0.0208,0.124 +DH006,44.0,46.0,0.231,0.02,0.235 +DH006,46.0,48.0,0.203,0.0297,0.258 +DH006,48.0,50.0,0.082,0.0202,0.063 +DH006,50.0,52.0,0.036,0.0085,0.03 +DH006,52.0,54.0,0.046,0.0133,0.06 +DH006,54.0,56.0,0.074,0.0202,0.111 +DH006,56.0,58.0,0.062,0.0246,0.061 +DH006,58.0,60.0,0.053,0.0199,0.065 +DH006,60.0,62.0,0.081,0.013,0.082 +DH006,62.0,64.0,0.087,0.017,0.087 +DH006,64.0,66.0,0.035,0.0113,0.045 +DH006,66.0,68.0,0.074,0.0138,0.04 +DH006,68.0,70.0,0.085,0.0286,0.064 +DH006,70.0,72.0,0.104,0.014,0.098 +DH006,72.0,74.0,0.103,0.0282,0.1 +DH006,74.0,76.0,0.117,0.0174,0.165 +DH006,76.0,78.0,0.155,0.0132,0.11 +DH006,78.0,80.0,0.092,0.0225,0.124 +DH006,80.0,82.0,2.035,0.207,3.811 +DH006,82.0,84.0,1.71,0.1967,3.941 +DH006,84.0,86.0,12.171,0.0844,31.162 +DH006,86.0,88.0,0.097,0.1519,0.26 +DH006,88.0,90.0,1.207,0.5413,3.595 +DH006,90.0,92.0,2.443,0.1659,6.325 +DH006,92.0,94.0,2.173,0.1159,4.839 +DH006,94.0,96.0,1.311,0.4081,2.17 +DH006,96.0,98.0,2.396,0.121,5.367 +DH006,98.0,100.0,4.316,0.0544,10.05 +DH006,100.0,102.0,5.937,0.3163,13.529 +DH006,102.0,104.0,4.384,0.2558,7.727 +DH006,104.0,106.0,20.501,0.1684,55.546 +DH006,106.0,108.0,0.122,0.6195,0.32 +DH006,108.0,110.0,2.307,0.3489,3.673 +DH006,110.0,112.0,1.029,0.3457,2.623 +DH006,112.0,114.0,1.072,0.5497,1.79 +DH006,114.0,116.0,0.953,0.1241,2.401 +DH006,116.0,118.0,5.361,0.1003,13.546 +DH006,118.0,120.0,5.453,0.2079,10.916 +DH006,120.0,122.0,1.545,0.188,4.339 +DH006,122.0,124.0,7.543,0.1208,17.613 +DH006,124.0,126.0,2.043,0.0961,3.165 +DH006,126.0,128.0,11.698,0.2622,18.726 +DH006,128.0,130.0,3.21,0.1985,8.996 +DH006,130.0,132.0,1.727,0.2803,4.62 +DH006,132.0,134.0,12.232,0.0512,27.683 +DH006,134.0,136.0,24.369,0.2033,67.788 +DH006,136.0,138.0,1.384,0.7143,3.737 +DH006,138.0,140.0,0.813,0.129,1.448 +DH006,140.0,142.0,3.433,0.6509,5.513 +DH006,142.0,144.0,3.847,0.0769,11.287 +DH006,144.0,146.0,4.22,0.076,11.95 +DH006,146.0,148.0,3.206,0.0898,8.107 +DH006,148.0,150.0,1.988,0.3338,5.413 +DH006,150.0,152.0,4.611,0.2367,13.821 +DH006,152.0,154.0,0.772,0.1228,2.156 +DH006,154.0,156.0,1.206,0.3097,2.54 +DH006,156.0,158.0,0.179,0.119,0.457 +DH006,158.0,160.0,2.447,0.0718,5.931 +DH006,160.0,162.0,2.15,0.3035,3.728 +DH006,162.0,164.0,1.432,0.1247,4.283 +DH006,164.0,166.0,7.418,0.4307,11.853 +DH006,166.0,168.0,0.668,0.62,1.812 +DH006,168.0,170.0,3.127,0.0601,7.454 +DH006,170.0,172.0,3.261,0.1168,7.199 +DH006,172.0,174.0,4.258,1.2166,8.624 +DH006,174.0,176.0,1.634,0.2247,3.808 +DH006,176.0,178.0,8.555,0.1695,20.885 +DH006,178.0,180.0,3.192,0.3475,6.027 +DH006,180.0,182.0,1.927,0.6729,5.592 +DH006,182.0,184.0,3.947,0.8828,8.27 +DH006,184.0,186.0,15.605,0.3444,37.885 +DH006,186.0,188.0,0.532,0.1285,1.238 +DH006,188.0,190.0,3.585,1.062,9.894 +DH006,190.0,192.0,6.592,0.5655,19.181 +DH006,192.0,194.0,0.702,0.6881,1.939 +DH006,194.0,196.0,4.57,0.2628,7.026 +DH006,196.0,198.0,2.025,0.3726,3.424 +DH006,198.0,200.0,0.804,0.0964,2.351 +DH006,200.0,202.0,2.905,0.2184,6.622 +DH006,202.0,204.0,4.059,0.1351,6.505 +DH006,204.0,206.0,1.614,0.1578,4.582 +DH006,206.0,208.0,0.246,0.1185,0.484 +DH006,208.0,210.0,0.277,0.5456,0.516 +DH006,210.0,212.0,1.429,0.2818,4.24 +DH006,212.0,214.0,1.271,0.4467,3.029 +DH006,214.0,216.0,1.255,0.1177,2.417 +DH006,216.0,218.0,8.931,0.1926,15.616 +DH006,218.0,220.0,0.607,0.306,1.569 +DH006,220.0,222.0,3.57,0.1637,5.495 +DH006,222.0,224.0,1.67,0.1649,3.068 +DH006,224.0,226.0,12.063,0.0293,34.656 +DH006,226.0,228.0,1.276,0.1607,3.292 +DH006,228.0,230.0,0.945,0.1295,2.494 +DH006,230.0,232.0,3.657,0.1567,7.456 +DH006,232.0,234.0,0.788,0.6219,2.075 +DH006,234.0,236.0,3.824,0.181,10.313 +DH006,236.0,238.0,16.661,0.1919,31.818 +DH006,238.0,240.0,8.293,0.1252,23.873 +DH006,240.0,242.0,2.253,0.2232,3.932 +DH006,242.0,244.0,27.385,0.292,71.578 +DH006,244.0,246.0,3.292,0.23,8.767 +DH006,246.0,248.0,3.472,0.2716,5.219 +DH006,248.0,250.0,2.089,0.3644,3.699 +DH006,250.0,252.0,0.046,0.0831,0.051 +DH006,252.0,254.0,0.087,0.0087,0.056 +DH006,254.0,256.0,0.047,0.0147,0.038 +DH006,256.0,258.0,0.109,0.0243,0.095 +DH006,258.0,260.0,0.247,0.0101,0.328 +DH006,260.0,262.0,0.152,0.0244,0.121 +DH006,262.0,264.0,0.09,0.0145,0.124 +DH006,264.0,266.0,0.071,0.0066,0.068 +DH006,266.0,268.0,0.078,0.0144,0.082 +DH006,268.0,270.0,0.102,0.0117,0.15 +DH006,270.0,272.0,0.105,0.0237,0.108 +DH006,272.0,274.0,0.041,0.0191,0.045 +DH006,274.0,276.0,0.044,0.0126,0.041 +DH006,276.0,278.0,0.066,0.0146,0.097 +DH006,278.0,280.0,0.101,0.0217,0.067 +DH006,280.0,282.0,0.057,0.0061,0.042 +DH006,282.0,284.0,0.107,0.0167,0.123 +DH006,284.0,286.0,0.128,0.0084,0.147 +DH006,286.0,288.0,0.042,0.0444,0.055 +DH006,288.0,290.0,0.022,0.0086,0.025 +DH006,290.0,292.0,0.062,0.0094,0.084 +DH006,292.0,294.0,0.099,0.0232,0.061 +DH006,294.0,296.0,0.127,0.0151,0.13 +DH006,296.0,298.0,0.118,0.0081,0.072 +DH006,298.0,300.0,0.092,0.0348,0.09 +DH006,300.0,302.0,0.047,0.0102,0.06 +DH006,302.0,304.0,0.085,0.0145,0.095 +DH006,304.0,306.0,0.038,0.0179,0.034 +DH006,306.0,308.0,0.054,0.0397,0.068 +DH006,308.0,310.0,0.176,0.014,0.179 +DH006,310.0,312.0,0.079,0.0078,0.049 +DH006,312.0,314.0,0.076,0.0266,0.06 +DH006,314.0,316.0,0.074,0.0119,0.043 +DH006,316.0,318.0,0.099,0.022,0.134 +DH006,318.0,320.0,0.164,0.0269,0.201 +DH006,320.0,322.0,0.054,0.0111,0.057 +DH006,322.0,324.0,0.091,0.0091,0.105 +DH006,324.0,326.0,0.033,0.0178,0.02 +DH006,326.0,328.0,0.113,0.0221,0.098 +DH006,328.0,330.0,0.137,0.0148,0.203 +DH006,330.0,332.0,0.035,0.0113,0.027 +DH006,332.0,334.0,0.022,0.018,0.028 +DH006,334.0,336.0,0.087,0.0107,0.103 +DH006,336.0,338.0,0.083,0.0369,0.062 +DH006,338.0,340.0,0.052,0.0162,0.063 +DH006,340.0,342.0,0.105,0.0246,0.156 +DH006,342.0,344.0,0.057,0.016,0.074 +DH006,344.0,346.0,0.093,0.0222,0.117 +DH006,346.0,348.0,0.158,0.0135,0.169 +DH006,348.0,350.0,0.113,0.0182,0.075 +DH006,350.0,352.0,0.352,0.0122,0.243 +DH007,0.0,2.0,0.052,0.0447,0.052 +DH007,2.0,4.0,0.055,0.0237,0.071 +DH007,4.0,6.0,0.06,0.0268,0.071 +DH007,6.0,8.0,0.093,0.0179,0.132 +DH007,8.0,10.0,0.094,0.0189,0.069 +DH007,10.0,12.0,0.227,0.0108,0.159 +DH007,12.0,14.0,0.068,0.0441,0.063 +DH007,14.0,16.0,0.053,0.0113,0.047 +DH007,16.0,18.0,0.036,0.0144,0.054 +DH007,18.0,20.0,0.095,0.0143,0.078 +DH007,20.0,22.0,0.157,0.0095,0.095 +DH007,22.0,24.0,0.054,0.0408,0.043 +DH007,24.0,26.0,0.045,0.0116,0.037 +DH007,26.0,28.0,0.07,0.0168,0.074 +DH007,28.0,30.0,0.052,0.0192,0.037 +DH007,30.0,32.0,0.133,0.0169,0.187 +DH007,32.0,34.0,0.029,0.0108,0.02 +DH007,34.0,36.0,0.076,0.019,0.072 +DH007,36.0,38.0,0.04,0.0163,0.046 +DH007,38.0,40.0,0.054,0.0375,0.064 +DH007,40.0,42.0,0.098,0.0449,0.068 +DH007,42.0,44.0,0.082,0.022,0.044 +DH007,44.0,46.0,0.098,0.0105,0.139 +DH007,46.0,48.0,0.155,0.021,0.149 +DH007,48.0,50.0,0.046,0.0243,0.029 +DH007,50.0,52.0,0.016,0.0341,0.023 +DH007,52.0,54.0,0.05,0.0301,0.033 +DH007,54.0,56.0,0.054,0.0219,0.052 +DH007,56.0,58.0,0.217,0.0219,0.198 +DH007,58.0,60.0,0.132,0.0098,0.181 +DH007,60.0,62.0,0.068,0.0253,0.055 +DH007,62.0,64.0,0.099,0.0163,0.115 +DH007,64.0,66.0,0.088,0.0039,0.056 +DH007,66.0,68.0,0.121,0.0229,0.152 +DH007,68.0,70.0,0.22,0.0214,0.21 +DH007,70.0,72.0,0.154,0.022,0.149 +DH007,72.0,74.0,0.019,0.0144,0.026 +DH007,74.0,76.0,0.066,0.0273,0.06 +DH007,76.0,78.0,0.178,0.0158,0.227 +DH007,78.0,80.0,0.111,0.0388,0.094 +DH007,80.0,82.0,1.284,0.4399,2.092 +DH007,82.0,84.0,2.969,0.1765,5.995 +DH007,84.0,86.0,3.443,0.4089,8.324 +DH007,86.0,88.0,1.445,0.2906,2.588 +DH007,88.0,90.0,21.511,0.4042,48.612 +DH007,90.0,92.0,2.086,0.3485,4.828 +DH007,92.0,94.0,2.794,0.0957,4.485 +DH007,94.0,96.0,0.567,0.1579,1.07 +DH007,96.0,98.0,24.269,0.1591,47.923 +DH007,98.0,100.0,1.149,0.8412,2.132 +DH007,100.0,102.0,0.668,1.9838,1.685 +DH007,102.0,104.0,0.59,0.2158,1.451 +DH007,104.0,106.0,6.143,0.972,16.394 +DH007,106.0,108.0,1.164,0.4188,1.81 +DH007,108.0,110.0,0.644,0.0546,1.805 +DH007,110.0,112.0,0.759,0.087,1.742 +DH007,112.0,114.0,0.528,0.018,1.523 +DH007,114.0,116.0,1.263,0.1375,3.77 +DH007,116.0,118.0,1.066,0.4515,2.401 +DH007,118.0,120.0,2.115,0.1144,4.783 +DH007,120.0,122.0,0.889,0.2556,2.211 +DH007,122.0,124.0,0.716,0.4934,1.837 +DH007,124.0,126.0,1.3,0.2507,1.959 +DH007,126.0,128.0,0.786,0.2361,1.267 +DH007,128.0,130.0,0.716,0.0609,1.37 +DH007,130.0,132.0,4.395,0.128,13.168 +DH007,132.0,134.0,6.442,0.6335,19.006 +DH007,134.0,136.0,20.562,0.1189,53.962 +DH007,136.0,138.0,1.968,0.1562,4.402 +DH007,138.0,140.0,2.669,0.2781,7.829 +DH007,140.0,142.0,3.52,0.4228,6.27 +DH007,142.0,144.0,0.598,0.8116,1.576 +DH007,144.0,146.0,1.054,0.1357,1.653 +DH007,146.0,148.0,0.951,0.0799,2.466 +DH007,148.0,150.0,1.761,0.1389,3.794 +DH007,150.0,152.0,3.164,0.2759,7.977 +DH007,152.0,154.0,1.925,0.2978,4.123 +DH007,154.0,156.0,1.988,0.529,4.476 +DH007,156.0,158.0,5.763,0.1508,14.821 +DH007,158.0,160.0,3.071,0.3986,7.85 +DH007,160.0,162.0,3.694,0.1688,6.532 +DH007,162.0,164.0,4.315,0.3138,12.356 +DH007,164.0,166.0,8.426,0.1101,21.262 +DH007,166.0,168.0,15.859,0.447,43.45 +DH007,168.0,170.0,3.142,0.2525,5.293 +DH007,170.0,172.0,0.75,0.2142,1.603 +DH007,172.0,174.0,2.994,0.5508,6.264 +DH007,174.0,176.0,0.626,0.2893,1.554 +DH007,176.0,178.0,1.845,0.1767,3.326 +DH007,178.0,180.0,0.151,0.1635,0.255 +DH007,180.0,182.0,0.872,0.4583,1.913 +DH007,182.0,184.0,2.102,0.1797,4.031 +DH007,184.0,186.0,1.963,0.2096,3.743 +DH007,186.0,188.0,3.013,0.4076,5.04 +DH007,188.0,190.0,0.631,0.0551,1.365 +DH007,190.0,192.0,3.005,0.3343,5.61 +DH007,192.0,194.0,18.953,0.1371,43.192 +DH007,194.0,196.0,6.204,0.1013,15.639 +DH007,196.0,198.0,2.759,2.1946,4.759 +DH007,198.0,200.0,15.297,0.5854,30.753 +DH007,200.0,202.0,0.679,0.5209,1.13 +DH007,202.0,204.0,15.196,0.2618,45.582 +DH007,204.0,206.0,20.213,0.1699,43.724 +DH007,206.0,208.0,1.675,0.3953,3.72 +DH007,208.0,210.0,0.464,0.2107,1.316 +DH007,210.0,212.0,1.465,0.5956,2.832 +DH007,212.0,214.0,3.241,0.2356,8.313 +DH007,214.0,216.0,0.457,0.2253,0.769 +DH007,216.0,218.0,4.46,0.0561,7.496 +DH007,218.0,220.0,5.364,0.2066,15.618 +DH007,220.0,222.0,0.773,0.2953,2.029 +DH007,222.0,224.0,3.824,0.156,8.077 +DH007,224.0,226.0,2.294,0.3444,6.468 +DH007,226.0,228.0,7.162,0.1542,13.065 +DH007,228.0,230.0,23.864,0.1376,46.058 +DH007,230.0,232.0,2.057,0.2355,5.514 +DH007,232.0,234.0,2.179,0.2161,3.772 +DH008,0.0,2.0,0.02,0.0469,0.023 +DH008,2.0,4.0,0.116,0.0092,0.064 +DH008,4.0,6.0,0.055,0.0382,0.057 +DH008,6.0,8.0,0.129,0.0132,0.166 +DH008,8.0,10.0,0.071,0.0348,0.052 +DH008,10.0,12.0,0.037,0.0069,0.055 +DH008,12.0,14.0,0.05,0.0082,0.069 +DH008,14.0,16.0,0.025,0.011,0.03 +DH008,16.0,18.0,0.105,0.0201,0.103 +DH008,18.0,20.0,0.033,0.0104,0.017 +DH008,20.0,22.0,0.138,0.0288,0.073 +DH008,22.0,24.0,0.053,0.0185,0.03 +DH008,24.0,26.0,0.073,0.0507,0.079 +DH008,26.0,28.0,0.071,0.0336,0.051 +DH008,28.0,30.0,0.056,0.0141,0.079 +DH008,30.0,32.0,0.032,0.0247,0.021 +DH008,32.0,34.0,0.111,0.0119,0.126 +DH008,34.0,36.0,0.048,0.0155,0.029 +DH008,36.0,38.0,0.087,0.0101,0.105 +DH008,38.0,40.0,0.036,0.0101,0.026 +DH008,40.0,42.0,0.063,0.0293,0.054 +DH008,42.0,44.0,0.112,0.0106,0.131 +DH008,44.0,46.0,0.097,0.0134,0.053 +DH008,46.0,48.0,0.107,0.0154,0.123 +DH008,48.0,50.0,0.213,0.0168,0.157 +DH008,50.0,52.0,0.115,0.0088,0.141 +DH008,52.0,54.0,0.05,0.0119,0.05 +DH008,54.0,56.0,0.119,0.0343,0.111 +DH008,56.0,58.0,0.063,0.0065,0.087 +DH008,58.0,60.0,0.083,0.0201,0.092 +DH008,60.0,62.0,0.173,0.0271,0.189 +DH008,62.0,64.0,0.06,0.0175,0.082 +DH008,64.0,66.0,0.111,0.0219,0.124 +DH008,66.0,68.0,0.168,0.0193,0.116 +DH008,68.0,70.0,0.08,0.0211,0.059 +DH008,70.0,72.0,0.067,0.0277,0.06 +DH008,72.0,74.0,0.037,0.009,0.027 +DH008,74.0,76.0,0.168,0.0215,0.249 +DH008,76.0,78.0,0.155,0.0258,0.164 +DH008,78.0,80.0,0.232,0.0239,0.18 +DH008,80.0,82.0,0.998,0.274,2.399 +DH008,82.0,84.0,5.153,0.1041,8.976 +DH008,84.0,86.0,1.19,0.1806,3.431 +DH008,86.0,88.0,1.834,1.0116,3.735 +DH008,88.0,90.0,3.405,0.2187,6.612 +DH008,90.0,92.0,8.636,0.1149,19.506 +DH008,92.0,94.0,0.25,0.548,0.558 +DH008,94.0,96.0,2.45,0.0408,6.311 +DH008,96.0,98.0,0.752,0.1312,1.598 +DH008,98.0,100.0,3.021,0.151,6.405 +DH008,100.0,102.0,2.588,0.1608,7.522 +DH008,102.0,104.0,1.493,0.2928,3.94 +DH008,104.0,106.0,0.408,0.4923,1.221 +DH008,106.0,108.0,1.303,0.1359,3.211 +DH008,108.0,110.0,4.367,0.5496,10.239 +DH008,110.0,112.0,4.499,0.261,10.895 +DH008,112.0,114.0,21.773,0.0706,38.038 +DH008,114.0,116.0,3.554,0.2782,9.79 +DH008,116.0,118.0,6.006,0.064,15.795 +DH008,118.0,120.0,1.131,0.1298,3.269 +DH008,120.0,122.0,8.109,0.1696,12.818 +DH008,122.0,124.0,2.362,0.1092,4.631 +DH008,124.0,126.0,1.554,0.1278,3.618 +DH008,126.0,128.0,2.949,0.0625,5.37 +DH008,128.0,130.0,3.705,0.1162,7.222 +DH008,130.0,132.0,5.681,0.0807,12.593 +DH008,132.0,134.0,16.599,0.2956,25.891 +DH008,134.0,136.0,0.726,0.1483,1.765 +DH008,136.0,138.0,6.424,0.1199,18.593 +DH008,138.0,140.0,1.376,0.0968,3.913 +DH008,140.0,142.0,0.095,0.2026,0.183 +DH008,142.0,144.0,5.988,0.0493,13.238 +DH008,144.0,146.0,5.958,0.6075,8.97 +DH008,146.0,148.0,7.513,0.0688,16.4 +DH008,148.0,150.0,0.882,0.0595,2.566 +DH008,150.0,152.0,2.24,0.1154,5.541 +DH008,152.0,154.0,0.254,0.0407,0.666 +DH008,154.0,156.0,6.583,0.0964,16.054 +DH008,156.0,158.0,7.564,0.312,13.325 +DH008,158.0,160.0,8.283,0.1244,12.477 +DH008,160.0,162.0,2.178,0.1794,5.417 +DH008,162.0,164.0,2.429,0.2294,6.099 +DH008,164.0,166.0,5.825,0.1022,8.935 +DH008,166.0,168.0,1.562,0.2972,3.683 +DH008,168.0,170.0,6.482,0.1298,10.914 +DH008,170.0,172.0,1.254,0.2146,3.713 +DH008,172.0,174.0,1.596,0.6011,4.196 +DH008,174.0,176.0,3.664,0.236,6.442 +DH008,176.0,178.0,0.978,0.1015,1.716 +DH008,178.0,180.0,2.508,0.187,7.261 +DH008,180.0,182.0,10.651,0.1022,23.185 +DH008,182.0,184.0,0.397,1.1324,1.138 +DH008,184.0,186.0,3.958,0.0764,8.164 +DH008,186.0,188.0,4.1,0.1823,6.905 +DH008,188.0,190.0,35.666,0.1046,58.783 +DH008,190.0,192.0,0.776,0.8065,1.679 +DH008,192.0,194.0,1.891,0.2298,3.385 +DH008,194.0,196.0,6.476,0.1647,18.605 +DH008,196.0,198.0,4.621,0.192,11.869 +DH008,198.0,200.0,2.254,0.4216,3.745 +DH008,200.0,202.0,4.493,0.4243,7.675 +DH008,202.0,204.0,0.952,0.3765,1.801 +DH008,204.0,206.0,0.404,0.1716,0.914 +DH008,206.0,208.0,1.206,0.7301,3.296 +DH008,208.0,210.0,11.563,0.2755,21.821 +DH008,210.0,212.0,0.723,0.2253,2.035 +DH008,212.0,214.0,0.431,0.1449,0.923 +DH008,214.0,216.0,3.655,0.3227,8.691 +DH008,216.0,218.0,3.907,0.1929,8.019 +DH008,218.0,220.0,1.244,0.529,3.489 +DH008,220.0,222.0,2.548,0.7931,7.477 +DH008,222.0,224.0,2.231,0.0786,6.224 +DH008,224.0,226.0,2.014,0.2316,4.765 +DH008,226.0,228.0,4.922,0.1107,12.784 +DH008,228.0,230.0,4.031,0.1354,12.008 +DH008,230.0,232.0,2.088,0.0683,3.483 +DH008,232.0,234.0,2.751,0.1082,5.395 +DH008,234.0,236.0,0.231,0.0926,0.501 +DH008,236.0,238.0,32.4,0.399,85.651 +DH008,238.0,240.0,1.325,0.1038,2.468 +DH008,240.0,242.0,1.774,1.2123,4.136 +DH008,242.0,244.0,0.276,0.131,0.552 +DH008,244.0,246.0,2.022,0.2126,6.063 +DH008,246.0,248.0,3.534,0.0943,6.794 +DH008,248.0,250.0,4.664,0.2228,11.46 +DH008,250.0,252.0,0.044,0.0193,0.024 +DH008,252.0,254.0,0.1,0.0244,0.083 +DH008,254.0,256.0,0.144,0.019,0.196 +DH008,256.0,258.0,0.057,0.0164,0.037 +DH008,258.0,260.0,0.062,0.0115,0.058 +DH008,260.0,262.0,0.03,0.0163,0.038 +DH008,262.0,264.0,0.045,0.015,0.039 +DH008,264.0,266.0,0.103,0.0265,0.12 +DH008,266.0,268.0,0.063,0.024,0.053 +DH008,268.0,270.0,0.051,0.0333,0.056 +DH008,270.0,272.0,0.118,0.0291,0.144 +DH008,272.0,274.0,0.185,0.0223,0.13 +DH008,274.0,276.0,0.104,0.0188,0.12 +DH008,276.0,278.0,0.102,0.0157,0.146 +DH008,278.0,280.0,0.032,0.014,0.027 +DH008,280.0,282.0,0.056,0.0163,0.033 +DH008,282.0,284.0,0.1,0.0127,0.139 +DH008,284.0,286.0,0.137,0.0129,0.175 +DH008,286.0,288.0,0.134,0.031,0.087 +DH008,288.0,290.0,0.574,0.031,0.66 +DH008,290.0,292.0,0.049,0.0174,0.059 +DH008,292.0,294.0,0.229,0.0384,0.165 +DH008,294.0,296.0,0.039,0.0234,0.027 +DH008,296.0,298.0,0.034,0.0206,0.02 +DH008,298.0,300.0,0.141,0.0235,0.202 +DH008,300.0,302.0,0.045,0.0174,0.067 +DH008,302.0,304.0,0.025,0.0265,0.022 +DH008,304.0,306.0,0.139,0.0319,0.165 +DH008,306.0,308.0,0.117,0.0132,0.082 +DH008,308.0,310.0,0.088,0.0145,0.093 +DH008,310.0,312.0,0.269,0.0085,0.178 +DH008,312.0,314.0,0.045,0.0288,0.035 +DH008,314.0,316.0,0.103,0.0114,0.071 +DH008,316.0,318.0,0.143,0.0444,0.076 +DH008,318.0,320.0,0.048,0.0217,0.041 +DH008,320.0,322.0,0.087,0.038,0.112 +DH008,322.0,324.0,0.08,0.025,0.092 +DH008,324.0,326.0,0.052,0.0122,0.074 +DH008,326.0,328.0,0.168,0.039,0.158 +DH008,328.0,330.0,0.089,0.0157,0.11 +DH008,330.0,332.0,0.126,0.0112,0.089 +DH008,332.0,334.0,0.11,0.0168,0.069 +DH008,334.0,336.0,0.156,0.0268,0.194 +DH008,336.0,338.0,0.026,0.0208,0.034 +DH008,338.0,340.0,0.033,0.0132,0.031 +DH008,340.0,342.0,0.083,0.0413,0.104 +DH008,342.0,344.0,0.05,0.0238,0.052 +DH008,344.0,346.0,0.104,0.0224,0.072 +DH008,346.0,348.0,0.226,0.0318,0.138 +DH009,0.0,2.0,0.132,0.0286,0.073 +DH009,2.0,4.0,0.162,0.0201,0.104 +DH009,4.0,6.0,0.088,0.0067,0.1 +DH009,6.0,8.0,0.055,0.0101,0.039 +DH009,8.0,10.0,0.111,0.018,0.079 +DH009,10.0,12.0,0.098,0.0301,0.147 +DH009,12.0,14.0,0.073,0.0183,0.062 +DH009,14.0,16.0,0.026,0.0178,0.036 +DH009,16.0,18.0,0.076,0.0143,0.069 +DH009,18.0,20.0,0.26,0.0156,0.303 +DH009,20.0,22.0,0.272,0.0139,0.37 +DH009,22.0,24.0,0.082,0.0446,0.066 +DH009,24.0,26.0,0.099,0.0177,0.066 +DH009,26.0,28.0,0.086,0.0287,0.097 +DH009,28.0,30.0,0.068,0.0162,0.087 +DH009,30.0,32.0,0.171,0.0131,0.178 +DH009,32.0,34.0,0.103,0.0393,0.063 +DH009,34.0,36.0,0.039,0.0161,0.027 +DH009,36.0,38.0,0.07,0.0409,0.066 +DH009,38.0,40.0,0.031,0.0121,0.024 +DH009,40.0,42.0,0.119,0.0228,0.083 +DH009,42.0,44.0,0.117,0.033,0.098 +DH009,44.0,46.0,0.167,0.0157,0.142 +DH009,46.0,48.0,0.037,0.0184,0.03 +DH009,48.0,50.0,0.164,0.0083,0.082 +DH009,50.0,52.0,0.043,0.0236,0.047 +DH009,52.0,54.0,0.178,0.014,0.14 +DH009,54.0,56.0,0.186,0.0081,0.217 +DH009,56.0,58.0,0.146,0.0161,0.082 +DH009,58.0,60.0,0.145,0.0101,0.168 +DH009,60.0,62.0,0.08,0.0262,0.067 +DH009,62.0,64.0,0.054,0.0192,0.078 +DH009,64.0,66.0,0.324,0.0086,0.218 +DH009,66.0,68.0,0.043,0.0305,0.05 +DH009,68.0,70.0,0.055,0.0136,0.076 +DH009,70.0,72.0,0.1,0.0233,0.1 +DH009,72.0,74.0,0.037,0.0264,0.023 +DH009,74.0,76.0,0.165,0.0129,0.223 +DH009,76.0,78.0,0.08,0.035,0.071 +DH009,78.0,80.0,0.073,0.0119,0.089 +DH009,80.0,82.0,0.647,0.1249,1.256 +DH009,82.0,84.0,0.24,0.6186,0.514 +DH009,84.0,86.0,6.547,0.3487,9.914 +DH009,86.0,88.0,0.621,0.1995,1.785 +DH009,88.0,90.0,3.988,0.4255,8.824 +DH009,90.0,92.0,3.477,0.4675,9.895 +DH009,92.0,94.0,1.254,0.3259,2.927 +DH009,94.0,96.0,3.074,0.0955,6.59 +DH009,96.0,98.0,4.771,0.4536,12.243 +DH009,98.0,100.0,4.977,0.1457,12.146 +DH009,100.0,102.0,12.187,0.4257,33.555 +DH009,102.0,104.0,21.989,0.1271,47.592 +DH009,104.0,106.0,0.936,0.182,2.266 +DH009,106.0,108.0,1.735,0.1443,4.515 +DH009,108.0,110.0,3.397,0.138,6.643 +DH009,110.0,112.0,5.301,0.1207,11.297 +DH009,112.0,114.0,0.154,0.0932,0.386 +DH009,114.0,116.0,2.433,0.1047,3.825 +DH009,116.0,118.0,0.512,0.2559,1.379 +DH009,118.0,120.0,3.607,0.2253,8.779 +DH009,120.0,122.0,10.647,0.065,17.268 +DH009,122.0,124.0,1.365,0.1616,3.857 +DH009,124.0,126.0,12.313,0.4273,25.125 +DH009,126.0,128.0,5.023,0.3724,14.406 +DH009,128.0,130.0,6.163,0.1963,16.149 +DH009,130.0,132.0,3.843,0.2654,8.81 +DH009,132.0,134.0,2.128,0.1255,5.413 +DH009,134.0,136.0,2.112,0.2549,5.251 +DH009,136.0,138.0,0.557,0.1091,1.561 +DH009,138.0,140.0,4.383,0.0846,9.966 +DH009,140.0,142.0,3.474,0.3613,8.222 +DH009,142.0,144.0,2.058,0.8489,5.766 +DH009,144.0,146.0,7.278,0.2923,17.292 +DH009,146.0,148.0,5.272,0.1966,8.46 +DH009,148.0,150.0,1.041,0.1943,2.956 +DH009,150.0,152.0,2.991,0.3312,6.884 +DH009,152.0,154.0,0.444,0.8186,0.749 +DH009,154.0,156.0,3.807,0.0774,6.018 +DH009,156.0,158.0,4.1,0.6524,6.539 +DH009,158.0,160.0,1.917,0.261,4.068 +DH009,160.0,162.0,1.474,0.0639,2.338 +DH009,162.0,164.0,8.583,0.2089,19.961 +DH009,164.0,166.0,1.259,0.1134,2.086 +DH009,166.0,168.0,3.543,0.3303,10.612 +DH009,168.0,170.0,0.628,0.1435,1.66 +DH009,170.0,172.0,1.131,0.4175,3.203 +DH009,172.0,174.0,0.676,0.2352,1.674 +DH009,174.0,176.0,6.832,0.3056,13.309 +DH009,176.0,178.0,3.269,0.1919,8.241 +DH009,178.0,180.0,3.147,0.1709,9.217 +DH009,180.0,182.0,11.141,0.3702,31.986 +DH009,182.0,184.0,2.003,0.0814,4.927 +DH009,184.0,186.0,2.514,0.2681,6.334 +DH009,186.0,188.0,6.723,0.1283,19.706 +DH009,188.0,190.0,12.693,0.4135,19.74 +DH009,190.0,192.0,1.957,0.2055,5.145 +DH009,192.0,194.0,3.924,1.6955,6.728 +DH009,194.0,196.0,4.929,0.0579,7.786 +DH009,196.0,198.0,9.724,0.3078,25.447 +DH009,198.0,200.0,7.172,0.0539,15.204 +DH009,200.0,202.0,22.238,0.0452,45.084 +DH009,202.0,204.0,0.08,0.4726,0.225 +DH009,204.0,206.0,0.133,0.3188,0.243 +DH009,206.0,208.0,3.444,0.3562,8.002 +DH009,208.0,210.0,0.238,0.3881,0.714 +DH009,210.0,212.0,8.632,0.0455,24.162 +DH009,212.0,214.0,0.806,0.0624,2.273 +DH009,214.0,216.0,3.568,0.0711,7.831 +DH009,216.0,218.0,4.578,0.1439,7.777 +DH009,218.0,220.0,0.214,0.171,0.523 +DH009,220.0,222.0,2.725,0.3021,6.784 +DH009,222.0,224.0,1.621,0.2805,3.902 +DH009,224.0,226.0,1.985,0.2877,4.491 +DH009,226.0,228.0,1.024,0.339,2.812 +DH009,228.0,230.0,3.537,0.2282,8.032 +DH009,230.0,232.0,1.501,0.1486,3.865 +DH009,232.0,234.0,3.524,0.2685,6.872 +DH009,234.0,236.0,1.176,1.0164,2.488 +DH009,236.0,238.0,0.779,0.1008,2.01 +DH009,238.0,240.0,14.001,0.6682,24.329 +DH009,240.0,242.0,0.759,0.9503,1.737 +DH009,242.0,244.0,1.612,0.7046,3.139 +DH009,244.0,246.0,31.228,0.2723,72.581 +DH009,246.0,248.0,1.068,0.0509,2.423 +DH009,248.0,250.0,8.789,0.3603,18.154 +DH009,250.0,252.0,0.045,0.0205,0.048 +DH009,252.0,254.0,0.106,0.0199,0.153 +DH009,254.0,256.0,0.138,0.0038,0.178 +DH009,256.0,258.0,0.384,0.0086,0.201 +DH009,258.0,260.0,0.082,0.0145,0.108 +DH009,260.0,262.0,0.109,0.0198,0.115 +DH009,262.0,264.0,0.083,0.0898,0.044 +DH009,264.0,266.0,0.092,0.0078,0.108 +DH009,266.0,268.0,0.163,0.0094,0.199 +DH009,268.0,270.0,0.084,0.0363,0.095 +DH009,270.0,272.0,0.067,0.0072,0.044 +DH009,272.0,274.0,0.122,0.0075,0.135 +DH009,274.0,276.0,0.13,0.0323,0.101 +DH009,276.0,278.0,0.122,0.0238,0.156 +DH009,278.0,280.0,0.028,0.0086,0.015 +DH009,280.0,282.0,0.076,0.0222,0.102 +DH009,282.0,284.0,0.16,0.0325,0.175 +DH009,284.0,286.0,0.095,0.012,0.05 +DH009,286.0,288.0,0.1,0.0033,0.133 +DH009,288.0,290.0,0.115,0.0136,0.154 +DH009,290.0,292.0,0.067,0.0196,0.086 +DH009,292.0,294.0,0.221,0.0174,0.251 +DH009,294.0,296.0,0.169,0.0245,0.107 +DH009,296.0,298.0,0.16,0.0652,0.164 +DH009,298.0,300.0,0.088,0.0199,0.096 +DH009,300.0,302.0,0.057,0.0159,0.078 +DH009,302.0,304.0,0.04,0.0141,0.021 +DH009,304.0,306.0,0.237,0.0239,0.252 +DH009,306.0,308.0,0.053,0.0364,0.07 +DH009,308.0,310.0,0.083,0.0147,0.125 +DH009,310.0,312.0,0.045,0.0223,0.034 +DH009,312.0,314.0,0.071,0.0203,0.052 +DH009,314.0,316.0,0.105,0.0145,0.14 +DH009,316.0,318.0,0.125,0.032,0.081 +DH009,318.0,320.0,0.065,0.0113,0.05 +DH009,320.0,322.0,0.059,0.011,0.051 +DH009,322.0,324.0,0.109,0.0244,0.104 +DH009,324.0,326.0,0.13,0.0149,0.121 +DH009,326.0,328.0,0.07,0.0228,0.04 +DH009,328.0,330.0,0.065,0.0094,0.034 +DH009,330.0,332.0,0.073,0.0071,0.059 +DH009,332.0,334.0,0.146,0.0648,0.186 +DH009,334.0,336.0,0.059,0.0105,0.077 +DH009,336.0,338.0,0.093,0.0122,0.096 +DH009,338.0,340.0,0.025,0.0291,0.018 +DH009,340.0,342.0,0.08,0.009,0.053 +DH009,342.0,344.0,0.069,0.0182,0.072 +DH009,344.0,346.0,0.195,0.0264,0.227 +DH009,346.0,348.0,0.195,0.0244,0.172 +DH009,348.0,350.0,0.15,0.0313,0.091 +DH009,350.0,352.0,0.034,0.012,0.048 +DH009,352.0,354.0,0.131,0.0181,0.142 +DH009,354.0,356.0,0.181,0.0334,0.238 +DH009,356.0,358.0,0.044,0.0233,0.025 +DH009,358.0,360.0,0.031,0.0159,0.041 +DH009,360.0,362.0,0.108,0.0502,0.136 +DH009,362.0,364.0,0.357,0.02,0.401 +DH009,364.0,366.0,0.038,0.0319,0.025 +DH009,366.0,368.0,0.056,0.0348,0.081 +DH010,0.0,2.0,0.162,0.0153,0.102 +DH010,2.0,4.0,0.079,0.0271,0.109 +DH010,4.0,6.0,0.102,0.0492,0.146 +DH010,6.0,8.0,0.071,0.0277,0.068 +DH010,8.0,10.0,0.272,0.0332,0.375 +DH010,10.0,12.0,0.072,0.0244,0.052 +DH010,12.0,14.0,0.106,0.023,0.054 +DH010,14.0,16.0,0.067,0.0169,0.06 +DH010,16.0,18.0,0.23,0.0162,0.231 +DH010,18.0,20.0,0.049,0.0262,0.066 +DH010,20.0,22.0,0.218,0.0203,0.117 +DH010,22.0,24.0,0.075,0.0238,0.098 +DH010,24.0,26.0,0.085,0.0196,0.077 +DH010,26.0,28.0,0.069,0.0162,0.057 +DH010,28.0,30.0,0.417,0.01,0.303 +DH010,30.0,32.0,0.046,0.0174,0.066 +DH010,32.0,34.0,0.117,0.02,0.08 +DH010,34.0,36.0,0.054,0.0162,0.061 +DH010,36.0,38.0,0.032,0.0102,0.043 +DH010,38.0,40.0,0.13,0.0207,0.139 +DH010,40.0,42.0,0.027,0.0087,0.035 +DH010,42.0,44.0,0.015,0.0338,0.013 +DH010,44.0,46.0,0.136,0.0117,0.084 +DH010,46.0,48.0,0.563,0.0059,0.828 +DH010,48.0,50.0,0.028,0.0227,0.032 +DH010,50.0,52.0,0.089,0.0116,0.062 +DH010,52.0,54.0,0.034,0.0341,0.032 +DH010,54.0,56.0,0.035,0.0407,0.022 +DH010,56.0,58.0,0.258,0.0337,0.151 +DH010,58.0,60.0,0.078,0.0195,0.113 +DH010,60.0,62.0,0.107,0.02,0.095 +DH010,62.0,64.0,0.08,0.0352,0.04 +DH010,64.0,66.0,0.065,0.0138,0.077 +DH010,66.0,68.0,0.035,0.0126,0.029 +DH010,68.0,70.0,0.073,0.026,0.045 +DH010,70.0,72.0,0.115,0.0169,0.141 +DH010,72.0,74.0,0.091,0.0143,0.068 +DH010,74.0,76.0,0.143,0.0207,0.098 +DH010,76.0,78.0,0.046,0.0088,0.03 +DH010,78.0,80.0,0.216,0.0203,0.24 +DH010,80.0,82.0,2.916,0.2138,5.801 +DH010,82.0,84.0,4.609,0.0205,12.478 +DH010,84.0,86.0,0.668,0.0715,1.285 +DH010,86.0,88.0,3.644,0.06,7.933 +DH010,88.0,90.0,5.562,0.2317,16.115 +DH010,90.0,92.0,0.687,0.507,1.382 +DH010,92.0,94.0,7.983,0.1955,19.787 +DH010,94.0,96.0,0.287,0.1984,0.73 +DH010,96.0,98.0,0.448,0.3325,0.935 +DH010,98.0,100.0,1.028,0.4421,3.069 +DH010,100.0,102.0,3.374,0.8151,6.941 +DH010,102.0,104.0,3.553,0.1753,8.142 +DH010,104.0,106.0,1.547,0.3447,2.781 +DH010,106.0,108.0,5.523,1.2294,10.459 +DH010,108.0,110.0,0.443,0.0761,1.224 +DH010,110.0,112.0,2.072,0.45,4.617 +DH010,112.0,114.0,6.03,0.1966,16.174 +DH010,114.0,116.0,1.375,0.0856,4.105 +DH010,116.0,118.0,1.982,0.3737,3.411 +DH010,118.0,120.0,0.63,0.1851,1.219 +DH010,120.0,122.0,1.191,0.1112,1.845 +DH010,122.0,124.0,4.05,0.8305,7.02 +DH010,124.0,126.0,4.82,0.3967,8.644 +DH010,126.0,128.0,0.7,0.0938,1.278 +DH010,128.0,130.0,5.781,0.2814,13.091 +DH010,130.0,132.0,0.099,1.1553,0.195 +DH010,132.0,134.0,26.106,0.07,74.714 +DH010,134.0,136.0,0.158,0.2981,0.291 +DH010,136.0,138.0,0.614,0.0744,1.309 +DH010,138.0,140.0,5.227,0.9509,12.277 +DH010,140.0,142.0,2.894,0.0795,4.502 +DH010,142.0,144.0,1.194,0.3235,1.954 +DH010,144.0,146.0,7.31,0.1137,17.723 +DH010,146.0,148.0,2.111,0.1721,3.815 +DH010,148.0,150.0,1.137,0.8993,3.261 +DH010,150.0,152.0,2.744,0.1809,4.572 +DH010,152.0,154.0,10.655,0.1253,30.125 +DH010,154.0,156.0,1.721,0.2507,4.4 +DH010,156.0,158.0,3.768,0.713,6.074 +DH010,158.0,160.0,0.575,0.1516,0.886 +DH010,160.0,162.0,24.487,0.4973,58.539 +DH010,162.0,164.0,1.621,0.1775,4.198 +DH010,164.0,166.0,5.686,0.3305,14.926 +DH010,166.0,168.0,3.64,0.1885,6.926 +DH010,168.0,170.0,2.729,0.4554,7.527 +DH010,170.0,172.0,5.383,0.2195,15.895 +DH010,172.0,174.0,0.182,0.2001,0.471 +DH010,174.0,176.0,16.604,0.2965,49.587 +DH010,176.0,178.0,2.114,0.4784,5.721 +DH010,178.0,180.0,1.2,0.1298,3.538 +DH010,180.0,182.0,10.428,0.1335,26.944 +DH010,182.0,184.0,0.54,0.1895,1.498 +DH010,184.0,186.0,27.455,0.0591,47.638 +DH010,186.0,188.0,0.643,0.492,1.112 +DH010,188.0,190.0,1.037,0.2365,2.382 +DH010,190.0,192.0,15.442,0.3456,37.069 +DH010,192.0,194.0,0.091,0.2115,0.254 +DH010,194.0,196.0,10.928,0.0509,19.413 +DH010,196.0,198.0,0.526,0.8771,1.108 +DH010,198.0,200.0,0.886,0.2293,1.952 +DH010,200.0,202.0,0.605,0.2297,1.296 +DH010,202.0,204.0,0.217,0.1645,0.557 +DH010,204.0,206.0,0.39,0.268,1.1 +DH010,206.0,208.0,17.414,0.1856,42.783 +DH010,208.0,210.0,6.209,0.0772,13.922 +DH010,210.0,212.0,4.216,0.187,12.136 +DH010,212.0,214.0,1.884,0.4399,3.599 +DH010,214.0,216.0,0.906,0.2489,2.001 +DH010,216.0,218.0,0.821,0.2506,1.871 +DH010,218.0,220.0,2.063,0.0605,4.206 +DH010,220.0,222.0,0.879,0.5071,2.048 +DH010,222.0,224.0,1.051,0.5889,2.685 +DH010,224.0,226.0,2.859,0.4102,5.558 +DH010,226.0,228.0,2.203,0.1314,4.835 +DH010,228.0,230.0,0.968,0.7321,2.409 +DH010,230.0,232.0,2.281,0.4094,6.424 +DH010,232.0,234.0,1.557,0.2178,4.614 +DH010,234.0,236.0,1.005,0.2017,2.45 +DH010,236.0,238.0,6.281,0.206,15.085 +DH010,238.0,240.0,1.844,0.1845,3.197 +DH010,240.0,242.0,0.458,0.0974,0.798 +DH010,242.0,244.0,8.697,0.2173,19.89 +DH010,244.0,246.0,9.697,0.7718,28.542 +DH010,246.0,248.0,0.8,0.1501,1.453 +DH010,248.0,250.0,2.972,0.1801,6.394 +DH010,250.0,252.0,0.15,0.0138,0.099 +DH010,252.0,254.0,0.143,0.0103,0.197 +DH010,254.0,256.0,0.042,0.0112,0.043 +DH010,256.0,258.0,0.109,0.0156,0.063 +DH010,258.0,260.0,0.085,0.0103,0.076 +DH010,260.0,262.0,0.162,0.0176,0.147 +DH010,262.0,264.0,0.103,0.0066,0.145 +DH010,264.0,266.0,0.528,0.0172,0.532 +DH010,266.0,268.0,0.128,0.0417,0.138 +DH010,268.0,270.0,0.023,0.0243,0.03 +DH010,270.0,272.0,0.119,0.0103,0.078 +DH010,272.0,274.0,0.038,0.0339,0.045 +DH010,274.0,276.0,0.086,0.0119,0.067 +DH010,276.0,278.0,0.2,0.0193,0.234 +DH010,278.0,280.0,0.041,0.0072,0.051 +DH010,280.0,282.0,0.088,0.0299,0.064 +DH010,282.0,284.0,0.211,0.0128,0.161 +DH010,284.0,286.0,0.043,0.0301,0.032 +DH010,286.0,288.0,0.031,0.0523,0.042 +DH010,288.0,290.0,0.067,0.0345,0.099 +DH010,290.0,292.0,0.115,0.0337,0.063 +DH010,292.0,294.0,0.098,0.0241,0.073 +DH010,294.0,296.0,0.264,0.0178,0.255 +DH010,296.0,298.0,0.047,0.0299,0.07 +DH010,298.0,300.0,0.071,0.0193,0.082 +DH010,300.0,302.0,0.097,0.066,0.074 +DH010,302.0,304.0,0.063,0.0304,0.042 +DH010,304.0,306.0,0.195,0.0199,0.183 +DH010,306.0,308.0,0.028,0.0081,0.031 +DH010,308.0,310.0,0.103,0.0093,0.111 +DH010,310.0,312.0,0.084,0.0162,0.045 +DH010,312.0,314.0,0.119,0.0122,0.13 +DH010,314.0,316.0,0.167,0.0219,0.109 +DH010,316.0,318.0,0.121,0.0184,0.078 +DH010,318.0,320.0,0.05,0.0516,0.058 +DH010,320.0,322.0,0.209,0.0167,0.307 +DH010,322.0,324.0,0.128,0.0325,0.092 +DH010,324.0,326.0,0.157,0.0461,0.082 +DH010,326.0,328.0,0.084,0.0141,0.065 +DH010,328.0,330.0,0.229,0.0111,0.126 +DH010,330.0,332.0,0.216,0.025,0.134 +DH010,332.0,334.0,0.063,0.0195,0.078 +DH010,334.0,336.0,0.089,0.0075,0.127 +DH010,336.0,338.0,0.1,0.0178,0.134 +DH010,338.0,340.0,0.048,0.0264,0.059 +DH010,340.0,342.0,0.112,0.0517,0.083 +DH010,342.0,344.0,0.033,0.014,0.022 +DH010,344.0,346.0,0.079,0.0091,0.051 +DH010,346.0,348.0,0.082,0.0477,0.078 +DH010,348.0,350.0,0.165,0.0097,0.239 +DH010,350.0,352.0,0.127,0.0315,0.136 +DH010,352.0,354.0,0.083,0.0092,0.116 +DH010,354.0,356.0,0.136,0.0147,0.155 +DH010,356.0,358.0,0.042,0.0132,0.047 +DH010,358.0,360.0,0.141,0.019,0.207 +DH010,360.0,362.0,0.068,0.0082,0.075 +DH010,362.0,364.0,0.186,0.0171,0.182 +DH010,364.0,366.0,0.078,0.018,0.114 +DH010,366.0,368.0,0.017,0.0203,0.012 +DH010,368.0,370.0,0.2,0.0297,0.261 +DH010,370.0,372.0,0.173,0.0161,0.103 +DH010,372.0,374.0,0.092,0.0165,0.057 +DH010,374.0,376.0,0.101,0.0203,0.124 +DH010,376.0,378.0,0.158,0.0271,0.114 +DH010,378.0,380.0,0.118,0.0199,0.144 +DH010,380.0,381.0,0.078,0.0186,0.048 +DH011,0.0,2.0,0.217,0.0182,0.198 +DH011,2.0,4.0,0.197,0.0273,0.151 +DH011,4.0,6.0,0.068,0.0216,0.034 +DH011,6.0,8.0,0.055,0.0195,0.078 +DH011,8.0,10.0,0.066,0.0288,0.046 +DH011,10.0,12.0,0.147,0.016,0.082 +DH011,12.0,14.0,0.086,0.0099,0.111 +DH011,14.0,16.0,0.09,0.067,0.108 +DH011,16.0,18.0,0.126,0.0207,0.066 +DH011,18.0,20.0,0.045,0.0077,0.038 +DH011,20.0,22.0,0.08,0.0064,0.046 +DH011,22.0,24.0,0.071,0.0164,0.057 +DH011,24.0,26.0,0.067,0.0434,0.078 +DH011,26.0,28.0,0.059,0.0177,0.051 +DH011,28.0,30.0,0.052,0.0125,0.067 +DH011,30.0,32.0,0.064,0.0106,0.088 +DH011,32.0,34.0,0.088,0.0068,0.067 +DH011,34.0,36.0,0.138,0.023,0.135 +DH011,36.0,38.0,0.174,0.0378,0.151 +DH011,38.0,40.0,0.129,0.0199,0.121 +DH011,40.0,42.0,0.059,0.0193,0.055 +DH011,42.0,44.0,0.104,0.0132,0.1 +DH011,44.0,46.0,0.105,0.0171,0.115 +DH011,46.0,48.0,0.034,0.0103,0.029 +DH011,48.0,50.0,0.105,0.0204,0.111 +DH011,50.0,52.0,0.129,0.0313,0.072 +DH011,52.0,54.0,0.093,0.0317,0.089 +DH011,54.0,56.0,0.103,0.0346,0.064 +DH011,56.0,58.0,0.069,0.0157,0.051 +DH011,58.0,60.0,0.211,0.0089,0.131 +DH011,60.0,62.0,0.041,0.0104,0.027 +DH011,62.0,64.0,0.068,0.0084,0.045 +DH011,64.0,66.0,0.123,0.031,0.1 +DH011,66.0,68.0,0.08,0.018,0.107 +DH011,68.0,70.0,0.015,0.0114,0.017 +DH011,70.0,72.0,0.043,0.0161,0.038 +DH011,72.0,74.0,0.055,0.0189,0.051 +DH011,74.0,76.0,0.071,0.0146,0.055 +DH011,76.0,78.0,0.082,0.0077,0.107 +DH011,78.0,80.0,0.063,0.0344,0.081 +DH011,80.0,82.0,9.062,0.0994,13.793 +DH011,82.0,84.0,0.501,0.1269,1.001 +DH011,84.0,86.0,13.263,0.0891,21.101 +DH011,86.0,88.0,2.031,0.3565,3.346 +DH011,88.0,90.0,0.325,0.3301,0.71 +DH011,90.0,92.0,1.302,0.254,2.482 +DH011,92.0,94.0,1.877,0.1665,4.051 +DH011,94.0,96.0,3.134,0.133,8.862 +DH011,96.0,98.0,3.525,0.8821,5.52 +DH011,98.0,100.0,9.559,0.1369,24.058 +DH011,100.0,102.0,1.678,0.1989,4.611 +DH011,102.0,104.0,10.167,0.4523,21.227 +DH011,104.0,106.0,4.807,0.2667,10.561 +DH011,106.0,108.0,0.443,0.1986,0.921 +DH011,108.0,110.0,4.704,0.135,9.56 +DH011,110.0,112.0,0.608,0.2125,1.262 +DH011,112.0,114.0,16.785,0.3557,41.678 +DH011,114.0,116.0,2.141,0.5397,5.521 +DH011,116.0,118.0,1.881,0.0933,3.878 +DH011,118.0,120.0,40.135,0.3054,95.228 +DH011,120.0,122.0,1.94,0.3355,5.158 +DH011,122.0,124.0,1.172,0.1322,2.036 +DH011,124.0,126.0,1.448,0.1552,3.243 +DH011,126.0,128.0,2.443,0.193,6.496 +DH011,128.0,130.0,2.825,0.4059,6.036 +DH011,130.0,132.0,4.32,0.1841,8.332 +DH011,132.0,134.0,0.636,0.1388,1.433 +DH011,134.0,136.0,0.866,0.241,1.546 +DH011,136.0,138.0,0.303,0.4298,0.754 +DH011,138.0,140.0,0.815,0.093,1.263 +DH011,140.0,142.0,11.587,0.1616,17.641 +DH011,142.0,144.0,8.052,0.0524,21.073 +DH011,144.0,146.0,41.801,0.0256,78.845 +DH011,146.0,148.0,0.939,0.1805,1.637 +DH011,148.0,150.0,5.895,0.2039,17.538 +DH011,150.0,152.0,1.81,0.3368,5.405 +DH011,152.0,154.0,0.309,1.0988,0.741 +DH011,154.0,156.0,1.887,0.1623,3.402 +DH011,156.0,158.0,18.678,0.3549,38.41 +DH011,158.0,160.0,0.423,0.1622,0.723 +DH011,160.0,162.0,0.282,0.4298,0.562 +DH011,162.0,164.0,13.356,0.9574,24.39 +DH011,164.0,166.0,3.769,0.0833,7.489 +DH011,166.0,168.0,1.224,0.0935,2.786 +DH011,168.0,170.0,1.273,0.172,2.985 +DH011,170.0,172.0,0.867,0.8941,1.871 +DH011,172.0,174.0,15.464,0.0989,34.796 +DH011,174.0,176.0,1.236,0.1695,3.11 +DH011,176.0,178.0,13.461,0.5783,33.36 +DH011,178.0,180.0,2.776,0.1194,8.068 +DH011,180.0,182.0,0.562,0.1572,1.067 +DH012,0.0,2.0,0.026,0.0179,0.029 +DH012,2.0,4.0,0.161,0.0137,0.114 +DH012,4.0,6.0,0.108,0.0057,0.154 +DH012,6.0,8.0,0.072,0.0458,0.105 +DH012,8.0,10.0,0.142,0.0174,0.17 +DH012,10.0,12.0,0.036,0.0247,0.048 +DH012,12.0,14.0,0.24,0.0303,0.356 +DH012,14.0,16.0,0.045,0.0092,0.05 +DH012,16.0,18.0,0.051,0.0384,0.064 +DH012,18.0,20.0,0.076,0.0238,0.088 +DH012,20.0,22.0,0.068,0.0255,0.085 +DH012,22.0,24.0,0.066,0.0259,0.066 +DH012,24.0,26.0,0.051,0.0247,0.039 +DH012,26.0,28.0,0.11,0.0146,0.162 +DH012,28.0,30.0,0.232,0.0397,0.25 +DH012,30.0,32.0,0.065,0.0158,0.078 +DH012,32.0,34.0,0.066,0.0133,0.038 +DH012,34.0,36.0,0.08,0.0443,0.079 +DH012,36.0,38.0,0.112,0.0516,0.099 +DH012,38.0,40.0,0.07,0.0102,0.085 +DH012,40.0,42.0,0.052,0.0175,0.057 +DH012,42.0,44.0,0.209,0.0326,0.236 +DH012,44.0,46.0,0.041,0.0395,0.032 +DH012,46.0,48.0,0.042,0.0076,0.06 +DH012,48.0,50.0,0.034,0.0134,0.037 +DH012,50.0,52.0,0.066,0.0219,0.07 +DH012,52.0,54.0,0.085,0.0479,0.091 +DH012,54.0,56.0,0.103,0.0084,0.077 +DH012,56.0,58.0,0.062,0.031,0.032 +DH012,58.0,60.0,0.118,0.0256,0.152 +DH012,60.0,62.0,0.158,0.0125,0.232 +DH012,62.0,64.0,0.065,0.0218,0.053 +DH012,64.0,66.0,0.085,0.0107,0.047 +DH012,66.0,68.0,0.084,0.014,0.053 +DH012,68.0,70.0,0.089,0.0135,0.091 +DH012,70.0,72.0,0.045,0.0592,0.055 +DH012,72.0,74.0,0.097,0.0329,0.12 +DH012,74.0,76.0,0.018,0.015,0.019 +DH012,76.0,78.0,0.071,0.0203,0.068 +DH012,78.0,80.0,0.041,0.0224,0.021 +DH012,80.0,82.0,3.377,0.1472,10.012 +DH012,82.0,84.0,1.966,0.9225,3.666 +DH012,84.0,86.0,5.427,0.2127,8.363 +DH012,86.0,88.0,4.753,0.1756,14.164 +DH012,88.0,90.0,0.056,0.6175,0.125 +DH012,90.0,92.0,21.43,0.22,51.822 +DH012,92.0,94.0,1.345,0.2252,2.48 +DH012,94.0,96.0,16.091,1.3386,28.146 +DH012,96.0,98.0,2.197,0.0792,5.729 +DH012,98.0,100.0,2.439,0.177,6.074 +DH012,100.0,102.0,1.102,0.251,3.243 +DH012,102.0,104.0,8.203,0.2052,16.313 +DH012,104.0,106.0,1.748,0.2001,5.192 +DH012,106.0,108.0,5.538,0.1107,11.875 +DH012,108.0,110.0,2.228,0.2459,6.206 +DH012,110.0,112.0,1.687,0.4216,3.56 +DH012,112.0,114.0,1.699,0.2541,3.246 +DH012,114.0,116.0,0.646,0.2167,1.755 +DH012,116.0,118.0,0.63,0.1654,1.349 +DH012,118.0,120.0,6.887,0.2072,12.573 +DH012,120.0,122.0,2.486,0.0852,5.451 +DH012,122.0,124.0,0.386,0.095,0.646 +DH012,124.0,126.0,0.923,0.324,2.547 +DH012,126.0,128.0,5.537,0.0982,13.559 +DH012,128.0,130.0,2.371,1.4365,4.523 +DH012,130.0,132.0,1.093,0.386,2.425 +DH012,132.0,134.0,0.315,0.1137,0.836 +DH012,134.0,136.0,1.349,0.171,2.993 +DH012,136.0,138.0,11.998,0.0715,18.182 +DH012,138.0,140.0,7.807,0.2178,18.407 +DH012,140.0,142.0,0.441,0.1856,0.691 +DH012,142.0,144.0,2.847,0.0727,5.712 +DH012,144.0,146.0,2.557,0.2597,6.076 +DH012,146.0,148.0,1.316,0.1248,3.566 +DH012,148.0,150.0,1.766,0.2075,4.478 +DH012,150.0,152.0,0.196,0.1425,0.412 +DH012,152.0,154.0,2.621,0.5825,7.345 +DH012,154.0,156.0,5.536,0.6744,10.937 +DH012,156.0,158.0,17.32,0.9809,33.894 +DH012,158.0,160.0,5.195,0.1893,8.809 +DH012,160.0,162.0,1.484,0.3668,3.732 +DH012,162.0,164.0,1.769,0.0339,4.542 +DH012,164.0,166.0,1.708,0.3212,4.389 +DH012,166.0,168.0,3.191,0.7086,8.865 +DH012,168.0,170.0,39.522,0.5324,104.563 +DH012,170.0,172.0,12.306,0.0876,28.768 +DH012,172.0,174.0,12.592,0.0501,29.817 +DH012,174.0,176.0,4.215,1.0783,11.733 +DH012,176.0,178.0,15.357,0.1426,26.847 +DH012,178.0,180.0,0.514,0.0935,1.21 +DH012,180.0,182.0,0.586,0.4034,1.245 +DH012,182.0,184.0,0.519,0.1463,1.195 +DH012,184.0,186.0,1.595,0.2293,3.698 +DH012,186.0,188.0,8.157,0.1741,16.621 +DH012,188.0,190.0,2.438,0.3251,7.216 +DH012,190.0,192.0,0.764,0.1255,1.443 +DH012,192.0,194.0,0.893,0.3928,1.817 +DH012,194.0,196.0,0.334,0.1708,0.632 +DH012,196.0,198.0,0.388,0.1373,0.967 +DH012,198.0,200.0,1.388,0.252,3.236 +DH012,200.0,202.0,13.11,0.3297,38.466 +DH012,202.0,204.0,2.493,0.2464,6.375 +DH012,204.0,206.0,1.083,0.4122,1.633 +DH012,206.0,208.0,13.328,0.6267,28.036 +DH012,208.0,210.0,1.625,0.3346,2.86 +DH012,210.0,212.0,16.716,0.2376,44.809 +DH012,212.0,214.0,1.282,0.0845,3.491 +DH012,214.0,216.0,0.832,0.5371,2.141 +DH012,216.0,218.0,2.593,0.56,4.721 +DH012,218.0,220.0,25.076,0.1588,42.716 +DH012,220.0,222.0,4.418,0.3989,6.806 +DH012,222.0,224.0,7.366,0.338,21.972 +DH012,224.0,226.0,4.165,1.0743,7.477 +DH012,226.0,228.0,0.255,1.802,0.681 +DH012,228.0,230.0,13.392,0.228,29.771 +DH012,230.0,232.0,0.974,0.3681,1.885 +DH012,232.0,234.0,14.803,0.3169,32.539 +DH012,234.0,236.0,0.166,0.2084,0.298 +DH012,236.0,238.0,2.911,0.4814,6.701 +DH012,238.0,240.0,2.36,0.5741,5.702 +DH012,240.0,242.0,4.514,0.1708,9.807 +DH012,242.0,244.0,3.333,0.5957,5.254 +DH012,244.0,246.0,1.892,0.4496,4.39 +DH012,246.0,248.0,2.004,0.1282,3.17 +DH012,248.0,250.0,6.083,0.2157,17.453 +DH012,250.0,252.0,0.03,0.0278,0.042 +DH012,252.0,254.0,0.1,0.034,0.121 +DH012,254.0,256.0,0.08,0.0168,0.092 +DH012,256.0,258.0,0.173,0.0094,0.21 +DH012,258.0,260.0,0.152,0.0167,0.096 +DH012,260.0,262.0,0.106,0.0218,0.137 +DH012,262.0,264.0,0.115,0.0112,0.079 +DH012,264.0,266.0,0.165,0.0201,0.22 +DH012,266.0,268.0,0.077,0.0202,0.114 +DH012,268.0,270.0,0.066,0.0091,0.093 +DH012,270.0,272.0,0.091,0.008,0.105 +DH012,272.0,274.0,0.079,0.0237,0.082 +DH012,274.0,276.0,0.051,0.0125,0.065 +DH012,276.0,278.0,0.083,0.0197,0.074 +DH012,278.0,280.0,0.064,0.0154,0.071 +DH012,280.0,282.0,0.052,0.0139,0.071 +DH012,282.0,284.0,0.106,0.0092,0.087 +DH012,284.0,286.0,0.048,0.0289,0.042 +DH012,286.0,288.0,0.063,0.0409,0.054 +DH012,288.0,290.0,0.147,0.0228,0.114 +DH012,290.0,292.0,0.118,0.0335,0.164 +DH012,292.0,294.0,0.242,0.028,0.215 +DH012,294.0,296.0,0.095,0.0196,0.094 +DH012,296.0,298.0,0.078,0.0205,0.081 +DH012,298.0,300.0,0.101,0.0185,0.056 +DH012,300.0,302.0,0.122,0.0199,0.103 +DH012,302.0,304.0,0.24,0.0171,0.151 +DH012,304.0,306.0,0.067,0.0143,0.097 +DH012,306.0,308.0,0.189,0.0229,0.167 +DH012,308.0,310.0,0.119,0.019,0.092 +DH012,310.0,312.0,0.101,0.0147,0.128 +DH012,312.0,314.0,0.093,0.0248,0.063 +DH012,314.0,316.0,0.126,0.0116,0.161 +DH012,316.0,318.0,0.06,0.0107,0.048 +DH012,318.0,320.0,0.046,0.0129,0.061 +DH012,320.0,322.0,0.058,0.0167,0.034 +DH012,322.0,324.0,0.135,0.028,0.115 +DH012,324.0,326.0,0.113,0.019,0.164 +DH012,326.0,328.0,0.05,0.0349,0.065 +DH012,328.0,330.0,0.054,0.0187,0.029 +DH012,330.0,332.0,0.042,0.02,0.021 +DH012,332.0,334.0,0.046,0.0087,0.063 +DH012,334.0,336.0,0.066,0.0176,0.054 +DH012,336.0,338.0,0.121,0.0177,0.1 +DH012,338.0,340.0,0.074,0.0124,0.038 +DH012,340.0,342.0,0.038,0.024,0.042 +DH012,342.0,344.0,0.142,0.0155,0.176 +DH012,344.0,346.0,0.042,0.0131,0.048 +DH012,346.0,348.0,0.166,0.0421,0.228 +DH012,348.0,350.0,0.247,0.0158,0.15 +DH012,350.0,352.0,0.047,0.0226,0.046 +DH012,352.0,354.0,0.042,0.0231,0.063 +DH012,354.0,356.0,0.106,0.0288,0.152 +DH012,356.0,358.0,0.046,0.0144,0.056 +DH012,358.0,360.0,0.077,0.0193,0.072 +DH012,360.0,362.0,0.224,0.0128,0.162 +DH012,362.0,364.0,0.044,0.019,0.058 +DH012,364.0,366.0,0.162,0.0148,0.089 +DH012,366.0,368.0,0.106,0.014,0.092 +DH012,368.0,370.0,0.057,0.0249,0.042 +DH012,370.0,372.0,0.109,0.0243,0.12 +DH012,372.0,374.0,0.034,0.0231,0.042 +DH012,374.0,376.0,0.058,0.054,0.066 +DH012,376.0,378.0,0.053,0.0326,0.028 +DH012,378.0,380.0,0.063,0.0342,0.032 +DH012,380.0,382.0,0.032,0.024,0.041 +DH012,382.0,384.0,0.207,0.0135,0.272 +DH012,384.0,386.0,0.238,0.012,0.211 +DH012,386.0,388.0,0.104,0.0119,0.08 +DH012,388.0,390.0,0.072,0.0162,0.072 +DH012,390.0,392.0,0.086,0.0199,0.068 +DH012,392.0,394.0,0.059,0.0173,0.031 +DH012,394.0,396.0,0.063,0.0215,0.091 +DH012,396.0,398.0,0.053,0.0159,0.066 +DH012,398.0,400.0,0.218,0.0185,0.253 +DH012,400.0,402.0,0.061,0.0182,0.076 +DH012,402.0,404.0,0.074,0.0115,0.077 +DH012,404.0,406.0,0.018,0.0104,0.024 +DH012,406.0,408.0,0.135,0.0354,0.149 +DH012,408.0,410.0,0.123,0.0146,0.147 +DH012,410.0,412.0,0.163,0.0189,0.224 +DH012,412.0,414.0,0.066,0.0491,0.034 +DH012,414.0,416.0,0.183,0.0428,0.176 +DH012,416.0,418.0,0.061,0.0109,0.045 +DH012,418.0,420.0,0.122,0.0166,0.108 +DH012,420.0,422.0,0.115,0.0072,0.067 +DH012,422.0,424.0,0.067,0.0239,0.055 +DH012,424.0,425.0,0.187,0.0174,0.247 +DH013,0.0,2.0,0.085,0.0202,0.123 +DH013,2.0,4.0,0.09,0.0153,0.132 +DH013,4.0,6.0,0.123,0.0138,0.127 +DH013,6.0,8.0,0.062,0.034,0.032 +DH013,8.0,10.0,0.086,0.0147,0.069 +DH013,10.0,12.0,0.184,0.0253,0.262 +DH013,12.0,14.0,0.118,0.0092,0.16 +DH013,14.0,16.0,0.073,0.0127,0.058 +DH013,16.0,18.0,0.027,0.0093,0.021 +DH013,18.0,20.0,0.079,0.0123,0.089 +DH013,20.0,22.0,0.063,0.0316,0.073 +DH013,22.0,24.0,0.125,0.0203,0.107 +DH013,24.0,26.0,0.078,0.0099,0.109 +DH013,26.0,28.0,0.052,0.0222,0.046 +DH013,28.0,30.0,0.083,0.0244,0.107 +DH013,30.0,32.0,0.052,0.0185,0.034 +DH013,32.0,34.0,0.208,0.0087,0.195 +DH013,34.0,36.0,0.442,0.016,0.583 +DH013,36.0,38.0,0.058,0.0046,0.08 +DH013,38.0,40.0,0.133,0.0116,0.121 +DH013,40.0,42.0,0.143,0.0076,0.212 +DH013,42.0,44.0,0.072,0.0126,0.1 +DH013,44.0,46.0,0.038,0.0204,0.022 +DH013,46.0,48.0,0.114,0.0202,0.145 +DH013,48.0,50.0,0.034,0.0234,0.032 +DH013,50.0,52.0,0.074,0.0309,0.059 +DH013,52.0,54.0,0.185,0.0377,0.248 +DH013,54.0,56.0,0.046,0.0061,0.028 +DH013,56.0,58.0,0.088,0.0126,0.049 +DH013,58.0,60.0,0.049,0.0148,0.027 +DH013,60.0,62.0,0.042,0.0173,0.051 +DH013,62.0,64.0,0.093,0.0342,0.057 +DH013,64.0,66.0,0.082,0.0057,0.12 +DH013,66.0,68.0,0.13,0.0084,0.069 +DH013,68.0,70.0,0.101,0.0382,0.121 +DH013,70.0,72.0,0.056,0.0178,0.031 +DH013,72.0,74.0,0.075,0.031,0.09 +DH013,74.0,76.0,0.088,0.0229,0.048 +DH013,76.0,78.0,0.136,0.0197,0.176 +DH013,78.0,80.0,0.092,0.0221,0.097 +DH013,80.0,82.0,1.044,0.5942,2.59 +DH013,82.0,84.0,0.652,0.2579,1.419 +DH013,84.0,86.0,1.118,0.4813,2.737 +DH013,86.0,88.0,2.564,0.02,4.514 +DH013,88.0,90.0,3.34,0.3238,7.354 +DH013,90.0,92.0,1.729,0.1954,5.093 +DH013,92.0,94.0,1.741,0.0813,5.216 +DH013,94.0,96.0,0.605,0.746,1.68 +DH013,96.0,98.0,2.898,0.148,6.508 +DH013,98.0,100.0,6.844,0.0393,14.05 +DH013,100.0,102.0,2.084,0.2683,3.829 +DH013,102.0,104.0,0.245,0.1176,0.485 +DH013,104.0,106.0,0.88,0.4848,2.083 +DH013,106.0,108.0,3.194,0.2533,7.438 +DH013,108.0,110.0,1.897,0.4202,4.295 +DH013,110.0,112.0,3.748,0.067,7.72 +DH013,112.0,114.0,3.501,0.315,9.344 +DH013,114.0,116.0,1.185,0.7348,2.265 +DH013,116.0,118.0,3.688,0.3591,10.128 +DH013,118.0,120.0,1.521,0.1323,2.729 +DH013,120.0,122.0,14.337,0.3126,30.091 +DH013,122.0,124.0,93.695,0.2894,157.109 +DH013,124.0,126.0,1.759,0.1023,3.04 +DH013,126.0,128.0,1.373,0.1395,2.748 +DH013,128.0,130.0,15.044,0.2834,31.518 +DH013,130.0,132.0,5.524,0.3253,9.048 +DH013,132.0,134.0,5.063,0.2484,11.072 +DH013,134.0,136.0,5.494,0.2542,14.726 +DH013,136.0,138.0,13.964,0.1522,34.448 +DH013,138.0,140.0,3.657,0.137,10.186 +DH013,140.0,142.0,1.456,0.1505,4.036 +DH013,142.0,144.0,1.018,0.2761,1.712 +DH013,144.0,146.0,4.329,0.0279,10.164 +DH013,146.0,148.0,1.139,0.3206,2.144 +DH013,148.0,150.0,1.766,0.2056,2.659 +DH013,150.0,152.0,11.171,0.2196,33.139 +DH013,152.0,154.0,6.875,0.3805,11.268 +DH013,154.0,156.0,8.499,0.1547,21.469 +DH013,156.0,158.0,0.693,0.0865,1.947 +DH013,158.0,160.0,0.706,0.5582,1.867 +DH013,160.0,162.0,1.344,0.2153,2.466 +DH013,162.0,164.0,2.189,0.0938,5.56 +DH013,164.0,166.0,6.756,0.2734,12.556 +DH013,166.0,168.0,6.183,0.2219,10.914 +DH013,168.0,170.0,5.452,0.1952,14.192 +DH013,170.0,172.0,20.438,0.2201,42.292 +DH013,172.0,174.0,1.369,0.5735,3.704 +DH013,174.0,176.0,0.349,0.1296,0.639 +DH013,176.0,178.0,6.041,0.182,12.137 +DH013,178.0,180.0,5.46,0.1803,9.28 +DH013,180.0,182.0,3.304,0.1147,6.199 +DH013,182.0,184.0,3.223,0.0579,7.513 +DH013,184.0,186.0,1.547,0.5079,3.378 +DH013,186.0,188.0,1.408,0.1518,2.783 +DH013,188.0,190.0,2.112,0.9388,3.824 +DH013,190.0,192.0,1.36,0.2703,3.682 +DH013,192.0,194.0,6.242,0.0769,15.786 +DH013,194.0,196.0,3.845,0.5949,9.249 +DH013,196.0,198.0,11.581,0.1995,29.857 +DH013,198.0,200.0,0.061,0.0656,0.171 +DH013,200.0,202.0,2.056,0.3703,4.935 +DH013,202.0,204.0,0.589,0.1603,1.331 +DH013,204.0,206.0,2.936,0.1187,7.5 +DH013,206.0,208.0,1.056,0.1113,2.504 +DH013,208.0,210.0,8.083,0.2006,21.729 +DH013,210.0,212.0,6.762,1.2389,18.679 +DH013,212.0,214.0,9.783,0.5111,15.245 +DH013,214.0,216.0,2.298,0.08,3.506 +DH013,216.0,218.0,1.05,0.1617,2.668 +DH013,218.0,219.0,1.577,0.3416,2.984 +DH014,0.0,2.0,0.027,0.0126,0.017 +DH014,2.0,4.0,0.095,0.0236,0.14 +DH014,4.0,6.0,0.051,0.0207,0.027 +DH014,6.0,8.0,0.041,0.0265,0.023 +DH014,8.0,10.0,0.145,0.0135,0.104 +DH014,10.0,12.0,0.061,0.0254,0.063 +DH014,12.0,14.0,0.072,0.0055,0.047 +DH014,14.0,16.0,0.087,0.0149,0.094 +DH014,16.0,18.0,0.041,0.0138,0.033 +DH014,18.0,20.0,0.059,0.0307,0.085 +DH014,20.0,22.0,0.054,0.0128,0.037 +DH014,22.0,24.0,0.18,0.0321,0.181 +DH014,24.0,26.0,0.036,0.0095,0.023 +DH014,26.0,28.0,0.114,0.0065,0.16 +DH014,28.0,30.0,0.217,0.0164,0.119 +DH014,30.0,32.0,0.121,0.0107,0.14 +DH014,32.0,34.0,0.076,0.0114,0.082 +DH014,34.0,36.0,0.203,0.0112,0.139 +DH014,36.0,38.0,0.063,0.0181,0.075 +DH014,38.0,40.0,0.057,0.0243,0.033 +DH014,40.0,42.0,0.107,0.0053,0.086 +DH014,42.0,44.0,0.137,0.025,0.098 +DH014,44.0,46.0,0.041,0.013,0.035 +DH014,46.0,48.0,0.179,0.0201,0.197 +DH014,48.0,50.0,0.081,0.0214,0.074 +DH014,50.0,52.0,0.112,0.0205,0.13 +DH014,52.0,54.0,0.026,0.0196,0.014 +DH014,54.0,56.0,0.058,0.0233,0.05 +DH014,56.0,58.0,0.08,0.0242,0.116 +DH014,58.0,60.0,0.095,0.0178,0.113 +DH014,60.0,62.0,0.059,0.0162,0.078 +DH014,62.0,64.0,0.078,0.0105,0.046 +DH014,64.0,66.0,0.043,0.0177,0.028 +DH014,66.0,68.0,0.096,0.0167,0.123 +DH014,68.0,70.0,0.071,0.0105,0.104 +DH014,70.0,72.0,0.072,0.0247,0.065 +DH014,72.0,74.0,0.066,0.0146,0.098 +DH014,74.0,76.0,0.075,0.0149,0.108 +DH014,76.0,78.0,0.04,0.0137,0.054 +DH014,78.0,80.0,0.119,0.0117,0.071 +DH014,80.0,82.0,0.784,0.3499,1.575 +DH014,82.0,84.0,1.868,0.0742,3.452 +DH014,84.0,86.0,6.245,0.0814,17.776 +DH014,86.0,88.0,2.553,0.3017,6.8 +DH014,88.0,90.0,0.726,0.1022,1.977 +DH014,90.0,92.0,1.046,0.0247,3.084 +DH014,92.0,94.0,0.642,0.3242,1.311 +DH014,94.0,96.0,2.271,0.4949,6.008 +DH014,96.0,98.0,14.953,0.0954,36.461 +DH014,98.0,100.0,4.992,0.1916,14.582 +DH014,100.0,102.0,1.325,1.1682,2.956 +DH014,102.0,104.0,3.122,0.3472,9.189 +DH014,104.0,106.0,0.535,0.0781,1.096 +DH014,106.0,108.0,3.092,0.1861,4.643 +DH014,108.0,110.0,0.127,0.1916,0.284 +DH014,110.0,112.0,6.697,0.4946,11.757 +DH014,112.0,114.0,3.577,0.0673,7.822 +DH014,114.0,116.0,4.736,0.6042,12.186 +DH014,116.0,118.0,0.292,0.1635,0.741 +DH014,118.0,120.0,2.737,0.2255,7.838 +DH014,120.0,122.0,7.638,0.0924,18.201 +DH014,122.0,124.0,0.651,0.1673,1.67 +DH014,124.0,126.0,2.1,0.1955,3.883 +DH014,126.0,128.0,6.35,0.2128,18.474 +DH014,128.0,130.0,1.761,0.2189,3.733 +DH014,130.0,132.0,2.207,0.3945,4.715 +DH014,132.0,134.0,4.146,0.1165,9.012 +DH014,134.0,136.0,1.11,0.441,1.679 +DH014,136.0,138.0,13.807,0.0886,41.193 +DH014,138.0,140.0,1.062,0.0737,1.716 +DH014,140.0,142.0,4.692,0.2224,12.8 +DH014,142.0,144.0,1.399,0.1384,3.069 +DH014,144.0,146.0,0.921,0.0775,1.471 +DH014,146.0,148.0,1.718,1.14,2.692 +DH014,148.0,150.0,6.142,0.5303,14.087 +DH014,150.0,152.0,0.913,0.4038,1.641 +DH014,152.0,154.0,0.41,0.0905,1.06 +DH014,154.0,156.0,4.547,0.181,8.594 +DH014,156.0,158.0,0.292,0.0927,0.703 +DH014,158.0,160.0,0.993,0.2452,2.9 +DH014,160.0,161.0,33.904,0.2196,98.544 +DH015,0.0,2.0,0.05,0.0079,0.045 +DH015,2.0,4.0,0.031,0.0185,0.034 +DH015,4.0,6.0,0.025,0.0436,0.037 +DH015,6.0,8.0,0.031,0.0287,0.037 +DH015,8.0,10.0,0.158,0.0127,0.182 +DH015,10.0,12.0,0.101,0.0246,0.134 +DH015,12.0,14.0,0.078,0.0239,0.082 +DH015,14.0,16.0,0.093,0.0171,0.076 +DH015,16.0,18.0,0.118,0.0187,0.092 +DH015,18.0,20.0,0.177,0.009,0.191 +DH015,20.0,22.0,0.081,0.0215,0.107 +DH015,22.0,24.0,0.03,0.0171,0.031 +DH015,24.0,26.0,0.123,0.0166,0.138 +DH015,26.0,28.0,0.033,0.0511,0.023 +DH015,28.0,30.0,0.193,0.0115,0.172 +DH015,30.0,32.0,0.119,0.0122,0.086 +DH015,32.0,34.0,0.086,0.0231,0.102 +DH015,34.0,36.0,0.122,0.0403,0.109 +DH015,36.0,38.0,0.232,0.0135,0.253 +DH015,38.0,40.0,0.11,0.0107,0.153 +DH015,40.0,42.0,0.082,0.012,0.086 +DH015,42.0,44.0,0.09,0.0177,0.112 +DH015,44.0,46.0,0.078,0.0152,0.07 +DH015,46.0,48.0,0.056,0.0691,0.063 +DH015,48.0,50.0,0.058,0.0142,0.078 +DH015,50.0,52.0,0.037,0.0227,0.052 +DH015,52.0,54.0,0.1,0.034,0.095 +DH015,54.0,56.0,0.063,0.0202,0.093 +DH015,56.0,58.0,0.087,0.0123,0.07 +DH015,58.0,60.0,0.03,0.0224,0.025 +DH015,60.0,62.0,0.09,0.0099,0.083 +DH015,62.0,64.0,0.164,0.0246,0.182 +DH015,64.0,66.0,0.209,0.0124,0.283 +DH015,66.0,68.0,0.034,0.0266,0.045 +DH015,68.0,70.0,0.047,0.0249,0.039 +DH015,70.0,72.0,0.142,0.0204,0.091 +DH015,72.0,74.0,0.113,0.0213,0.163 +DH015,74.0,76.0,0.093,0.0279,0.066 +DH015,76.0,78.0,0.076,0.0092,0.106 +DH015,78.0,80.0,0.22,0.0145,0.224 +DH015,80.0,82.0,5.517,0.0427,8.764 +DH015,82.0,84.0,3.447,0.022,7.055 +DH015,84.0,86.0,8.34,0.4978,14.445 +DH015,86.0,88.0,6.415,0.265,10.126 +DH015,88.0,90.0,1.524,0.2448,3.956 +DH015,90.0,92.0,10.137,0.7537,18.254 +DH015,92.0,94.0,1.364,0.104,2.796 +DH015,94.0,96.0,4.275,0.2902,12.437 +DH015,96.0,98.0,3.709,0.0936,10.761 +DH015,98.0,100.0,11.643,0.8227,23.564 +DH015,100.0,102.0,0.424,0.2613,1.255 +DH015,102.0,104.0,0.785,0.2128,1.614 +DH015,104.0,106.0,4.667,1.6228,13.481 +DH015,106.0,108.0,0.679,0.5941,1.622 +DH015,108.0,110.0,1.757,0.2117,2.915 +DH015,110.0,112.0,4.651,0.3216,13.36 +DH015,112.0,114.0,9.564,5.5882,20.933 +DH015,114.0,116.0,2.508,0.079,5.324 +DH015,116.0,118.0,1.722,0.1455,2.589 +DH015,118.0,120.0,18.796,0.6052,39.276 +DH015,120.0,122.0,0.522,0.6504,1.372 +DH015,122.0,124.0,0.28,0.3945,0.701 +DH015,124.0,126.0,0.121,0.1154,0.344 +DH015,126.0,128.0,5.373,0.1477,10.545 +DH015,128.0,130.0,5.326,0.1534,15.329 +DH015,130.0,132.0,0.586,0.0756,1.257 +DH015,132.0,134.0,3.013,0.4667,4.806 +DH015,134.0,136.0,0.857,0.6627,1.561 +DH015,136.0,138.0,9.992,0.6417,26.998 +DH015,138.0,140.0,0.975,0.1161,2.398 +DH015,140.0,142.0,0.47,0.1034,0.856 +DH015,142.0,144.0,4.851,0.0964,8.074 +DH015,144.0,146.0,3.839,0.7467,6.701 +DH015,146.0,148.0,7.927,0.3268,16.11 +DH015,148.0,150.0,0.475,0.2024,1.159 +DH015,150.0,152.0,1.661,0.3183,2.618 +DH015,152.0,154.0,3.563,0.1937,9.662 +DH015,154.0,156.0,8.303,0.2952,22.37 +DH015,156.0,158.0,1.764,0.0553,5.016 +DH015,158.0,160.0,4.09,0.1904,11.663 +DH015,160.0,162.0,14.902,0.0885,34.73 +DH015,162.0,164.0,30.693,0.5282,80.89 +DH015,164.0,166.0,0.571,0.075,1.217 +DH015,166.0,168.0,0.976,0.1255,2.057 +DH015,168.0,170.0,1.969,0.329,5.088 +DH015,170.0,172.0,0.981,0.1964,2.095 +DH015,172.0,174.0,20.16,0.2687,33.516 +DH015,174.0,176.0,3.676,0.3453,7.642 +DH015,176.0,178.0,0.519,0.9107,1.113 +DH015,178.0,180.0,4.918,0.2619,10.586 +DH015,180.0,182.0,17.257,0.3497,27.461 +DH015,182.0,184.0,8.391,0.1347,22.112 +DH015,184.0,186.0,0.472,0.0976,1.064 +DH015,186.0,188.0,3.462,0.0572,9.524 +DH015,188.0,190.0,0.833,0.6211,1.485 +DH015,190.0,192.0,0.578,0.2371,1.457 +DH015,192.0,194.0,10.204,0.2232,25.054 +DH015,194.0,196.0,4.527,0.0999,12.412 +DH015,196.0,198.0,3.633,0.0926,7.269 +DH015,198.0,200.0,6.075,0.3396,16.792 +DH015,200.0,202.0,1.059,0.1083,2.132 +DH015,202.0,204.0,6.601,0.1593,12.218 +DH015,204.0,206.0,0.437,0.1303,0.661 +DH015,206.0,208.0,3.829,0.2064,9.45 +DH015,208.0,210.0,2.445,0.1958,5.209 +DH015,210.0,212.0,1.334,0.2686,2.346 +DH015,212.0,214.0,2.824,0.0869,5.597 +DH015,214.0,216.0,3.592,0.7242,5.507 +DH015,216.0,218.0,1.358,0.267,2.262 +DH015,218.0,220.0,0.717,0.0899,1.174 +DH015,220.0,222.0,2.784,0.1306,5.002 +DH015,222.0,224.0,1.182,0.6372,3.357 +DH015,224.0,226.0,2.682,0.3531,7.72 +DH015,226.0,228.0,2.808,0.2779,7.765 +DH015,228.0,230.0,3.014,0.2151,6.283 +DH015,230.0,232.0,2.323,0.2745,4.741 +DH015,232.0,234.0,0.54,0.1697,1.148 +DH015,234.0,236.0,3.963,0.3222,7.323 +DH015,236.0,238.0,4.65,0.5514,8.931 +DH015,238.0,240.0,0.676,0.1735,1.191 +DH015,240.0,242.0,3.626,0.3081,9.647 +DH015,242.0,244.0,1.421,0.1932,2.267 +DH015,244.0,246.0,6.104,0.0998,11.051 +DH015,246.0,248.0,1.019,0.3247,2.886 +DH015,248.0,250.0,14.57,0.1597,25.341 +DH015,250.0,252.0,0.118,0.0118,0.06 +DH015,252.0,254.0,0.07,0.0142,0.046 +DH015,254.0,256.0,0.16,0.0136,0.125 +DH015,256.0,258.0,0.099,0.0091,0.143 +DH015,258.0,260.0,0.035,0.0251,0.036 +DH015,260.0,262.0,0.082,0.0096,0.074 +DH015,262.0,264.0,0.143,0.0122,0.095 +DH015,264.0,266.0,0.108,0.0233,0.12 +DH015,266.0,268.0,0.275,0.0239,0.252 +DH015,268.0,270.0,0.075,0.0072,0.099 +DH015,270.0,272.0,0.058,0.024,0.067 +DH015,272.0,274.0,0.095,0.0124,0.136 +DH015,274.0,276.0,0.04,0.0563,0.025 +DH015,276.0,278.0,0.219,0.0347,0.166 +DH015,278.0,280.0,0.165,0.0175,0.135 +DH015,280.0,282.0,0.202,0.0322,0.203 +DH015,282.0,284.0,0.039,0.0137,0.049 +DH015,284.0,286.0,0.145,0.0082,0.166 +DH015,286.0,288.0,0.049,0.009,0.064 +DH015,288.0,290.0,0.067,0.0279,0.083 +DH015,290.0,292.0,0.052,0.0056,0.039 +DH015,292.0,294.0,0.241,0.0519,0.221 +DH015,294.0,296.0,0.05,0.0158,0.048 +DH015,296.0,298.0,0.06,0.0206,0.068 +DH015,298.0,300.0,0.058,0.0141,0.053 +DH015,300.0,302.0,0.046,0.023,0.024 +DH015,302.0,304.0,0.089,0.0366,0.058 +DH015,304.0,306.0,0.143,0.0075,0.147 +DH015,306.0,308.0,0.083,0.0479,0.072 +DH015,308.0,310.0,0.077,0.0379,0.076 +DH015,310.0,312.0,0.072,0.0216,0.039 +DH015,312.0,314.0,0.21,0.0229,0.121 +DH015,314.0,316.0,0.066,0.0126,0.076 +DH016,0.0,2.0,0.041,0.0233,0.042 +DH016,2.0,4.0,0.055,0.0235,0.082 +DH016,4.0,6.0,0.13,0.0144,0.094 +DH016,6.0,8.0,0.065,0.0251,0.042 +DH016,8.0,10.0,0.128,0.0194,0.073 +DH016,10.0,12.0,0.15,0.0175,0.161 +DH016,12.0,14.0,0.124,0.0124,0.152 +DH016,14.0,16.0,0.122,0.0157,0.085 +DH016,16.0,18.0,0.074,0.0306,0.041 +DH016,18.0,20.0,0.098,0.0152,0.089 +DH016,20.0,22.0,0.168,0.0178,0.171 +DH016,22.0,24.0,0.084,0.0195,0.051 +DH016,24.0,26.0,0.169,0.0191,0.151 +DH016,26.0,28.0,0.054,0.0168,0.042 +DH016,28.0,30.0,0.137,0.0266,0.112 +DH016,30.0,32.0,0.148,0.0175,0.175 +DH016,32.0,34.0,0.183,0.0381,0.21 +DH016,34.0,36.0,0.126,0.0269,0.186 +DH016,36.0,38.0,0.127,0.0094,0.09 +DH016,38.0,40.0,0.156,0.0142,0.166 +DH016,40.0,42.0,0.111,0.0159,0.087 +DH016,42.0,44.0,0.128,0.0138,0.074 +DH016,44.0,46.0,0.103,0.014,0.123 +DH016,46.0,48.0,0.037,0.0161,0.021 +DH016,48.0,50.0,0.118,0.0123,0.081 +DH016,50.0,52.0,0.083,0.0242,0.106 +DH016,52.0,54.0,0.06,0.0213,0.072 +DH016,54.0,56.0,0.093,0.0081,0.119 +DH016,56.0,58.0,0.28,0.0096,0.176 +DH016,58.0,60.0,0.072,0.0192,0.038 +DH016,60.0,62.0,0.163,0.0191,0.134 +DH016,62.0,64.0,0.076,0.0154,0.099 +DH016,64.0,66.0,0.028,0.021,0.024 +DH016,66.0,68.0,0.108,0.0258,0.084 +DH016,68.0,70.0,0.071,0.03,0.06 +DH016,70.0,72.0,0.2,0.0274,0.126 +DH016,72.0,74.0,0.093,0.0126,0.079 +DH016,74.0,76.0,0.042,0.0188,0.054 +DH016,76.0,78.0,0.034,0.018,0.018 +DH016,78.0,80.0,0.041,0.0152,0.042 +DH016,80.0,82.0,1.062,0.4683,2.378 +DH016,82.0,84.0,0.205,0.2237,0.464 +DH016,84.0,86.0,3.615,0.145,7.37 +DH016,86.0,88.0,2.206,0.1567,4.048 +DH016,88.0,90.0,1.508,0.2138,3.349 +DH016,90.0,92.0,1.762,0.3482,4.063 +DH016,92.0,94.0,5.353,0.2813,13.165 +DH016,94.0,96.0,2.51,0.1407,4.406 +DH016,96.0,98.0,25.39,0.5877,53.377 +DH016,98.0,100.0,6.215,0.1113,16.583 +DH016,100.0,102.0,6.941,0.7333,14.721 +DH016,102.0,104.0,1.246,1.2777,2.125 +DH016,104.0,106.0,19.847,0.2633,34.714 +DH016,106.0,108.0,1.543,0.4743,3.692 +DH016,108.0,110.0,0.643,0.1683,1.606 +DH016,110.0,112.0,1.905,0.1504,5.138 +DH016,112.0,114.0,8.366,0.1557,13.541 +DH016,114.0,116.0,0.522,0.109,1.315 +DH016,116.0,118.0,2.311,0.103,4.089 +DH016,118.0,120.0,0.62,0.3211,1.736 +DH016,120.0,122.0,0.661,0.0503,1.147 +DH016,122.0,124.0,0.256,0.2289,0.663 +DH016,124.0,126.0,16.579,0.0526,41.263 +DH016,126.0,128.0,0.679,0.0859,1.921 +DH016,128.0,130.0,9.718,0.3605,25.426 +DH016,130.0,132.0,5.186,0.0371,11.494 +DH016,132.0,134.0,0.828,0.2376,1.75 +DH016,134.0,136.0,1.878,0.194,3.177 +DH016,136.0,138.0,4.255,0.2514,9.892 +DH016,138.0,140.0,3.604,0.4321,10.323 +DH016,140.0,142.0,2.072,0.5653,6.193 +DH016,142.0,144.0,19.407,0.0764,56.732 +DH016,144.0,146.0,0.712,1.2845,1.913 +DH016,146.0,148.0,1.22,0.1659,2.533 +DH016,148.0,150.0,1.501,0.2006,3.912 +DH016,150.0,152.0,2.384,0.2263,6.154 +DH016,152.0,154.0,10.707,0.192,31.323 +DH016,154.0,156.0,0.593,0.4122,0.97 +DH016,156.0,158.0,0.537,0.1923,0.871 +DH016,158.0,160.0,2.765,0.7387,4.871 +DH016,160.0,162.0,7.826,0.1324,13.351 +DH016,162.0,164.0,2.886,0.3788,7.702 +DH016,164.0,166.0,0.917,0.4512,2.188 +DH016,166.0,168.0,1.105,0.0514,2.305 +DH016,168.0,170.0,1.496,0.2009,3.584 +DH016,170.0,172.0,1.287,0.1799,3.633 +DH016,172.0,174.0,12.984,0.2286,23.505 +DH016,174.0,176.0,0.53,0.2494,1.473 +DH016,176.0,178.0,0.341,0.371,0.754 +DH016,178.0,180.0,1.431,0.2822,3.012 +DH016,180.0,182.0,4.586,0.362,12.895 +DH016,182.0,184.0,1.987,0.1841,3.048 +DH016,184.0,186.0,1.36,0.2297,3.448 +DH016,186.0,188.0,2.453,0.7455,7.127 +DH016,188.0,190.0,1.93,0.1904,4.343 +DH016,190.0,192.0,4.84,0.1718,11.605 +DH016,192.0,194.0,2.902,0.2522,7.765 +DH016,194.0,196.0,11.894,0.2185,22.207 +DH016,196.0,198.0,2.942,0.0782,5.466 +DH016,198.0,200.0,1.423,0.3583,2.508 +DH016,200.0,202.0,1.556,0.1962,4.165 +DH016,202.0,204.0,5.893,0.3727,10.951 +DH016,204.0,206.0,1.496,0.5839,3.238 +DH016,206.0,208.0,0.421,0.0845,0.947 +DH016,208.0,210.0,9.42,0.1378,20.225 +DH016,210.0,212.0,1.717,0.3528,3.141 +DH016,212.0,214.0,1.173,0.0761,2.482 +DH016,214.0,216.0,9.143,0.24,18.438 +DH016,216.0,218.0,9.81,0.1397,25.732 +DH016,218.0,220.0,11.993,0.2334,24.297 +DH016,220.0,222.0,34.723,0.3042,59.447 +DH016,222.0,224.0,7.01,0.3913,20.594 +DH016,224.0,226.0,1.005,0.2879,2.167 +DH016,226.0,228.0,4.951,0.2191,7.939 +DH016,228.0,230.0,1.867,0.1825,4.748 +DH016,230.0,232.0,5.746,0.7347,12.486 +DH016,232.0,234.0,4.324,0.3153,9.737 +DH016,234.0,236.0,0.356,0.0788,0.788 +DH016,236.0,238.0,0.171,0.6883,0.423 +DH016,238.0,240.0,2.147,0.0387,4.005 +DH016,240.0,242.0,2.219,1.0794,5.184 +DH016,242.0,244.0,6.275,0.152,14.17 +DH016,244.0,246.0,9.56,0.1692,22.003 +DH016,246.0,248.0,12.203,0.2314,33.45 +DH016,248.0,250.0,0.978,0.6875,1.582 +DH016,250.0,252.0,0.107,0.0196,0.13 +DH016,252.0,254.0,0.082,0.0147,0.088 +DH016,254.0,256.0,0.073,0.0087,0.08 +DH016,256.0,258.0,0.029,0.0249,0.043 +DH016,258.0,260.0,0.098,0.0196,0.136 +DH016,260.0,261.0,0.107,0.0198,0.092 +DH017,0.0,2.0,0.068,0.0227,0.09 +DH017,2.0,4.0,0.226,0.0093,0.258 +DH017,4.0,6.0,0.032,0.0392,0.032 +DH017,6.0,8.0,0.101,0.0199,0.122 +DH017,8.0,10.0,0.17,0.0327,0.203 +DH017,10.0,12.0,0.067,0.0269,0.079 +DH017,12.0,14.0,0.073,0.0154,0.108 +DH017,14.0,16.0,0.223,0.0126,0.199 +DH017,16.0,18.0,0.101,0.0234,0.081 +DH017,18.0,20.0,0.254,0.0226,0.25 +DH017,20.0,22.0,0.236,0.0146,0.297 +DH017,22.0,24.0,0.039,0.0168,0.022 +DH017,24.0,26.0,0.129,0.0226,0.115 +DH017,26.0,28.0,0.077,0.0268,0.061 +DH017,28.0,30.0,0.093,0.026,0.08 +DH017,30.0,32.0,0.124,0.0079,0.079 +DH017,32.0,34.0,0.041,0.0375,0.033 +DH017,34.0,36.0,0.03,0.0196,0.028 +DH017,36.0,38.0,0.033,0.0238,0.02 +DH017,38.0,40.0,0.044,0.0137,0.057 +DH017,40.0,42.0,0.179,0.0318,0.203 +DH017,42.0,44.0,0.019,0.0223,0.026 +DH017,44.0,46.0,0.172,0.0231,0.168 +DH017,46.0,48.0,0.06,0.0482,0.066 +DH017,48.0,50.0,0.041,0.0293,0.048 +DH017,50.0,52.0,0.04,0.0393,0.033 +DH017,52.0,54.0,0.065,0.0103,0.081 +DH017,54.0,56.0,0.081,0.0368,0.096 +DH017,56.0,58.0,0.06,0.0142,0.058 +DH017,58.0,60.0,0.197,0.0072,0.14 +DH017,60.0,62.0,0.076,0.0109,0.058 +DH017,62.0,64.0,0.037,0.0145,0.034 +DH017,64.0,66.0,0.061,0.0177,0.044 +DH017,66.0,68.0,0.211,0.0234,0.203 +DH017,68.0,70.0,0.075,0.0139,0.11 +DH017,70.0,72.0,0.058,0.0168,0.057 +DH017,72.0,74.0,0.039,0.0261,0.048 +DH017,74.0,76.0,0.176,0.0286,0.231 +DH017,76.0,78.0,0.077,0.0119,0.066 +DH017,78.0,80.0,0.033,0.009,0.031 +DH017,80.0,82.0,15.642,0.2597,36.783 +DH017,82.0,84.0,0.203,0.1496,0.49 +DH017,84.0,86.0,5.677,0.0647,11.486 +DH017,86.0,88.0,4.124,0.5218,7.777 +DH017,88.0,90.0,4.411,0.3431,10.916 +DH017,90.0,92.0,0.598,0.3506,1.274 +DH017,92.0,94.0,6.507,0.2864,16.548 +DH017,94.0,96.0,5.096,0.2229,10.056 +DH017,96.0,98.0,1.563,0.1285,4.557 +DH017,98.0,100.0,0.406,0.1008,0.639 +DH017,100.0,102.0,15.433,0.5186,33.602 +DH017,102.0,104.0,11.264,0.6567,22.735 +DH017,104.0,106.0,0.108,0.2106,0.319 +DH017,106.0,108.0,15.022,0.1112,32.933 +DH017,108.0,110.0,0.154,0.1662,0.324 +DH017,110.0,112.0,8.871,0.6304,22.337 +DH017,112.0,114.0,0.44,0.4449,0.922 +DH017,114.0,116.0,0.3,0.0427,0.586 +DH017,116.0,118.0,1.793,0.0798,2.756 +DH017,118.0,120.0,3.445,0.2088,10.322 +DH017,120.0,122.0,21.385,0.4983,56.885 +DH017,122.0,124.0,1.562,0.2975,2.577 +DH017,124.0,126.0,3.278,0.077,8.622 +DH017,126.0,128.0,0.548,0.0912,1.321 +DH017,128.0,130.0,2.389,0.2634,5.248 +DH017,130.0,132.0,1.087,0.3227,2.052 +DH017,132.0,134.0,0.168,0.2633,0.394 +DH017,134.0,136.0,10.387,0.1321,23.355 +DH017,136.0,138.0,0.673,0.0928,1.461 +DH017,138.0,140.0,0.085,0.1559,0.236 +DH017,140.0,142.0,2.245,0.4571,4.194 +DH017,142.0,144.0,0.326,0.7045,0.674 +DH017,144.0,146.0,2.519,0.0912,3.803 +DH017,146.0,148.0,0.563,0.5767,1.682 +DH017,148.0,150.0,3.978,0.1343,11.8 +DH017,150.0,152.0,0.295,0.7741,0.746 +DH017,152.0,154.0,1.426,0.3769,4.273 +DH017,154.0,156.0,1.752,0.1614,3.653 +DH017,156.0,158.0,1.048,0.141,2.511 +DH017,158.0,160.0,2.78,1.2279,5.442 +DH017,160.0,162.0,8.858,0.0947,23.755 +DH017,162.0,164.0,0.935,0.3062,2.094 +DH017,164.0,166.0,2.363,1.5309,5.649 +DH017,166.0,168.0,9.14,0.4112,22.267 +DH017,168.0,170.0,0.397,0.6678,0.799 +DH017,170.0,172.0,1.131,0.3496,3.096 +DH017,172.0,174.0,0.558,0.1481,1.589 +DH017,174.0,176.0,1.78,0.4419,5.298 +DH017,176.0,178.0,3.681,0.1239,10.216 +DH017,178.0,180.0,1.506,0.1052,3.321 +DH017,180.0,182.0,3.828,0.154,10.753 +DH017,182.0,184.0,0.921,0.2028,2.654 +DH017,184.0,186.0,6.491,0.6201,10.175 +DH017,186.0,188.0,7.855,0.1311,15.476 +DH017,188.0,190.0,6.591,0.7485,19.692 +DH017,190.0,192.0,0.749,0.4311,1.672 +DH017,192.0,194.0,4.016,0.5209,9.402 +DH017,194.0,196.0,1.328,0.0945,2.8 +DH017,196.0,198.0,1.232,0.1292,2.001 +DH017,198.0,200.0,1.608,0.1779,2.656 +DH017,200.0,202.0,1.387,0.2939,2.277 +DH017,202.0,204.0,1.097,0.0571,2.048 +DH017,204.0,206.0,0.523,0.2585,1.149 +DH017,206.0,208.0,0.261,0.1438,0.525 +DH017,208.0,210.0,1.621,0.5276,3.793 +DH017,210.0,212.0,2.102,0.7148,3.695 +DH017,212.0,214.0,0.894,0.2534,1.793 +DH017,214.0,216.0,3.686,0.337,9.623 +DH017,216.0,218.0,2.746,0.2031,6.913 +DH017,218.0,220.0,6.035,0.3269,13.765 +DH017,220.0,222.0,6.821,0.111,16.382 +DH017,222.0,224.0,0.048,0.211,0.116 +DH017,224.0,226.0,3.587,0.0461,7.644 +DH017,226.0,228.0,3.913,0.0979,7.701 +DH017,228.0,230.0,1.141,0.2173,3.141 +DH017,230.0,232.0,6.982,0.2403,16.517 +DH017,232.0,234.0,1.284,0.3714,3.272 +DH017,234.0,236.0,1.797,0.1639,4.063 +DH017,236.0,238.0,0.663,0.0507,1.677 +DH017,238.0,240.0,7.078,0.0532,17.504 +DH017,240.0,242.0,8.165,0.3594,15.668 +DH017,242.0,244.0,0.717,0.2381,1.628 +DH017,244.0,246.0,2.497,0.1932,6.375 +DH017,246.0,248.0,3.696,0.3252,9.817 +DH017,248.0,250.0,2.543,0.855,6.473 +DH017,250.0,252.0,0.177,0.0127,0.127 +DH017,252.0,254.0,0.172,0.0158,0.144 +DH017,254.0,256.0,0.109,0.0118,0.1 +DH017,256.0,258.0,0.162,0.0291,0.158 +DH017,258.0,260.0,0.076,0.0203,0.099 +DH017,260.0,262.0,0.338,0.0206,0.382 +DH017,262.0,264.0,0.168,0.0153,0.119 +DH017,264.0,266.0,0.03,0.0146,0.032 +DH017,266.0,268.0,0.211,0.0124,0.246 +DH017,268.0,270.0,0.115,0.0134,0.118 +DH017,270.0,272.0,0.139,0.014,0.154 +DH017,272.0,274.0,0.038,0.0184,0.045 +DH017,274.0,276.0,0.069,0.0091,0.059 +DH017,276.0,278.0,0.301,0.0108,0.271 +DH017,278.0,280.0,0.046,0.0157,0.068 +DH017,280.0,282.0,0.062,0.0159,0.066 +DH017,282.0,284.0,0.163,0.0036,0.209 +DH017,284.0,286.0,0.08,0.0132,0.095 +DH017,286.0,288.0,0.169,0.009,0.119 +DH017,288.0,290.0,0.035,0.0349,0.044 +DH017,290.0,292.0,0.061,0.0149,0.076 +DH017,292.0,294.0,0.093,0.0116,0.099 +DH017,294.0,296.0,0.052,0.01,0.041 +DH017,296.0,298.0,0.041,0.0148,0.043 +DH017,298.0,300.0,0.088,0.0492,0.075 +DH017,300.0,302.0,0.109,0.0184,0.142 +DH017,302.0,304.0,0.126,0.0169,0.08 +DH017,304.0,306.0,0.053,0.0249,0.057 +DH017,306.0,308.0,0.131,0.0181,0.069 +DH017,308.0,310.0,0.071,0.0169,0.105 +DH017,310.0,312.0,0.571,0.0337,0.64 +DH017,312.0,314.0,0.12,0.0256,0.14 +DH017,314.0,316.0,0.039,0.0177,0.022 +DH017,316.0,318.0,0.031,0.0128,0.033 +DH017,318.0,320.0,0.084,0.0372,0.103 +DH017,320.0,322.0,0.337,0.0085,0.505 +DH017,322.0,324.0,0.079,0.0104,0.06 +DH017,324.0,326.0,0.079,0.0166,0.114 +DH017,326.0,328.0,0.106,0.0156,0.154 +DH017,328.0,330.0,0.074,0.0113,0.043 +DH017,330.0,332.0,0.074,0.0097,0.045 +DH017,332.0,334.0,0.113,0.0075,0.134 +DH017,334.0,336.0,0.09,0.0179,0.064 +DH017,336.0,338.0,0.13,0.0183,0.139 +DH017,338.0,340.0,0.093,0.0079,0.053 +DH017,340.0,342.0,0.042,0.0218,0.031 +DH017,342.0,344.0,0.154,0.0116,0.221 +DH017,344.0,346.0,0.077,0.0114,0.062 +DH017,346.0,348.0,0.079,0.0134,0.089 +DH017,348.0,350.0,0.076,0.017,0.044 +DH017,350.0,352.0,0.038,0.019,0.022 +DH017,352.0,354.0,0.045,0.0162,0.046 +DH017,354.0,356.0,0.092,0.014,0.091 +DH017,356.0,358.0,0.12,0.0055,0.163 +DH017,358.0,360.0,0.027,0.009,0.016 +DH017,360.0,362.0,0.302,0.0424,0.284 +DH017,362.0,364.0,0.102,0.0072,0.079 +DH017,364.0,366.0,0.059,0.0122,0.061 +DH017,366.0,368.0,0.062,0.0283,0.038 +DH017,368.0,370.0,0.086,0.0118,0.055 +DH017,370.0,372.0,0.099,0.0105,0.112 +DH017,372.0,374.0,0.072,0.0132,0.085 +DH017,374.0,376.0,0.075,0.0125,0.084 +DH017,376.0,378.0,0.069,0.0135,0.052 +DH017,378.0,380.0,0.105,0.0151,0.119 +DH017,380.0,382.0,0.044,0.0147,0.041 +DH017,382.0,384.0,0.039,0.0222,0.041 +DH017,384.0,386.0,0.066,0.0138,0.041 +DH017,386.0,388.0,0.055,0.0065,0.031 +DH017,388.0,390.0,0.129,0.0357,0.17 +DH017,390.0,392.0,0.177,0.0265,0.182 +DH017,392.0,394.0,0.07,0.02,0.086 +DH017,394.0,396.0,0.104,0.0131,0.118 +DH017,396.0,398.0,0.269,0.0208,0.228 +DH017,398.0,399.0,0.113,0.021,0.117 +DH018,0.0,2.0,0.141,0.0262,0.125 +DH018,2.0,4.0,0.054,0.0222,0.055 +DH018,4.0,6.0,0.068,0.0699,0.059 +DH018,6.0,8.0,0.146,0.0119,0.165 +DH018,8.0,10.0,0.383,0.0113,0.359 +DH018,10.0,12.0,0.081,0.012,0.099 +DH018,12.0,14.0,0.06,0.0254,0.086 +DH018,14.0,16.0,0.028,0.0163,0.033 +DH018,16.0,18.0,0.204,0.0085,0.296 +DH018,18.0,20.0,0.105,0.0137,0.155 +DH018,20.0,22.0,0.279,0.0111,0.32 +DH018,22.0,24.0,0.072,0.0261,0.058 +DH018,24.0,26.0,0.05,0.0156,0.07 +DH018,26.0,28.0,0.129,0.0102,0.128 +DH018,28.0,30.0,0.052,0.0182,0.036 +DH018,30.0,32.0,0.038,0.0118,0.049 +DH018,32.0,34.0,0.064,0.0112,0.059 +DH018,34.0,36.0,0.051,0.0117,0.046 +DH018,36.0,38.0,0.149,0.0204,0.114 +DH018,38.0,40.0,0.035,0.0103,0.043 +DH018,40.0,42.0,0.18,0.0239,0.246 +DH018,42.0,44.0,0.059,0.0121,0.084 +DH018,44.0,46.0,0.108,0.0159,0.066 +DH018,46.0,48.0,0.174,0.0353,0.157 +DH018,48.0,50.0,0.064,0.0247,0.034 +DH018,50.0,52.0,0.218,0.0224,0.14 +DH018,52.0,54.0,0.089,0.0437,0.121 +DH018,54.0,56.0,0.247,0.0167,0.234 +DH018,56.0,58.0,0.052,0.008,0.029 +DH018,58.0,60.0,0.044,0.0199,0.042 +DH018,60.0,62.0,0.055,0.016,0.04 +DH018,62.0,64.0,0.065,0.0663,0.096 +DH018,64.0,66.0,0.07,0.0135,0.044 +DH018,66.0,68.0,0.089,0.0149,0.114 +DH018,68.0,70.0,0.046,0.0113,0.042 +DH018,70.0,72.0,0.041,0.0264,0.02 +DH018,72.0,74.0,0.027,0.0193,0.016 +DH018,74.0,76.0,0.124,0.0162,0.153 +DH018,76.0,78.0,0.156,0.0108,0.136 +DH018,78.0,80.0,0.052,0.0099,0.039 +DH018,80.0,82.0,2.198,0.4708,6.396 +DH018,82.0,84.0,1.794,0.2174,5.364 +DH018,84.0,86.0,3.235,0.0958,7.714 +DH018,86.0,88.0,1.566,0.155,3.811 +DH018,88.0,90.0,4.765,0.2419,9.89 +DH018,90.0,92.0,1.372,0.1408,3.713 +DH018,92.0,94.0,3.88,0.3721,11.024 +DH018,94.0,96.0,6.95,0.2095,20.398 +DH018,96.0,98.0,2.824,0.0752,4.321 +DH018,98.0,100.0,0.35,0.0981,0.918 +DH018,100.0,102.0,1.709,0.194,3.191 +DH018,102.0,104.0,1.934,0.3734,5.038 +DH018,104.0,106.0,3.614,0.121,8.3 +DH018,106.0,108.0,2.227,0.1345,5.658 +DH018,108.0,110.0,7.259,0.5071,18.995 +DH018,110.0,112.0,0.834,0.1539,2.223 +DH018,112.0,114.0,8.773,1.9378,21.812 +DH018,114.0,116.0,1.351,0.3573,2.394 +DH018,116.0,118.0,1.879,0.1601,3.449 +DH018,118.0,120.0,2.58,0.1928,4.7 +DH018,120.0,122.0,2.24,0.0818,6.395 +DH018,122.0,124.0,0.181,0.0847,0.281 +DH018,124.0,126.0,1.654,0.4667,3.99 +DH018,126.0,128.0,1.664,0.1525,2.641 +DH018,128.0,130.0,4.989,0.373,12.031 +DH018,130.0,132.0,1.431,0.6493,2.628 +DH018,132.0,134.0,0.608,0.4075,0.964 +DH018,134.0,136.0,4.425,0.242,8.701 +DH018,136.0,138.0,2.072,0.2334,3.281 +DH018,138.0,140.0,1.005,0.1268,1.547 +DH018,140.0,142.0,2.149,0.1611,6.073 +DH018,142.0,144.0,15.082,0.1565,34.698 +DH018,144.0,146.0,0.287,0.2157,0.45 +DH018,146.0,148.0,6.07,0.2433,16.337 +DH018,148.0,150.0,5.352,0.5435,13.734 +DH018,150.0,152.0,14.643,0.1948,25.707 +DH018,152.0,154.0,4.936,0.4166,14.548 +DH018,154.0,156.0,10.356,1.058,18.401 +DH018,156.0,158.0,2.929,0.0737,6.823 +DH018,158.0,160.0,1.147,0.2643,2.371 +DH018,160.0,162.0,3.92,0.2064,9.985 +DH018,162.0,164.0,0.085,0.2598,0.141 +DH018,164.0,166.0,20.99,0.4007,50.774 +DH018,166.0,168.0,2.726,0.2236,4.715 +DH018,168.0,170.0,2.217,0.1193,6.405 +DH018,170.0,172.0,0.586,0.3405,0.879 +DH018,172.0,174.0,1.444,0.1418,3.945 +DH018,174.0,176.0,5.678,0.0903,11.563 +DH018,176.0,178.0,6.997,0.0743,12.334 +DH018,178.0,180.0,15.491,0.815,26.087 +DH018,180.0,182.0,2.994,0.4026,5.504 +DH018,182.0,184.0,33.191,0.0345,88.31 +DH018,184.0,186.0,6.161,0.1704,14.552 +DH018,186.0,188.0,2.123,0.2479,6.043 +DH018,188.0,190.0,1.189,0.144,2.952 +DH018,190.0,192.0,0.879,0.4783,2.532 +DH018,192.0,194.0,8.325,0.0904,21.386 +DH018,194.0,196.0,2.214,2.2683,5.675 +DH018,196.0,198.0,1.144,0.3134,2.263 +DH018,198.0,200.0,0.431,0.6674,1.056 +DH018,200.0,202.0,1.996,0.2274,3.973 +DH018,202.0,204.0,0.899,0.057,1.906 +DH018,204.0,206.0,0.192,0.1754,0.346 +DH018,206.0,208.0,4.459,0.5137,6.961 +DH018,208.0,210.0,40.141,0.1394,100.223 +DH018,210.0,212.0,1.316,0.4797,2.977 +DH018,212.0,214.0,17.507,0.1459,39.374 +DH018,214.0,216.0,4.535,0.2174,8.784 +DH018,216.0,218.0,3.045,0.2966,8.073 +DH018,218.0,220.0,0.959,0.1707,1.768 +DH018,220.0,222.0,6.113,0.0831,11.999 +DH018,222.0,224.0,4.844,0.4367,9.017 +DH018,224.0,226.0,1.993,0.3223,3.003 +DH018,226.0,228.0,11.166,0.1156,24.897 +DH018,228.0,230.0,5.885,0.1452,15.4 +DH018,230.0,232.0,1.84,0.5972,3.686 +DH018,232.0,234.0,36.715,0.1141,62.954 +DH018,234.0,236.0,0.515,0.2307,0.781 +DH018,236.0,238.0,0.373,2.1397,0.659 +DH018,238.0,240.0,1.23,0.4844,2.018 +DH018,240.0,242.0,8.6,0.0854,21.186 +DH018,242.0,244.0,0.233,0.459,0.643 +DH018,244.0,246.0,0.849,0.2226,1.631 +DH018,246.0,248.0,1.627,0.7522,3.901 +DH018,248.0,250.0,4.824,0.0834,13.257 +DH018,250.0,252.0,0.051,0.0437,0.042 +DH018,252.0,254.0,0.112,0.0307,0.097 +DH018,254.0,256.0,0.073,0.0318,0.069 +DH018,256.0,258.0,0.039,0.0158,0.034 +DH018,258.0,260.0,0.105,0.0071,0.127 +DH018,260.0,262.0,0.167,0.0144,0.134 +DH018,262.0,264.0,0.072,0.0207,0.107 +DH018,264.0,266.0,0.119,0.0081,0.146 +DH018,266.0,268.0,0.076,0.0165,0.05 +DH018,268.0,270.0,0.056,0.047,0.063 +DH018,270.0,272.0,0.094,0.0202,0.116 +DH018,272.0,274.0,0.116,0.0228,0.094 +DH018,274.0,276.0,0.027,0.0075,0.017 +DH018,276.0,278.0,0.073,0.0245,0.101 +DH018,278.0,280.0,0.116,0.0098,0.146 +DH018,280.0,282.0,0.037,0.0222,0.055 +DH018,282.0,284.0,0.14,0.0218,0.157 +DH018,284.0,286.0,0.065,0.0287,0.034 +DH018,286.0,288.0,0.031,0.0131,0.025 +DH018,288.0,290.0,0.03,0.0194,0.028 +DH018,290.0,292.0,0.107,0.0248,0.054 +DH018,292.0,294.0,0.07,0.0107,0.064 +DH018,294.0,296.0,0.037,0.012,0.019 +DH018,296.0,298.0,0.076,0.0848,0.113 +DH018,298.0,300.0,0.076,0.009,0.1 +DH018,300.0,302.0,0.067,0.0279,0.095 +DH018,302.0,304.0,0.073,0.0148,0.053 +DH018,304.0,306.0,0.056,0.0151,0.078 +DH018,306.0,308.0,0.115,0.0163,0.077 +DH018,308.0,310.0,0.029,0.024,0.02 +DH018,310.0,312.0,0.129,0.0354,0.13 +DH018,312.0,314.0,0.044,0.0182,0.065 +DH018,314.0,316.0,0.068,0.0138,0.081 +DH018,316.0,318.0,0.111,0.0154,0.11 +DH018,318.0,320.0,0.108,0.0125,0.07 +DH018,320.0,322.0,0.09,0.0071,0.104 +DH018,322.0,324.0,0.112,0.0252,0.071 +DH018,324.0,326.0,0.025,0.0347,0.032 +DH018,326.0,328.0,0.04,0.0124,0.046 +DH018,328.0,330.0,0.123,0.0144,0.179 +DH018,330.0,332.0,0.028,0.0109,0.024 +DH018,332.0,334.0,0.048,0.0389,0.065 +DH018,334.0,336.0,0.094,0.0133,0.136 +DH018,336.0,338.0,0.109,0.0084,0.089 +DH018,338.0,340.0,0.194,0.0109,0.115 +DH018,340.0,342.0,0.083,0.0211,0.066 +DH018,342.0,344.0,0.086,0.0248,0.054 +DH018,344.0,346.0,0.076,0.0179,0.046 +DH018,346.0,348.0,0.059,0.0094,0.062 +DH018,348.0,350.0,0.157,0.0219,0.185 +DH018,350.0,352.0,0.432,0.0089,0.219 +DH018,352.0,354.0,0.172,0.0099,0.11 +DH018,354.0,356.0,0.065,0.0129,0.033 +DH018,356.0,358.0,0.107,0.0227,0.126 +DH018,358.0,360.0,0.031,0.0209,0.017 +DH018,360.0,362.0,0.247,0.047,0.208 +DH018,362.0,364.0,0.047,0.0243,0.038 +DH018,364.0,366.0,0.129,0.0153,0.137 +DH018,366.0,368.0,0.082,0.0195,0.05 +DH018,368.0,370.0,0.121,0.0161,0.16 +DH018,370.0,372.0,0.095,0.02,0.095 +DH018,372.0,374.0,0.132,0.0166,0.091 +DH018,374.0,376.0,0.115,0.0122,0.068 +DH018,376.0,378.0,0.044,0.0211,0.052 +DH018,378.0,380.0,0.023,0.0151,0.016 +DH018,380.0,382.0,0.063,0.0169,0.037 +DH018,382.0,384.0,0.132,0.0305,0.098 +DH018,384.0,386.0,0.232,0.0252,0.144 +DH018,386.0,388.0,0.051,0.0076,0.026 +DH018,388.0,390.0,0.07,0.0254,0.082 +DH018,390.0,392.0,0.078,0.0162,0.09 +DH019,0.0,2.0,0.07,0.0155,0.07 +DH019,2.0,4.0,0.175,0.0315,0.177 +DH019,4.0,6.0,0.023,0.017,0.02 +DH019,6.0,8.0,0.076,0.0131,0.038 +DH019,8.0,10.0,0.044,0.0097,0.047 +DH019,10.0,12.0,0.046,0.0183,0.026 +DH019,12.0,14.0,0.142,0.0273,0.173 +DH019,14.0,16.0,0.127,0.0364,0.157 +DH019,16.0,18.0,0.027,0.0141,0.016 +DH019,18.0,20.0,0.056,0.0412,0.058 +DH019,20.0,22.0,0.086,0.0321,0.067 +DH019,22.0,24.0,0.091,0.0287,0.078 +DH019,24.0,26.0,0.069,0.0277,0.035 +DH019,26.0,28.0,0.198,0.0083,0.161 +DH019,28.0,30.0,0.13,0.0282,0.116 +DH019,30.0,32.0,0.104,0.0266,0.135 +DH019,32.0,34.0,0.054,0.0201,0.044 +DH019,34.0,36.0,0.041,0.0166,0.057 +DH019,36.0,38.0,0.105,0.0182,0.149 +DH019,38.0,40.0,0.174,0.014,0.098 +DH019,40.0,42.0,0.032,0.0128,0.029 +DH019,42.0,44.0,0.099,0.0247,0.128 +DH019,44.0,46.0,0.287,0.0126,0.388 +DH019,46.0,48.0,0.044,0.0129,0.03 +DH019,48.0,50.0,0.087,0.0343,0.084 +DH019,50.0,52.0,0.111,0.0534,0.13 +DH019,52.0,54.0,0.031,0.031,0.045 +DH019,54.0,56.0,0.052,0.0238,0.073 +DH019,56.0,58.0,0.073,0.0101,0.046 +DH019,58.0,60.0,0.15,0.0185,0.202 +DH019,60.0,62.0,0.039,0.0122,0.045 +DH019,62.0,64.0,0.101,0.0123,0.15 +DH019,64.0,66.0,0.106,0.0117,0.111 +DH019,66.0,68.0,0.052,0.0112,0.053 +DH019,68.0,70.0,0.338,0.0266,0.214 +DH019,70.0,72.0,0.102,0.0076,0.109 +DH019,72.0,74.0,0.018,0.0435,0.025 +DH019,74.0,76.0,0.104,0.0196,0.153 +DH019,76.0,78.0,0.072,0.0449,0.074 +DH019,78.0,80.0,0.058,0.0076,0.042 +DH019,80.0,82.0,2.046,0.0547,3.662 +DH019,82.0,84.0,0.48,0.2008,1.0 +DH019,84.0,86.0,1.217,0.4155,1.839 +DH019,86.0,88.0,7.963,0.1677,19.16 +DH019,88.0,90.0,1.13,0.1083,2.911 +DH019,90.0,92.0,1.728,0.0564,2.639 +DH019,92.0,94.0,0.226,0.2539,0.624 +DH019,94.0,96.0,1.408,0.3619,2.872 +DH019,96.0,98.0,0.61,0.1978,1.366 +DH019,98.0,100.0,0.784,0.1259,1.73 +DH019,100.0,102.0,1.239,1.3491,3.084 +DH019,102.0,104.0,0.662,0.1664,1.185 +DH019,104.0,106.0,5.813,0.0601,10.629 +DH019,106.0,108.0,1.094,0.3853,2.459 +DH019,108.0,110.0,11.666,0.3409,17.841 +DH019,110.0,112.0,5.775,0.0893,14.951 +DH019,112.0,114.0,3.758,0.0998,7.075 +DH019,114.0,116.0,2.569,0.2721,6.481 +DH019,116.0,118.0,6.041,0.2608,16.464 +DH019,118.0,120.0,2.533,0.1385,6.213 +DH019,120.0,122.0,51.512,0.2581,92.2 +DH019,122.0,124.0,0.954,0.5046,2.257 +DH019,124.0,126.0,5.589,0.265,12.077 +DH019,126.0,128.0,10.237,0.2798,29.18 +DH019,128.0,130.0,6.511,0.1083,11.259 +DH019,130.0,132.0,2.088,0.0554,3.789 +DH019,132.0,134.0,0.701,0.153,1.332 +DH019,134.0,136.0,2.333,0.1695,3.954 +DH019,136.0,138.0,2.072,0.156,6.109 +DH019,138.0,140.0,8.148,0.0414,12.44 +DH019,140.0,142.0,1.268,0.3119,2.259 +DH019,142.0,144.0,1.222,0.2056,2.963 +DH019,144.0,146.0,3.316,0.0866,8.876 +DH019,146.0,148.0,6.445,0.0854,9.705 +DH019,148.0,150.0,2.201,0.1639,4.934 +DH019,150.0,152.0,1.356,0.3198,3.891 +DH019,152.0,154.0,4.193,0.4478,8.201 +DH019,154.0,156.0,2.084,0.109,5.061 +DH019,156.0,158.0,7.723,0.1432,21.405 +DH019,158.0,160.0,18.512,0.1175,35.401 +DH019,160.0,162.0,15.944,0.1992,42.812 +DH019,162.0,164.0,0.51,0.0603,1.361 +DH019,164.0,166.0,3.44,0.2849,7.203 +DH019,166.0,168.0,2.28,0.0513,5.684 +DH019,168.0,170.0,2.701,1.0821,5.068 +DH019,170.0,172.0,0.718,0.2143,1.292 +DH019,172.0,174.0,3.75,0.228,6.951 +DH019,174.0,176.0,0.313,0.2754,0.86 +DH019,176.0,178.0,2.448,0.4277,5.449 +DH019,178.0,180.0,3.065,0.1163,8.718 +DH019,180.0,182.0,9.473,0.3409,25.518 +DH019,182.0,184.0,1.278,0.1898,3.133 +DH019,184.0,186.0,2.093,0.568,6.257 +DH019,186.0,188.0,2.309,0.2094,5.021 +DH019,188.0,190.0,4.983,0.125,14.206 +DH019,190.0,192.0,20.461,0.5006,52.054 +DH019,192.0,194.0,3.515,0.1956,7.201 +DH019,194.0,196.0,5.828,0.1225,14.131 +DH019,196.0,198.0,4.394,0.2134,10.438 +DH019,198.0,200.0,3.722,0.1799,9.95 +DH019,200.0,202.0,3.781,0.1372,6.595 +DH019,202.0,204.0,1.224,0.1578,2.152 +DH019,204.0,206.0,8.647,0.1783,20.681 +DH019,206.0,208.0,18.919,0.1236,49.647 +DH019,208.0,210.0,1.672,0.5146,4.755 +DH019,210.0,212.0,0.787,0.1393,1.951 +DH019,212.0,214.0,10.555,0.2536,26.847 +DH019,214.0,216.0,4.027,0.1742,10.372 +DH019,216.0,218.0,4.366,0.4301,11.068 +DH019,218.0,220.0,1.626,0.2567,4.773 +DH019,220.0,222.0,1.404,0.09,2.443 +DH019,222.0,224.0,1.667,0.379,4.607 +DH019,224.0,226.0,0.437,0.1384,1.021 +DH019,226.0,228.0,5.776,0.1462,10.521 +DH019,228.0,230.0,0.409,0.3285,1.085 +DH019,230.0,232.0,1.015,0.1813,1.634 +DH019,232.0,234.0,0.666,0.1138,1.336 +DH019,234.0,236.0,2.437,0.3813,4.358 +DH019,236.0,238.0,2.133,0.1689,3.758 +DH019,238.0,240.0,8.978,0.5312,26.052 +DH019,240.0,242.0,10.654,0.1676,22.745 +DH019,242.0,244.0,1.816,0.4338,4.57 +DH019,244.0,245.0,1.638,0.4361,3.1 +DH020,0.0,2.0,0.058,0.0129,0.053 +DH020,2.0,4.0,0.078,0.0092,0.073 +DH020,4.0,6.0,0.062,0.0406,0.091 +DH020,6.0,8.0,0.074,0.0129,0.041 +DH020,8.0,10.0,0.061,0.0444,0.057 +DH020,10.0,12.0,0.051,0.0073,0.037 +DH020,12.0,14.0,0.059,0.0133,0.083 +DH020,14.0,16.0,0.021,0.0175,0.029 +DH020,16.0,18.0,0.064,0.0306,0.04 +DH020,18.0,20.0,0.026,0.0123,0.038 +DH020,20.0,22.0,0.09,0.01,0.062 +DH020,22.0,24.0,0.084,0.0172,0.091 +DH020,24.0,26.0,0.081,0.0224,0.096 +DH020,26.0,28.0,0.036,0.0135,0.036 +DH020,28.0,30.0,0.12,0.021,0.129 +DH020,30.0,32.0,0.142,0.0093,0.105 +DH020,32.0,34.0,0.059,0.0487,0.065 +DH020,34.0,36.0,0.063,0.0131,0.093 +DH020,36.0,38.0,0.086,0.0199,0.049 +DH020,38.0,40.0,0.142,0.0166,0.149 +DH020,40.0,42.0,0.054,0.024,0.072 +DH020,42.0,44.0,0.108,0.0221,0.123 +DH020,44.0,46.0,0.132,0.0084,0.174 +DH020,46.0,48.0,0.07,0.0089,0.086 +DH020,48.0,50.0,0.066,0.0353,0.042 +DH020,50.0,52.0,0.152,0.0213,0.182 +DH020,52.0,54.0,0.089,0.0264,0.087 +DH020,54.0,56.0,0.076,0.008,0.113 +DH020,56.0,58.0,0.067,0.0057,0.076 +DH020,58.0,60.0,0.117,0.0133,0.08 +DH020,60.0,62.0,0.152,0.0105,0.197 +DH020,62.0,64.0,0.052,0.0194,0.075 +DH020,64.0,66.0,0.168,0.0309,0.21 +DH020,66.0,68.0,0.151,0.0131,0.151 +DH020,68.0,70.0,0.055,0.0122,0.074 +DH020,70.0,72.0,0.046,0.0145,0.061 +DH020,72.0,74.0,0.23,0.0077,0.341 +DH020,74.0,76.0,0.051,0.0269,0.065 +DH020,76.0,78.0,0.053,0.0262,0.059 +DH020,78.0,80.0,0.081,0.0122,0.103 +DH020,80.0,82.0,1.682,0.184,4.213 +DH020,82.0,84.0,6.753,0.2725,20.063 +DH020,84.0,86.0,11.063,0.3221,27.838 +DH020,86.0,88.0,7.755,0.3239,17.421 +DH020,88.0,90.0,3.229,0.3899,6.276 +DH020,90.0,92.0,1.976,0.1814,3.016 +DH020,92.0,94.0,4.16,0.5619,7.983 +DH020,94.0,96.0,1.277,0.1718,3.805 +DH020,96.0,98.0,16.337,0.1447,39.5 +DH020,98.0,100.0,3.101,0.2845,7.068 +DH020,100.0,102.0,0.865,0.1028,2.574 +DH020,102.0,104.0,2.552,0.5489,5.21 +DH020,104.0,106.0,1.359,0.3131,2.811 +DH020,106.0,108.0,0.555,0.1924,0.856 +DH020,108.0,110.0,1.223,0.1721,2.782 +DH020,110.0,112.0,28.046,0.0514,59.939 +DH020,112.0,114.0,1.642,0.1337,3.116 +DH020,114.0,116.0,4.957,0.3984,12.23 +DH020,116.0,118.0,8.259,0.6157,18.397 +DH020,118.0,120.0,1.156,0.3314,2.054 +DH020,120.0,122.0,0.836,0.0636,2.287 +DH020,122.0,124.0,2.42,0.2832,4.535 +DH020,124.0,126.0,7.809,0.252,21.039 +DH020,126.0,128.0,3.472,0.0951,7.41 +DH020,128.0,130.0,4.974,0.144,9.962 +DH020,130.0,132.0,2.51,0.1002,6.567 +DH020,132.0,134.0,1.365,0.8866,3.322 +DH020,134.0,136.0,2.616,0.7001,6.82 +DH020,136.0,138.0,1.839,0.1616,3.242 +DH020,138.0,140.0,2.985,0.0792,6.819 +DH020,140.0,142.0,4.134,0.1879,9.668 +DH020,142.0,144.0,7.662,0.4002,22.297 +DH020,144.0,146.0,0.471,0.1042,0.883 +DH020,146.0,148.0,0.453,0.3451,1.054 +DH020,148.0,150.0,5.744,0.1719,11.141 +DH020,150.0,152.0,6.703,0.1433,13.965 +DH020,152.0,154.0,0.346,0.1414,0.885 +DH020,154.0,156.0,0.942,0.4281,2.465 +DH020,156.0,158.0,1.137,0.1945,2.312 +DH020,158.0,160.0,0.547,0.3817,0.971 +DH020,160.0,162.0,0.936,0.1655,2.316 +DH020,162.0,164.0,0.376,0.155,0.909 +DH020,164.0,166.0,4.167,0.1968,6.514 +DH020,166.0,168.0,4.469,0.4139,8.913 +DH020,168.0,170.0,14.037,0.6396,36.035 +DH020,170.0,172.0,0.809,0.0986,2.155 +DH020,172.0,174.0,2.394,0.0542,6.483 +DH020,174.0,176.0,10.433,0.3539,26.708 +DH020,176.0,178.0,0.858,0.2836,1.939 +DH020,178.0,180.0,3.787,0.3611,9.127 +DH020,180.0,182.0,0.572,0.2664,1.092 +DH020,182.0,184.0,1.977,0.4455,4.967 +DH020,184.0,186.0,11.919,0.3136,31.509 +DH020,186.0,188.0,1.643,0.0557,3.81 +DH020,188.0,190.0,1.512,0.3344,2.386 +DH020,190.0,192.0,0.499,0.1066,1.09 +DH020,192.0,194.0,3.154,0.1402,5.967 +DH020,194.0,196.0,8.195,0.4712,15.152 +DH020,196.0,198.0,15.818,0.4833,42.221 +DH020,198.0,200.0,0.533,0.5185,1.514 +DH020,200.0,202.0,0.387,0.1853,1.074 +DH020,202.0,204.0,2.27,0.1232,4.398 +DH020,204.0,206.0,18.663,0.4396,40.979 +DH020,206.0,208.0,2.998,0.6085,5.842 +DH020,208.0,210.0,2.705,0.2807,4.48 +DH020,210.0,212.0,3.263,0.1353,6.867 +DH020,212.0,214.0,0.298,0.0348,0.476 +DH020,214.0,216.0,1.42,0.181,3.853 +DH020,216.0,218.0,11.899,0.3422,28.484 +DH020,218.0,220.0,4.068,0.2842,11.788 +DH020,220.0,222.0,0.476,0.4794,1.154 +DH020,222.0,224.0,1.101,0.2273,2.523 +DH020,224.0,226.0,1.294,0.9719,2.657 +DH020,226.0,228.0,0.977,0.1533,2.284 +DH020,228.0,230.0,5.186,0.1827,10.579 +DH020,230.0,232.0,2.512,0.317,6.499 +DH020,232.0,234.0,2.038,0.1656,3.435 +DH020,234.0,236.0,1.409,1.0931,2.911 +DH020,236.0,238.0,5.278,0.1449,15.273 +DH020,238.0,240.0,0.388,0.1542,1.127 +DH020,240.0,242.0,1.077,0.6068,2.938 +DH020,242.0,244.0,5.269,0.7511,10.935 +DH020,244.0,246.0,7.334,0.3413,19.326 +DH020,246.0,248.0,5.476,0.9723,15.998 +DH020,248.0,250.0,0.704,0.0988,2.099 +DH020,250.0,252.0,0.162,0.014,0.237 +DH020,252.0,254.0,0.055,0.0241,0.035 +DH020,254.0,256.0,0.091,0.0141,0.101 +DH020,256.0,258.0,0.101,0.0246,0.14 +DH020,258.0,260.0,0.112,0.023,0.125 +DH020,260.0,262.0,0.103,0.0272,0.074 +DH020,262.0,264.0,0.105,0.0113,0.088 +DH020,264.0,266.0,0.063,0.0201,0.04 +DH020,266.0,268.0,0.042,0.0104,0.026 +DH020,268.0,270.0,0.013,0.0171,0.014 +DH020,270.0,272.0,0.241,0.0112,0.164 +DH020,272.0,274.0,0.034,0.0095,0.029 +DH020,274.0,276.0,0.072,0.0167,0.101 +DH020,276.0,278.0,0.122,0.0155,0.169 +DH020,278.0,280.0,0.043,0.0094,0.026 +DH020,280.0,282.0,0.121,0.0155,0.102 +DH020,282.0,284.0,0.079,0.0098,0.107 +DH020,284.0,286.0,0.058,0.0258,0.086 +DH020,286.0,288.0,0.046,0.019,0.042 +DH020,288.0,290.0,0.088,0.0219,0.082 +DH020,290.0,292.0,0.114,0.0144,0.145 +DH020,292.0,294.0,0.143,0.0256,0.074 +DH020,294.0,296.0,0.121,0.0258,0.173 +DH020,296.0,298.0,0.08,0.0199,0.12 +DH020,298.0,300.0,0.061,0.0094,0.086 +DH020,300.0,302.0,0.073,0.01,0.076 +DH020,302.0,304.0,0.194,0.0081,0.16 +DH020,304.0,306.0,0.018,0.015,0.02 +DH020,306.0,308.0,0.067,0.0192,0.064 +DH020,308.0,310.0,0.029,0.019,0.019 +DH020,310.0,312.0,0.251,0.0099,0.231 +DH020,312.0,314.0,0.047,0.0109,0.034 +DH020,314.0,316.0,0.083,0.0139,0.049 +DH020,316.0,318.0,0.059,0.0145,0.043 +DH020,318.0,320.0,0.07,0.0153,0.059 +DH020,320.0,322.0,0.09,0.0206,0.083 +DH020,322.0,324.0,0.075,0.0539,0.046 +DH020,324.0,326.0,0.044,0.0116,0.064 +DH020,326.0,328.0,0.155,0.015,0.158 +DH020,328.0,330.0,0.272,0.0182,0.315 +DH020,330.0,332.0,0.112,0.0136,0.136 +DH020,332.0,334.0,0.049,0.0358,0.061 +DH020,334.0,336.0,0.062,0.0106,0.067 +DH020,336.0,338.0,0.064,0.0054,0.075 +DH020,338.0,340.0,0.061,0.0272,0.033 +DH020,340.0,342.0,0.054,0.0146,0.05 +DH020,342.0,344.0,0.2,0.0121,0.234 +DH020,344.0,346.0,0.042,0.0087,0.028 +DH020,346.0,348.0,0.093,0.0348,0.086 +DH020,348.0,350.0,0.346,0.0177,0.353 +DH020,350.0,352.0,0.038,0.0259,0.043 +DH020,352.0,354.0,0.121,0.0104,0.114 +DH020,354.0,356.0,0.093,0.0196,0.098 +DH020,356.0,358.0,0.168,0.0511,0.244 +DH020,358.0,360.0,0.126,0.0043,0.091 +DH020,360.0,362.0,0.027,0.0141,0.02 +DH020,362.0,364.0,0.072,0.0279,0.106 +DH020,364.0,366.0,0.066,0.0142,0.09 +DH020,366.0,368.0,0.106,0.0102,0.071 +DH020,368.0,370.0,0.209,0.0262,0.254 +DH020,370.0,372.0,0.07,0.0163,0.083 +DH020,372.0,374.0,0.029,0.0131,0.018 +DH020,374.0,376.0,0.065,0.0174,0.042 +DH020,376.0,378.0,0.311,0.0184,0.218 +DH020,378.0,380.0,0.057,0.0161,0.079 +DH020,380.0,382.0,0.052,0.0165,0.036 +DH020,382.0,384.0,0.051,0.0183,0.073 +DH020,384.0,386.0,0.05,0.0317,0.025 +DH020,386.0,388.0,0.074,0.0067,0.096 +DH020,388.0,390.0,0.103,0.0438,0.134 +DH020,390.0,392.0,0.161,0.01,0.163 +DH020,392.0,394.0,0.171,0.0118,0.243 +DH020,394.0,396.0,0.127,0.021,0.066 +DH020,396.0,398.0,0.045,0.0445,0.026 +DH020,398.0,400.0,0.101,0.0149,0.101 +DH020,400.0,402.0,0.091,0.0224,0.056 +DH020,402.0,404.0,0.051,0.0088,0.059 +DH020,404.0,406.0,0.029,0.0156,0.019 +DH020,406.0,408.0,0.11,0.0494,0.136 +DH020,408.0,410.0,0.321,0.0163,0.218 +DH020,410.0,412.0,0.035,0.0302,0.035 +DH020,412.0,414.0,0.079,0.007,0.05 +DH020,414.0,416.0,0.136,0.0163,0.111 +DH020,416.0,418.0,0.162,0.0133,0.096 +DH020,418.0,420.0,0.084,0.0188,0.086 +DH020,420.0,422.0,0.086,0.0049,0.098 +DH020,422.0,424.0,0.036,0.0413,0.022 +DH020,424.0,426.0,0.137,0.0163,0.167 +DH020,426.0,428.0,0.055,0.0484,0.031 +DH020,428.0,430.0,0.02,0.0307,0.026 +DH020,430.0,432.0,0.222,0.0308,0.209 +DH020,432.0,434.0,0.085,0.0065,0.054 +DH020,434.0,436.0,0.119,0.0171,0.136 +DH021,0.0,2.0,0.046,0.0111,0.034 +DH021,2.0,4.0,0.253,0.0183,0.26 +DH021,4.0,6.0,0.046,0.0253,0.034 +DH021,6.0,8.0,0.033,0.0231,0.018 +DH021,8.0,10.0,0.113,0.0416,0.111 +DH021,10.0,12.0,0.071,0.0256,0.098 +DH021,12.0,14.0,0.056,0.021,0.032 +DH021,14.0,16.0,0.093,0.0118,0.111 +DH021,16.0,18.0,0.062,0.012,0.051 +DH021,18.0,20.0,0.105,0.0299,0.074 +DH021,20.0,22.0,0.058,0.0398,0.037 +DH021,22.0,24.0,0.084,0.0168,0.067 +DH021,24.0,26.0,0.166,0.032,0.166 +DH021,26.0,28.0,0.049,0.048,0.038 +DH021,28.0,30.0,0.062,0.0373,0.058 +DH021,30.0,32.0,0.191,0.0384,0.165 +DH021,32.0,34.0,0.116,0.0271,0.115 +DH021,34.0,36.0,0.053,0.0375,0.072 +DH021,36.0,38.0,0.039,0.0172,0.039 +DH021,38.0,40.0,0.043,0.0214,0.059 +DH021,40.0,42.0,0.095,0.014,0.072 +DH021,42.0,44.0,0.082,0.0204,0.06 +DH021,44.0,46.0,0.097,0.0091,0.103 +DH021,46.0,48.0,0.091,0.0321,0.066 +DH021,48.0,50.0,0.238,0.0196,0.284 +DH021,50.0,52.0,0.034,0.0227,0.029 +DH021,52.0,54.0,0.079,0.0833,0.051 +DH021,54.0,56.0,0.049,0.0225,0.027 +DH021,56.0,58.0,0.046,0.0524,0.051 +DH021,58.0,60.0,0.101,0.0151,0.092 +DH021,60.0,62.0,0.207,0.0213,0.154 +DH021,62.0,64.0,0.351,0.0201,0.252 +DH021,64.0,66.0,0.158,0.0231,0.13 +DH021,66.0,68.0,0.064,0.0099,0.065 +DH021,68.0,70.0,0.194,0.0132,0.179 +DH021,70.0,72.0,0.171,0.0146,0.157 +DH021,72.0,74.0,0.066,0.0177,0.063 +DH021,74.0,76.0,0.059,0.0206,0.084 +DH021,76.0,78.0,0.164,0.0459,0.218 +DH021,78.0,80.0,0.142,0.017,0.115 +DH021,80.0,82.0,2.274,0.3565,3.996 +DH021,82.0,84.0,4.701,0.2025,12.783 +DH021,84.0,86.0,10.105,0.4512,17.111 +DH021,86.0,88.0,0.818,0.1124,1.308 +DH021,88.0,90.0,3.03,0.3382,7.258 +DH021,90.0,92.0,1.216,0.2711,2.174 +DH021,92.0,94.0,3.746,0.1745,7.494 +DH021,94.0,96.0,2.372,0.3054,6.071 +DH021,96.0,98.0,1.663,0.3244,3.336 +DH021,98.0,100.0,0.304,0.0653,0.652 +DH021,100.0,102.0,0.457,0.1689,1.262 +DH021,102.0,104.0,0.426,0.178,1.263 +DH021,104.0,106.0,3.632,0.1663,6.348 +DH021,106.0,108.0,3.726,0.8664,7.914 +DH021,108.0,110.0,0.897,0.074,2.035 +DH021,110.0,112.0,0.412,0.154,0.665 +DH021,112.0,114.0,8.076,0.1486,23.589 +DH021,114.0,116.0,0.325,0.2479,0.884 +DH021,116.0,118.0,1.335,1.3086,2.215 +DH021,118.0,120.0,1.908,2.8839,3.083 +DH021,120.0,122.0,9.009,0.0655,15.661 +DH021,122.0,124.0,0.442,0.2741,0.75 +DH021,124.0,126.0,1.538,0.5345,4.264 +DH021,126.0,128.0,3.294,0.4302,6.606 +DH021,128.0,130.0,0.907,0.233,2.515 +DH021,130.0,132.0,12.25,0.1877,23.295 +DH021,132.0,134.0,0.781,0.2905,1.202 +DH021,134.0,136.0,1.602,0.207,4.061 +DH021,136.0,138.0,1.131,0.1203,3.327 +DH021,138.0,140.0,0.059,0.1377,0.155 +DH021,140.0,142.0,1.662,0.5843,2.626 +DH021,142.0,144.0,1.136,0.2146,2.543 +DH021,144.0,146.0,1.373,0.2412,2.656 +DH021,146.0,148.0,1.33,0.0994,3.622 +DH021,148.0,150.0,2.394,0.2852,4.816 +DH021,150.0,152.0,5.54,0.4112,8.757 +DH021,152.0,154.0,3.19,0.3715,8.885 +DH021,154.0,156.0,1.55,0.0967,3.775 +DH021,156.0,158.0,18.298,0.9185,46.632 +DH021,158.0,160.0,0.93,0.1722,2.726 +DH021,160.0,162.0,0.475,0.0463,1.237 +DH021,162.0,164.0,3.238,0.321,4.993 +DH021,164.0,166.0,3.892,0.0664,7.959 +DH021,166.0,168.0,2.525,0.0363,5.807 +DH021,168.0,170.0,1.438,0.1751,3.278 +DH021,170.0,172.0,0.674,0.0519,1.905 +DH021,172.0,174.0,1.552,0.0743,2.337 +DH021,174.0,176.0,1.562,0.1543,4.681 +DH021,176.0,178.0,5.05,0.0832,9.586 +DH021,178.0,180.0,0.844,0.1635,1.811 +DH021,180.0,182.0,4.212,0.551,8.875 +DH021,182.0,184.0,3.58,0.0537,5.454 +DH021,184.0,186.0,1.699,0.5939,2.742 +DH021,186.0,188.0,3.058,0.2673,7.35 +DH021,188.0,190.0,1.896,0.4327,4.911 +DH021,190.0,192.0,0.321,0.0359,0.721 +DH021,192.0,194.0,1.348,0.3825,3.654 +DH021,194.0,196.0,0.987,0.1422,2.114 +DH021,196.0,198.0,12.584,0.8651,32.011 +DH021,198.0,200.0,3.311,0.6494,6.339 +DH021,200.0,202.0,1.392,0.2012,3.884 +DH021,202.0,204.0,1.804,0.0913,4.61 +DH021,204.0,206.0,4.273,0.7002,12.571 +DH021,206.0,208.0,21.803,0.0634,60.466 +DH021,208.0,210.0,1.057,0.6352,1.885 +DH021,210.0,212.0,1.661,0.1184,3.628 +DH021,212.0,214.0,8.664,0.4227,20.704 +DH021,214.0,216.0,3.583,0.027,7.108 +DH021,216.0,218.0,3.888,0.166,6.228 +DH021,218.0,220.0,0.592,0.4762,1.479 +DH021,220.0,222.0,4.061,0.1344,10.743 +DH021,222.0,224.0,0.447,0.2011,1.251 +DH021,224.0,226.0,0.339,0.1724,0.619 +DH021,226.0,228.0,0.256,0.0825,0.547 +DH021,228.0,230.0,18.603,0.2623,46.62 +DH021,230.0,232.0,1.484,0.1483,3.074 +DH021,232.0,234.0,1.01,0.3983,1.651 +DH021,234.0,236.0,6.475,0.2303,12.262 +DH021,236.0,237.0,0.31,0.1019,0.512 +DH022,0.0,2.0,0.072,0.0211,0.043 +DH022,2.0,4.0,0.081,0.0092,0.083 +DH022,4.0,6.0,0.103,0.0215,0.139 +DH022,6.0,8.0,0.067,0.024,0.043 +DH022,8.0,10.0,0.069,0.0474,0.089 +DH022,10.0,12.0,0.157,0.0103,0.184 +DH022,12.0,14.0,0.126,0.0142,0.089 +DH022,14.0,16.0,0.025,0.0135,0.029 +DH022,16.0,18.0,0.043,0.0192,0.031 +DH022,18.0,20.0,0.071,0.0103,0.072 +DH022,20.0,22.0,0.061,0.0101,0.086 +DH022,22.0,24.0,0.047,0.0095,0.027 +DH022,24.0,26.0,0.066,0.0061,0.072 +DH022,26.0,28.0,0.142,0.0125,0.121 +DH022,28.0,30.0,0.049,0.0236,0.045 +DH022,30.0,32.0,0.108,0.0092,0.114 +DH022,32.0,34.0,0.166,0.0122,0.138 +DH022,34.0,36.0,0.063,0.0197,0.095 +DH022,36.0,38.0,0.057,0.0118,0.046 +DH022,38.0,40.0,0.087,0.0231,0.1 +DH022,40.0,42.0,0.047,0.0201,0.045 +DH022,42.0,44.0,0.157,0.0173,0.153 +DH022,44.0,46.0,0.108,0.0176,0.078 +DH022,46.0,48.0,0.043,0.0311,0.044 +DH022,48.0,50.0,0.03,0.0218,0.028 +DH022,50.0,52.0,0.049,0.0103,0.065 +DH022,52.0,54.0,0.025,0.012,0.019 +DH022,54.0,56.0,0.212,0.0242,0.149 +DH022,56.0,58.0,0.205,0.0093,0.157 +DH022,58.0,60.0,0.11,0.0118,0.136 +DH022,60.0,62.0,0.06,0.0259,0.079 +DH022,62.0,64.0,0.1,0.0149,0.071 +DH022,64.0,66.0,0.08,0.0342,0.074 +DH022,66.0,68.0,0.076,0.0272,0.073 +DH022,68.0,70.0,0.109,0.0058,0.06 +DH022,70.0,72.0,0.188,0.0098,0.253 +DH022,72.0,74.0,0.125,0.0127,0.153 +DH022,74.0,76.0,0.058,0.0518,0.035 +DH022,76.0,78.0,0.051,0.0111,0.041 +DH022,78.0,80.0,0.071,0.0134,0.068 +DH022,80.0,82.0,4.461,0.1069,7.903 +DH022,82.0,84.0,8.933,0.2261,26.323 +DH022,84.0,86.0,0.262,0.0914,0.711 +DH022,86.0,88.0,0.191,0.0926,0.453 +DH022,88.0,90.0,1.277,0.8644,2.473 +DH022,90.0,92.0,1.82,0.3353,3.519 +DH022,92.0,94.0,3.597,0.2793,9.493 +DH022,94.0,96.0,61.544,0.4625,149.711 +DH022,96.0,98.0,3.47,0.1184,8.699 +DH022,98.0,100.0,0.427,0.092,0.833 +DH022,100.0,102.0,7.368,0.3336,16.289 +DH022,102.0,104.0,3.485,0.2561,10.118 +DH022,104.0,106.0,5.904,0.5066,15.538 +DH022,106.0,108.0,1.934,0.797,3.995 +DH022,108.0,110.0,2.437,0.3287,6.028 +DH022,110.0,112.0,0.832,0.3019,1.249 +DH022,112.0,114.0,20.302,0.4193,59.34 +DH022,114.0,116.0,5.338,0.2854,12.634 +DH022,116.0,118.0,1.186,0.2595,1.794 +DH022,118.0,120.0,2.387,0.1099,6.349 +DH022,120.0,122.0,3.675,0.6239,8.961 +DH022,122.0,124.0,1.358,0.4196,3.399 +DH022,124.0,126.0,8.182,0.5306,16.451 +DH022,126.0,128.0,3.497,0.1512,9.253 +DH022,128.0,130.0,3.512,0.1425,9.166 +DH022,130.0,132.0,4.464,0.1093,10.787 +DH022,132.0,134.0,2.501,0.093,6.914 +DH022,134.0,136.0,13.268,0.9608,38.475 +DH022,136.0,138.0,10.839,0.5905,28.036 +DH022,138.0,140.0,3.303,0.3437,5.188 +DH022,140.0,142.0,0.914,0.4007,1.817 +DH022,142.0,144.0,1.737,0.1737,4.419 +DH022,144.0,146.0,1.021,0.0778,1.809 +DH022,146.0,148.0,1.295,0.2264,2.352 +DH022,148.0,150.0,10.3,0.4416,19.573 +DH022,150.0,152.0,0.54,0.1691,1.558 +DH022,152.0,154.0,2.791,0.2435,8.01 +DH022,154.0,156.0,5.532,0.2158,12.736 +DH022,156.0,158.0,0.681,1.7213,1.807 +DH022,158.0,160.0,2.841,0.351,4.51 +DH022,160.0,162.0,2.247,0.2224,4.609 +DH022,162.0,164.0,3.767,0.0596,7.457 +DH022,164.0,166.0,5.764,0.3721,13.98 +DH022,166.0,168.0,0.86,0.6781,2.573 +DH022,168.0,170.0,5.443,0.5129,11.153 +DH022,170.0,172.0,7.724,0.3396,20.674 +DH022,172.0,174.0,7.346,0.0925,11.446 +DH022,174.0,176.0,0.483,0.487,0.727 +DH022,176.0,178.0,2.512,0.2204,6.753 +DH022,178.0,180.0,0.995,0.1358,2.418 +DH022,180.0,182.0,1.215,0.0939,2.902 +DH022,182.0,184.0,4.919,0.0793,10.315 +DH022,184.0,186.0,20.641,0.1018,55.603 +DH022,186.0,188.0,2.526,0.5349,4.37 +DH022,188.0,190.0,1.326,0.2354,2.498 +DH022,190.0,192.0,1.994,0.0777,3.293 +DH022,192.0,194.0,8.002,0.0968,15.368 +DH022,194.0,196.0,1.699,0.0885,4.122 +DH022,196.0,198.0,0.995,0.1678,2.399 +DH022,198.0,200.0,2.752,0.5657,7.926 +DH022,200.0,202.0,1.912,0.0512,5.209 +DH022,202.0,204.0,2.653,0.3133,7.892 +DH022,204.0,206.0,0.827,0.0224,2.108 +DH022,206.0,208.0,3.988,0.228,7.123 +DH022,208.0,210.0,0.405,0.168,1.062 +DH022,210.0,212.0,4.157,0.1606,11.152 +DH022,212.0,214.0,0.896,0.2754,2.198 +DH022,214.0,216.0,2.836,0.2577,8.064 +DH022,216.0,218.0,0.644,0.1244,1.406 +DH022,218.0,220.0,26.529,0.0758,47.154 +DH022,220.0,222.0,2.504,0.1751,5.376 +DH022,222.0,224.0,1.537,0.185,4.276 +DH022,224.0,226.0,19.548,0.688,58.414 +DH022,226.0,228.0,1.639,0.2,4.317 +DH022,228.0,230.0,2.354,0.251,4.264 +DH022,230.0,232.0,6.848,0.2632,18.014 +DH022,232.0,234.0,0.484,0.2345,0.806 +DH022,234.0,236.0,1.107,0.1422,2.522 +DH022,236.0,238.0,21.239,0.3526,39.073 +DH022,238.0,240.0,4.827,0.5488,7.993 +DH022,240.0,242.0,0.925,0.1179,2.037 +DH022,242.0,244.0,2.216,0.2661,5.042 +DH022,244.0,246.0,1.088,0.816,1.952 +DH022,246.0,248.0,5.072,0.3394,8.431 +DH022,248.0,250.0,0.821,0.1313,2.053 +DH022,250.0,252.0,0.066,0.0175,0.089 +DH022,252.0,254.0,0.331,0.019,0.432 +DH022,254.0,256.0,0.059,0.0132,0.078 +DH022,256.0,258.0,0.026,0.0211,0.022 +DH022,258.0,260.0,0.064,0.0133,0.043 +DH022,260.0,262.0,0.084,0.0051,0.118 +DH022,262.0,264.0,0.078,0.0093,0.113 +DH022,264.0,266.0,0.057,0.0163,0.032 +DH022,266.0,268.0,0.078,0.0352,0.117 +DH022,268.0,270.0,0.128,0.0316,0.092 +DH022,270.0,272.0,0.095,0.0402,0.078 +DH022,272.0,274.0,0.089,0.0218,0.1 +DH022,274.0,276.0,0.098,0.0085,0.083 +DH022,276.0,278.0,0.092,0.0105,0.104 +DH022,278.0,280.0,0.089,0.0201,0.073 +DH022,280.0,282.0,0.141,0.0175,0.145 +DH022,282.0,284.0,0.04,0.0168,0.023 +DH022,284.0,286.0,0.147,0.0123,0.081 +DH022,286.0,288.0,0.045,0.0132,0.05 +DH022,288.0,290.0,0.076,0.0251,0.091 +DH022,290.0,292.0,0.078,0.0164,0.046 +DH022,292.0,294.0,0.057,0.0137,0.06 +DH022,294.0,296.0,0.041,0.0239,0.037 +DH022,296.0,298.0,0.085,0.0346,0.105 +DH022,298.0,300.0,0.031,0.0253,0.025 +DH022,300.0,302.0,0.062,0.0216,0.091 +DH022,302.0,304.0,0.197,0.0237,0.238 +DH022,304.0,305.0,0.058,0.0078,0.031 +DH023,0.0,2.0,0.061,0.0094,0.057 +DH023,2.0,4.0,0.177,0.0181,0.158 +DH023,4.0,6.0,0.107,0.0181,0.088 +DH023,6.0,8.0,0.055,0.0158,0.07 +DH023,8.0,10.0,0.083,0.0203,0.047 +DH023,10.0,12.0,0.122,0.0183,0.09 +DH023,12.0,14.0,0.065,0.0215,0.065 +DH023,14.0,16.0,0.092,0.0177,0.057 +DH023,16.0,18.0,0.205,0.0103,0.133 +DH023,18.0,20.0,0.062,0.0167,0.068 +DH023,20.0,22.0,0.184,0.0159,0.22 +DH023,22.0,24.0,0.174,0.0142,0.09 +DH023,24.0,26.0,0.136,0.0232,0.168 +DH023,26.0,28.0,0.125,0.0174,0.101 +DH023,28.0,30.0,0.077,0.0082,0.044 +DH023,30.0,32.0,0.036,0.0159,0.044 +DH023,32.0,34.0,0.132,0.0313,0.198 +DH023,34.0,36.0,0.196,0.0294,0.228 +DH023,36.0,38.0,0.042,0.0089,0.043 +DH023,38.0,40.0,0.053,0.0334,0.069 +DH023,40.0,42.0,0.048,0.0206,0.047 +DH023,42.0,44.0,0.083,0.03,0.104 +DH023,44.0,46.0,0.088,0.0203,0.12 +DH023,46.0,48.0,0.104,0.0198,0.058 +DH023,48.0,50.0,0.118,0.0166,0.082 +DH023,50.0,52.0,0.069,0.0207,0.096 +DH023,52.0,54.0,0.108,0.0152,0.131 +DH023,54.0,56.0,0.275,0.0284,0.335 +DH023,56.0,58.0,0.033,0.009,0.017 +DH023,58.0,60.0,0.084,0.0166,0.103 +DH023,60.0,62.0,0.164,0.0538,0.158 +DH023,62.0,64.0,0.157,0.0205,0.175 +DH023,64.0,66.0,0.086,0.0525,0.068 +DH023,66.0,68.0,0.062,0.0319,0.052 +DH023,68.0,70.0,0.049,0.0161,0.041 +DH023,70.0,72.0,0.086,0.0318,0.112 +DH023,72.0,74.0,0.158,0.0193,0.177 +DH023,74.0,76.0,0.099,0.0174,0.067 +DH023,76.0,78.0,0.067,0.0075,0.077 +DH023,78.0,80.0,0.07,0.0083,0.062 +DH023,80.0,82.0,0.186,0.169,0.32 +DH023,82.0,84.0,2.5,0.1606,6.594 +DH023,84.0,86.0,0.869,0.2251,2.121 +DH023,86.0,88.0,0.756,0.2764,1.851 +DH023,88.0,90.0,1.823,1.5478,3.642 +DH023,90.0,92.0,1.6,0.1785,2.533 +DH023,92.0,94.0,0.694,0.3862,1.559 +DH023,94.0,96.0,1.126,0.1451,2.268 +DH023,96.0,98.0,0.272,0.1541,0.703 +DH023,98.0,100.0,2.819,0.7776,7.284 +DH023,100.0,102.0,4.174,1.0061,6.341 +DH023,102.0,104.0,2.401,0.2211,5.796 +DH023,104.0,106.0,2.232,0.1328,3.925 +DH023,106.0,108.0,0.836,0.3419,2.385 +DH023,108.0,110.0,1.773,0.3509,5.239 +DH023,110.0,112.0,2.706,0.1541,4.964 +DH023,112.0,114.0,2.683,0.1385,7.487 +DH023,114.0,116.0,10.66,0.1686,27.146 +DH023,116.0,118.0,3.332,0.3752,5.425 +DH023,118.0,120.0,2.279,0.2534,3.503 +DH023,120.0,122.0,3.332,0.3135,8.517 +DH023,122.0,124.0,2.381,0.1161,6.299 +DH023,124.0,126.0,5.499,0.0534,12.033 +DH023,126.0,128.0,6.699,0.7528,11.083 +DH023,128.0,130.0,2.511,0.1621,3.941 +DH023,130.0,132.0,3.211,0.0793,5.665 +DH023,132.0,134.0,1.55,0.1986,4.036 +DH023,134.0,136.0,5.741,0.1598,14.332 +DH023,136.0,138.0,3.124,0.2013,4.876 +DH023,138.0,140.0,0.726,0.073,1.39 +DH023,140.0,142.0,2.392,0.0827,5.553 +DH023,142.0,144.0,2.77,0.1217,5.564 +DH023,144.0,146.0,7.088,0.1346,12.983 +DH023,146.0,148.0,2.303,0.2825,6.094 +DH023,148.0,150.0,0.092,0.0899,0.158 +DH023,150.0,152.0,3.448,0.0533,9.715 +DH023,152.0,154.0,0.579,0.2692,1.195 +DH023,154.0,156.0,5.431,0.5239,13.488 +DH023,156.0,158.0,6.249,0.1686,14.047 +DH023,158.0,160.0,4.252,0.0842,10.682 +DH023,160.0,162.0,6.564,0.4075,15.096 +DH023,162.0,164.0,5.005,0.0421,10.982 +DH023,164.0,166.0,1.743,0.6045,3.561 +DH023,166.0,168.0,3.028,0.1422,7.212 +DH023,168.0,170.0,3.256,0.299,7.624 +DH023,170.0,172.0,2.078,0.1932,5.271 +DH023,172.0,174.0,7.295,0.2517,11.959 +DH023,174.0,176.0,2.532,1.8019,6.155 +DH023,176.0,178.0,0.063,0.2347,0.169 +DH023,178.0,180.0,1.788,0.1544,3.1 +DH023,180.0,182.0,4.317,0.089,12.137 +DH023,182.0,184.0,2.081,0.1056,5.055 +DH023,184.0,186.0,0.348,0.1431,1.013 +DH023,186.0,188.0,29.158,0.129,87.221 +DH023,188.0,190.0,1.107,0.3212,1.946 +DH023,190.0,192.0,34.187,0.6876,97.273 +DH023,192.0,194.0,0.764,0.8181,1.767 +DH023,194.0,196.0,1.01,0.1598,1.805 +DH023,196.0,198.0,1.274,0.1852,2.258 +DH023,198.0,200.0,1.397,0.0809,3.914 +DH023,200.0,202.0,2.862,0.2365,7.655 +DH023,202.0,204.0,1.27,0.3045,2.52 +DH023,204.0,206.0,0.873,0.2396,1.555 +DH023,206.0,208.0,0.877,0.2204,2.306 +DH023,208.0,210.0,0.461,0.2553,1.221 +DH023,210.0,212.0,4.332,0.0863,8.943 +DH023,212.0,214.0,11.682,1.1759,27.898 +DH023,214.0,216.0,0.542,0.3201,1.342 +DH023,216.0,218.0,3.129,0.1203,8.102 +DH023,218.0,220.0,1.472,0.3978,3.641 +DH023,220.0,222.0,3.609,0.2653,9.643 +DH023,222.0,224.0,4.201,0.1791,10.274 +DH023,224.0,226.0,18.028,0.25,27.112 +DH023,226.0,227.0,2.518,0.1874,4.892 +DH024,0.0,2.0,0.093,0.0142,0.048 +DH024,2.0,4.0,0.051,0.0193,0.059 +DH024,4.0,6.0,0.072,0.0067,0.069 +DH024,6.0,8.0,0.088,0.0111,0.054 +DH024,8.0,10.0,0.035,0.0309,0.036 +DH024,10.0,12.0,0.021,0.02,0.022 +DH024,12.0,14.0,0.059,0.0127,0.067 +DH024,14.0,16.0,0.061,0.0072,0.06 +DH024,16.0,18.0,0.071,0.0127,0.078 +DH024,18.0,20.0,0.13,0.0096,0.101 +DH024,20.0,22.0,0.058,0.0141,0.07 +DH024,22.0,24.0,0.057,0.0184,0.041 +DH024,24.0,26.0,0.113,0.0124,0.072 +DH024,26.0,28.0,0.14,0.008,0.087 +DH024,28.0,30.0,0.046,0.0108,0.059 +DH024,30.0,32.0,0.059,0.01,0.044 +DH024,32.0,34.0,0.143,0.007,0.102 +DH024,34.0,36.0,0.117,0.0159,0.129 +DH024,36.0,38.0,0.119,0.0213,0.127 +DH024,38.0,40.0,0.11,0.0097,0.15 +DH024,40.0,42.0,0.106,0.0121,0.139 +DH024,42.0,44.0,0.315,0.0164,0.214 +DH024,44.0,46.0,0.063,0.0191,0.045 +DH024,46.0,48.0,0.082,0.0187,0.081 +DH024,48.0,50.0,0.028,0.0159,0.04 +DH024,50.0,52.0,0.071,0.0168,0.052 +DH024,52.0,54.0,0.047,0.0074,0.027 +DH024,54.0,56.0,0.045,0.0194,0.049 +DH024,56.0,58.0,0.062,0.0146,0.062 +DH024,58.0,60.0,0.06,0.0108,0.03 +DH024,60.0,62.0,0.156,0.0195,0.187 +DH024,62.0,64.0,0.076,0.0066,0.077 +DH024,64.0,66.0,0.065,0.0115,0.045 +DH024,66.0,68.0,0.064,0.0301,0.092 +DH024,68.0,70.0,0.047,0.0141,0.031 +DH024,70.0,72.0,0.133,0.0197,0.154 +DH024,72.0,74.0,0.113,0.0136,0.12 +DH024,74.0,76.0,0.082,0.0119,0.066 +DH024,76.0,78.0,0.172,0.0148,0.179 +DH024,78.0,80.0,0.056,0.0125,0.046 +DH024,80.0,82.0,0.78,0.4309,1.808 +DH024,82.0,84.0,0.78,0.2107,2.162 +DH024,84.0,86.0,3.383,1.0103,7.056 +DH024,86.0,88.0,4.223,0.2275,10.316 +DH024,88.0,90.0,1.825,0.1124,3.859 +DH024,90.0,92.0,1.574,0.1082,3.791 +DH024,92.0,94.0,2.506,0.1859,5.036 +DH024,94.0,96.0,0.246,0.6177,0.498 +DH024,96.0,98.0,2.869,0.1394,5.817 +DH024,98.0,100.0,10.769,0.9851,27.126 +DH024,100.0,102.0,3.329,0.2335,6.238 +DH024,102.0,104.0,0.176,0.3017,0.376 +DH024,104.0,106.0,0.132,0.1672,0.29 +DH024,106.0,108.0,1.013,0.42,2.436 +DH024,108.0,110.0,2.192,0.2457,4.37 +DH024,110.0,112.0,0.942,0.461,2.126 +DH024,112.0,114.0,3.458,0.2482,9.707 +DH024,114.0,116.0,1.328,0.806,3.25 +DH024,116.0,118.0,16.997,0.0837,36.264 +DH024,118.0,120.0,1.388,0.2495,3.617 +DH024,120.0,122.0,3.506,0.5923,6.086 +DH024,122.0,124.0,0.829,0.226,2.028 +DH024,124.0,126.0,1.781,0.1036,4.936 +DH024,126.0,128.0,1.44,0.6983,2.433 +DH024,128.0,130.0,4.846,0.3486,13.042 +DH024,130.0,132.0,3.458,1.0436,6.616 +DH024,132.0,134.0,6.564,0.3885,17.506 +DH024,134.0,136.0,2.784,0.3457,8.099 +DH024,136.0,138.0,0.439,0.2719,0.839 +DH024,138.0,140.0,1.391,0.6292,2.785 +DH024,140.0,142.0,0.417,0.4217,0.901 +DH024,142.0,144.0,0.22,0.4614,0.333 +DH024,144.0,146.0,3.925,0.1566,8.77 +DH024,146.0,148.0,0.536,0.1795,1.065 +DH024,148.0,150.0,3.217,0.1541,9.144 +DH024,150.0,152.0,2.681,0.3041,4.795 +DH024,152.0,154.0,1.473,0.2585,3.891 +DH024,154.0,156.0,0.121,0.3743,0.229 +DH024,156.0,158.0,4.379,0.0797,11.365 +DH024,158.0,160.0,0.601,0.4048,1.76 +DH024,160.0,162.0,0.73,0.3421,1.864 +DH024,162.0,164.0,0.73,0.4609,1.17 +DH024,164.0,166.0,5.294,0.44,15.02 +DH024,166.0,168.0,1.741,0.1329,2.98 +DH024,168.0,170.0,1.181,0.1578,2.094 +DH024,170.0,172.0,9.221,0.3069,17.056 +DH024,172.0,174.0,0.954,0.0513,1.884 +DH024,174.0,176.0,0.881,0.1793,1.48 +DH024,176.0,178.0,0.757,0.0671,1.471 +DH024,178.0,180.0,1.386,0.2398,2.705 +DH024,180.0,182.0,5.014,0.0609,9.713 +DH024,182.0,184.0,2.545,0.2063,6.686 +DH024,184.0,186.0,2.845,0.1283,6.554 +DH024,186.0,188.0,9.214,0.1271,23.082 +DH024,188.0,190.0,2.067,0.0903,3.832 +DH024,190.0,192.0,1.472,0.711,2.769 +DH024,192.0,194.0,2.757,0.0406,6.851 +DH024,194.0,196.0,2.489,0.1311,4.699 +DH024,196.0,198.0,2.73,0.0956,5.725 +DH024,198.0,200.0,9.361,0.1859,15.377 +DH024,200.0,202.0,1.798,0.4421,2.958 +DH024,202.0,204.0,4.456,0.1297,11.022 +DH024,204.0,206.0,1.131,0.1418,2.109 +DH024,206.0,208.0,0.41,0.329,1.227 +DH024,208.0,210.0,5.066,0.0769,10.211 +DH024,210.0,212.0,0.903,0.2532,1.586 +DH024,212.0,214.0,0.484,0.111,1.338 +DH024,214.0,216.0,1.792,1.0917,3.609 +DH024,216.0,218.0,0.689,0.0901,1.976 +DH024,218.0,220.0,2.118,0.1089,3.647 +DH024,220.0,222.0,0.861,0.2827,1.593 +DH024,222.0,224.0,4.31,0.2071,9.087 +DH024,224.0,226.0,0.444,0.4013,0.951 +DH024,226.0,228.0,1.272,0.589,2.153 +DH024,228.0,230.0,5.639,0.2828,13.558 +DH024,230.0,232.0,1.843,0.1039,3.509 +DH024,232.0,234.0,6.113,0.1486,13.471 +DH024,234.0,236.0,0.607,0.4165,0.925 +DH024,236.0,238.0,0.526,0.1865,0.868 +DH024,238.0,240.0,0.491,0.0947,1.109 +DH024,240.0,242.0,28.789,0.1303,73.859 +DH024,242.0,244.0,3.041,0.1392,5.791 +DH024,244.0,246.0,1.3,0.1676,2.917 +DH024,246.0,248.0,2.161,0.4581,5.29 +DH024,248.0,250.0,8.237,0.355,20.223 +DH024,250.0,252.0,0.056,0.0144,0.034 +DH024,252.0,254.0,0.07,0.0197,0.05 +DH024,254.0,256.0,0.113,0.0119,0.163 +DH024,256.0,258.0,0.073,0.0275,0.084 +DH024,258.0,260.0,0.114,0.0167,0.08 +DH024,260.0,262.0,0.031,0.0408,0.042 +DH024,262.0,264.0,0.132,0.016,0.091 +DH024,264.0,266.0,0.06,0.0162,0.068 +DH024,266.0,268.0,0.108,0.0311,0.148 +DH024,268.0,270.0,0.1,0.0431,0.064 +DH024,270.0,272.0,0.157,0.0227,0.086 +DH024,272.0,274.0,0.092,0.0236,0.057 +DH024,274.0,276.0,0.105,0.0282,0.105 +DH024,276.0,278.0,0.014,0.0424,0.013 +DH024,278.0,280.0,0.05,0.0104,0.034 +DH024,280.0,282.0,0.059,0.0127,0.076 +DH024,282.0,284.0,0.113,0.0505,0.137 +DH024,284.0,286.0,0.161,0.0152,0.12 +DH024,286.0,288.0,0.076,0.0193,0.041 +DH024,288.0,290.0,0.055,0.0148,0.059 +DH024,290.0,292.0,0.158,0.0189,0.117 +DH024,292.0,294.0,0.069,0.0089,0.095 +DH024,294.0,296.0,0.096,0.016,0.062 +DH024,296.0,298.0,0.105,0.0208,0.065 +DH024,298.0,300.0,0.071,0.0225,0.061 +DH024,300.0,302.0,0.07,0.0241,0.047 +DH024,302.0,304.0,0.073,0.0325,0.044 +DH024,304.0,306.0,0.188,0.023,0.257 +DH024,306.0,308.0,0.057,0.053,0.047 +DH024,308.0,310.0,0.183,0.0156,0.175 +DH024,310.0,312.0,0.193,0.0106,0.15 +DH024,312.0,314.0,0.023,0.0168,0.025 +DH024,314.0,316.0,0.072,0.079,0.053 +DH024,316.0,318.0,0.035,0.0242,0.05 +DH024,318.0,320.0,0.067,0.02,0.085 +DH024,320.0,322.0,0.037,0.0109,0.019 +DH024,322.0,324.0,0.087,0.0129,0.069 +DH024,324.0,326.0,0.078,0.0285,0.078 +DH024,326.0,328.0,0.217,0.0129,0.246 +DH024,328.0,330.0,0.066,0.0246,0.045 +DH024,330.0,332.0,0.261,0.0079,0.156 +DH024,332.0,334.0,0.087,0.0241,0.05 +DH024,334.0,336.0,0.137,0.0127,0.147 +DH024,336.0,338.0,0.252,0.0118,0.376 +DH024,338.0,340.0,0.103,0.0147,0.085 +DH024,340.0,342.0,0.072,0.0069,0.084 +DH024,342.0,344.0,0.07,0.0107,0.093 +DH024,344.0,346.0,0.072,0.0133,0.055 +DH024,346.0,348.0,0.102,0.019,0.136 +DH024,348.0,350.0,0.089,0.0179,0.065 +DH024,350.0,352.0,0.069,0.0245,0.055 +DH024,352.0,354.0,0.072,0.0257,0.105 +DH024,354.0,356.0,0.046,0.0162,0.052 +DH024,356.0,358.0,0.091,0.016,0.09 +DH024,358.0,360.0,0.069,0.056,0.038 +DH024,360.0,362.0,0.045,0.0169,0.04 +DH024,362.0,364.0,0.051,0.0673,0.027 +DH024,364.0,366.0,0.108,0.0145,0.108 +DH024,366.0,368.0,0.073,0.0137,0.052 +DH024,368.0,370.0,0.03,0.0103,0.027 +DH024,370.0,372.0,0.185,0.0152,0.099 +DH024,372.0,374.0,0.083,0.035,0.081 +DH024,374.0,376.0,0.128,0.0166,0.088 +DH024,376.0,378.0,0.05,0.0185,0.07 +DH024,378.0,380.0,0.045,0.0097,0.047 +DH024,380.0,382.0,0.089,0.0125,0.114 +DH024,382.0,384.0,0.026,0.0152,0.029 +DH024,384.0,386.0,0.125,0.0175,0.113 +DH024,386.0,388.0,0.05,0.0413,0.074 +DH024,388.0,390.0,0.091,0.0669,0.061 +DH024,390.0,392.0,0.039,0.0128,0.034 +DH024,392.0,394.0,0.329,0.0159,0.31 +DH024,394.0,396.0,0.048,0.0324,0.029 +DH024,396.0,398.0,0.061,0.0072,0.06 +DH024,398.0,400.0,0.231,0.0258,0.117 +DH024,400.0,402.0,0.252,0.0488,0.158 +DH024,402.0,404.0,0.081,0.0137,0.116 +DH024,404.0,406.0,0.034,0.0087,0.05 +DH024,406.0,408.0,0.157,0.0084,0.096 +DH024,408.0,410.0,0.053,0.0437,0.068 +DH024,410.0,412.0,0.032,0.0348,0.047 +DH024,412.0,414.0,0.048,0.0155,0.063 +DH024,414.0,416.0,0.076,0.0193,0.06 +DH024,416.0,418.0,0.028,0.0137,0.029 +DH024,418.0,420.0,0.072,0.0155,0.058 +DH024,420.0,422.0,0.057,0.037,0.083 +DH024,422.0,424.0,0.127,0.0188,0.162 +DH024,424.0,426.0,0.053,0.0154,0.06 +DH024,426.0,428.0,0.06,0.0216,0.063 +DH024,428.0,430.0,0.302,0.021,0.413 +DH024,430.0,431.0,0.165,0.0165,0.202 +DH025,0.0,2.0,0.198,0.0142,0.184 +DH025,2.0,4.0,0.057,0.0183,0.057 +DH025,4.0,6.0,0.16,0.0287,0.101 +DH025,6.0,8.0,0.364,0.0153,0.31 +DH025,8.0,10.0,0.035,0.0383,0.044 +DH025,10.0,12.0,0.09,0.014,0.05 +DH025,12.0,14.0,0.051,0.0232,0.045 +DH025,14.0,16.0,0.107,0.0217,0.097 +DH025,16.0,18.0,0.034,0.0085,0.043 +DH025,18.0,20.0,0.199,0.0358,0.259 +DH025,20.0,22.0,0.083,0.0122,0.049 +DH025,22.0,24.0,0.058,0.0355,0.035 +DH025,24.0,26.0,0.046,0.0156,0.066 +DH025,26.0,28.0,0.058,0.0191,0.04 +DH025,28.0,30.0,0.104,0.0208,0.149 +DH025,30.0,32.0,0.059,0.0104,0.066 +DH025,32.0,34.0,0.077,0.0275,0.048 +DH025,34.0,36.0,0.097,0.0271,0.082 +DH025,36.0,38.0,0.07,0.0417,0.1 +DH025,38.0,40.0,0.027,0.0255,0.021 +DH025,40.0,42.0,0.124,0.013,0.063 +DH025,42.0,44.0,0.059,0.0183,0.054 +DH025,44.0,46.0,0.072,0.0102,0.047 +DH025,46.0,48.0,0.091,0.0082,0.113 +DH025,48.0,50.0,0.074,0.0199,0.086 +DH025,50.0,52.0,0.1,0.0328,0.091 +DH025,52.0,54.0,0.153,0.0195,0.082 +DH025,54.0,56.0,0.105,0.0341,0.139 +DH025,56.0,58.0,0.063,0.0133,0.071 +DH025,58.0,60.0,0.052,0.0108,0.05 +DH025,60.0,62.0,0.032,0.0494,0.021 +DH025,62.0,64.0,0.257,0.0224,0.162 +DH025,64.0,66.0,0.033,0.0184,0.028 +DH025,66.0,68.0,0.209,0.021,0.201 +DH025,68.0,70.0,0.046,0.012,0.032 +DH025,70.0,72.0,0.219,0.0202,0.15 +DH025,72.0,74.0,0.208,0.0112,0.261 +DH025,74.0,76.0,0.108,0.0119,0.074 +DH025,76.0,78.0,0.053,0.0372,0.071 +DH025,78.0,80.0,0.088,0.016,0.117 +DH025,80.0,82.0,2.23,0.1437,4.213 +DH025,82.0,84.0,3.654,0.1613,7.629 +DH025,84.0,86.0,1.781,0.1731,5.087 +DH025,86.0,88.0,5.555,0.0541,12.444 +DH025,88.0,90.0,2.619,0.3635,4.665 +DH025,90.0,92.0,0.952,0.1074,2.3 +DH025,92.0,94.0,1.655,0.3904,4.139 +DH025,94.0,96.0,4.616,0.0336,10.957 +DH025,96.0,98.0,9.03,0.1946,20.966 +DH025,98.0,100.0,1.012,0.0198,2.211 +DH025,100.0,102.0,7.914,0.14,19.622 +DH025,102.0,104.0,0.136,0.0605,0.226 +DH025,104.0,106.0,4.668,0.079,7.805 +DH025,106.0,108.0,2.149,0.0857,6.42 +DH025,108.0,110.0,1.838,0.3528,5.297 +DH025,110.0,112.0,6.362,0.0644,17.944 +DH025,112.0,114.0,1.613,0.2081,2.45 +DH025,114.0,116.0,1.007,0.02,2.575 +DH025,116.0,118.0,3.307,0.0681,8.416 +DH025,118.0,120.0,1.301,0.1596,2.657 +DH025,120.0,122.0,4.239,0.1177,8.513 +DH025,122.0,124.0,8.655,0.1934,21.199 +DH025,124.0,126.0,5.109,0.1308,13.653 +DH025,126.0,128.0,3.212,0.065,9.12 +DH025,128.0,130.0,0.899,0.4424,2.626 +DH025,130.0,132.0,3.66,0.0617,7.192 +DH025,132.0,134.0,7.059,0.087,10.627 +DH025,134.0,136.0,0.138,0.065,0.409 +DH025,136.0,138.0,3.466,0.1681,10.226 +DH025,138.0,140.0,0.606,0.2619,1.504 +DH025,140.0,142.0,14.239,0.1925,26.843 +DH025,142.0,144.0,0.421,0.1672,0.955 +DH025,144.0,146.0,1.423,0.1513,4.042 +DH025,146.0,148.0,13.705,0.2506,33.308 +DH025,148.0,150.0,4.692,0.5313,8.269 +DH025,150.0,152.0,1.736,0.1897,4.098 +DH025,152.0,154.0,5.76,0.2466,15.361 +DH025,154.0,156.0,1.132,0.4531,2.245 +DH025,156.0,158.0,5.018,0.2484,7.835 +DH025,158.0,160.0,0.761,0.2615,2.031 +DH025,160.0,162.0,0.451,0.3262,1.077 +DH025,162.0,164.0,1.332,0.2303,2.13 +DH025,164.0,166.0,2.457,0.2353,5.349 +DH025,166.0,168.0,4.4,0.1211,9.809 +DH025,168.0,170.0,1.952,0.0874,3.048 +DH025,170.0,172.0,8.821,0.1608,14.048 +DH025,172.0,174.0,6.199,0.16,17.184 +DH025,174.0,176.0,6.839,0.2779,16.565 +DH025,176.0,178.0,0.281,0.116,0.796 +DH025,178.0,180.0,33.562,0.9403,90.824 +DH025,180.0,182.0,0.858,0.1298,1.396 +DH025,182.0,184.0,0.869,0.7365,1.525 +DH025,184.0,186.0,1.947,0.4146,5.753 +DH025,186.0,188.0,2.371,0.0928,4.991 +DH025,188.0,190.0,1.101,0.1339,2.7 +DH025,190.0,192.0,2.902,0.1871,4.511 +DH025,192.0,194.0,0.785,0.3849,2.245 +DH025,194.0,196.0,1.246,0.1181,3.35 +DH025,196.0,198.0,21.005,0.2121,45.712 +DH025,198.0,199.0,6.703,0.153,16.681 +DH026,0.0,2.0,0.057,0.0347,0.077 +DH026,2.0,4.0,0.19,0.0108,0.246 +DH026,4.0,6.0,0.19,0.0199,0.115 +DH026,6.0,8.0,0.07,0.0208,0.078 +DH026,8.0,10.0,0.033,0.0081,0.039 +DH026,10.0,12.0,0.134,0.0082,0.09 +DH026,12.0,14.0,0.113,0.0501,0.079 +DH026,14.0,16.0,0.102,0.0361,0.126 +DH026,16.0,18.0,0.062,0.0103,0.05 +DH026,18.0,20.0,0.08,0.02,0.06 +DH026,20.0,22.0,0.072,0.0186,0.093 +DH026,22.0,24.0,0.218,0.0201,0.207 +DH026,24.0,26.0,0.028,0.0258,0.027 +DH026,26.0,28.0,0.138,0.0368,0.202 +DH026,28.0,30.0,0.114,0.035,0.135 +DH026,30.0,32.0,0.023,0.012,0.019 +DH026,32.0,34.0,0.112,0.0225,0.069 +DH026,34.0,36.0,0.069,0.0273,0.062 +DH026,36.0,38.0,0.09,0.0153,0.13 +DH026,38.0,40.0,0.081,0.0188,0.046 +DH026,40.0,42.0,0.125,0.0191,0.108 +DH026,42.0,44.0,0.066,0.0089,0.07 +DH026,44.0,46.0,0.089,0.0235,0.096 +DH026,46.0,48.0,0.24,0.0261,0.24 +DH026,48.0,50.0,0.148,0.0159,0.174 +DH026,50.0,52.0,0.157,0.0106,0.194 +DH026,52.0,54.0,0.057,0.0433,0.065 +DH026,54.0,56.0,0.212,0.0127,0.133 +DH026,56.0,58.0,0.133,0.0255,0.127 +DH026,58.0,60.0,0.061,0.0191,0.089 +DH026,60.0,62.0,0.054,0.0244,0.041 +DH026,62.0,64.0,0.093,0.0191,0.127 +DH026,64.0,66.0,0.07,0.0197,0.072 +DH026,66.0,68.0,0.211,0.0303,0.27 +DH026,68.0,70.0,0.052,0.0121,0.058 +DH026,70.0,72.0,0.045,0.0194,0.041 +DH026,72.0,74.0,0.068,0.0111,0.091 +DH026,74.0,76.0,0.059,0.0128,0.043 +DH026,76.0,78.0,0.082,0.0141,0.052 +DH026,78.0,80.0,0.123,0.0154,0.162 +DH026,80.0,82.0,0.484,0.5695,1.271 +DH026,82.0,84.0,2.101,0.1282,5.831 +DH026,84.0,86.0,0.301,0.1212,0.64 +DH026,86.0,88.0,0.702,0.0647,1.933 +DH026,88.0,90.0,1.402,0.1692,2.654 +DH026,90.0,92.0,7.684,0.6062,12.747 +DH026,92.0,94.0,0.317,0.1125,0.848 +DH026,94.0,96.0,1.291,0.4442,3.697 +DH026,96.0,98.0,14.806,0.5138,38.815 +DH026,98.0,100.0,1.358,0.2064,3.872 +DH026,100.0,102.0,0.365,0.7243,0.638 +DH026,102.0,104.0,1.471,0.6336,3.98 +DH026,104.0,106.0,0.245,0.4995,0.488 +DH026,106.0,108.0,1.76,0.2631,4.718 +DH026,108.0,110.0,6.16,0.3551,17.808 +DH026,110.0,112.0,0.862,0.2824,2.576 +DH026,112.0,114.0,14.506,0.0727,22.248 +DH026,114.0,116.0,0.457,0.1244,0.944 +DH026,116.0,118.0,1.18,0.5573,2.517 +DH026,118.0,120.0,1.277,0.2005,3.584 +DH026,120.0,122.0,6.624,0.0897,19.465 +DH026,122.0,124.0,3.934,0.296,10.795 +DH026,124.0,126.0,5.468,0.1094,15.236 +DH026,126.0,128.0,4.201,0.0902,8.039 +DH026,128.0,130.0,1.155,0.2536,2.638 +DH026,130.0,132.0,0.563,0.0731,1.506 +DH026,132.0,134.0,3.138,0.2428,4.905 +DH026,134.0,136.0,1.059,0.2585,1.787 +DH026,136.0,138.0,1.625,1.7003,3.228 +DH026,138.0,140.0,1.574,0.1468,3.83 +DH026,140.0,142.0,8.024,0.4187,17.125 +DH026,142.0,144.0,0.399,0.0885,0.991 +DH026,144.0,146.0,1.999,0.388,4.185 +DH026,146.0,148.0,7.1,0.2999,15.833 +DH026,148.0,150.0,0.181,0.0831,0.509 +DH026,150.0,152.0,2.197,0.5292,6.569 +DH026,152.0,154.0,1.827,0.1368,4.416 +DH026,154.0,156.0,6.273,0.1437,18.749 +DH026,156.0,158.0,0.916,1.2023,2.36 +DH026,158.0,160.0,0.648,0.2687,1.416 +DH026,160.0,162.0,1.698,0.4362,4.95 +DH026,162.0,163.0,4.552,0.2202,8.296 +DH027,0.0,2.0,0.078,0.02,0.106 +DH027,2.0,4.0,0.091,0.0175,0.113 +DH027,4.0,6.0,0.067,0.0157,0.049 +DH027,6.0,8.0,0.094,0.0307,0.118 +DH027,8.0,10.0,0.027,0.0256,0.035 +DH027,10.0,12.0,0.067,0.0108,0.059 +DH027,12.0,14.0,0.156,0.0292,0.226 +DH027,14.0,16.0,0.231,0.0066,0.144 +DH027,16.0,18.0,0.028,0.0251,0.04 +DH027,18.0,20.0,0.061,0.0164,0.049 +DH027,20.0,22.0,0.034,0.0098,0.038 +DH027,22.0,24.0,0.169,0.0181,0.24 +DH027,24.0,26.0,0.023,0.0295,0.024 +DH027,26.0,28.0,0.041,0.0078,0.034 +DH027,28.0,30.0,0.046,0.0163,0.031 +DH027,30.0,32.0,0.092,0.0162,0.112 +DH027,32.0,34.0,0.03,0.0199,0.03 +DH027,34.0,36.0,0.044,0.0192,0.036 +DH027,36.0,38.0,0.087,0.0366,0.053 +DH027,38.0,40.0,0.05,0.0383,0.041 +DH027,40.0,42.0,0.114,0.0339,0.084 +DH027,42.0,44.0,0.132,0.0312,0.107 +DH027,44.0,46.0,0.398,0.0202,0.248 +DH027,46.0,48.0,0.103,0.0128,0.1 +DH027,48.0,50.0,0.114,0.0136,0.08 +DH027,50.0,52.0,0.144,0.0121,0.128 +DH027,52.0,54.0,0.112,0.0153,0.128 +DH027,54.0,56.0,0.084,0.0107,0.049 +DH027,56.0,58.0,0.095,0.0068,0.112 +DH027,58.0,60.0,0.028,0.008,0.033 +DH027,60.0,62.0,0.072,0.0161,0.08 +DH027,62.0,64.0,0.055,0.0221,0.07 +DH027,64.0,66.0,0.134,0.0297,0.136 +DH027,66.0,68.0,0.027,0.0125,0.031 +DH027,68.0,70.0,0.052,0.0108,0.058 +DH027,70.0,72.0,0.353,0.0143,0.485 +DH027,72.0,74.0,0.037,0.0341,0.025 +DH027,74.0,76.0,0.133,0.0361,0.136 +DH027,76.0,78.0,0.068,0.0431,0.054 +DH027,78.0,80.0,0.022,0.023,0.02 +DH027,80.0,82.0,6.539,0.3093,14.283 +DH027,82.0,84.0,3.073,0.2641,6.05 +DH027,84.0,86.0,4.44,0.7384,11.069 +DH027,86.0,88.0,2.288,0.559,4.638 +DH027,88.0,90.0,6.673,0.2631,16.077 +DH027,90.0,92.0,3.026,0.2265,6.214 +DH027,92.0,94.0,0.906,0.5621,1.578 +DH027,94.0,96.0,0.377,0.1919,1.122 +DH027,96.0,98.0,4.451,0.24,12.281 +DH027,98.0,100.0,13.003,0.5337,24.111 +DH027,100.0,102.0,2.958,0.2168,6.388 +DH027,102.0,104.0,1.113,0.2476,2.734 +DH027,104.0,106.0,0.385,0.2471,0.606 +DH027,106.0,108.0,1.664,0.2985,4.007 +DH027,108.0,110.0,0.804,0.1705,1.344 +DH027,110.0,112.0,0.822,0.1387,1.26 +DH027,112.0,114.0,4.495,0.2883,10.85 +DH027,114.0,116.0,10.517,0.475,26.868 +DH027,116.0,118.0,9.669,0.2898,21.99 +DH027,118.0,120.0,3.42,0.2186,9.431 +DH027,120.0,122.0,2.786,0.1703,8.345 +DH027,122.0,124.0,4.19,0.1655,11.602 +DH027,124.0,126.0,3.967,0.169,7.986 +DH027,126.0,128.0,2.846,0.2543,4.307 +DH027,128.0,130.0,16.781,0.1261,35.927 +DH027,130.0,132.0,0.504,0.3991,1.353 +DH027,132.0,134.0,1.266,0.1476,2.865 +DH027,134.0,136.0,0.496,0.0371,1.28 +DH027,136.0,138.0,0.176,0.4419,0.296 +DH027,138.0,140.0,1.827,0.631,5.145 +DH027,140.0,142.0,15.167,0.1549,33.835 +DH027,142.0,144.0,2.022,0.8749,3.596 +DH027,144.0,146.0,1.199,0.2903,2.368 +DH027,146.0,148.0,2.008,1.8241,4.375 +DH027,148.0,150.0,7.411,0.4105,16.011 +DH027,150.0,152.0,1.337,0.5038,2.278 +DH027,152.0,154.0,3.339,0.0603,7.139 +DH027,154.0,156.0,3.142,0.212,7.186 +DH027,156.0,158.0,1.362,0.139,2.598 +DH027,158.0,160.0,1.275,1.2769,3.241 +DH027,160.0,162.0,0.696,1.1377,1.412 +DH027,162.0,164.0,2.306,0.4575,6.885 +DH027,164.0,166.0,1.675,0.141,2.898 +DH027,166.0,168.0,3.47,0.2098,9.819 +DH027,168.0,170.0,7.99,0.284,21.026 +DH027,170.0,172.0,2.658,0.9692,5.544 +DH027,172.0,174.0,1.2,0.0485,3.043 +DH027,174.0,176.0,1.271,0.2046,2.009 +DH027,176.0,178.0,3.392,0.1416,7.374 +DH027,178.0,180.0,4.642,0.6673,11.66 +DH027,180.0,182.0,2.982,0.0486,4.931 +DH027,182.0,184.0,1.098,0.5532,2.193 +DH027,184.0,186.0,0.836,0.2297,1.889 +DH027,186.0,188.0,0.867,1.0931,2.17 +DH027,188.0,190.0,2.551,0.1618,5.068 +DH027,190.0,192.0,9.796,0.8445,27.157 +DH027,192.0,194.0,8.339,0.3464,18.48 +DH027,194.0,196.0,1.993,0.1921,5.537 +DH027,196.0,198.0,6.998,0.7808,19.871 +DH027,198.0,200.0,1.958,0.0312,5.01 +DH027,200.0,202.0,1.387,0.0925,3.726 +DH027,202.0,204.0,0.462,0.1494,1.35 +DH027,204.0,206.0,9.447,0.1372,25.339 +DH027,206.0,208.0,2.815,0.4596,8.334 +DH027,208.0,210.0,2.138,0.0574,4.456 +DH027,210.0,212.0,2.173,0.2805,6.29 +DH027,212.0,214.0,8.75,0.2256,19.474 +DH027,214.0,216.0,1.284,1.0438,2.739 +DH027,216.0,218.0,7.831,0.097,21.154 +DH027,218.0,220.0,0.982,0.2586,1.509 +DH027,220.0,222.0,1.237,0.1668,3.374 +DH027,222.0,224.0,1.794,0.5437,5.305 +DH027,224.0,226.0,3.373,0.6731,6.412 +DH027,226.0,228.0,1.18,0.4674,3.499 +DH027,228.0,230.0,2.166,0.0971,6.492 +DH027,230.0,232.0,1.855,0.0812,2.784 +DH027,232.0,234.0,8.483,0.9835,17.576 +DH027,234.0,236.0,7.561,0.307,16.499 +DH027,236.0,238.0,0.221,0.8197,0.523 +DH027,238.0,240.0,11.697,0.3428,21.791 +DH027,240.0,242.0,3.236,1.2292,9.089 +DH027,242.0,244.0,1.203,0.1262,2.948 +DH027,244.0,246.0,1.825,0.5826,4.892 +DH027,246.0,248.0,0.292,0.322,0.62 +DH027,248.0,250.0,2.327,0.2723,4.771 +DH027,250.0,252.0,0.148,0.0126,0.111 +DH027,252.0,254.0,0.105,0.0178,0.111 +DH027,254.0,256.0,0.03,0.0173,0.037 +DH027,256.0,258.0,0.029,0.0181,0.026 +DH027,258.0,260.0,0.098,0.0113,0.095 +DH027,260.0,262.0,0.036,0.0356,0.051 +DH027,262.0,264.0,0.061,0.0525,0.049 +DH027,264.0,266.0,0.101,0.0312,0.123 +DH027,266.0,268.0,0.037,0.0128,0.029 +DH027,268.0,270.0,0.261,0.0125,0.243 +DH027,270.0,272.0,0.106,0.025,0.141 +DH027,272.0,274.0,0.049,0.014,0.044 +DH027,274.0,276.0,0.175,0.0163,0.153 +DH027,276.0,278.0,0.044,0.0465,0.029 +DH027,278.0,280.0,0.157,0.0186,0.138 +DH027,280.0,281.0,0.033,0.0062,0.049 +DH028,0.0,2.0,0.086,0.0203,0.107 +DH028,2.0,4.0,0.048,0.0312,0.048 +DH028,4.0,6.0,0.057,0.0256,0.051 +DH028,6.0,8.0,0.076,0.0462,0.071 +DH028,8.0,10.0,0.173,0.0222,0.151 +DH028,10.0,12.0,0.187,0.0212,0.095 +DH028,12.0,14.0,0.188,0.0342,0.129 +DH028,14.0,16.0,0.008,0.0228,0.004 +DH028,16.0,18.0,0.08,0.0248,0.061 +DH028,18.0,20.0,0.123,0.016,0.073 +DH028,20.0,22.0,0.131,0.024,0.195 +DH028,22.0,24.0,0.164,0.0305,0.209 +DH028,24.0,26.0,0.149,0.02,0.178 +DH028,26.0,28.0,0.159,0.0134,0.158 +DH028,28.0,30.0,0.023,0.0252,0.013 +DH028,30.0,32.0,0.254,0.0208,0.301 +DH028,32.0,34.0,0.07,0.0128,0.055 +DH028,34.0,36.0,0.067,0.0126,0.077 +DH028,36.0,38.0,0.104,0.0111,0.113 +DH028,38.0,40.0,0.099,0.0239,0.135 +DH028,40.0,42.0,0.114,0.0402,0.122 +DH028,42.0,44.0,0.41,0.0863,0.45 +DH028,44.0,46.0,0.022,0.0182,0.028 +DH028,46.0,48.0,0.078,0.026,0.09 +DH028,48.0,50.0,0.054,0.014,0.072 +DH028,50.0,52.0,0.136,0.0144,0.156 +DH028,52.0,54.0,0.116,0.0166,0.109 +DH028,54.0,56.0,0.047,0.0104,0.043 +DH028,56.0,58.0,0.105,0.0119,0.141 +DH028,58.0,60.0,0.261,0.0134,0.26 +DH028,60.0,62.0,0.02,0.0314,0.012 +DH028,62.0,64.0,0.147,0.0113,0.185 +DH028,64.0,66.0,0.05,0.0165,0.068 +DH028,66.0,68.0,0.077,0.0526,0.081 +DH028,68.0,70.0,0.201,0.0081,0.211 +DH028,70.0,72.0,0.06,0.0395,0.035 +DH028,72.0,74.0,0.023,0.0095,0.025 +DH028,74.0,76.0,0.144,0.0274,0.094 +DH028,76.0,78.0,0.059,0.0262,0.073 +DH028,78.0,80.0,0.051,0.0104,0.066 +DH028,80.0,82.0,3.48,0.1791,9.92 +DH028,82.0,84.0,2.516,0.3322,4.958 +DH028,84.0,86.0,4.652,0.5073,10.739 +DH028,86.0,88.0,4.579,0.2043,7.65 +DH028,88.0,90.0,2.407,0.0891,3.787 +DH028,90.0,92.0,0.313,0.2798,0.714 +DH028,92.0,94.0,1.3,0.256,2.582 +DH028,94.0,96.0,4.115,0.2335,10.259 +DH028,96.0,98.0,11.087,0.2628,23.741 +DH028,98.0,100.0,12.181,0.684,35.701 +DH028,100.0,102.0,1.548,0.0711,2.355 +DH028,102.0,104.0,8.277,0.2963,16.887 +DH028,104.0,106.0,6.322,0.4701,17.029 +DH028,106.0,108.0,7.287,0.3688,15.802 +DH028,108.0,110.0,10.232,0.0809,25.096 +DH028,110.0,112.0,1.843,0.1153,2.95 +DH028,112.0,114.0,10.724,0.6054,21.375 +DH028,114.0,116.0,0.291,0.0766,0.615 +DH028,116.0,118.0,2.136,0.1498,5.571 +DH028,118.0,120.0,12.795,1.0246,19.483 +DH028,120.0,122.0,4.267,0.4918,6.416 +DH028,122.0,124.0,49.863,0.1052,137.762 +DH028,124.0,126.0,0.718,0.7789,1.295 +DH028,126.0,128.0,1.158,0.1118,2.816 +DH028,128.0,130.0,3.435,0.6896,8.404 +DH028,130.0,132.0,4.112,0.2837,11.109 +DH028,132.0,134.0,1.872,0.0865,3.941 +DH028,134.0,136.0,5.548,0.4927,9.772 +DH028,136.0,138.0,1.908,0.7723,4.152 +DH028,138.0,140.0,11.778,0.7125,29.998 +DH028,140.0,142.0,3.401,0.3043,7.941 +DH028,142.0,144.0,0.56,0.0906,1.154 +DH028,144.0,146.0,1.955,0.1709,4.687 +DH028,146.0,148.0,2.662,0.2067,5.451 +DH028,148.0,150.0,24.918,0.3215,73.156 +DH028,150.0,152.0,4.836,0.2248,9.272 +DH028,152.0,154.0,0.791,0.1539,1.504 +DH028,154.0,156.0,5.841,0.3358,12.017 +DH028,156.0,158.0,4.999,0.3133,13.566 +DH028,158.0,160.0,0.641,0.1414,1.042 +DH028,160.0,162.0,0.103,0.0996,0.25 +DH028,162.0,164.0,3.464,0.1651,8.778 +DH028,164.0,166.0,0.214,0.2796,0.467 +DH028,166.0,168.0,1.924,0.0541,3.403 +DH028,168.0,170.0,10.331,0.2744,19.102 +DH028,170.0,172.0,38.136,0.0818,59.151 +DH028,172.0,174.0,0.641,0.0974,1.374 +DH028,174.0,176.0,4.775,0.6265,10.225 +DH028,176.0,178.0,0.662,0.3272,1.423 +DH028,178.0,180.0,2.97,0.2782,6.185 +DH028,180.0,182.0,2.504,0.193,7.426 +DH028,182.0,184.0,32.27,0.2576,84.753 +DH028,184.0,186.0,3.025,0.1318,8.771 +DH028,186.0,188.0,3.779,0.1594,11.133 +DH028,188.0,190.0,2.277,0.1027,3.958 +DH028,190.0,192.0,2.958,0.4811,6.975 +DH028,192.0,194.0,1.952,0.1529,5.491 +DH028,194.0,196.0,3.442,0.3286,9.838 +DH028,196.0,198.0,1.996,0.4953,5.765 +DH028,198.0,200.0,43.61,0.4108,93.794 +DH028,200.0,202.0,2.78,0.414,7.944 +DH028,202.0,204.0,0.37,0.0972,0.79 +DH028,204.0,206.0,0.271,0.07,0.426 +DH028,206.0,208.0,1.704,0.1279,3.597 +DH028,208.0,210.0,0.381,0.3288,0.96 +DH028,210.0,212.0,1.17,0.2945,3.323 +DH028,212.0,214.0,0.955,0.0454,2.375 +DH028,214.0,216.0,2.447,0.1475,6.291 +DH028,216.0,218.0,2.26,0.3277,6.434 +DH028,218.0,220.0,15.89,0.3921,44.853 +DH028,220.0,222.0,5.397,0.232,11.162 +DH028,222.0,224.0,10.545,0.1088,15.838 +DH028,224.0,226.0,9.278,0.2857,15.086 +DH028,226.0,228.0,0.287,0.0363,0.75 +DH028,228.0,230.0,3.223,0.1398,9.294 +DH028,230.0,232.0,0.714,0.1712,2.079 +DH028,232.0,234.0,0.408,0.0414,0.679 +DH028,234.0,236.0,7.58,0.1013,19.211 +DH028,236.0,238.0,7.014,0.2261,10.992 +DH028,238.0,240.0,2.611,0.1599,6.651 +DH028,240.0,242.0,21.154,0.7117,38.516 +DH028,242.0,244.0,1.317,0.2239,2.311 +DH028,244.0,246.0,0.28,0.0553,0.716 +DH028,246.0,248.0,1.138,0.0679,2.953 +DH028,248.0,250.0,3.556,0.1156,5.763 +DH028,250.0,252.0,0.046,0.0077,0.033 +DH028,252.0,254.0,0.104,0.0155,0.112 +DH028,254.0,256.0,0.198,0.0246,0.219 +DH028,256.0,258.0,0.058,0.0188,0.073 +DH028,258.0,260.0,0.059,0.0175,0.041 +DH028,260.0,262.0,0.104,0.0095,0.086 +DH028,262.0,264.0,0.099,0.0165,0.053 +DH028,264.0,266.0,0.066,0.0131,0.063 +DH028,266.0,268.0,0.117,0.0142,0.113 +DH028,268.0,270.0,0.074,0.0139,0.1 +DH028,270.0,272.0,0.099,0.0184,0.117 +DH028,272.0,274.0,0.128,0.0135,0.104 +DH028,274.0,276.0,0.13,0.0222,0.157 +DH028,276.0,278.0,0.075,0.0195,0.058 +DH028,278.0,280.0,0.09,0.0074,0.067 +DH028,280.0,282.0,0.046,0.0211,0.028 +DH028,282.0,284.0,0.049,0.007,0.069 +DH028,284.0,286.0,0.266,0.0164,0.338 +DH028,286.0,288.0,0.136,0.0185,0.193 +DH028,288.0,290.0,0.143,0.0232,0.164 +DH028,290.0,292.0,0.076,0.0154,0.084 +DH028,292.0,294.0,0.067,0.0339,0.075 +DH028,294.0,296.0,0.194,0.0232,0.135 +DH028,296.0,298.0,0.111,0.0132,0.126 +DH028,298.0,300.0,0.061,0.0171,0.044 +DH028,300.0,302.0,0.112,0.0104,0.067 +DH028,302.0,304.0,0.097,0.0217,0.136 +DH028,304.0,306.0,0.213,0.0275,0.317 +DH028,306.0,308.0,0.053,0.0163,0.069 +DH028,308.0,310.0,0.174,0.03,0.241 +DH028,310.0,312.0,0.123,0.0276,0.124 +DH028,312.0,314.0,0.105,0.0247,0.055 +DH028,314.0,316.0,0.051,0.0131,0.047 +DH028,316.0,318.0,0.054,0.0088,0.063 +DH028,318.0,320.0,0.101,0.0094,0.065 +DH028,320.0,322.0,0.073,0.0201,0.105 +DH028,322.0,324.0,0.036,0.0238,0.045 +DH028,324.0,326.0,0.071,0.0156,0.046 +DH028,326.0,328.0,0.096,0.0407,0.141 +DH028,328.0,330.0,0.139,0.0052,0.101 +DH028,330.0,332.0,0.024,0.0619,0.028 +DH028,332.0,334.0,0.178,0.0315,0.138 +DH028,334.0,336.0,0.066,0.0121,0.064 +DH028,336.0,338.0,0.064,0.0122,0.051 +DH028,338.0,340.0,0.048,0.0155,0.055 +DH028,340.0,342.0,0.056,0.0143,0.083 +DH028,342.0,344.0,0.073,0.0153,0.046 +DH028,344.0,346.0,0.108,0.0109,0.084 +DH028,346.0,348.0,0.096,0.0075,0.117 +DH028,348.0,350.0,0.197,0.0123,0.281 +DH028,350.0,352.0,0.094,0.009,0.069 +DH028,352.0,354.0,0.062,0.0412,0.091 +DH028,354.0,356.0,0.077,0.0345,0.065 +DH028,356.0,358.0,0.097,0.0316,0.053 +DH028,358.0,360.0,0.039,0.0088,0.035 +DH028,360.0,362.0,0.104,0.0311,0.106 +DH028,362.0,364.0,0.035,0.0056,0.052 +DH028,364.0,366.0,0.113,0.0196,0.118 +DH028,366.0,368.0,0.035,0.0123,0.025 +DH028,368.0,370.0,0.122,0.0125,0.16 +DH028,370.0,372.0,0.06,0.0156,0.075 +DH028,372.0,374.0,0.073,0.0101,0.101 +DH028,374.0,376.0,0.096,0.0097,0.111 +DH028,376.0,378.0,0.17,0.0196,0.241 +DH028,378.0,380.0,0.06,0.008,0.083 +DH028,380.0,382.0,0.099,0.0117,0.06 +DH028,382.0,384.0,0.132,0.0075,0.077 +DH028,384.0,386.0,0.045,0.0402,0.038 +DH028,386.0,388.0,0.217,0.0184,0.249 +DH028,388.0,390.0,0.039,0.0218,0.039 +DH028,390.0,392.0,0.071,0.0411,0.04 +DH028,392.0,394.0,0.182,0.0083,0.131 +DH028,394.0,396.0,0.066,0.0261,0.068 +DH028,396.0,398.0,0.061,0.0276,0.036 +DH028,398.0,400.0,0.054,0.0129,0.034 +DH028,400.0,402.0,0.077,0.0368,0.093 +DH028,402.0,404.0,0.079,0.0248,0.057 +DH028,404.0,406.0,0.057,0.0212,0.078 +DH028,406.0,408.0,0.093,0.038,0.113 +DH028,408.0,410.0,0.061,0.0171,0.074 +DH028,410.0,412.0,0.063,0.0394,0.06 +DH028,412.0,414.0,0.099,0.0265,0.115 +DH028,414.0,416.0,0.059,0.0176,0.042 +DH028,416.0,418.0,0.061,0.0107,0.051 +DH028,418.0,420.0,0.104,0.0303,0.071 +DH028,420.0,422.0,0.304,0.032,0.208 +DH028,422.0,424.0,0.109,0.0139,0.112 +DH028,424.0,426.0,0.035,0.0159,0.029 +DH028,426.0,428.0,0.079,0.0106,0.096 +DH028,428.0,430.0,0.291,0.0215,0.362 +DH028,430.0,432.0,0.108,0.0547,0.157 +DH028,432.0,434.0,0.015,0.069,0.011 +DH028,434.0,436.0,0.073,0.0104,0.085 +DH028,436.0,438.0,0.097,0.0065,0.098 +DH028,438.0,440.0,0.163,0.012,0.182 +DH028,440.0,442.0,0.076,0.0155,0.079 +DH028,442.0,444.0,0.04,0.0237,0.035 +DH028,444.0,446.0,0.043,0.0115,0.06 +DH028,446.0,448.0,0.046,0.02,0.04 +DH029,0.0,2.0,0.079,0.01,0.103 +DH029,2.0,4.0,0.074,0.017,0.039 +DH029,4.0,6.0,0.124,0.0186,0.129 +DH029,6.0,8.0,0.099,0.0514,0.07 +DH029,8.0,10.0,0.135,0.0196,0.094 +DH029,10.0,12.0,0.161,0.0197,0.195 +DH029,12.0,14.0,0.071,0.0113,0.094 +DH029,14.0,16.0,0.124,0.0201,0.093 +DH029,16.0,18.0,0.046,0.0179,0.049 +DH029,18.0,20.0,0.023,0.009,0.03 +DH029,20.0,22.0,0.048,0.0212,0.066 +DH029,22.0,24.0,0.076,0.037,0.08 +DH029,24.0,26.0,0.076,0.0179,0.102 +DH029,26.0,28.0,0.087,0.0196,0.086 +DH029,28.0,30.0,0.048,0.0317,0.053 +DH029,30.0,32.0,0.184,0.0235,0.144 +DH029,32.0,34.0,0.05,0.0473,0.061 +DH029,34.0,36.0,0.076,0.0196,0.082 +DH029,36.0,38.0,0.089,0.0131,0.068 +DH029,38.0,40.0,0.243,0.0175,0.145 +DH029,40.0,42.0,0.036,0.0195,0.052 +DH029,42.0,44.0,0.095,0.0081,0.052 +DH029,44.0,46.0,0.043,0.0187,0.061 +DH029,46.0,48.0,0.23,0.02,0.31 +DH029,48.0,50.0,0.115,0.0374,0.16 +DH029,50.0,52.0,0.101,0.0337,0.139 +DH029,52.0,54.0,0.113,0.0155,0.101 +DH029,54.0,56.0,0.162,0.0359,0.167 +DH029,56.0,58.0,0.053,0.0117,0.048 +DH029,58.0,60.0,0.047,0.0276,0.025 +DH029,60.0,62.0,0.059,0.04,0.056 +DH029,62.0,64.0,0.222,0.0215,0.244 +DH029,64.0,66.0,0.213,0.0298,0.166 +DH029,66.0,68.0,0.046,0.0084,0.051 +DH029,68.0,70.0,0.047,0.0097,0.046 +DH029,70.0,72.0,0.031,0.0112,0.025 +DH029,72.0,74.0,0.108,0.0151,0.068 +DH029,74.0,76.0,0.063,0.0178,0.066 +DH029,76.0,78.0,0.058,0.0135,0.083 +DH029,78.0,80.0,0.154,0.0269,0.141 +DH029,80.0,82.0,0.531,0.1968,1.186 +DH029,82.0,84.0,0.648,0.1961,0.983 +DH029,84.0,86.0,1.954,0.1547,3.243 +DH029,86.0,88.0,3.84,0.439,8.995 +DH029,88.0,90.0,6.506,0.7926,14.224 +DH029,90.0,92.0,36.226,0.5909,63.658 +DH029,92.0,94.0,6.152,0.3939,17.298 +DH029,94.0,96.0,1.259,0.1029,1.964 +DH029,96.0,98.0,0.983,0.3362,2.068 +DH029,98.0,100.0,3.957,0.0722,8.0 +DH029,100.0,102.0,2.85,0.252,4.715 +DH029,102.0,104.0,1.406,0.2934,2.656 +DH029,104.0,106.0,2.823,1.3198,5.94 +DH029,106.0,108.0,1.127,0.9967,3.002 +DH029,108.0,110.0,0.324,0.1234,0.713 +DH029,110.0,112.0,0.257,0.1669,0.533 +DH029,112.0,114.0,9.176,0.3692,23.013 +DH029,114.0,116.0,0.762,0.4529,1.666 +DH029,116.0,118.0,3.573,0.3129,6.429 +DH029,118.0,120.0,7.888,0.9274,22.506 +DH029,120.0,122.0,1.091,0.196,1.731 +DH029,122.0,124.0,1.444,0.3747,3.392 +DH029,124.0,126.0,7.424,0.3002,13.122 +DH029,126.0,128.0,1.22,0.1422,1.855 +DH029,128.0,130.0,19.176,1.066,41.131 +DH029,130.0,132.0,2.566,0.0751,5.609 +DH029,132.0,134.0,0.862,0.8224,1.771 +DH029,134.0,136.0,3.53,0.1109,9.939 +DH029,136.0,138.0,4.949,0.5054,8.415 +DH029,138.0,140.0,5.548,0.1313,12.789 +DH029,140.0,142.0,7.409,0.291,15.028 +DH029,142.0,144.0,1.592,0.5028,4.16 +DH029,144.0,146.0,0.717,0.3611,1.979 +DH029,146.0,148.0,0.389,0.6575,0.914 +DH029,148.0,150.0,1.752,0.1359,2.695 +DH029,150.0,152.0,0.77,0.3951,1.896 +DH029,152.0,154.0,7.246,0.1371,20.229 +DH029,154.0,156.0,0.226,0.0628,0.628 +DH029,156.0,158.0,3.931,0.2932,6.967 +DH029,158.0,160.0,4.417,0.2836,12.423 +DH029,160.0,162.0,4.578,0.103,8.954 +DH029,162.0,164.0,4.918,0.6996,8.135 +DH029,164.0,166.0,3.309,0.0836,7.412 +DH029,166.0,168.0,0.656,0.2924,1.922 +DH029,168.0,170.0,1.327,0.4112,2.296 +DH029,170.0,172.0,4.12,0.1162,11.039 +DH029,172.0,174.0,0.884,0.1903,1.83 +DH029,174.0,176.0,20.352,0.1813,41.128 +DH029,176.0,178.0,11.871,0.3196,31.276 +DH029,178.0,180.0,1.317,0.1046,3.373 +DH029,180.0,182.0,2.368,0.0556,5.9 +DH029,182.0,184.0,9.463,0.2529,20.921 +DH029,184.0,186.0,0.678,0.1071,1.876 +DH029,186.0,188.0,2.042,0.0583,3.234 +DH029,188.0,190.0,2.636,0.1558,5.566 +DH029,190.0,192.0,0.621,0.5322,1.408 +DH029,192.0,194.0,3.953,0.2714,6.484 +DH029,194.0,196.0,1.269,0.1893,3.768 +DH029,196.0,198.0,12.152,0.0839,27.656 +DH029,198.0,200.0,6.093,1.0057,17.087 +DH029,200.0,202.0,0.856,0.6188,2.415 +DH029,202.0,204.0,7.794,0.4192,23.101 +DH029,204.0,206.0,4.306,0.4989,9.708 +DH029,206.0,208.0,1.656,0.0635,4.502 +DH029,208.0,210.0,2.859,0.1067,4.377 +DH029,210.0,212.0,2.679,0.1427,6.529 +DH029,212.0,214.0,6.188,0.2236,14.51 +DH029,214.0,216.0,11.238,0.226,18.379 +DH029,216.0,218.0,0.116,0.5083,0.231 +DH029,218.0,220.0,2.866,0.4453,7.861 +DH029,220.0,222.0,2.81,0.1821,4.989 +DH029,222.0,224.0,3.688,0.6822,9.058 +DH029,224.0,226.0,13.089,0.3007,30.895 +DH029,226.0,228.0,39.89,0.8371,96.179 +DH029,228.0,230.0,0.855,1.2888,2.093 +DH029,230.0,232.0,1.694,0.0397,2.603 +DH029,232.0,234.0,0.607,0.3093,1.329 +DH029,234.0,236.0,19.245,0.3469,53.397 +DH029,236.0,238.0,0.652,0.7705,1.947 +DH029,238.0,240.0,2.857,0.1346,6.558 +DH029,240.0,242.0,1.197,0.1073,2.589 +DH029,242.0,244.0,1.309,0.2448,3.08 +DH029,244.0,246.0,3.172,0.5674,7.096 +DH029,246.0,248.0,1.324,0.3941,2.353 +DH029,248.0,250.0,0.792,0.4711,2.121 +DH029,250.0,252.0,0.051,0.0234,0.052 +DH029,252.0,254.0,0.06,0.0139,0.033 +DH029,254.0,256.0,0.065,0.0317,0.094 +DH029,256.0,258.0,0.146,0.0237,0.126 +DH029,258.0,260.0,0.031,0.0115,0.045 +DH029,260.0,262.0,0.052,0.0299,0.028 +DH029,262.0,264.0,0.309,0.0125,0.221 +DH029,264.0,266.0,0.213,0.0163,0.175 +DH029,266.0,268.0,0.173,0.0178,0.112 +DH029,268.0,270.0,0.056,0.0056,0.057 +DH029,270.0,272.0,0.054,0.0107,0.062 +DH029,272.0,274.0,0.034,0.0274,0.031 +DH029,274.0,276.0,0.065,0.0177,0.087 +DH029,276.0,278.0,0.129,0.0201,0.099 +DH029,278.0,280.0,0.111,0.0133,0.08 +DH029,280.0,282.0,0.146,0.0258,0.188 +DH029,282.0,284.0,0.105,0.0344,0.101 +DH029,284.0,286.0,0.058,0.0087,0.042 +DH029,286.0,288.0,0.068,0.0381,0.056 +DH029,288.0,290.0,0.057,0.0135,0.063 +DH029,290.0,292.0,0.082,0.0097,0.048 +DH029,292.0,294.0,0.075,0.0633,0.045 +DH029,294.0,296.0,0.213,0.0367,0.249 +DH029,296.0,298.0,0.065,0.0116,0.053 +DH029,298.0,300.0,0.082,0.0185,0.061 +DH029,300.0,302.0,0.325,0.0161,0.252 +DH029,302.0,304.0,0.056,0.016,0.072 +DH029,304.0,306.0,0.082,0.0182,0.056 +DH029,306.0,308.0,0.094,0.026,0.094 +DH029,308.0,310.0,0.094,0.0162,0.077 +DH029,310.0,312.0,0.1,0.0169,0.115 +DH029,312.0,314.0,0.077,0.0186,0.077 +DH029,314.0,316.0,0.059,0.0268,0.069 +DH029,316.0,318.0,0.239,0.0135,0.188 +DH029,318.0,320.0,0.026,0.0277,0.015 +DH029,320.0,322.0,0.045,0.0216,0.067 +DH029,322.0,324.0,0.052,0.0144,0.056 +DH029,324.0,326.0,0.047,0.0178,0.031 +DH029,326.0,328.0,0.134,0.028,0.163 +DH029,328.0,330.0,0.154,0.0135,0.103 +DH029,330.0,332.0,0.047,0.0221,0.046 +DH029,332.0,334.0,0.089,0.0146,0.046 +DH029,334.0,336.0,0.034,0.0378,0.018 +DH029,336.0,338.0,0.044,0.011,0.055 +DH029,338.0,340.0,0.144,0.0103,0.161 +DH029,340.0,342.0,0.078,0.0115,0.101 +DH029,342.0,344.0,0.234,0.0091,0.307 +DH029,344.0,346.0,0.145,0.0204,0.191 +DH029,346.0,348.0,0.146,0.0304,0.21 +DH029,348.0,350.0,0.057,0.0146,0.051 +DH029,350.0,352.0,0.037,0.0356,0.046 +DH029,352.0,354.0,0.071,0.0219,0.049 +DH029,354.0,356.0,0.265,0.0399,0.154 +DH029,356.0,358.0,0.068,0.0235,0.089 +DH029,358.0,360.0,0.239,0.0414,0.28 +DH029,360.0,362.0,0.074,0.0126,0.085 +DH029,362.0,364.0,0.072,0.0295,0.098 +DH029,364.0,366.0,0.017,0.0082,0.016 +DH029,366.0,368.0,0.055,0.0201,0.053 +DH029,368.0,370.0,0.04,0.0115,0.044 +DH029,370.0,372.0,0.059,0.0136,0.084 +DH029,372.0,374.0,0.045,0.0153,0.027 +DH029,374.0,376.0,0.133,0.017,0.179 +DH029,376.0,378.0,0.041,0.0179,0.044 +DH029,378.0,380.0,0.039,0.0177,0.044 +DH029,380.0,382.0,0.049,0.0172,0.053 +DH029,382.0,384.0,0.034,0.0124,0.036 +DH029,384.0,386.0,0.064,0.0164,0.094 +DH029,386.0,388.0,0.056,0.0235,0.054 +DH029,388.0,390.0,0.066,0.0212,0.072 +DH029,390.0,392.0,0.101,0.0086,0.06 +DH029,392.0,394.0,0.102,0.0188,0.083 +DH029,394.0,396.0,0.067,0.0134,0.09 +DH029,396.0,398.0,0.248,0.0129,0.343 +DH029,398.0,400.0,0.154,0.0176,0.201 +DH029,400.0,402.0,0.131,0.0138,0.105 +DH029,402.0,404.0,0.082,0.01,0.118 +DH029,404.0,406.0,0.055,0.0291,0.046 +DH029,406.0,408.0,0.129,0.0228,0.11 +DH029,408.0,410.0,0.249,0.0225,0.193 +DH029,410.0,412.0,0.105,0.0232,0.064 +DH029,412.0,414.0,0.051,0.0109,0.037 +DH029,414.0,416.0,0.221,0.0062,0.215 +DH029,416.0,418.0,0.086,0.0304,0.091 +DH030,0.0,2.0,0.195,0.0203,0.258 +DH030,2.0,4.0,0.077,0.0237,0.059 +DH030,4.0,6.0,0.122,0.0177,0.081 +DH030,6.0,8.0,0.043,0.0151,0.06 +DH030,8.0,10.0,0.025,0.0124,0.022 +DH030,10.0,12.0,0.057,0.0333,0.069 +DH030,12.0,14.0,0.125,0.0761,0.093 +DH030,14.0,16.0,0.089,0.0281,0.118 +DH030,16.0,18.0,0.032,0.0186,0.037 +DH030,18.0,20.0,0.158,0.0138,0.081 +DH030,20.0,22.0,0.09,0.0172,0.125 +DH030,22.0,24.0,0.049,0.0211,0.063 +DH030,24.0,26.0,0.063,0.0256,0.09 +DH030,26.0,28.0,0.123,0.0109,0.109 +DH030,28.0,30.0,0.048,0.0192,0.069 +DH030,30.0,32.0,0.177,0.0271,0.255 +DH030,32.0,34.0,0.154,0.016,0.217 +DH030,34.0,36.0,0.233,0.0169,0.229 +DH030,36.0,38.0,0.15,0.0197,0.125 +DH030,38.0,40.0,0.095,0.0181,0.067 +DH030,40.0,42.0,0.033,0.0137,0.028 +DH030,42.0,44.0,0.022,0.0283,0.026 +DH030,44.0,46.0,0.141,0.0222,0.078 +DH030,46.0,48.0,0.062,0.0125,0.086 +DH030,48.0,50.0,0.142,0.0179,0.097 +DH030,50.0,52.0,0.04,0.0203,0.046 +DH030,52.0,54.0,0.079,0.0163,0.081 +DH030,54.0,56.0,0.098,0.0242,0.06 +DH030,56.0,58.0,0.129,0.0406,0.092 +DH030,58.0,60.0,0.031,0.0182,0.019 +DH030,60.0,62.0,0.125,0.0336,0.139 +DH030,62.0,64.0,0.174,0.0217,0.21 +DH030,64.0,66.0,0.127,0.0199,0.116 +DH030,66.0,68.0,0.149,0.0227,0.182 +DH030,68.0,70.0,0.075,0.0082,0.049 +DH030,70.0,72.0,0.19,0.0098,0.174 +DH030,72.0,74.0,0.048,0.0146,0.063 +DH030,74.0,76.0,0.063,0.0254,0.038 +DH030,76.0,78.0,0.159,0.0105,0.175 +DH030,78.0,80.0,0.198,0.0398,0.152 +DH030,80.0,82.0,0.903,0.1015,1.665 +DH030,82.0,84.0,2.257,0.4397,5.495 +DH030,84.0,86.0,1.243,0.2163,3.047 +DH030,86.0,88.0,1.038,0.402,2.801 +DH030,88.0,90.0,2.638,0.2972,7.732 +DH030,90.0,92.0,4.602,0.1141,13.434 +DH030,92.0,94.0,3.024,0.1576,6.891 +DH030,94.0,96.0,3.365,0.5302,9.757 +DH030,96.0,98.0,10.913,0.2273,20.095 +DH030,98.0,100.0,1.169,0.1001,2.13 +DH030,100.0,102.0,5.017,1.0884,13.154 +DH030,102.0,104.0,0.711,0.4071,1.47 +DH030,104.0,106.0,6.058,0.2057,15.272 +DH030,106.0,108.0,1.697,0.0332,3.179 +DH030,108.0,110.0,6.944,0.579,11.049 +DH030,110.0,112.0,3.777,0.0367,10.872 +DH030,112.0,114.0,10.909,0.8175,28.166 +DH030,114.0,116.0,1.676,0.0785,2.521 +DH030,116.0,118.0,2.265,0.7807,4.334 +DH030,118.0,120.0,2.271,0.2366,4.457 +DH030,120.0,122.0,4.72,0.125,11.2 +DH030,122.0,124.0,11.527,0.06,20.992 +DH030,124.0,126.0,0.225,0.1398,0.607 +DH030,126.0,128.0,2.226,0.0778,4.298 +DH030,128.0,130.0,2.412,0.1877,5.546 +DH030,130.0,132.0,2.135,0.1401,4.749 +DH030,132.0,134.0,1.669,0.1655,2.592 +DH030,134.0,136.0,18.772,0.0601,46.926 +DH030,136.0,138.0,1.67,0.0715,4.216 +DH030,138.0,140.0,3.255,0.1117,6.954 +DH030,140.0,142.0,17.725,0.2558,32.362 +DH030,142.0,144.0,0.806,0.1776,1.699 +DH030,144.0,146.0,2.671,0.2865,6.453 +DH030,146.0,148.0,2.216,0.0888,3.999 +DH030,148.0,150.0,10.131,0.2687,28.734 +DH030,150.0,152.0,4.698,0.1885,12.269 +DH030,152.0,154.0,4.376,0.4556,9.519 +DH030,154.0,156.0,0.926,0.2674,2.117 +DH030,156.0,158.0,2.466,0.2446,6.489 +DH030,158.0,160.0,2.869,0.4035,5.358 +DH030,160.0,162.0,0.898,0.1944,1.395 +DH030,162.0,164.0,1.129,0.0612,1.7 +DH030,164.0,166.0,3.956,0.1971,8.906 +DH030,166.0,168.0,3.677,0.69,6.45 +DH030,168.0,170.0,0.546,0.2076,1.518 +DH030,170.0,172.0,0.553,0.3754,1.333 +DH030,172.0,174.0,0.13,0.3098,0.328 +DH030,174.0,176.0,1.615,0.133,3.838 +DH030,176.0,178.0,1.5,0.1752,2.66 +DH030,178.0,180.0,1.472,0.5785,4.367 +DH030,180.0,182.0,0.273,0.5859,0.745 +DH030,182.0,184.0,1.397,0.2041,3.217 +DH030,184.0,186.0,1.187,0.3345,3.222 +DH030,186.0,188.0,1.549,0.0379,4.027 +DH030,188.0,190.0,1.802,0.3814,2.779 +DH030,190.0,192.0,4.305,0.2217,8.271 +DH030,192.0,194.0,0.702,0.0874,1.322 +DH030,194.0,196.0,0.984,0.6979,1.714 +DH030,196.0,198.0,0.942,0.1796,2.663 +DH030,198.0,200.0,2.051,0.2773,3.129 +DH030,200.0,202.0,0.419,0.0399,1.202 +DH030,202.0,204.0,4.361,0.167,11.955 +DH030,204.0,206.0,2.104,0.6608,5.058 +DH030,206.0,208.0,7.858,0.0852,11.801 +DH030,208.0,210.0,9.654,0.2774,20.72 +DH030,210.0,212.0,0.421,1.0357,0.822 +DH030,212.0,214.0,0.203,0.1685,0.452 +DH030,214.0,216.0,0.605,1.7277,0.924 +DH030,216.0,218.0,0.401,0.2277,1.172 +DH030,218.0,220.0,6.28,0.1095,15.652 +DH030,220.0,222.0,0.562,1.7847,1.194 +DH030,222.0,224.0,1.869,0.1765,4.749 +DH030,224.0,226.0,0.893,0.1188,1.803 +DH030,226.0,228.0,1.147,0.0406,2.57 +DH030,228.0,230.0,6.775,0.1823,17.865 +DH030,230.0,232.0,9.059,0.1198,16.033 +DH030,232.0,234.0,0.999,0.3537,2.268 +DH030,234.0,236.0,1.666,0.43,3.74 +DH030,236.0,238.0,2.668,0.4059,5.065 +DH030,238.0,240.0,1.264,0.802,3.237 +DH030,240.0,242.0,1.392,0.1323,4.162 +DH030,242.0,244.0,2.556,0.1958,5.316 +DH030,244.0,246.0,3.338,0.2132,9.287 +DH030,246.0,248.0,10.087,0.3415,29.634 +DH030,248.0,250.0,2.248,0.3876,3.773 +DH030,250.0,252.0,0.151,0.029,0.086 +DH030,252.0,254.0,0.266,0.014,0.238 +DH030,254.0,256.0,0.072,0.0152,0.072 +DH030,256.0,258.0,0.187,0.011,0.096 +DH030,258.0,260.0,0.035,0.025,0.045 +DH030,260.0,262.0,0.042,0.0202,0.06 +DH030,262.0,264.0,0.058,0.02,0.069 +DH030,264.0,266.0,0.05,0.0112,0.025 +DH030,266.0,268.0,0.113,0.0381,0.121 +DH030,268.0,270.0,0.068,0.033,0.084 +DH030,270.0,272.0,0.045,0.0127,0.024 +DH030,272.0,274.0,0.058,0.0125,0.067 +DH030,274.0,276.0,0.208,0.0095,0.306 +DH030,276.0,278.0,0.058,0.0218,0.057 +DH030,278.0,280.0,0.1,0.0158,0.123 +DH030,280.0,282.0,0.074,0.0238,0.075 +DH030,282.0,284.0,0.138,0.0091,0.154 +DH030,284.0,286.0,0.035,0.0178,0.043 +DH030,286.0,288.0,0.054,0.0105,0.045 +DH030,288.0,290.0,0.045,0.0096,0.024 +DH030,290.0,292.0,0.226,0.0173,0.311 +DH030,292.0,294.0,0.178,0.0284,0.184 +DH030,294.0,296.0,0.058,0.023,0.034 +DH030,296.0,298.0,0.056,0.0375,0.046 +DH030,298.0,300.0,0.107,0.007,0.154 +DH030,300.0,302.0,0.055,0.0168,0.071 +DH030,302.0,304.0,0.071,0.0443,0.099 +DH030,304.0,306.0,0.094,0.011,0.113 +DH030,306.0,308.0,0.039,0.0079,0.054 +DH030,308.0,310.0,0.103,0.0113,0.119 +DH030,310.0,312.0,0.198,0.0487,0.109 +DH030,312.0,314.0,0.074,0.0265,0.054 +DH030,314.0,316.0,0.025,0.0384,0.029 +DH030,316.0,318.0,0.06,0.0153,0.083 +DH030,318.0,320.0,0.042,0.0159,0.054 +DH030,320.0,322.0,0.094,0.0222,0.074 +DH030,322.0,324.0,0.124,0.0311,0.139 +DH030,324.0,326.0,0.106,0.0293,0.154 +DH030,326.0,328.0,0.409,0.0337,0.462 +DH030,328.0,330.0,0.048,0.0161,0.061 +DH030,330.0,332.0,0.112,0.0129,0.076 +DH030,332.0,334.0,0.036,0.0081,0.023 +DH030,334.0,336.0,0.05,0.0098,0.072 +DH030,336.0,338.0,0.052,0.0184,0.056 +DH030,338.0,340.0,0.059,0.0183,0.055 +DH030,340.0,342.0,0.198,0.0197,0.152 +DH030,342.0,344.0,0.074,0.0233,0.041 +DH030,344.0,346.0,0.182,0.0071,0.119 +DH030,346.0,348.0,0.101,0.0181,0.125 +DH030,348.0,350.0,0.038,0.0274,0.042 +DH030,350.0,352.0,0.029,0.0281,0.034 +DH030,352.0,354.0,0.077,0.0116,0.087 +DH030,354.0,356.0,0.17,0.0082,0.248 +DH030,356.0,358.0,0.056,0.0181,0.079 +DH030,358.0,360.0,0.121,0.0316,0.079 +DH030,360.0,362.0,0.115,0.021,0.086 +DH030,362.0,364.0,0.038,0.011,0.027 +DH030,364.0,366.0,0.075,0.0206,0.056 +DH030,366.0,368.0,0.086,0.0118,0.058 +DH030,368.0,370.0,0.056,0.0105,0.052 +DH030,370.0,372.0,0.074,0.0275,0.085 +DH030,372.0,374.0,0.064,0.0467,0.072 +DH030,374.0,375.0,0.177,0.0419,0.231 +DH031,0.0,2.0,0.067,0.0374,0.037 +DH031,2.0,4.0,0.054,0.0151,0.064 +DH031,4.0,6.0,0.047,0.0319,0.048 +DH031,6.0,8.0,0.081,0.0089,0.111 +DH031,8.0,10.0,0.041,0.0102,0.022 +DH031,10.0,12.0,0.155,0.0228,0.091 +DH031,12.0,14.0,0.076,0.0155,0.093 +DH031,14.0,16.0,0.059,0.0278,0.056 +DH031,16.0,18.0,0.05,0.0129,0.03 +DH031,18.0,20.0,0.034,0.0145,0.037 +DH031,20.0,22.0,0.044,0.0355,0.055 +DH031,22.0,24.0,0.054,0.0147,0.047 +DH031,24.0,26.0,0.055,0.017,0.08 +DH031,26.0,28.0,0.054,0.0358,0.056 +DH031,28.0,30.0,0.152,0.0095,0.143 +DH031,30.0,32.0,0.046,0.0094,0.047 +DH031,32.0,34.0,0.094,0.0188,0.112 +DH031,34.0,36.0,0.139,0.0382,0.094 +DH031,36.0,38.0,0.202,0.0469,0.231 +DH031,38.0,40.0,0.03,0.0092,0.039 +DH031,40.0,42.0,0.275,0.0185,0.274 +DH031,42.0,44.0,0.061,0.013,0.037 +DH031,44.0,46.0,0.139,0.0175,0.188 +DH031,46.0,48.0,0.12,0.0277,0.122 +DH031,48.0,50.0,0.043,0.0118,0.042 +DH031,50.0,52.0,0.142,0.0151,0.184 +DH031,52.0,54.0,0.089,0.0158,0.074 +DH031,54.0,56.0,0.098,0.0164,0.12 +DH031,56.0,58.0,0.053,0.0249,0.065 +DH031,58.0,60.0,0.097,0.0271,0.135 +DH031,60.0,62.0,0.256,0.0221,0.237 +DH031,62.0,64.0,0.08,0.0124,0.088 +DH031,64.0,66.0,0.176,0.0111,0.254 +DH031,66.0,68.0,0.105,0.029,0.082 +DH031,68.0,70.0,0.051,0.0221,0.047 +DH031,70.0,72.0,0.039,0.0483,0.046 +DH031,72.0,74.0,0.045,0.0162,0.038 +DH031,74.0,76.0,0.022,0.0329,0.016 +DH031,76.0,78.0,0.096,0.0131,0.131 +DH031,78.0,80.0,0.088,0.0129,0.072 +DH031,80.0,82.0,2.478,0.2572,4.794 +DH031,82.0,84.0,2.222,0.0741,3.913 +DH031,84.0,86.0,4.609,0.1306,9.029 +DH031,86.0,88.0,2.312,0.1875,6.839 +DH031,88.0,90.0,0.276,0.13,0.542 +DH031,90.0,92.0,20.007,1.3893,37.646 +DH031,92.0,94.0,3.855,0.4291,10.811 +DH031,94.0,96.0,3.24,0.4681,7.44 +DH031,96.0,98.0,4.165,0.107,6.393 +DH031,98.0,100.0,1.188,0.0862,3.56 +DH031,100.0,102.0,1.339,0.1807,2.602 +DH031,102.0,104.0,4.336,0.2594,7.726 +DH031,104.0,106.0,0.742,0.4501,2.097 +DH031,106.0,108.0,1.322,0.1922,2.886 +DH031,108.0,110.0,1.177,0.1423,2.363 +DH031,110.0,112.0,4.889,0.309,12.543 +DH031,112.0,114.0,9.526,1.0673,16.756 +DH031,114.0,116.0,4.27,0.1511,8.749 +DH031,116.0,118.0,1.013,0.0688,2.612 +DH031,118.0,120.0,0.497,0.317,0.894 +DH031,120.0,122.0,8.602,0.6128,15.866 +DH031,122.0,124.0,9.931,0.2244,22.139 +DH031,124.0,126.0,5.449,0.1086,10.249 +DH031,126.0,128.0,1.853,0.1826,5.448 +DH031,128.0,130.0,3.54,0.0736,8.624 +DH031,130.0,132.0,1.473,0.1219,2.372 +DH031,132.0,134.0,0.054,0.113,0.101 +DH031,134.0,136.0,1.04,0.3042,1.68 +DH031,136.0,138.0,4.136,0.5072,11.881 +DH031,138.0,140.0,0.655,0.317,1.654 +DH031,140.0,142.0,1.319,0.1185,3.804 +DH031,142.0,144.0,0.376,0.0934,0.591 +DH031,144.0,146.0,3.821,0.2658,9.147 +DH031,146.0,148.0,0.736,0.1022,1.298 +DH031,148.0,150.0,0.854,0.1377,2.547 +DH031,150.0,152.0,3.155,0.7657,7.457 +DH031,152.0,154.0,7.584,0.2128,13.485 +DH031,154.0,156.0,0.761,0.1038,1.777 +DH031,156.0,158.0,3.682,0.9794,8.659 +DH031,158.0,160.0,1.244,0.109,2.467 +DH031,160.0,162.0,2.496,0.2234,6.502 +DH031,162.0,164.0,2.275,0.0851,3.417 +DH031,164.0,166.0,10.21,0.3232,25.506 +DH031,166.0,168.0,1.18,0.2354,2.781 +DH031,168.0,170.0,3.885,0.2061,8.825 +DH031,170.0,172.0,0.458,0.124,0.988 +DH031,172.0,174.0,6.113,0.2405,11.391 +DH031,174.0,176.0,4.094,0.1852,11.383 +DH031,176.0,178.0,12.509,0.4132,37.226 +DH031,178.0,180.0,29.971,0.0797,67.197 +DH031,180.0,182.0,0.072,0.4652,0.167 +DH031,182.0,184.0,2.503,0.0837,3.809 +DH031,184.0,186.0,2.778,0.4174,6.395 +DH031,186.0,188.0,4.936,0.202,13.436 +DH031,188.0,190.0,4.75,0.0863,10.404 +DH031,190.0,192.0,9.686,0.3238,16.578 +DH031,192.0,194.0,16.286,0.0604,44.536 +DH031,194.0,196.0,1.257,0.5359,3.56 +DH031,196.0,198.0,0.501,0.15,1.465 +DH031,198.0,200.0,1.729,0.1357,3.048 +DH031,200.0,202.0,4.81,0.9053,14.274 +DH031,202.0,204.0,64.124,0.2626,159.473 +DH031,204.0,206.0,1.318,0.2225,2.272 +DH031,206.0,208.0,0.632,0.1171,0.996 +DH031,208.0,210.0,0.345,0.3175,0.678 +DH031,210.0,212.0,0.703,1.0806,1.767 +DH031,212.0,214.0,0.573,0.1921,0.897 +DH031,214.0,216.0,2.243,0.2527,4.271 +DH031,216.0,218.0,1.918,0.1272,4.102 +DH031,218.0,220.0,1.946,0.1501,3.573 +DH031,220.0,222.0,1.924,0.5345,4.915 +DH031,222.0,224.0,10.435,0.3879,29.351 +DH031,224.0,226.0,2.061,0.1835,4.54 +DH031,226.0,228.0,5.273,0.2713,13.483 +DH031,228.0,230.0,1.934,0.3798,5.699 +DH031,230.0,232.0,0.547,0.0308,1.398 +DH031,232.0,234.0,15.172,0.1203,30.413 +DH031,234.0,236.0,3.325,0.1588,5.989 +DH031,236.0,238.0,47.168,0.2166,105.907 +DH031,238.0,240.0,0.996,0.1943,1.711 +DH031,240.0,242.0,10.618,0.2094,25.596 +DH031,242.0,244.0,1.325,0.3138,3.468 +DH031,244.0,246.0,9.339,0.6373,26.503 +DH031,246.0,248.0,2.211,0.0307,5.091 +DH031,248.0,250.0,8.244,0.4572,12.481 +DH031,250.0,252.0,0.228,0.0151,0.212 +DH031,252.0,254.0,0.062,0.0104,0.054 +DH031,254.0,256.0,0.098,0.0248,0.076 +DH031,256.0,258.0,0.079,0.0062,0.072 +DH031,258.0,260.0,0.087,0.0106,0.089 +DH031,260.0,262.0,0.07,0.0443,0.057 +DH031,262.0,264.0,0.1,0.0106,0.082 +DH031,264.0,266.0,0.097,0.0165,0.097 +DH031,266.0,268.0,0.1,0.0143,0.087 +DH031,268.0,270.0,0.068,0.0174,0.079 +DH031,270.0,272.0,0.094,0.0253,0.063 +DH031,272.0,274.0,0.109,0.0156,0.092 +DH031,274.0,276.0,0.035,0.0079,0.047 +DH031,276.0,278.0,0.022,0.0333,0.019 +DH031,278.0,280.0,0.167,0.0061,0.193 +DH031,280.0,282.0,0.196,0.0262,0.276 +DH031,282.0,284.0,0.026,0.0095,0.015 +DH031,284.0,286.0,0.067,0.0177,0.07 +DH031,286.0,288.0,0.038,0.0225,0.029 +DH031,288.0,290.0,0.098,0.0137,0.097 +DH031,290.0,292.0,0.064,0.0252,0.056 +DH031,292.0,294.0,0.084,0.0287,0.055 +DH031,294.0,296.0,0.085,0.0144,0.123 +DH031,296.0,298.0,0.098,0.0139,0.096 +DH031,298.0,300.0,0.159,0.0126,0.102 +DH031,300.0,302.0,0.337,0.0273,0.373 +DH031,302.0,304.0,0.059,0.0313,0.037 +DH031,304.0,306.0,0.102,0.0503,0.053 +DH031,306.0,308.0,0.083,0.0117,0.111 +DH031,308.0,310.0,0.059,0.0305,0.071 +DH031,310.0,312.0,0.114,0.0133,0.112 +DH031,312.0,314.0,0.081,0.014,0.114 +DH031,314.0,316.0,0.049,0.0278,0.034 +DH031,316.0,318.0,0.07,0.0218,0.042 +DH031,318.0,320.0,0.082,0.0162,0.103 +DH031,320.0,322.0,0.024,0.0101,0.023 +DH031,322.0,324.0,0.054,0.0082,0.069 +DH031,324.0,326.0,0.096,0.0196,0.08 +DH031,326.0,328.0,0.086,0.0237,0.056 +DH031,328.0,330.0,0.107,0.0123,0.135 +DH031,330.0,332.0,0.163,0.0339,0.14 +DH031,332.0,334.0,0.097,0.0186,0.125 +DH031,334.0,336.0,0.028,0.0093,0.028 +DH031,336.0,338.0,0.077,0.0371,0.075 +DH031,338.0,340.0,0.054,0.0276,0.071 +DH031,340.0,342.0,0.124,0.0274,0.089 +DH031,342.0,344.0,0.061,0.0304,0.068 +DH031,344.0,346.0,0.179,0.0181,0.156 +DH031,346.0,348.0,0.024,0.0151,0.025 +DH031,348.0,350.0,0.064,0.0262,0.048 +DH031,350.0,352.0,0.155,0.0202,0.231 +DH031,352.0,354.0,0.085,0.0408,0.057 +DH031,354.0,356.0,0.077,0.0566,0.072 +DH031,356.0,358.0,0.134,0.0215,0.096 +DH031,358.0,360.0,0.13,0.0061,0.101 +DH031,360.0,362.0,0.075,0.0143,0.094 +DH031,362.0,364.0,0.032,0.0074,0.035 +DH031,364.0,366.0,0.108,0.0055,0.126 +DH031,366.0,368.0,0.139,0.0159,0.183 +DH031,368.0,370.0,0.154,0.0093,0.156 +DH031,370.0,372.0,0.063,0.0091,0.036 +DH031,372.0,374.0,0.051,0.0133,0.033 +DH031,374.0,376.0,0.154,0.0237,0.122 +DH031,376.0,378.0,0.07,0.0248,0.097 +DH031,378.0,380.0,0.063,0.0473,0.094 +DH031,380.0,382.0,0.027,0.0222,0.038 +DH031,382.0,384.0,0.035,0.0108,0.034 +DH031,384.0,386.0,0.14,0.0336,0.102 +DH031,386.0,388.0,0.032,0.0092,0.019 +DH031,388.0,390.0,0.178,0.0226,0.135 +DH031,390.0,392.0,0.094,0.0178,0.081 +DH031,392.0,394.0,0.112,0.0167,0.165 +DH031,394.0,396.0,0.116,0.0148,0.118 +DH031,396.0,398.0,0.076,0.0286,0.087 +DH031,398.0,400.0,0.048,0.0215,0.031 +DH031,400.0,402.0,0.112,0.0307,0.062 +DH031,402.0,404.0,0.123,0.0077,0.066 +DH031,404.0,406.0,0.07,0.0378,0.036 +DH031,406.0,408.0,0.118,0.0076,0.063 +DH031,408.0,410.0,0.049,0.0631,0.064 +DH031,410.0,412.0,0.086,0.0195,0.104 +DH031,412.0,414.0,0.06,0.0224,0.061 +DH031,414.0,416.0,0.021,0.0138,0.014 +DH031,416.0,417.0,0.117,0.0337,0.097 +DH032,0.0,2.0,0.177,0.0179,0.108 +DH032,2.0,4.0,0.082,0.0066,0.12 +DH032,4.0,6.0,0.063,0.0152,0.085 +DH032,6.0,8.0,0.217,0.0141,0.134 +DH032,8.0,10.0,0.063,0.0115,0.084 +DH032,10.0,12.0,0.079,0.0177,0.088 +DH032,12.0,14.0,0.062,0.0227,0.06 +DH032,14.0,16.0,0.059,0.0148,0.03 +DH032,16.0,18.0,0.199,0.0158,0.208 +DH032,18.0,20.0,0.426,0.0147,0.22 +DH032,20.0,22.0,0.066,0.0159,0.042 +DH032,22.0,24.0,0.143,0.0224,0.211 +DH032,24.0,26.0,0.154,0.0203,0.141 +DH032,26.0,28.0,0.16,0.0105,0.159 +DH032,28.0,30.0,0.06,0.0154,0.052 +DH032,30.0,32.0,0.04,0.0298,0.054 +DH032,32.0,34.0,0.058,0.0218,0.075 +DH032,34.0,36.0,0.15,0.0555,0.088 +DH032,36.0,38.0,0.071,0.0239,0.05 +DH032,38.0,40.0,0.081,0.0106,0.048 +DH032,40.0,42.0,0.163,0.0342,0.165 +DH032,42.0,44.0,0.096,0.0333,0.119 +DH032,44.0,46.0,0.063,0.0502,0.065 +DH032,46.0,48.0,0.042,0.0194,0.026 +DH032,48.0,50.0,0.018,0.02,0.025 +DH032,50.0,52.0,0.031,0.0191,0.042 +DH032,52.0,54.0,0.081,0.0154,0.09 +DH032,54.0,56.0,0.034,0.013,0.05 +DH032,56.0,58.0,0.094,0.0177,0.116 +DH032,58.0,60.0,0.066,0.0265,0.071 +DH032,60.0,62.0,0.062,0.005,0.057 +DH032,62.0,64.0,0.061,0.0116,0.079 +DH032,64.0,66.0,0.134,0.018,0.078 +DH032,66.0,68.0,0.033,0.0157,0.029 +DH032,68.0,70.0,0.064,0.0109,0.061 +DH032,70.0,72.0,0.105,0.0304,0.07 +DH032,72.0,74.0,0.045,0.0108,0.047 +DH032,74.0,76.0,0.243,0.0225,0.251 +DH032,76.0,78.0,0.073,0.018,0.064 +DH032,78.0,80.0,0.172,0.0209,0.154 +DH032,80.0,82.0,3.187,0.3314,6.846 +DH032,82.0,84.0,0.808,0.5096,2.275 +DH032,84.0,86.0,6.948,0.8327,15.963 +DH032,86.0,88.0,3.422,2.8869,7.136 +DH032,88.0,90.0,0.601,0.1782,1.773 +DH032,90.0,92.0,0.471,0.1222,1.219 +DH032,92.0,94.0,1.606,0.2043,3.888 +DH032,94.0,96.0,0.942,0.0689,1.558 +DH032,96.0,98.0,4.473,0.2745,10.438 +DH032,98.0,100.0,0.554,0.1797,1.116 +DH032,100.0,102.0,0.816,0.1313,1.836 +DH032,102.0,104.0,2.346,0.1663,5.143 +DH032,104.0,106.0,28.168,0.2656,74.333 +DH032,106.0,108.0,6.268,0.3894,18.103 +DH032,108.0,110.0,35.25,0.2188,89.128 +DH032,110.0,112.0,4.313,0.2943,12.927 +DH032,112.0,114.0,1.096,0.4176,1.881 +DH032,114.0,116.0,7.237,0.1879,18.186 +DH032,116.0,118.0,5.357,0.2971,8.346 +DH032,118.0,120.0,11.187,0.4009,16.827 +DH032,120.0,122.0,1.269,0.2986,2.971 +DH032,122.0,124.0,0.329,0.3014,0.859 +DH032,124.0,126.0,0.132,0.261,0.309 +DH032,126.0,128.0,4.469,0.424,11.361 +DH032,128.0,130.0,0.639,0.0529,1.376 +DH032,130.0,132.0,5.174,0.5682,11.27 +DH032,132.0,134.0,5.839,0.0671,15.108 +DH032,134.0,136.0,2.589,0.3793,6.309 +DH032,136.0,138.0,4.561,0.1841,9.315 +DH032,138.0,140.0,0.74,0.1287,2.05 +DH032,140.0,142.0,5.519,0.5434,13.659 +DH032,142.0,144.0,2.221,0.3904,6.344 +DH032,144.0,146.0,1.569,0.1301,4.702 +DH032,146.0,148.0,0.83,0.156,1.252 +DH032,148.0,150.0,0.83,0.2805,1.262 +DH032,150.0,152.0,1.795,0.1151,3.432 +DH032,152.0,154.0,1.214,0.2316,3.322 +DH032,154.0,156.0,0.495,1.2697,1.119 +DH032,156.0,158.0,3.648,0.1222,10.249 +DH032,158.0,160.0,1.914,0.1628,3.732 +DH032,160.0,162.0,1.613,0.3118,2.816 +DH032,162.0,164.0,2.122,0.1263,3.692 +DH032,164.0,166.0,1.28,0.3225,2.96 +DH032,166.0,168.0,5.792,0.2229,15.597 +DH032,168.0,170.0,1.818,0.0554,4.811 +DH032,170.0,172.0,1.419,0.0972,3.839 +DH032,172.0,174.0,2.617,0.0901,4.349 +DH032,174.0,176.0,14.26,0.0619,29.783 +DH032,176.0,178.0,0.549,0.1223,1.354 +DH032,178.0,180.0,0.68,0.3532,1.495 +DH032,180.0,182.0,6.111,0.5065,9.688 +DH032,182.0,184.0,1.662,0.3243,3.26 +DH032,184.0,186.0,18.247,0.5248,28.416 +DH032,186.0,188.0,52.474,0.241,120.661 +DH032,188.0,190.0,2.753,0.1073,7.829 +DH032,190.0,192.0,0.28,0.1461,0.486 +DH032,192.0,194.0,6.956,0.5427,12.586 +DH032,194.0,196.0,26.876,0.2513,72.309 +DH032,196.0,198.0,0.319,0.1359,0.687 +DH032,198.0,200.0,2.728,0.2432,6.268 +DH032,200.0,202.0,0.394,0.2065,0.708 +DH032,202.0,204.0,8.199,0.2019,17.854 +DH032,204.0,206.0,0.491,0.1026,1.012 +DH032,206.0,208.0,4.453,0.1771,11.718 +DH032,208.0,210.0,0.845,0.2784,1.445 +DH032,210.0,212.0,2.279,0.0882,3.982 +DH032,212.0,214.0,1.179,0.1014,3.072 +DH032,214.0,216.0,30.074,1.0556,88.535 +DH032,216.0,218.0,1.618,0.2109,2.799 +DH032,218.0,220.0,1.344,0.6409,2.702 +DH032,220.0,222.0,1.561,0.4235,3.736 +DH032,222.0,224.0,1.668,0.3588,4.632 +DH032,224.0,226.0,0.471,0.0747,1.124 +DH032,226.0,228.0,0.352,0.069,1.023 +DH032,228.0,230.0,9.779,0.1738,20.273 +DH032,230.0,232.0,0.707,0.3704,1.987 +DH032,232.0,234.0,0.767,0.8867,2.127 +DH032,234.0,236.0,2.271,0.3073,3.968 +DH032,236.0,238.0,20.667,0.3383,36.372 +DH032,238.0,240.0,1.342,0.4366,2.642 +DH032,240.0,242.0,2.537,2.2403,6.594 +DH032,242.0,244.0,2.944,0.2773,4.472 +DH032,244.0,246.0,1.741,0.2401,5.142 +DH032,246.0,248.0,2.905,0.1511,8.63 +DH032,248.0,250.0,1.645,0.3519,4.315 +DH032,250.0,252.0,0.066,0.0131,0.088 +DH032,252.0,254.0,0.127,0.0226,0.071 +DH032,254.0,256.0,0.052,0.0426,0.032 +DH032,256.0,258.0,0.121,0.0114,0.147 +DH032,258.0,260.0,0.054,0.0113,0.063 +DH032,260.0,262.0,0.059,0.0224,0.031 +DH032,262.0,264.0,0.043,0.0181,0.03 +DH032,264.0,266.0,0.121,0.0277,0.076 +DH032,266.0,268.0,0.097,0.044,0.097 +DH032,268.0,270.0,0.047,0.0245,0.045 +DH032,270.0,272.0,0.072,0.0136,0.04 +DH032,272.0,274.0,0.071,0.0287,0.079 +DH032,274.0,276.0,0.143,0.0217,0.181 +DH032,276.0,278.0,0.02,0.022,0.017 +DH032,278.0,280.0,0.026,0.0169,0.014 +DH032,280.0,282.0,0.063,0.0395,0.088 +DH032,282.0,284.0,0.071,0.0366,0.095 +DH032,284.0,286.0,0.112,0.0124,0.116 +DH032,286.0,288.0,0.034,0.0179,0.05 +DH032,288.0,290.0,0.067,0.0209,0.083 +DH032,290.0,292.0,0.038,0.0142,0.025 +DH032,292.0,294.0,0.061,0.016,0.091 +DH032,294.0,296.0,0.034,0.014,0.03 +DH032,296.0,298.0,0.068,0.0194,0.053 +DH032,298.0,300.0,0.124,0.0133,0.121 +DH032,300.0,302.0,0.176,0.0222,0.251 +DH032,302.0,304.0,0.097,0.0312,0.144 +DH032,304.0,306.0,0.095,0.0311,0.102 +DH032,306.0,308.0,0.08,0.0155,0.064 +DH032,308.0,310.0,0.216,0.0208,0.145 +DH032,310.0,312.0,0.038,0.0417,0.02 +DH032,312.0,314.0,0.107,0.0154,0.113 +DH032,314.0,316.0,0.045,0.0222,0.06 +DH032,316.0,318.0,0.066,0.0133,0.057 +DH032,318.0,320.0,0.067,0.0117,0.093 +DH032,320.0,322.0,0.082,0.0443,0.065 +DH032,322.0,324.0,0.1,0.0235,0.059 +DH032,324.0,326.0,0.108,0.0211,0.064 +DH032,326.0,328.0,0.019,0.0521,0.016 +DH032,328.0,330.0,0.094,0.009,0.137 +DH032,330.0,332.0,0.054,0.0239,0.074 +DH032,332.0,334.0,0.312,0.0089,0.313 +DH032,334.0,336.0,0.023,0.0179,0.022 +DH032,336.0,338.0,0.162,0.0148,0.2 +DH032,338.0,340.0,0.044,0.0159,0.035 +DH032,340.0,342.0,0.111,0.022,0.06 +DH032,342.0,344.0,0.096,0.0255,0.082 +DH032,344.0,346.0,0.104,0.0409,0.154 +DH032,346.0,348.0,0.11,0.0257,0.091 +DH032,348.0,350.0,0.127,0.0193,0.074 +DH032,350.0,352.0,0.053,0.0151,0.076 +DH032,352.0,354.0,0.2,0.0229,0.285 +DH032,354.0,356.0,0.097,0.0327,0.105 +DH032,356.0,358.0,0.047,0.0038,0.048 +DH032,358.0,360.0,0.048,0.025,0.069 +DH032,360.0,362.0,0.16,0.0438,0.118 +DH032,362.0,364.0,0.235,0.0365,0.136 +DH032,364.0,366.0,0.08,0.0096,0.12 +DH032,366.0,368.0,0.085,0.0339,0.121 +DH032,368.0,370.0,0.146,0.0054,0.19 +DH032,370.0,372.0,0.077,0.0231,0.043 +DH032,372.0,374.0,0.043,0.0255,0.026 +DH032,374.0,376.0,0.335,0.0261,0.218 +DH032,376.0,378.0,0.038,0.0457,0.033 +DH032,378.0,380.0,0.081,0.0081,0.07 +DH032,380.0,382.0,0.12,0.0219,0.147 +DH032,382.0,384.0,0.12,0.0084,0.069 +DH032,384.0,386.0,0.093,0.0145,0.077 +DH032,386.0,388.0,0.101,0.0355,0.065 +DH032,388.0,390.0,0.089,0.0159,0.068 +DH032,390.0,392.0,0.227,0.0142,0.311 +DH032,392.0,394.0,0.048,0.0065,0.043 +DH032,394.0,396.0,0.103,0.0173,0.058 +DH032,396.0,398.0,0.099,0.0209,0.07 +DH032,398.0,400.0,0.036,0.0161,0.021 +DH032,400.0,402.0,0.105,0.0118,0.106 +DH032,402.0,404.0,0.14,0.0102,0.14 +DH032,404.0,406.0,0.183,0.0097,0.107 +DH032,406.0,408.0,0.217,0.0164,0.176 +DH032,408.0,410.0,0.153,0.0167,0.185 +DH032,410.0,412.0,0.077,0.0232,0.081 +DH032,412.0,414.0,0.048,0.016,0.033 +DH032,414.0,416.0,0.079,0.0085,0.099 +DH032,416.0,418.0,0.072,0.0316,0.087 +DH033,0.0,2.0,0.076,0.0236,0.039 +DH033,2.0,4.0,0.04,0.0056,0.025 +DH033,4.0,6.0,0.095,0.0328,0.078 +DH033,6.0,8.0,0.117,0.0156,0.101 +DH033,8.0,10.0,0.194,0.0191,0.265 +DH033,10.0,12.0,0.033,0.0082,0.04 +DH033,12.0,14.0,0.05,0.0509,0.041 +DH033,14.0,16.0,0.213,0.0285,0.238 +DH033,16.0,18.0,0.03,0.0387,0.033 +DH033,18.0,20.0,0.212,0.0256,0.107 +DH033,20.0,22.0,0.107,0.0231,0.133 +DH033,22.0,24.0,0.076,0.0374,0.071 +DH033,24.0,26.0,0.09,0.0136,0.079 +DH033,26.0,28.0,0.024,0.0229,0.014 +DH033,28.0,30.0,0.05,0.0298,0.025 +DH033,30.0,32.0,0.059,0.0296,0.063 +DH033,32.0,34.0,0.138,0.0068,0.142 +DH033,34.0,36.0,0.084,0.014,0.126 +DH033,36.0,38.0,0.045,0.0176,0.065 +DH033,38.0,40.0,0.115,0.023,0.089 +DH033,40.0,42.0,0.062,0.0158,0.055 +DH033,42.0,44.0,0.074,0.0319,0.102 +DH033,44.0,46.0,0.103,0.0091,0.15 +DH033,46.0,48.0,0.058,0.0109,0.07 +DH033,48.0,50.0,0.125,0.0299,0.176 +DH033,50.0,52.0,0.078,0.0159,0.095 +DH033,52.0,54.0,0.162,0.0177,0.238 +DH033,54.0,56.0,0.073,0.0091,0.108 +DH033,56.0,58.0,0.03,0.0149,0.031 +DH033,58.0,60.0,0.124,0.0181,0.069 +DH033,60.0,62.0,0.084,0.0184,0.069 +DH033,62.0,64.0,0.193,0.0085,0.102 +DH033,64.0,66.0,0.074,0.0271,0.083 +DH033,66.0,68.0,0.083,0.016,0.088 +DH033,68.0,70.0,0.082,0.049,0.089 +DH033,70.0,72.0,0.083,0.017,0.096 +DH033,72.0,74.0,0.058,0.0197,0.029 +DH033,74.0,76.0,0.1,0.0218,0.103 +DH033,76.0,78.0,0.087,0.0401,0.089 +DH033,78.0,80.0,0.392,0.0188,0.567 +DH033,80.0,82.0,0.931,0.6843,1.559 +DH033,82.0,84.0,3.846,0.1806,10.977 +DH033,84.0,86.0,1.679,0.1187,3.213 +DH033,86.0,88.0,14.153,0.3243,37.127 +DH033,88.0,90.0,8.285,0.1093,21.503 +DH033,90.0,92.0,4.322,0.3653,11.26 +DH033,92.0,94.0,0.823,0.3637,1.836 +DH033,94.0,96.0,1.028,0.1229,1.774 +DH033,96.0,98.0,3.286,0.0722,8.31 +DH033,98.0,100.0,0.411,0.6279,0.952 +DH033,100.0,102.0,22.104,0.381,34.098 +DH033,102.0,104.0,0.853,0.2701,1.286 +DH033,104.0,106.0,9.238,0.1062,15.328 +DH033,106.0,108.0,10.275,0.1896,22.981 +DH033,108.0,110.0,0.87,0.263,2.103 +DH033,110.0,112.0,20.407,0.0597,59.104 +DH033,112.0,114.0,1.039,0.6427,3.049 +DH033,114.0,116.0,2.577,0.5042,6.408 +DH033,116.0,118.0,3.695,0.8364,9.872 +DH033,118.0,120.0,0.887,0.3251,2.079 +DH033,120.0,122.0,2.541,0.4979,3.901 +DH033,122.0,124.0,2.594,0.3011,5.766 +DH033,124.0,126.0,1.574,0.8111,3.108 +DH033,126.0,128.0,1.545,0.3404,2.734 +DH033,128.0,130.0,5.635,0.3965,15.524 +DH033,130.0,132.0,0.112,0.6189,0.192 +DH033,132.0,134.0,2.169,0.3889,4.032 +DH033,134.0,136.0,12.137,0.4818,32.79 +DH033,136.0,138.0,0.897,0.0331,1.735 +DH033,138.0,140.0,8.418,0.5782,16.77 +DH033,140.0,142.0,1.85,0.1421,2.943 +DH033,142.0,144.0,1.829,0.1021,4.762 +DH033,144.0,146.0,0.466,0.1906,0.767 +DH033,146.0,148.0,3.177,0.2227,9.322 +DH033,148.0,150.0,0.727,0.2236,1.684 +DH033,150.0,152.0,1.888,1.0682,5.046 +DH033,152.0,154.0,4.218,0.1539,8.197 +DH033,154.0,156.0,2.165,1.6539,4.776 +DH033,156.0,158.0,3.434,0.115,8.339 +DH033,158.0,160.0,0.863,1.4987,1.814 +DH033,160.0,162.0,15.944,0.1689,38.427 +DH033,162.0,164.0,0.588,0.3065,1.363 +DH033,164.0,166.0,2.198,0.146,5.768 +DH033,166.0,168.0,0.187,0.4732,0.498 +DH033,168.0,170.0,3.22,0.2609,6.094 +DH033,170.0,172.0,0.773,0.1585,1.284 +DH033,172.0,174.0,8.457,0.5048,24.899 +DH033,174.0,176.0,0.396,0.5364,0.798 +DH033,176.0,178.0,2.624,0.1659,4.883 +DH033,178.0,180.0,6.302,0.5763,17.187 +DH033,180.0,182.0,0.891,0.6022,1.801 +DH033,182.0,184.0,18.819,0.2045,44.29 +DH033,184.0,186.0,2.349,0.1638,5.283 +DH033,186.0,188.0,0.282,0.4532,0.791 +DH033,188.0,190.0,2.777,0.1549,7.819 +DH033,190.0,192.0,1.335,0.7213,3.358 +DH033,192.0,194.0,1.994,0.1063,3.712 +DH033,194.0,196.0,2.622,0.2011,6.743 +DH033,196.0,198.0,1.207,0.1729,3.194 +DH033,198.0,200.0,0.458,0.2872,0.897 +DH033,200.0,202.0,1.122,0.127,2.997 +DH033,202.0,204.0,0.813,0.2719,1.694 +DH033,204.0,206.0,2.358,1.4667,4.951 +DH033,206.0,208.0,4.599,0.3965,12.982 +DH033,208.0,210.0,3.091,0.2269,7.61 +DH033,210.0,212.0,1.101,0.1503,3.104 +DH033,212.0,214.0,0.209,0.7385,0.43 +DH033,214.0,216.0,2.73,0.38,6.021 +DH033,216.0,218.0,0.454,0.4689,1.223 +DH033,218.0,220.0,34.774,0.1919,96.379 +DH033,220.0,222.0,1.797,1.2935,3.799 +DH033,222.0,224.0,9.008,0.3684,18.968 +DH033,224.0,226.0,2.929,0.1309,8.778 +DH033,226.0,228.0,8.079,0.1509,18.975 +DH033,228.0,230.0,3.394,0.5829,7.556 +DH033,230.0,232.0,0.116,0.3649,0.331 +DH033,232.0,234.0,9.007,0.3581,26.281 +DH033,234.0,236.0,1.605,0.1075,3.719 +DH033,236.0,238.0,0.257,0.1391,0.429 +DH033,238.0,240.0,0.396,0.2449,1.095 +DH033,240.0,242.0,2.142,0.1497,4.539 +DH033,242.0,244.0,1.521,0.1156,2.856 +DH033,244.0,246.0,0.358,0.391,0.896 +DH033,246.0,248.0,3.496,0.4537,10.171 +DH033,248.0,250.0,5.806,0.0427,10.388 +DH033,250.0,252.0,0.159,0.0236,0.234 +DH033,252.0,254.0,0.228,0.0213,0.318 +DH033,254.0,256.0,0.046,0.0144,0.049 +DH033,256.0,258.0,0.058,0.0116,0.081 +DH033,258.0,260.0,0.227,0.0292,0.146 +DH033,260.0,262.0,0.151,0.0218,0.151 +DH033,262.0,264.0,0.077,0.0166,0.053 +DH033,264.0,266.0,0.089,0.0127,0.083 +DH033,266.0,268.0,0.099,0.0227,0.12 +DH033,268.0,270.0,0.042,0.0342,0.029 +DH033,270.0,272.0,0.025,0.0358,0.022 +DH033,272.0,274.0,0.092,0.0324,0.079 +DH033,274.0,276.0,0.15,0.0207,0.186 +DH033,276.0,278.0,0.024,0.0284,0.02 +DH033,278.0,280.0,0.05,0.016,0.059 +DH033,280.0,282.0,0.058,0.0314,0.052 +DH033,282.0,284.0,0.072,0.0692,0.058 +DH033,284.0,286.0,0.114,0.0108,0.129 +DH033,286.0,288.0,0.09,0.0279,0.083 +DH033,288.0,290.0,0.066,0.0159,0.073 +DH033,290.0,292.0,0.12,0.0211,0.089 +DH033,292.0,294.0,0.051,0.0228,0.026 +DH033,294.0,296.0,0.073,0.033,0.077 +DH033,296.0,298.0,0.192,0.0221,0.234 +DH033,298.0,300.0,0.064,0.0166,0.094 +DH033,300.0,302.0,0.136,0.0158,0.18 +DH033,302.0,304.0,0.073,0.013,0.052 +DH033,304.0,306.0,0.13,0.0125,0.188 +DH034,0.0,2.0,0.051,0.0139,0.052 +DH034,2.0,4.0,0.16,0.0113,0.159 +DH034,4.0,6.0,0.047,0.0091,0.04 +DH034,6.0,8.0,0.181,0.0167,0.218 +DH034,8.0,10.0,0.105,0.0196,0.125 +DH034,10.0,12.0,0.019,0.012,0.028 +DH034,12.0,14.0,0.25,0.0161,0.145 +DH034,14.0,16.0,0.097,0.0228,0.139 +DH034,16.0,18.0,0.018,0.0888,0.017 +DH034,18.0,20.0,0.073,0.0128,0.089 +DH034,20.0,22.0,0.11,0.0192,0.105 +DH034,22.0,24.0,0.077,0.0224,0.095 +DH034,24.0,26.0,0.101,0.0212,0.097 +DH034,26.0,28.0,0.031,0.0123,0.024 +DH034,28.0,30.0,0.053,0.015,0.046 +DH034,30.0,32.0,0.075,0.0073,0.04 +DH034,32.0,34.0,0.085,0.0187,0.122 +DH034,34.0,36.0,0.109,0.0171,0.091 +DH034,36.0,38.0,0.063,0.0134,0.049 +DH034,38.0,40.0,0.124,0.0224,0.115 +DH034,40.0,42.0,0.065,0.0389,0.085 +DH034,42.0,44.0,0.088,0.0248,0.07 +DH034,44.0,46.0,0.023,0.0135,0.016 +DH034,46.0,48.0,0.086,0.0171,0.127 +DH034,48.0,50.0,0.025,0.0373,0.023 +DH034,50.0,52.0,0.063,0.0131,0.039 +DH034,52.0,54.0,0.139,0.0113,0.111 +DH034,54.0,56.0,0.075,0.0135,0.076 +DH034,56.0,58.0,0.051,0.0095,0.028 +DH034,58.0,60.0,0.072,0.0249,0.095 +DH034,60.0,62.0,0.114,0.0066,0.077 +DH034,62.0,64.0,0.116,0.0097,0.148 +DH034,64.0,66.0,0.036,0.0185,0.035 +DH034,66.0,68.0,0.131,0.0073,0.141 +DH034,68.0,70.0,0.245,0.0742,0.232 +DH034,70.0,72.0,0.036,0.0228,0.025 +DH034,72.0,74.0,0.073,0.0309,0.077 +DH034,74.0,76.0,0.103,0.0053,0.096 +DH034,76.0,78.0,0.082,0.0153,0.097 +DH034,78.0,80.0,0.061,0.0216,0.039 +DH034,80.0,82.0,2.394,0.4007,3.663 +DH034,82.0,84.0,11.37,0.1011,29.34 +DH034,84.0,86.0,8.463,0.1678,22.664 +DH034,86.0,88.0,2.852,0.3602,4.609 +DH034,88.0,90.0,0.445,0.3166,0.983 +DH034,90.0,92.0,1.799,0.714,3.308 +DH034,92.0,94.0,0.327,0.2662,0.846 +DH034,94.0,96.0,3.289,0.0486,8.441 +DH034,96.0,98.0,2.503,0.0869,3.787 +DH034,98.0,100.0,2.816,0.1508,6.752 +DH034,100.0,102.0,4.52,0.5882,11.425 +DH034,102.0,104.0,1.859,0.191,5.313 +DH034,104.0,106.0,5.04,0.1326,8.327 +DH034,106.0,108.0,0.909,0.2649,2.629 +DH034,108.0,110.0,1.296,1.2686,2.785 +DH034,110.0,112.0,1.544,0.1312,2.322 +DH034,112.0,114.0,1.971,0.0911,5.331 +DH034,114.0,116.0,4.626,0.5074,9.549 +DH034,116.0,118.0,2.389,0.1672,7.034 +DH034,118.0,120.0,0.738,0.0642,2.153 +DH034,120.0,122.0,6.585,0.1589,17.479 +DH034,122.0,124.0,1.435,0.604,3.227 +DH034,124.0,126.0,3.641,0.1062,9.683 +DH034,126.0,128.0,2.05,0.2356,5.082 +DH034,128.0,130.0,2.384,0.4208,6.271 +DH034,130.0,132.0,18.052,0.2312,53.962 +DH034,132.0,134.0,4.787,0.3053,10.785 +DH034,134.0,136.0,1.63,0.0411,3.3 +DH034,136.0,138.0,16.071,0.1397,46.474 +DH034,138.0,140.0,0.325,0.0966,0.69 +DH034,140.0,142.0,1.968,0.3431,4.82 +DH034,142.0,144.0,2.659,0.189,5.612 +DH034,144.0,146.0,0.531,0.6853,0.978 +DH034,146.0,148.0,0.64,0.0922,1.581 +DH034,148.0,150.0,3.349,0.1929,7.677 +DH034,150.0,152.0,2.098,0.2036,3.815 +DH034,152.0,154.0,1.185,0.8286,2.384 +DH034,154.0,156.0,4.075,0.0478,11.495 +DH034,156.0,158.0,1.2,0.2267,1.96 +DH034,158.0,160.0,5.515,0.4907,10.17 +DH034,160.0,162.0,1.407,0.0956,3.742 +DH034,162.0,164.0,18.307,0.2359,52.967 +DH034,164.0,166.0,1.679,0.1492,3.604 +DH034,166.0,168.0,1.96,0.3081,4.558 +DH034,168.0,170.0,3.377,0.3486,9.165 +DH034,170.0,172.0,0.743,0.2157,2.093 +DH034,172.0,174.0,1.189,0.2706,2.857 +DH034,174.0,176.0,9.254,0.6906,27.499 +DH034,176.0,178.0,0.551,0.177,1.456 +DH034,178.0,180.0,1.672,0.1434,2.575 +DH034,180.0,182.0,3.975,0.077,11.108 +DH034,182.0,184.0,2.282,0.5172,5.728 +DH034,184.0,186.0,4.434,0.2417,7.195 +DH034,186.0,188.0,1.754,0.772,4.889 +DH034,188.0,190.0,6.954,0.2454,18.766 +DH034,190.0,192.0,23.161,0.9792,64.806 +DH034,192.0,194.0,2.751,0.3924,5.879 +DH034,194.0,196.0,13.717,0.6352,36.279 +DH034,196.0,198.0,34.21,0.4721,54.372 +DH034,198.0,200.0,1.147,0.6033,3.301 +DH034,200.0,202.0,1.361,0.1842,3.148 +DH034,202.0,204.0,1.764,0.0778,3.174 +DH034,204.0,206.0,1.37,1.1229,3.966 +DH034,206.0,208.0,10.182,0.3696,23.8 +DH034,208.0,210.0,4.412,0.2693,13.058 +DH034,210.0,212.0,43.955,0.1798,93.966 +DH034,212.0,214.0,2.212,0.3345,5.402 +DH034,214.0,216.0,0.167,0.1901,0.274 +DH034,216.0,218.0,0.888,0.4662,1.695 +DH034,218.0,220.0,1.769,0.4605,2.912 +DH034,220.0,222.0,3.686,0.5029,6.983 +DH034,222.0,224.0,0.309,0.1649,0.519 +DH034,224.0,226.0,4.898,0.457,10.567 +DH034,226.0,228.0,4.002,0.484,10.475 +DH034,228.0,230.0,1.956,0.0719,4.097 +DH034,230.0,232.0,15.479,0.535,27.341 +DH034,232.0,234.0,1.79,0.1008,3.391 +DH034,234.0,236.0,8.439,0.3097,17.223 +DH034,236.0,238.0,2.523,0.0483,6.847 +DH034,238.0,240.0,0.969,0.0839,1.776 +DH034,240.0,242.0,4.355,0.2687,10.453 +DH034,242.0,244.0,4.768,0.1332,14.013 +DH034,244.0,245.0,1.579,0.6147,4.465 +DH035,0.0,2.0,0.103,0.0089,0.129 +DH035,2.0,4.0,0.079,0.011,0.071 +DH035,4.0,6.0,0.107,0.0183,0.078 +DH035,6.0,8.0,0.07,0.0145,0.064 +DH035,8.0,10.0,0.086,0.0149,0.057 +DH035,10.0,12.0,0.085,0.0296,0.098 +DH035,12.0,14.0,0.193,0.0323,0.211 +DH035,14.0,16.0,0.187,0.04,0.269 +DH035,16.0,18.0,0.121,0.0337,0.089 +DH035,18.0,20.0,0.052,0.0254,0.033 +DH035,20.0,22.0,0.249,0.0092,0.296 +DH035,22.0,24.0,0.028,0.0197,0.02 +DH035,24.0,26.0,0.08,0.0193,0.064 +DH035,26.0,28.0,0.077,0.022,0.079 +DH035,28.0,30.0,0.049,0.0175,0.034 +DH035,30.0,32.0,0.143,0.0351,0.097 +DH035,32.0,34.0,0.102,0.0267,0.1 +DH035,34.0,36.0,0.056,0.0172,0.056 +DH035,36.0,38.0,0.105,0.0309,0.135 +DH035,38.0,40.0,0.107,0.0134,0.144 +DH035,40.0,42.0,0.282,0.0111,0.343 +DH035,42.0,44.0,0.093,0.0209,0.079 +DH035,44.0,46.0,0.273,0.0124,0.339 +DH035,46.0,48.0,0.216,0.0293,0.194 +DH035,48.0,50.0,0.058,0.0322,0.086 +DH035,50.0,52.0,0.092,0.0137,0.047 +DH035,52.0,54.0,0.221,0.0106,0.29 +DH035,54.0,56.0,0.056,0.0149,0.07 +DH035,56.0,58.0,0.146,0.0231,0.128 +DH035,58.0,60.0,0.097,0.025,0.092 +DH035,60.0,62.0,0.156,0.0121,0.141 +DH035,62.0,64.0,0.101,0.0176,0.134 +DH035,64.0,66.0,0.089,0.0158,0.077 +DH035,66.0,68.0,0.126,0.0213,0.167 +DH035,68.0,70.0,0.054,0.0543,0.039 +DH035,70.0,72.0,0.088,0.0159,0.08 +DH035,72.0,74.0,0.063,0.0125,0.084 +DH035,74.0,76.0,0.04,0.03,0.032 +DH035,76.0,78.0,0.065,0.0239,0.034 +DH035,78.0,80.0,0.042,0.0106,0.06 +DH035,80.0,82.0,4.592,0.2708,7.982 +DH035,82.0,84.0,1.771,0.172,3.269 +DH035,84.0,86.0,2.395,0.3389,4.962 +DH035,86.0,88.0,18.597,0.0999,49.651 +DH035,88.0,90.0,2.611,0.2712,5.729 +DH035,90.0,92.0,4.587,0.2722,9.362 +DH035,92.0,94.0,1.935,0.1169,3.133 +DH035,94.0,96.0,0.447,0.3113,1.172 +DH035,96.0,98.0,3.059,0.0397,7.576 +DH035,98.0,100.0,1.762,0.0925,2.717 +DH035,100.0,102.0,6.396,0.1307,14.093 +DH035,102.0,104.0,0.199,0.131,0.533 +DH035,104.0,106.0,1.198,0.1292,3.461 +DH035,106.0,108.0,3.878,0.2618,6.885 +DH035,108.0,110.0,1.013,0.093,2.838 +DH035,110.0,112.0,1.095,0.0432,2.511 +DH035,112.0,114.0,8.38,0.4235,21.269 +DH035,114.0,116.0,2.606,0.7111,5.709 +DH035,116.0,118.0,0.699,0.5485,1.444 +DH035,118.0,120.0,0.995,0.347,2.506 +DH035,120.0,122.0,0.815,0.1117,1.398 +DH035,122.0,124.0,2.849,0.7508,5.516 +DH035,124.0,126.0,1.539,0.7059,2.717 +DH035,126.0,128.0,2.648,0.064,5.289 +DH035,128.0,130.0,0.628,0.2297,1.675 +DH035,130.0,132.0,15.233,0.0635,41.678 +DH035,132.0,134.0,2.985,0.3386,6.65 +DH035,134.0,136.0,0.277,0.1807,0.557 +DH035,136.0,138.0,21.441,0.1602,40.779 +DH035,138.0,140.0,0.815,0.3703,1.462 +DH035,140.0,142.0,10.047,0.218,18.168 +DH035,142.0,144.0,2.248,0.6734,5.864 +DH035,144.0,146.0,0.252,0.1673,0.535 +DH035,146.0,148.0,0.25,0.2686,0.497 +DH035,148.0,150.0,20.736,0.0768,32.428 +DH035,150.0,152.0,7.101,0.3381,20.991 +DH035,152.0,154.0,0.62,0.2412,1.753 +DH035,154.0,156.0,1.137,0.6271,2.448 +DH035,156.0,158.0,0.229,0.1865,0.484 +DH035,158.0,160.0,3.355,0.2915,6.706 +DH035,160.0,162.0,0.584,0.159,1.182 +DH035,162.0,164.0,0.21,0.2137,0.465 +DH035,164.0,166.0,9.553,0.3784,25.912 +DH035,166.0,168.0,0.638,0.6693,1.67 +DH035,168.0,170.0,0.566,0.3043,1.473 +DH035,170.0,172.0,2.852,0.3149,7.423 +DH035,172.0,174.0,3.745,0.136,8.806 +DH035,174.0,176.0,0.82,0.4633,1.235 +DH035,176.0,178.0,3.599,0.0537,6.028 +DH035,178.0,180.0,0.367,0.9018,0.884 +DH035,180.0,182.0,5.359,0.1335,9.211 +DH035,182.0,184.0,2.109,0.8311,4.815 +DH035,184.0,186.0,3.533,0.6296,8.854 +DH035,186.0,188.0,8.021,0.4589,17.148 +DH035,188.0,190.0,1.848,0.1573,4.646 +DH035,190.0,192.0,0.845,0.1071,2.41 +DH035,192.0,194.0,1.692,0.3151,3.331 +DH035,194.0,196.0,0.624,0.0933,1.19 +DH035,196.0,198.0,0.878,0.1103,2.376 +DH035,198.0,200.0,0.353,1.1258,0.653 +DH035,200.0,202.0,5.156,0.4911,10.45 +DH035,202.0,204.0,4.666,0.8432,10.2 +DH035,204.0,206.0,1.845,0.1128,4.828 +DH035,206.0,208.0,1.007,0.998,1.59 +DH035,208.0,210.0,24.052,1.1837,49.559 +DH035,210.0,212.0,1.239,1.0247,3.015 +DH035,212.0,214.0,3.288,0.2678,5.009 +DH035,214.0,216.0,2.226,0.2515,5.631 +DH035,216.0,218.0,1.273,0.0741,3.66 +DH035,218.0,220.0,0.969,0.1393,2.013 +DH035,220.0,222.0,1.424,0.5423,4.137 +DH035,222.0,224.0,8.958,0.2631,20.284 +DH035,224.0,226.0,2.691,0.0794,6.23 +DH035,226.0,228.0,6.166,0.493,14.9 +DH035,228.0,230.0,0.36,0.1452,0.656 +DH035,230.0,232.0,2.901,0.1201,5.281 +DH035,232.0,234.0,0.979,0.1223,2.684 +DH035,234.0,236.0,7.501,0.0963,12.022 +DH035,236.0,238.0,4.859,0.0868,8.289 +DH035,238.0,240.0,3.35,0.2543,9.262 +DH035,240.0,242.0,2.605,0.3712,6.831 +DH035,242.0,244.0,0.997,0.1442,2.274 +DH035,244.0,246.0,3.156,0.2411,6.161 +DH035,246.0,248.0,0.577,0.3065,1.285 +DH035,248.0,250.0,1.874,0.8749,5.216 +DH035,250.0,252.0,0.069,0.0097,0.088 +DH035,252.0,254.0,0.154,0.0199,0.174 +DH035,254.0,256.0,0.182,0.0216,0.195 +DH035,256.0,258.0,0.126,0.0043,0.143 +DH035,258.0,260.0,0.043,0.0121,0.051 +DH035,260.0,262.0,0.066,0.0472,0.09 +DH035,262.0,264.0,0.043,0.0268,0.028 +DH035,264.0,266.0,0.099,0.0173,0.05 +DH035,266.0,268.0,0.068,0.02,0.082 +DH035,268.0,270.0,0.216,0.0166,0.305 +DH035,270.0,272.0,0.06,0.0382,0.078 +DH035,272.0,274.0,0.026,0.0069,0.031 +DH035,274.0,276.0,0.094,0.018,0.077 +DH035,276.0,278.0,0.074,0.0368,0.079 +DH035,278.0,280.0,0.086,0.0325,0.063 +DH035,280.0,282.0,0.078,0.0196,0.095 +DH035,282.0,284.0,0.029,0.0161,0.024 +DH035,284.0,286.0,0.109,0.0331,0.156 +DH035,286.0,288.0,0.079,0.0257,0.071 +DH035,288.0,290.0,0.09,0.0273,0.102 +DH035,290.0,292.0,0.102,0.0296,0.144 +DH035,292.0,294.0,0.172,0.0587,0.143 +DH035,294.0,296.0,0.062,0.0237,0.081 +DH035,296.0,298.0,0.119,0.0387,0.145 +DH035,298.0,300.0,0.204,0.0462,0.212 +DH035,300.0,302.0,0.117,0.0162,0.073 +DH035,302.0,304.0,0.125,0.0251,0.15 +DH035,304.0,306.0,0.12,0.0287,0.079 +DH035,306.0,308.0,0.044,0.0278,0.059 +DH035,308.0,310.0,0.081,0.0388,0.066 +DH035,310.0,312.0,0.081,0.0133,0.099 +DH035,312.0,314.0,0.22,0.0174,0.242 +DH035,314.0,316.0,0.221,0.018,0.17 +DH035,316.0,318.0,0.127,0.012,0.161 +DH035,318.0,320.0,0.297,0.0143,0.35 +DH035,320.0,322.0,0.112,0.0169,0.129 +DH035,322.0,324.0,0.235,0.0242,0.196 +DH035,324.0,326.0,0.214,0.0158,0.157 +DH035,326.0,328.0,0.237,0.0196,0.189 +DH035,328.0,330.0,0.052,0.0222,0.031 +DH035,330.0,332.0,0.085,0.0132,0.069 +DH035,332.0,334.0,0.068,0.0058,0.039 +DH035,334.0,336.0,0.131,0.0218,0.107 +DH035,336.0,338.0,0.114,0.0118,0.162 +DH035,338.0,340.0,0.077,0.0156,0.089 +DH035,340.0,342.0,0.381,0.0125,0.491 +DH035,342.0,344.0,0.131,0.0113,0.189 +DH035,344.0,346.0,0.057,0.0268,0.052 +DH035,346.0,348.0,0.071,0.0289,0.059 +DH035,348.0,350.0,0.078,0.0086,0.08 +DH035,350.0,352.0,0.094,0.0273,0.124 +DH035,352.0,354.0,0.073,0.0097,0.066 +DH035,354.0,356.0,0.2,0.0156,0.145 +DH035,356.0,358.0,0.055,0.0082,0.04 +DH035,358.0,360.0,0.123,0.0089,0.065 +DH035,360.0,362.0,0.083,0.014,0.108 +DH035,362.0,364.0,0.047,0.0279,0.07 +DH035,364.0,366.0,0.065,0.0142,0.078 +DH035,366.0,368.0,0.114,0.0049,0.101 +DH035,368.0,370.0,0.029,0.0154,0.019 +DH035,370.0,372.0,0.066,0.0235,0.085 +DH035,372.0,374.0,0.052,0.0122,0.071 +DH035,374.0,376.0,0.033,0.0144,0.018 +DH035,376.0,378.0,0.033,0.0155,0.036 +DH035,378.0,380.0,0.273,0.014,0.319 +DH035,380.0,382.0,0.044,0.0184,0.035 +DH036,0.0,2.0,0.048,0.03,0.051 +DH036,2.0,4.0,0.137,0.0155,0.107 +DH036,4.0,6.0,0.072,0.038,0.038 +DH036,6.0,8.0,0.083,0.0146,0.109 +DH036,8.0,10.0,0.095,0.0276,0.111 +DH036,10.0,12.0,0.089,0.0201,0.124 +DH036,12.0,14.0,0.029,0.0115,0.036 +DH036,14.0,16.0,0.084,0.0117,0.065 +DH036,16.0,18.0,0.04,0.015,0.039 +DH036,18.0,20.0,0.129,0.0233,0.101 +DH036,20.0,22.0,0.068,0.0066,0.063 +DH036,22.0,24.0,0.052,0.0207,0.075 +DH036,24.0,26.0,0.1,0.0344,0.093 +DH036,26.0,28.0,0.057,0.0308,0.079 +DH036,28.0,30.0,0.071,0.0461,0.067 +DH036,30.0,32.0,0.073,0.013,0.08 +DH036,32.0,34.0,0.093,0.0185,0.061 +DH036,34.0,36.0,0.139,0.0241,0.2 +DH036,36.0,38.0,0.108,0.0242,0.144 +DH036,38.0,40.0,0.243,0.0099,0.293 +DH036,40.0,42.0,0.037,0.0174,0.022 +DH036,42.0,44.0,0.089,0.0217,0.127 +DH036,44.0,46.0,0.081,0.0368,0.096 +DH036,46.0,48.0,0.049,0.0282,0.062 +DH036,48.0,50.0,0.09,0.0305,0.13 +DH036,50.0,52.0,0.06,0.0133,0.055 +DH036,52.0,54.0,0.183,0.0078,0.157 +DH036,54.0,56.0,0.036,0.0369,0.051 +DH036,56.0,58.0,0.067,0.0082,0.077 +DH036,58.0,60.0,0.138,0.0208,0.105 +DH036,60.0,62.0,0.032,0.0155,0.017 +DH036,62.0,64.0,0.045,0.0254,0.042 +DH036,64.0,66.0,0.06,0.0263,0.083 +DH036,66.0,68.0,0.163,0.0506,0.159 +DH036,68.0,70.0,0.13,0.0352,0.136 +DH036,70.0,72.0,0.058,0.0137,0.038 +DH036,72.0,74.0,0.066,0.0166,0.054 +DH036,74.0,76.0,0.026,0.0113,0.018 +DH036,76.0,78.0,0.114,0.0108,0.075 +DH036,78.0,80.0,0.182,0.0179,0.269 +DH036,80.0,82.0,6.359,0.8855,18.324 +DH036,82.0,84.0,2.333,0.5337,4.473 +DH036,84.0,86.0,0.273,0.3181,0.555 +DH036,86.0,88.0,0.484,0.056,0.879 +DH036,88.0,90.0,0.817,0.2913,1.662 +DH036,90.0,92.0,2.703,0.2829,7.352 +DH036,92.0,94.0,2.627,0.1215,6.214 +DH036,94.0,96.0,1.962,0.2017,5.601 +DH036,96.0,98.0,8.348,0.2938,23.904 +DH036,98.0,100.0,0.162,0.1206,0.393 +DH036,100.0,102.0,0.926,0.2709,2.269 +DH036,102.0,104.0,20.693,0.3284,37.068 +DH036,104.0,106.0,5.25,0.5318,11.047 +DH036,106.0,108.0,0.613,0.1558,1.726 +DH036,108.0,110.0,1.047,0.1002,2.397 +DH036,110.0,112.0,0.666,0.0654,1.068 +DH036,112.0,114.0,1.68,0.101,3.852 +DH036,114.0,116.0,4.575,0.3533,9.723 +DH036,116.0,118.0,0.465,0.1408,1.008 +DH036,118.0,120.0,6.469,0.2959,18.957 +DH036,120.0,122.0,17.726,0.1516,38.898 +DH036,122.0,124.0,1.628,0.5045,4.361 +DH036,124.0,126.0,0.208,0.103,0.61 +DH036,126.0,128.0,0.262,0.4509,0.673 +DH036,128.0,130.0,1.634,0.4419,4.546 +DH036,130.0,132.0,2.858,0.2187,4.885 +DH036,132.0,134.0,4.242,0.4492,7.084 +DH036,134.0,136.0,3.717,0.2142,9.599 +DH036,136.0,138.0,6.536,0.0798,15.132 +DH036,138.0,140.0,5.512,0.0896,12.281 +DH036,140.0,142.0,28.382,0.2094,67.563 +DH036,142.0,144.0,5.819,0.1203,13.784 +DH036,144.0,146.0,4.153,0.1072,11.112 +DH036,146.0,148.0,0.839,0.3929,2.254 +DH036,148.0,150.0,0.1,0.3029,0.211 +DH036,150.0,152.0,12.183,0.3061,36.36 +DH036,152.0,154.0,0.949,0.1186,1.781 +DH036,154.0,156.0,1.444,0.6508,3.028 +DH036,156.0,158.0,0.512,0.1151,0.935 +DH036,158.0,160.0,1.821,0.187,2.951 +DH036,160.0,162.0,0.743,0.0373,1.998 +DH036,162.0,164.0,2.976,0.1828,6.091 +DH036,164.0,166.0,7.533,0.2543,16.203 +DH036,166.0,168.0,3.682,0.079,10.529 +DH036,168.0,170.0,6.612,0.5556,11.857 +DH036,170.0,172.0,4.12,0.0556,10.819 +DH036,172.0,174.0,0.706,0.6223,1.676 +DH036,174.0,176.0,0.711,0.2151,1.892 +DH036,176.0,178.0,6.56,0.0584,18.368 +DH036,178.0,180.0,2.33,0.0294,4.842 +DH036,180.0,182.0,4.53,0.5998,10.691 +DH036,182.0,184.0,2.7,0.3758,6.814 +DH036,184.0,186.0,6.675,0.2779,17.899 +DH036,186.0,188.0,2.637,0.1996,7.612 +DH036,188.0,190.0,1.444,0.2676,3.86 +DH036,190.0,192.0,0.722,0.2559,1.828 +DH036,192.0,194.0,5.816,0.3584,10.095 +DH036,194.0,196.0,2.876,0.1205,6.403 +DH036,196.0,198.0,1.087,0.2143,2.522 +DH036,198.0,200.0,2.663,0.4612,5.777 +DH036,200.0,202.0,1.416,0.8315,2.356 +DH036,202.0,204.0,1.294,0.0947,2.231 +DH036,204.0,206.0,1.321,0.3612,2.809 +DH036,206.0,208.0,0.465,0.1394,0.697 +DH036,208.0,210.0,5.405,1.5626,8.685 +DH036,210.0,212.0,0.66,0.207,1.125 +DH036,212.0,214.0,1.193,0.325,2.869 +DH036,214.0,216.0,4.322,0.1524,12.244 +DH036,216.0,218.0,12.921,0.0813,32.09 +DH036,218.0,220.0,5.77,0.2557,17.159 +DH036,220.0,222.0,11.251,0.1884,26.304 +DH036,222.0,224.0,1.533,0.1644,3.647 +DH036,224.0,226.0,2.713,0.1384,4.448 +DH036,226.0,228.0,4.142,0.8192,10.193 +DH036,228.0,230.0,0.849,0.0689,2.06 +DH036,230.0,232.0,4.926,0.1282,9.034 +DH036,232.0,234.0,11.329,0.0757,28.228 +DH036,234.0,236.0,1.899,0.0948,4.296 +DH036,236.0,238.0,5.23,0.0744,7.949 +DH036,238.0,240.0,9.045,0.3073,23.868 +DH036,240.0,242.0,0.998,0.4337,2.975 +DH036,242.0,244.0,2.978,0.2277,4.92 +DH036,244.0,246.0,1.106,0.1498,2.853 +DH036,246.0,248.0,3.761,0.159,10.387 +DH036,248.0,250.0,0.887,0.3429,1.767 +DH036,250.0,252.0,0.045,0.0287,0.03 +DH036,252.0,254.0,0.146,0.0153,0.073 +DH036,254.0,256.0,0.09,0.0366,0.075 +DH036,256.0,258.0,0.164,0.0134,0.155 +DH036,258.0,260.0,0.13,0.0365,0.194 +DH036,260.0,262.0,0.083,0.0264,0.087 +DH036,262.0,264.0,0.09,0.0202,0.091 +DH036,264.0,266.0,0.051,0.013,0.073 +DH036,266.0,268.0,0.031,0.0197,0.016 +DH036,268.0,270.0,0.13,0.0344,0.074 +DH036,270.0,272.0,0.192,0.0125,0.137 +DH036,272.0,274.0,0.143,0.0366,0.192 +DH036,274.0,276.0,0.11,0.0067,0.115 +DH036,276.0,278.0,0.115,0.0343,0.154 +DH036,278.0,280.0,0.142,0.0137,0.172 +DH036,280.0,282.0,0.113,0.0123,0.11 +DH036,282.0,284.0,0.03,0.0243,0.023 +DH036,284.0,286.0,0.073,0.0115,0.081 +DH036,286.0,288.0,0.06,0.0142,0.037 +DH036,288.0,290.0,0.051,0.023,0.068 +DH036,290.0,292.0,0.109,0.006,0.094 +DH036,292.0,294.0,0.075,0.0045,0.045 +DH036,294.0,296.0,0.049,0.0132,0.039 +DH036,296.0,298.0,0.055,0.0122,0.045 +DH036,298.0,300.0,0.134,0.0334,0.069 +DH036,300.0,302.0,0.081,0.0104,0.052 +DH036,302.0,304.0,0.094,0.0164,0.113 +DH036,304.0,306.0,0.099,0.0108,0.123 +DH036,306.0,308.0,0.072,0.0423,0.094 +DH036,308.0,310.0,0.268,0.033,0.148 +DH036,310.0,312.0,0.053,0.0129,0.077 +DH036,312.0,314.0,0.089,0.0136,0.106 +DH036,314.0,316.0,0.084,0.0279,0.114 +DH036,316.0,318.0,0.15,0.0235,0.129 +DH036,318.0,320.0,0.148,0.0176,0.168 +DH036,320.0,322.0,0.239,0.0158,0.28 +DH036,322.0,324.0,0.065,0.0072,0.065 +DH036,324.0,326.0,0.105,0.026,0.082 +DH036,326.0,328.0,0.163,0.0223,0.16 +DH036,328.0,330.0,0.117,0.0199,0.15 +DH036,330.0,332.0,0.109,0.0191,0.088 +DH036,332.0,334.0,0.074,0.0371,0.088 +DH036,334.0,336.0,0.092,0.0188,0.066 +DH036,336.0,338.0,0.23,0.0308,0.162 +DH036,338.0,340.0,0.021,0.0187,0.025 +DH036,340.0,342.0,0.124,0.0146,0.141 +DH036,342.0,344.0,0.119,0.0124,0.122 +DH036,344.0,346.0,0.092,0.0358,0.133 +DH036,346.0,348.0,0.156,0.0189,0.173 +DH037,0.0,2.0,0.029,0.0503,0.036 +DH037,2.0,4.0,0.108,0.0278,0.122 +DH037,4.0,6.0,0.072,0.0135,0.036 +DH037,6.0,8.0,0.115,0.0226,0.167 +DH037,8.0,10.0,0.087,0.0087,0.129 +DH037,10.0,12.0,0.039,0.0138,0.056 +DH037,12.0,14.0,0.105,0.0089,0.087 +DH037,14.0,16.0,0.034,0.025,0.029 +DH037,16.0,18.0,0.039,0.0301,0.043 +DH037,18.0,20.0,0.055,0.0068,0.069 +DH037,20.0,22.0,0.057,0.0396,0.073 +DH037,22.0,24.0,0.045,0.0197,0.065 +DH037,24.0,26.0,0.112,0.0112,0.082 +DH037,26.0,28.0,0.103,0.0439,0.125 +DH037,28.0,30.0,0.044,0.0136,0.056 +DH037,30.0,32.0,0.166,0.0062,0.086 +DH037,32.0,34.0,0.061,0.007,0.037 +DH037,34.0,36.0,0.058,0.0189,0.062 +DH037,36.0,38.0,0.102,0.0294,0.051 +DH037,38.0,40.0,0.054,0.0167,0.077 +DH037,40.0,42.0,0.153,0.017,0.163 +DH037,42.0,44.0,0.1,0.0233,0.06 +DH037,44.0,46.0,0.055,0.0131,0.051 +DH037,46.0,48.0,0.064,0.0146,0.035 +DH037,48.0,50.0,0.036,0.0512,0.026 +DH037,50.0,52.0,0.138,0.0173,0.072 +DH037,52.0,54.0,0.07,0.0281,0.076 +DH037,54.0,56.0,0.058,0.0454,0.073 +DH037,56.0,58.0,0.055,0.0087,0.074 +DH037,58.0,60.0,0.059,0.0514,0.046 +DH037,60.0,62.0,0.089,0.0199,0.121 +DH037,62.0,64.0,0.022,0.0204,0.015 +DH037,64.0,66.0,0.072,0.0197,0.076 +DH037,66.0,68.0,0.092,0.0181,0.112 +DH037,68.0,70.0,0.103,0.0262,0.147 +DH037,70.0,72.0,0.252,0.0357,0.179 +DH037,72.0,74.0,0.135,0.0186,0.16 +DH037,74.0,76.0,0.211,0.0274,0.27 +DH037,76.0,78.0,0.08,0.0244,0.052 +DH037,78.0,80.0,0.078,0.0138,0.087 +DH037,80.0,82.0,0.615,0.1051,1.329 +DH037,82.0,84.0,0.717,0.6052,2.113 +DH037,84.0,86.0,2.036,0.3319,3.057 +DH037,86.0,88.0,0.532,1.3159,1.38 +DH037,88.0,90.0,3.405,0.1125,7.193 +DH037,90.0,92.0,0.97,0.2412,2.609 +DH037,92.0,94.0,1.478,0.0697,3.857 +DH037,94.0,96.0,2.96,0.3215,6.194 +DH037,96.0,98.0,0.341,0.2087,0.735 +DH037,98.0,100.0,5.214,0.4606,14.182 +DH037,100.0,102.0,7.286,0.9445,11.34 +DH037,102.0,104.0,8.323,0.3312,24.92 +DH037,104.0,106.0,1.849,0.1115,2.89 +DH037,106.0,108.0,0.861,0.3622,2.388 +DH037,108.0,110.0,9.434,0.815,17.43 +DH037,110.0,112.0,0.528,2.3216,0.986 +DH037,112.0,114.0,2.913,0.2289,7.114 +DH037,114.0,116.0,0.219,0.1203,0.576 +DH037,116.0,118.0,0.943,0.1397,2.098 +DH037,118.0,120.0,1.645,0.2787,4.043 +DH037,120.0,122.0,4.515,0.1523,12.545 +DH037,122.0,124.0,3.79,0.0797,5.912 +DH037,124.0,126.0,1.81,0.1874,3.957 +DH037,126.0,128.0,4.767,0.3373,9.32 +DH037,128.0,130.0,2.466,0.0399,5.377 +DH037,130.0,132.0,3.999,0.1015,8.517 +DH037,132.0,134.0,4.843,0.5695,10.353 +DH037,134.0,136.0,3.274,0.4759,8.679 +DH037,136.0,138.0,3.649,0.1358,10.123 +DH037,138.0,140.0,0.322,0.4289,0.787 +DH037,140.0,142.0,7.088,0.1195,11.959 +DH037,142.0,144.0,11.119,0.2398,20.979 +DH037,144.0,146.0,3.746,0.0965,7.29 +DH037,146.0,148.0,0.243,0.1308,0.68 +DH037,148.0,150.0,6.013,0.3073,17.608 +DH037,150.0,152.0,13.037,0.1733,35.203 +DH037,152.0,154.0,2.409,0.2083,7.139 +DH037,154.0,156.0,27.065,0.158,64.656 +DH037,156.0,158.0,3.264,0.2908,8.628 +DH037,158.0,160.0,1.492,0.0127,2.728 +DH037,160.0,162.0,0.967,0.1839,1.674 +DH037,162.0,164.0,0.869,0.2704,1.474 +DH037,164.0,166.0,0.942,0.2514,1.772 +DH037,166.0,168.0,6.776,0.0764,18.412 +DH037,168.0,170.0,5.314,0.1337,9.393 +DH037,170.0,172.0,1.096,0.2058,2.269 +DH037,172.0,174.0,1.73,0.098,3.376 +DH037,174.0,176.0,10.929,0.0484,23.904 +DH037,176.0,178.0,7.414,0.7834,21.876 +DH037,178.0,180.0,5.921,0.8272,14.931 +DH037,180.0,182.0,14.814,0.1935,39.489 +DH037,182.0,184.0,0.939,0.497,1.732 +DH037,184.0,186.0,17.631,0.7064,39.696 +DH037,186.0,188.0,92.764,0.6575,248.91 +DH037,188.0,190.0,0.673,0.0656,1.876 +DH037,190.0,192.0,0.726,0.6716,1.831 +DH037,192.0,194.0,1.066,0.2001,3.048 +DH037,194.0,196.0,5.813,0.1105,11.331 +DH037,196.0,198.0,3.19,0.1131,7.162 +DH037,198.0,200.0,1.561,0.1008,2.874 +DH037,200.0,202.0,2.376,0.3094,3.823 +DH037,202.0,204.0,5.9,1.2686,17.088 +DH037,204.0,206.0,3.404,0.119,8.192 +DH037,206.0,208.0,9.851,0.2796,19.699 +DH037,208.0,210.0,0.682,0.4054,1.894 +DH037,210.0,212.0,0.451,0.2247,0.681 +DH037,212.0,214.0,3.511,0.157,7.553 +DH037,214.0,216.0,0.791,0.3684,1.219 +DH037,216.0,218.0,4.576,0.5744,12.168 +DH037,218.0,220.0,1.007,0.0578,2.45 +DH037,220.0,222.0,1.802,0.2047,4.894 +DH037,222.0,224.0,0.782,0.7548,2.276 +DH037,224.0,226.0,0.49,0.1566,0.947 +DH037,226.0,228.0,1.049,0.1168,1.628 +DH037,228.0,230.0,8.238,0.5741,19.314 +DH037,230.0,232.0,3.868,0.222,9.259 +DH037,232.0,234.0,1.558,0.0812,2.531 +DH037,234.0,236.0,14.339,0.1607,33.948 +DH037,236.0,238.0,7.889,0.5903,14.594 +DH037,238.0,240.0,1.863,0.2129,5.043 +DH037,240.0,242.0,3.537,0.1275,9.458 +DH037,242.0,244.0,1.971,0.0678,3.273 +DH037,244.0,246.0,6.699,0.1234,18.745 +DH037,246.0,248.0,23.717,0.1488,66.064 +DH037,248.0,250.0,6.856,0.1332,11.43 +DH037,250.0,252.0,0.124,0.0186,0.069 +DH037,252.0,254.0,0.072,0.0103,0.065 +DH037,254.0,256.0,0.125,0.0153,0.1 +DH037,256.0,258.0,0.033,0.0192,0.024 +DH037,258.0,260.0,0.142,0.0127,0.077 +DH037,260.0,262.0,0.301,0.0157,0.237 +DH038,0.0,2.0,0.117,0.0075,0.112 +DH038,2.0,4.0,0.149,0.0238,0.146 +DH038,4.0,6.0,0.07,0.0097,0.105 +DH038,6.0,8.0,0.154,0.0222,0.165 +DH038,8.0,10.0,0.201,0.0161,0.144 +DH038,10.0,12.0,0.096,0.0236,0.127 +DH038,12.0,14.0,0.191,0.0248,0.157 +DH038,14.0,16.0,0.091,0.0179,0.083 +DH038,16.0,18.0,0.195,0.0305,0.221 +DH038,18.0,20.0,0.027,0.0275,0.016 +DH038,20.0,22.0,0.084,0.0173,0.101 +DH038,22.0,24.0,0.103,0.0538,0.132 +DH038,24.0,26.0,0.13,0.0595,0.126 +DH038,26.0,28.0,0.056,0.0206,0.074 +DH038,28.0,30.0,0.194,0.0336,0.169 +DH038,30.0,32.0,0.049,0.0177,0.046 +DH038,32.0,34.0,0.009,0.0127,0.012 +DH038,34.0,36.0,0.06,0.0111,0.03 +DH038,36.0,38.0,0.101,0.0145,0.108 +DH038,38.0,40.0,0.085,0.0118,0.102 +DH038,40.0,42.0,0.072,0.032,0.044 +DH038,42.0,44.0,0.117,0.0192,0.115 +DH038,44.0,46.0,0.104,0.0129,0.084 +DH038,46.0,48.0,0.13,0.015,0.16 +DH038,48.0,50.0,0.113,0.0189,0.092 +DH038,50.0,52.0,0.096,0.0133,0.117 +DH038,52.0,54.0,0.066,0.0348,0.072 +DH038,54.0,56.0,0.145,0.021,0.096 +DH038,56.0,58.0,0.087,0.0105,0.062 +DH038,58.0,60.0,0.057,0.0369,0.056 +DH038,60.0,62.0,0.043,0.0188,0.041 +DH038,62.0,64.0,0.075,0.014,0.09 +DH038,64.0,66.0,0.081,0.0204,0.063 +DH038,66.0,68.0,0.044,0.0193,0.025 +DH038,68.0,70.0,0.199,0.0103,0.236 +DH038,70.0,72.0,0.085,0.0319,0.076 +DH038,72.0,74.0,0.123,0.0093,0.165 +DH038,74.0,76.0,0.022,0.0171,0.024 +DH038,76.0,78.0,0.183,0.0399,0.138 +DH038,78.0,80.0,0.033,0.0221,0.048 +DH038,80.0,82.0,3.939,0.5758,10.65 +DH038,82.0,84.0,0.782,0.2108,1.452 +DH038,84.0,86.0,33.68,0.2495,66.608 +DH038,86.0,88.0,1.279,0.0649,3.102 +DH038,88.0,90.0,0.578,0.295,1.696 +DH038,90.0,92.0,2.432,0.1191,5.982 +DH038,92.0,94.0,0.712,0.4263,1.367 +DH038,94.0,96.0,2.169,0.1416,3.647 +DH038,96.0,98.0,0.467,0.0648,1.145 +DH038,98.0,100.0,1.633,0.5369,3.126 +DH038,100.0,102.0,2.306,0.333,6.014 +DH038,102.0,104.0,27.779,0.2733,58.906 +DH038,104.0,106.0,2.824,0.0275,5.312 +DH038,106.0,108.0,8.261,0.3612,21.94 +DH038,108.0,110.0,4.851,0.5393,13.52 +DH038,110.0,112.0,3.807,0.1733,7.837 +DH038,112.0,114.0,7.198,0.3369,10.922 +DH038,114.0,116.0,0.975,0.4829,2.211 +DH038,116.0,118.0,2.135,0.2134,3.72 +DH038,118.0,120.0,0.561,0.35,0.923 +DH038,120.0,122.0,0.977,0.453,2.493 +DH038,122.0,124.0,6.425,0.242,10.41 +DH038,124.0,126.0,11.443,0.286,32.684 +DH038,126.0,128.0,7.454,0.7404,12.688 +DH038,128.0,130.0,4.668,0.3003,7.549 +DH038,130.0,132.0,0.333,0.265,0.849 +DH038,132.0,134.0,4.482,0.095,8.32 +DH038,134.0,136.0,1.535,0.0419,3.727 +DH038,136.0,138.0,0.716,0.9274,1.829 +DH038,138.0,140.0,1.693,0.3222,2.855 +DH038,140.0,142.0,7.389,0.27,21.805 +DH038,142.0,144.0,2.563,0.3554,6.539 +DH038,144.0,146.0,0.298,0.1772,0.617 +DH038,146.0,148.0,3.304,0.0717,9.537 +DH038,148.0,150.0,0.822,0.3631,2.254 +DH038,150.0,152.0,1.385,0.1032,4.109 +DH038,152.0,154.0,6.344,0.252,18.437 +DH038,154.0,156.0,2.459,0.1358,6.659 +DH038,156.0,158.0,1.955,0.4137,4.33 +DH038,158.0,160.0,2.289,0.5889,4.357 +DH038,160.0,162.0,0.871,0.0785,1.999 +DH038,162.0,164.0,0.486,1.1136,1.348 +DH038,164.0,166.0,1.984,0.8848,5.114 +DH038,166.0,168.0,1.888,1.1049,3.942 +DH038,168.0,170.0,41.937,0.4183,75.485 +DH038,170.0,172.0,11.044,0.2234,31.513 +DH038,172.0,174.0,1.938,0.1013,4.381 +DH038,174.0,176.0,2.214,0.8619,6.169 +DH038,176.0,178.0,37.907,0.0397,69.027 +DH039,0.0,2.0,0.066,0.0386,0.059 +DH039,2.0,4.0,0.034,0.0162,0.025 +DH039,4.0,6.0,0.036,0.0498,0.052 +DH039,6.0,8.0,0.091,0.0175,0.104 +DH039,8.0,10.0,0.05,0.0157,0.026 +DH039,10.0,12.0,0.192,0.0294,0.115 +DH039,12.0,14.0,0.149,0.0232,0.117 +DH039,14.0,16.0,0.092,0.0244,0.115 +DH039,16.0,18.0,0.109,0.0119,0.133 +DH039,18.0,20.0,0.026,0.0245,0.026 +DH039,20.0,22.0,0.121,0.0129,0.099 +DH039,22.0,24.0,0.077,0.0101,0.055 +DH039,24.0,26.0,0.088,0.0082,0.099 +DH039,26.0,28.0,0.154,0.0457,0.129 +DH039,28.0,30.0,0.066,0.0119,0.049 +DH039,30.0,32.0,0.064,0.0443,0.085 +DH039,32.0,34.0,0.072,0.0139,0.039 +DH039,34.0,36.0,0.178,0.0085,0.244 +DH039,36.0,38.0,0.2,0.0264,0.107 +DH039,38.0,40.0,0.229,0.0093,0.242 +DH039,40.0,42.0,0.079,0.0248,0.118 +DH039,42.0,44.0,0.07,0.0265,0.045 +DH039,44.0,46.0,0.174,0.0337,0.163 +DH039,46.0,48.0,0.135,0.0111,0.119 +DH039,48.0,50.0,0.122,0.0121,0.075 +DH039,50.0,52.0,0.061,0.0137,0.07 +DH039,52.0,54.0,0.05,0.0118,0.042 +DH039,54.0,56.0,0.088,0.0089,0.094 +DH039,56.0,58.0,0.064,0.0091,0.079 +DH039,58.0,60.0,0.141,0.0119,0.101 +DH039,60.0,62.0,0.12,0.0274,0.144 +DH039,62.0,64.0,0.142,0.0512,0.207 +DH039,64.0,66.0,0.168,0.0214,0.196 +DH039,66.0,68.0,0.079,0.0228,0.057 +DH039,68.0,70.0,0.052,0.009,0.073 +DH039,70.0,72.0,0.086,0.0132,0.074 +DH039,72.0,74.0,0.044,0.013,0.053 +DH039,74.0,76.0,0.143,0.0123,0.146 +DH039,76.0,78.0,0.051,0.0166,0.059 +DH039,78.0,80.0,0.115,0.0215,0.132 +DH039,80.0,82.0,0.61,0.3044,1.405 +DH039,82.0,84.0,5.087,0.1255,9.191 +DH039,84.0,86.0,0.458,0.1581,1.05 +DH039,86.0,88.0,0.489,0.1768,0.838 +DH039,88.0,90.0,0.249,0.1627,0.465 +DH039,90.0,92.0,25.786,0.2645,63.34 +DH039,92.0,94.0,2.94,0.3619,4.723 +DH039,94.0,96.0,0.341,0.6364,0.697 +DH039,96.0,98.0,2.055,0.2029,3.774 +DH039,98.0,100.0,0.5,0.3379,1.286 +DH039,100.0,102.0,5.337,0.21,14.847 +DH039,102.0,104.0,7.435,0.1628,20.682 +DH039,104.0,106.0,0.597,0.0687,1.038 +DH039,106.0,108.0,0.896,0.1666,1.581 +DH039,108.0,110.0,2.137,0.2217,4.069 +DH039,110.0,112.0,0.139,0.0664,0.292 +DH039,112.0,114.0,0.809,0.1854,1.618 +DH039,114.0,116.0,2.035,0.0775,5.979 +DH039,116.0,118.0,17.334,0.7603,41.766 +DH039,118.0,120.0,0.341,0.2852,0.584 +DH039,120.0,122.0,2.295,0.1414,5.661 +DH039,122.0,124.0,1.033,0.0893,2.858 +DH039,124.0,126.0,6.416,0.1776,19.013 +DH039,126.0,128.0,3.552,1.454,9.709 +DH039,128.0,130.0,6.06,0.23,9.279 +DH039,130.0,132.0,11.696,0.376,29.424 +DH039,132.0,134.0,3.837,0.436,7.057 +DH039,134.0,136.0,0.736,0.2983,2.193 +DH039,136.0,138.0,0.267,0.1797,0.418 +DH039,138.0,140.0,4.243,0.7913,10.408 +DH039,140.0,142.0,1.423,0.0784,4.237 +DH039,142.0,144.0,5.202,0.4075,9.084 +DH039,144.0,146.0,4.291,0.6195,11.297 +DH039,146.0,148.0,11.482,0.1248,17.501 +DH039,148.0,150.0,1.25,0.4207,3.463 +DH039,150.0,152.0,1.513,0.0504,3.073 +DH039,152.0,154.0,9.936,0.4623,19.599 +DH039,154.0,156.0,6.094,0.3905,14.315 +DH039,156.0,158.0,5.026,0.1321,12.714 +DH039,158.0,160.0,2.421,0.1706,4.968 +DH039,160.0,162.0,0.506,0.2682,1.278 +DH039,162.0,164.0,2.251,2.0378,4.783 +DH039,164.0,166.0,3.796,0.6269,7.599 +DH039,166.0,168.0,4.885,0.5253,12.867 +DH039,168.0,170.0,16.37,0.6228,38.485 +DH039,170.0,172.0,3.274,0.0647,6.71 +DH039,172.0,174.0,2.913,0.6564,5.489 +DH039,174.0,176.0,0.24,1.8402,0.362 +DH039,176.0,178.0,0.67,0.558,1.505 +DH039,178.0,180.0,1.746,0.2061,4.106 +DH039,180.0,182.0,0.587,0.1284,1.528 +DH039,182.0,184.0,1.899,0.1142,2.986 +DH039,184.0,186.0,8.064,0.0459,16.929 +DH039,186.0,188.0,42.72,1.133,110.682 +DH039,188.0,190.0,10.802,0.6347,28.532 +DH039,190.0,192.0,6.751,0.9332,13.877 +DH039,192.0,194.0,4.446,0.298,11.716 +DH039,194.0,196.0,2.265,0.2686,3.517 +DH039,196.0,198.0,8.519,0.3267,17.703 +DH039,198.0,200.0,0.812,0.1529,2.022 +DH039,200.0,202.0,0.954,0.4755,2.737 +DH039,202.0,204.0,8.778,0.1338,17.137 +DH039,204.0,206.0,8.7,0.2476,22.833 +DH039,206.0,208.0,1.859,0.1898,3.114 +DH039,208.0,210.0,4.922,0.0817,10.915 +DH039,210.0,212.0,1.36,0.8694,2.733 +DH039,212.0,214.0,3.257,0.1923,7.734 +DH039,214.0,216.0,4.903,0.0479,10.319 +DH039,216.0,218.0,8.374,0.146,21.648 +DH039,218.0,220.0,5.815,0.1828,16.676 +DH039,220.0,222.0,10.278,0.0877,27.544 +DH039,222.0,224.0,6.295,0.0833,11.748 +DH039,224.0,226.0,1.716,0.4492,4.35 +DH039,226.0,228.0,1.854,0.1521,4.877 +DH039,228.0,230.0,5.234,0.1014,13.518 +DH039,230.0,232.0,13.211,0.1239,20.601 +DH039,232.0,234.0,1.746,0.1967,4.895 +DH039,234.0,236.0,2.009,0.1677,5.362 +DH039,236.0,238.0,1.216,0.1305,2.566 +DH039,238.0,240.0,16.377,0.3942,40.434 +DH039,240.0,242.0,7.228,0.0627,17.511 +DH039,242.0,244.0,10.53,1.3352,29.426 +DH039,244.0,246.0,3.761,0.6268,6.57 +DH039,246.0,248.0,1.385,0.212,3.587 +DH039,248.0,250.0,0.797,0.1033,1.838 +DH039,250.0,252.0,0.126,0.0129,0.124 +DH039,252.0,254.0,0.187,0.0334,0.125 +DH039,254.0,256.0,0.078,0.0436,0.097 +DH039,256.0,258.0,0.144,0.0488,0.207 +DH039,258.0,260.0,0.045,0.0099,0.035 +DH039,260.0,262.0,0.126,0.0229,0.182 +DH039,262.0,264.0,0.107,0.0155,0.061 +DH039,264.0,266.0,0.167,0.0183,0.202 +DH039,266.0,268.0,0.083,0.0111,0.106 +DH039,268.0,270.0,0.082,0.0116,0.056 +DH039,270.0,272.0,0.053,0.0128,0.029 +DH039,272.0,274.0,0.061,0.0117,0.034 +DH039,274.0,276.0,0.093,0.0333,0.123 +DH039,276.0,278.0,0.123,0.0229,0.111 +DH039,278.0,280.0,0.109,0.0188,0.095 +DH039,280.0,282.0,0.044,0.0279,0.033 +DH039,282.0,284.0,0.196,0.0289,0.294 +DH039,284.0,286.0,0.096,0.0134,0.116 +DH039,286.0,288.0,0.018,0.0481,0.021 +DH039,288.0,290.0,0.11,0.0227,0.082 +DH039,290.0,292.0,0.067,0.0063,0.036 +DH039,292.0,294.0,0.072,0.0066,0.063 +DH039,294.0,296.0,0.043,0.0253,0.06 +DH039,296.0,298.0,0.266,0.0161,0.176 +DH039,298.0,300.0,0.072,0.0081,0.092 +DH039,300.0,302.0,0.129,0.0247,0.17 +DH039,302.0,304.0,0.034,0.0253,0.044 +DH039,304.0,306.0,0.136,0.016,0.099 +DH039,306.0,308.0,0.113,0.0182,0.069 +DH039,308.0,310.0,0.084,0.0179,0.055 +DH039,310.0,312.0,0.057,0.0133,0.051 +DH039,312.0,314.0,0.047,0.0163,0.035 +DH039,314.0,316.0,0.153,0.0214,0.17 +DH039,316.0,318.0,0.05,0.0636,0.028 +DH039,318.0,320.0,0.273,0.0498,0.231 +DH039,320.0,322.0,0.198,0.0159,0.117 +DH039,322.0,324.0,0.112,0.0111,0.088 +DH039,324.0,326.0,0.047,0.02,0.038 +DH039,326.0,328.0,0.104,0.0153,0.081 +DH039,328.0,330.0,0.035,0.012,0.02 +DH039,330.0,332.0,0.132,0.0224,0.152 +DH039,332.0,334.0,0.081,0.0124,0.078 +DH039,334.0,336.0,0.054,0.0226,0.075 +DH039,336.0,338.0,0.115,0.0135,0.11 +DH039,338.0,340.0,0.188,0.0301,0.119 +DH039,340.0,342.0,0.063,0.0751,0.091 +DH039,342.0,344.0,0.139,0.0216,0.123 +DH039,344.0,346.0,0.092,0.0142,0.121 +DH039,346.0,348.0,0.099,0.0699,0.143 +DH039,348.0,350.0,0.112,0.0244,0.07 +DH039,350.0,352.0,0.103,0.0459,0.113 +DH039,352.0,354.0,0.074,0.0071,0.059 +DH039,354.0,356.0,0.137,0.0111,0.165 +DH039,356.0,358.0,0.053,0.0154,0.027 +DH039,358.0,360.0,0.214,0.0119,0.308 +DH039,360.0,362.0,0.131,0.0243,0.184 +DH039,362.0,364.0,0.13,0.0139,0.144 +DH039,364.0,366.0,0.077,0.0162,0.057 +DH039,366.0,368.0,0.056,0.0215,0.073 +DH039,368.0,370.0,0.372,0.0581,0.2 +DH039,370.0,372.0,0.112,0.0184,0.156 +DH039,372.0,374.0,0.088,0.0179,0.12 +DH040,0.0,2.0,0.096,0.0179,0.05 +DH040,2.0,4.0,0.078,0.0153,0.074 +DH040,4.0,6.0,0.113,0.0368,0.103 +DH040,6.0,8.0,0.073,0.0249,0.098 +DH040,8.0,10.0,0.29,0.021,0.282 +DH040,10.0,12.0,0.049,0.0105,0.032 +DH040,12.0,14.0,0.102,0.0217,0.129 +DH040,14.0,16.0,0.056,0.0087,0.072 +DH040,16.0,18.0,0.038,0.0092,0.035 +DH040,18.0,20.0,0.106,0.0495,0.13 +DH040,20.0,22.0,0.194,0.0254,0.107 +DH040,22.0,24.0,0.369,0.0095,0.299 +DH040,24.0,26.0,0.067,0.0286,0.084 +DH040,26.0,28.0,0.13,0.0245,0.129 +DH040,28.0,30.0,0.115,0.0275,0.095 +DH040,30.0,32.0,0.207,0.0179,0.269 +DH040,32.0,34.0,0.053,0.0113,0.037 +DH040,34.0,36.0,0.05,0.0252,0.034 +DH040,36.0,38.0,0.166,0.008,0.24 +DH040,38.0,40.0,0.079,0.0136,0.111 +DH040,40.0,42.0,0.153,0.0264,0.116 +DH040,42.0,44.0,0.041,0.0107,0.026 +DH040,44.0,46.0,0.038,0.0173,0.048 +DH040,46.0,48.0,0.108,0.0265,0.145 +DH040,48.0,50.0,0.039,0.0273,0.02 +DH040,50.0,52.0,0.166,0.0197,0.226 +DH040,52.0,54.0,0.062,0.0222,0.09 +DH040,54.0,56.0,0.162,0.024,0.231 +DH040,56.0,58.0,0.072,0.0382,0.051 +DH040,58.0,60.0,0.037,0.0153,0.05 +DH040,60.0,62.0,0.079,0.0211,0.118 +DH040,62.0,64.0,0.039,0.012,0.035 +DH040,64.0,66.0,0.18,0.0321,0.17 +DH040,66.0,68.0,0.08,0.0339,0.081 +DH040,68.0,70.0,0.123,0.0304,0.107 +DH040,70.0,72.0,0.084,0.0161,0.051 +DH040,72.0,74.0,0.199,0.0147,0.195 +DH040,74.0,76.0,0.181,0.0085,0.108 +DH040,76.0,78.0,0.074,0.0193,0.079 +DH040,78.0,80.0,0.094,0.0209,0.051 +DH040,80.0,82.0,25.538,0.3147,50.964 +DH040,82.0,84.0,0.388,0.0691,0.895 +DH040,84.0,86.0,20.611,0.0995,35.182 +DH040,86.0,88.0,0.506,0.1256,1.253 +DH040,88.0,90.0,1.232,0.0785,1.991 +DH040,90.0,92.0,0.231,0.3267,0.472 +DH040,92.0,94.0,4.532,0.1078,11.434 +DH040,94.0,96.0,5.197,0.2244,8.834 +DH040,96.0,98.0,1.021,0.2602,1.699 +DH040,98.0,100.0,8.718,0.1818,15.102 +DH040,100.0,102.0,0.594,0.4001,0.92 +DH040,102.0,104.0,5.095,2.3995,11.805 +DH040,104.0,106.0,74.245,0.3304,175.521 +DH040,106.0,108.0,0.857,1.4799,2.289 +DH040,108.0,110.0,1.128,0.1896,3.27 +DH040,110.0,112.0,2.202,0.2943,4.948 +DH040,112.0,114.0,0.575,0.3737,1.087 +DH040,114.0,116.0,1.223,0.5261,2.979 +DH040,116.0,118.0,0.13,0.267,0.249 +DH040,118.0,120.0,0.439,0.0568,0.986 +DH040,120.0,122.0,3.879,0.2267,8.7 +DH040,122.0,124.0,7.587,0.9189,18.349 +DH040,124.0,126.0,0.516,0.3656,0.795 +DH040,126.0,128.0,9.97,0.0605,26.115 +DH040,128.0,130.0,7.295,0.4719,16.795 +DH040,130.0,132.0,4.147,0.12,8.01 +DH040,132.0,134.0,0.637,0.1216,1.055 +DH040,134.0,136.0,1.063,0.1507,2.942 +DH040,136.0,138.0,0.468,1.0713,1.076 +DH040,138.0,140.0,3.307,0.0546,8.975 +DH040,140.0,142.0,2.72,0.1564,4.174 +DH040,142.0,144.0,6.317,0.021,18.395 +DH040,144.0,146.0,1.929,0.201,4.307 +DH040,146.0,148.0,1.484,0.4927,2.437 +DH040,148.0,150.0,4.977,0.1302,9.895 +DH040,150.0,152.0,5.444,0.832,15.692 +DH040,152.0,154.0,9.778,1.7746,28.814 +DH040,154.0,156.0,0.594,0.2324,1.513 +DH040,156.0,158.0,1.651,0.7442,2.504 +DH040,158.0,160.0,3.324,0.1685,9.544 +DH040,160.0,162.0,2.872,0.0616,5.602 +DH040,162.0,164.0,0.507,0.1611,0.813 +DH040,164.0,166.0,7.495,0.506,14.878 +DH040,166.0,168.0,0.486,0.2063,1.412 +DH040,168.0,170.0,1.865,0.3745,5.21 +DH040,170.0,172.0,3.925,0.6107,8.213 +DH040,172.0,174.0,1.682,0.4488,4.215 +DH040,174.0,176.0,1.186,0.3022,2.753 +DH040,176.0,178.0,0.2,0.3173,0.551 +DH040,178.0,180.0,3.3,0.0653,9.615 +DH040,180.0,182.0,1.323,0.5836,2.827 +DH040,182.0,184.0,0.613,0.2986,1.632 +DH040,184.0,186.0,5.747,0.0993,15.257 +DH040,186.0,188.0,43.098,0.1843,81.766 +DH040,188.0,190.0,0.303,0.1128,0.467 +DH040,190.0,192.0,1.498,0.3648,3.182 +DH040,192.0,194.0,0.458,0.5027,1.014 +DH040,194.0,196.0,0.889,0.2681,2.44 +DH040,196.0,198.0,0.667,0.2511,1.657 +DH040,198.0,200.0,4.898,0.5754,13.032 +DH040,200.0,202.0,7.495,0.6468,22.374 +DH040,202.0,204.0,4.065,0.2531,6.964 +DH040,204.0,206.0,0.386,0.1786,0.69 +DH040,206.0,208.0,7.919,0.2044,18.139 +DH040,208.0,210.0,0.389,0.1929,0.945 +DH040,210.0,212.0,7.35,0.3653,20.942 +DH040,212.0,214.0,1.435,0.0548,2.343 +DH040,214.0,216.0,0.118,0.172,0.221 +DH040,216.0,218.0,1.301,1.2676,3.873 +DH040,218.0,220.0,7.686,0.1064,12.521 +DH040,220.0,222.0,4.677,0.105,8.856 +DH040,222.0,224.0,7.031,0.1382,18.642 +DH040,224.0,226.0,3.254,0.0925,8.685 +DH040,226.0,228.0,0.65,0.4471,1.638 +DH040,228.0,229.0,3.159,0.0734,6.964 +DH041,0.0,2.0,0.04,0.0158,0.031 +DH041,2.0,4.0,0.102,0.0076,0.091 +DH041,4.0,6.0,0.052,0.0239,0.073 +DH041,6.0,8.0,0.078,0.0126,0.067 +DH041,8.0,10.0,0.038,0.015,0.038 +DH041,10.0,12.0,0.071,0.0125,0.106 +DH041,12.0,14.0,0.054,0.0113,0.038 +DH041,14.0,16.0,0.319,0.0179,0.468 +DH041,16.0,18.0,0.128,0.0112,0.15 +DH041,18.0,20.0,0.056,0.0143,0.046 +DH041,20.0,22.0,0.037,0.0129,0.044 +DH041,22.0,24.0,0.08,0.0195,0.05 +DH041,24.0,26.0,0.145,0.013,0.143 +DH041,26.0,28.0,0.09,0.0138,0.119 +DH041,28.0,30.0,0.303,0.0274,0.263 +DH041,30.0,32.0,0.244,0.0205,0.243 +DH041,32.0,34.0,0.062,0.0265,0.08 +DH041,34.0,36.0,0.061,0.0192,0.088 +DH041,36.0,38.0,0.1,0.0157,0.073 +DH041,38.0,40.0,0.062,0.0154,0.074 +DH041,40.0,42.0,0.097,0.0378,0.064 +DH041,42.0,44.0,0.059,0.0178,0.078 +DH041,44.0,46.0,0.11,0.0189,0.129 +DH041,46.0,48.0,0.083,0.0231,0.058 +DH041,48.0,50.0,0.099,0.0083,0.081 +DH041,50.0,52.0,0.113,0.0414,0.069 +DH041,52.0,54.0,0.162,0.0292,0.083 +DH041,54.0,56.0,0.065,0.0106,0.055 +DH041,56.0,58.0,0.052,0.0098,0.038 +DH041,58.0,60.0,0.033,0.0197,0.047 +DH041,60.0,62.0,0.102,0.0229,0.073 +DH041,62.0,64.0,0.176,0.0294,0.228 +DH041,64.0,66.0,0.087,0.0158,0.071 +DH041,66.0,68.0,0.289,0.0101,0.25 +DH041,68.0,70.0,0.115,0.0313,0.086 +DH041,70.0,72.0,0.128,0.0368,0.127 +DH041,72.0,74.0,0.198,0.0285,0.221 +DH041,74.0,76.0,0.082,0.0213,0.084 +DH041,76.0,78.0,0.08,0.0401,0.1 +DH041,78.0,80.0,0.133,0.0215,0.173 +DH041,80.0,82.0,0.611,0.0572,1.548 +DH041,82.0,84.0,2.063,0.1153,4.533 +DH041,84.0,86.0,3.741,0.1942,7.581 +DH041,86.0,88.0,0.7,0.1844,1.246 +DH041,88.0,90.0,1.498,0.0862,2.258 +DH041,90.0,92.0,7.804,0.2304,19.081 +DH041,92.0,94.0,1.506,0.1095,3.511 +DH041,94.0,96.0,0.303,0.5741,0.815 +DH041,96.0,98.0,2.457,0.2827,7.178 +DH041,98.0,100.0,0.922,0.172,1.615 +DH041,100.0,102.0,45.318,0.5047,85.764 +DH041,102.0,104.0,11.464,0.6015,33.526 +DH041,104.0,106.0,1.703,0.2202,3.952 +DH041,106.0,108.0,1.701,0.2062,2.819 +DH041,108.0,110.0,7.836,0.0703,22.524 +DH041,110.0,112.0,0.244,0.0979,0.464 +DH041,112.0,114.0,3.331,0.1737,7.253 +DH041,114.0,116.0,11.301,0.2111,25.733 +DH041,116.0,118.0,1.293,0.3684,2.158 +DH041,118.0,120.0,19.202,0.5554,46.105 +DH041,120.0,122.0,0.863,0.3125,1.38 +DH041,122.0,124.0,4.278,0.1674,9.6 +DH041,124.0,126.0,2.248,1.5472,6.056 +DH041,126.0,128.0,0.441,1.1844,0.982 +DH041,128.0,130.0,3.512,0.3743,9.189 +DH041,130.0,132.0,0.255,0.2158,0.526 +DH041,132.0,134.0,3.578,0.8758,6.588 +DH041,134.0,136.0,2.281,0.5752,4.162 +DH041,136.0,138.0,2.021,0.1881,5.492 +DH041,138.0,140.0,0.123,0.2792,0.353 +DH041,140.0,142.0,2.647,0.294,5.007 +DH041,142.0,144.0,0.203,0.8437,0.54 +DH041,144.0,146.0,1.06,0.6613,1.959 +DH041,146.0,148.0,3.088,0.4129,7.199 +DH041,148.0,150.0,2.02,0.6287,5.83 +DH041,150.0,152.0,0.672,0.2376,1.899 +DH041,152.0,154.0,4.841,0.0741,13.442 +DH041,154.0,156.0,6.723,0.0938,16.827 +DH041,156.0,158.0,0.162,0.5058,0.371 +DH041,158.0,160.0,3.229,0.2844,8.447 +DH041,160.0,162.0,0.682,0.1555,1.092 +DH041,162.0,164.0,1.607,0.2717,2.626 +DH041,164.0,166.0,0.377,0.2216,0.677 +DH041,166.0,168.0,0.734,0.1912,1.556 +DH041,168.0,170.0,2.256,0.3826,5.994 +DH041,170.0,172.0,1.531,0.0873,3.535 +DH041,172.0,174.0,2.509,0.1008,5.765 +DH041,174.0,176.0,10.191,0.1316,24.706 +DH041,176.0,178.0,0.89,0.0583,2.48 +DH041,178.0,180.0,1.299,0.1123,2.131 +DH041,180.0,182.0,1.397,0.1279,3.126 +DH041,182.0,184.0,0.497,0.0652,1.287 +DH041,184.0,186.0,1.957,0.1867,3.49 +DH041,186.0,188.0,2.622,0.2149,4.184 +DH041,188.0,190.0,0.301,0.1274,0.486 +DH041,190.0,192.0,3.074,0.0529,5.14 +DH041,192.0,194.0,1.808,0.2162,3.826 +DH041,194.0,196.0,1.504,0.1308,4.222 +DH041,196.0,198.0,1.516,0.6944,3.501 +DH041,198.0,200.0,2.183,0.1997,6.21 +DH041,200.0,202.0,1.345,0.241,3.49 +DH041,202.0,204.0,7.835,0.5192,22.946 +DH041,204.0,206.0,0.54,0.2656,1.341 +DH041,206.0,208.0,1.194,0.1277,2.141 +DH041,208.0,210.0,5.069,0.5202,7.831 +DH041,210.0,212.0,1.192,0.4767,2.665 +DH041,212.0,214.0,0.902,0.1369,2.149 +DH041,214.0,216.0,1.205,0.4494,2.642 +DH041,216.0,218.0,4.734,0.1266,12.568 +DH041,218.0,220.0,1.867,0.187,4.289 +DH041,220.0,222.0,1.306,0.1413,3.611 +DH041,222.0,224.0,2.293,0.2017,4.916 +DH041,224.0,226.0,1.364,0.1336,2.927 +DH041,226.0,228.0,0.901,0.037,2.371 +DH041,228.0,230.0,1.592,0.1396,4.588 +DH041,230.0,232.0,0.084,0.7874,0.181 +DH041,232.0,234.0,1.047,0.1556,2.209 +DH041,234.0,236.0,4.21,0.1344,6.837 +DH041,236.0,238.0,28.119,0.4795,42.571 +DH041,238.0,240.0,2.748,0.3668,7.661 +DH041,240.0,242.0,0.182,0.1685,0.32 +DH041,242.0,244.0,1.834,0.4134,5.495 +DH041,244.0,246.0,0.441,0.1293,0.915 +DH041,246.0,248.0,6.041,0.8229,10.4 +DH041,248.0,250.0,6.029,0.3938,16.685 +DH041,250.0,252.0,0.081,0.015,0.075 +DH041,252.0,254.0,0.042,0.0218,0.058 +DH041,254.0,256.0,0.064,0.0255,0.041 +DH041,256.0,258.0,0.047,0.016,0.062 +DH041,258.0,260.0,0.044,0.0203,0.057 +DH041,260.0,262.0,0.052,0.0158,0.043 +DH041,262.0,264.0,0.088,0.0093,0.085 +DH041,264.0,266.0,0.078,0.0138,0.092 +DH041,266.0,268.0,0.044,0.0126,0.032 +DH041,268.0,270.0,0.18,0.0467,0.235 +DH041,270.0,272.0,0.05,0.019,0.031 +DH041,272.0,274.0,0.081,0.0173,0.084 +DH041,274.0,276.0,0.046,0.0202,0.033 +DH041,276.0,278.0,0.064,0.0077,0.036 +DH041,278.0,280.0,0.058,0.0294,0.044 +DH041,280.0,282.0,0.088,0.0181,0.109 +DH041,282.0,284.0,0.025,0.0156,0.031 +DH041,284.0,286.0,0.071,0.0119,0.056 +DH041,286.0,288.0,0.067,0.027,0.089 +DH041,288.0,290.0,0.059,0.0179,0.045 +DH041,290.0,292.0,0.106,0.0418,0.066 +DH041,292.0,294.0,0.166,0.0103,0.15 +DH041,294.0,296.0,0.023,0.0198,0.02 +DH041,296.0,298.0,0.018,0.0201,0.026 +DH041,298.0,300.0,0.114,0.0101,0.079 +DH041,300.0,302.0,0.083,0.0246,0.104 +DH041,302.0,304.0,0.103,0.0319,0.078 +DH041,304.0,306.0,0.097,0.0342,0.098 +DH041,306.0,308.0,0.042,0.0257,0.044 +DH041,308.0,310.0,0.178,0.0262,0.264 +DH041,310.0,312.0,0.056,0.0137,0.056 +DH041,312.0,314.0,0.226,0.0107,0.225 +DH041,314.0,316.0,0.065,0.0125,0.053 +DH041,316.0,318.0,0.143,0.0253,0.119 +DH041,318.0,320.0,0.111,0.0109,0.091 +DH041,320.0,322.0,0.078,0.0122,0.045 +DH041,322.0,324.0,0.058,0.0164,0.077 +DH041,324.0,326.0,0.153,0.0131,0.224 +DH041,326.0,328.0,0.156,0.0147,0.098 +DH041,328.0,330.0,0.062,0.0241,0.047 +DH041,330.0,332.0,0.064,0.0187,0.062 +DH041,332.0,334.0,0.078,0.0253,0.089 +DH041,334.0,336.0,0.145,0.0152,0.108 +DH041,336.0,338.0,0.042,0.015,0.024 +DH041,338.0,340.0,0.097,0.0137,0.142 +DH041,340.0,342.0,0.031,0.0121,0.042 +DH041,342.0,344.0,0.064,0.0113,0.052 +DH041,344.0,346.0,0.121,0.0176,0.165 +DH041,346.0,348.0,0.068,0.0552,0.083 +DH041,348.0,350.0,0.198,0.0076,0.226 +DH041,350.0,352.0,0.056,0.024,0.052 +DH041,352.0,354.0,0.1,0.0118,0.092 +DH041,354.0,356.0,0.119,0.0263,0.153 +DH041,356.0,358.0,0.089,0.0188,0.11 +DH041,358.0,360.0,0.237,0.0262,0.343 +DH041,360.0,362.0,0.083,0.0179,0.084 +DH041,362.0,364.0,0.051,0.0123,0.04 +DH041,364.0,366.0,0.054,0.0275,0.074 +DH041,366.0,368.0,0.134,0.0252,0.133 +DH041,368.0,370.0,0.062,0.0225,0.057 +DH041,370.0,372.0,0.032,0.0429,0.035 +DH041,372.0,374.0,0.145,0.0274,0.078 +DH041,374.0,376.0,0.068,0.0173,0.081 +DH041,376.0,378.0,0.046,0.0108,0.03 +DH041,378.0,380.0,0.122,0.0119,0.139 +DH041,380.0,382.0,0.077,0.011,0.064 +DH041,382.0,384.0,0.044,0.0209,0.066 +DH041,384.0,386.0,0.11,0.0248,0.145 +DH041,386.0,388.0,0.05,0.0221,0.057 +DH041,388.0,390.0,0.141,0.0222,0.135 +DH041,390.0,392.0,0.062,0.0312,0.069 +DH041,392.0,394.0,0.085,0.0235,0.074 +DH041,394.0,396.0,0.08,0.0286,0.097 +DH041,396.0,398.0,0.061,0.0246,0.049 +DH041,398.0,400.0,0.104,0.0275,0.067 +DH041,400.0,402.0,0.076,0.0278,0.044 +DH041,402.0,404.0,0.059,0.0183,0.033 +DH041,404.0,406.0,0.117,0.0338,0.12 +DH041,406.0,408.0,0.089,0.0164,0.049 +DH041,408.0,410.0,0.094,0.0124,0.086 +DH041,410.0,412.0,0.048,0.0246,0.061 +DH041,412.0,414.0,0.063,0.0187,0.089 +DH041,414.0,416.0,0.163,0.0147,0.21 +DH041,416.0,418.0,0.054,0.0275,0.08 +DH041,418.0,420.0,0.157,0.0382,0.201 +DH041,420.0,422.0,0.173,0.0413,0.101 +DH041,422.0,424.0,0.057,0.0087,0.034 +DH041,424.0,426.0,0.033,0.0075,0.02 +DH041,426.0,428.0,0.029,0.021,0.039 +DH041,428.0,430.0,0.03,0.0179,0.023 +DH041,430.0,431.0,0.027,0.0128,0.03 +DH042,0.0,2.0,0.066,0.0155,0.082 +DH042,2.0,4.0,0.298,0.0157,0.328 +DH042,4.0,6.0,0.071,0.0202,0.045 +DH042,6.0,8.0,0.118,0.0554,0.118 +DH042,8.0,10.0,0.061,0.0396,0.074 +DH042,10.0,12.0,0.132,0.0251,0.078 +DH042,12.0,14.0,0.259,0.0216,0.223 +DH042,14.0,16.0,0.054,0.0546,0.038 +DH042,16.0,18.0,0.111,0.0052,0.151 +DH042,18.0,20.0,0.14,0.0186,0.16 +DH042,20.0,22.0,0.05,0.0067,0.055 +DH042,22.0,24.0,0.069,0.0086,0.043 +DH042,24.0,26.0,0.116,0.0166,0.088 +DH042,26.0,28.0,0.084,0.0129,0.095 +DH042,28.0,30.0,0.128,0.0307,0.086 +DH042,30.0,32.0,0.055,0.0252,0.058 +DH042,32.0,34.0,0.054,0.0145,0.036 +DH042,34.0,36.0,0.188,0.0074,0.157 +DH042,36.0,38.0,0.165,0.0202,0.126 +DH042,38.0,40.0,0.104,0.0133,0.133 +DH042,40.0,42.0,0.034,0.0077,0.029 +DH042,42.0,44.0,0.085,0.0203,0.118 +DH042,44.0,46.0,0.05,0.0157,0.069 +DH042,46.0,48.0,0.073,0.0126,0.076 +DH042,48.0,50.0,0.092,0.0223,0.072 +DH042,50.0,52.0,0.074,0.0168,0.107 +DH042,52.0,54.0,0.047,0.0072,0.06 +DH042,54.0,56.0,0.056,0.0107,0.076 +DH042,56.0,58.0,0.075,0.0097,0.113 +DH042,58.0,60.0,0.031,0.0175,0.026 +DH042,60.0,62.0,0.097,0.0133,0.081 +DH042,62.0,64.0,0.081,0.036,0.044 +DH042,64.0,66.0,0.031,0.0206,0.016 +DH042,66.0,68.0,0.028,0.0108,0.015 +DH042,68.0,70.0,0.209,0.0261,0.187 +DH042,70.0,72.0,0.109,0.0066,0.131 +DH042,72.0,74.0,0.104,0.0199,0.068 +DH042,74.0,76.0,0.08,0.0217,0.05 +DH042,76.0,78.0,0.138,0.0215,0.182 +DH042,78.0,80.0,0.229,0.0277,0.284 +DH042,80.0,82.0,0.994,0.0624,2.514 +DH042,82.0,84.0,1.698,0.7172,3.995 +DH042,84.0,86.0,2.025,0.3086,3.824 +DH042,86.0,88.0,1.812,0.2973,4.023 +DH042,88.0,90.0,14.054,0.2291,22.887 +DH042,90.0,92.0,14.033,0.0942,42.032 +DH042,92.0,94.0,11.167,0.7346,22.884 +DH042,94.0,96.0,0.176,0.0972,0.493 +DH042,96.0,98.0,3.384,0.13,7.093 +DH042,98.0,100.0,4.643,0.1948,10.277 +DH042,100.0,102.0,6.442,0.3369,13.634 +DH042,102.0,104.0,5.225,0.2408,10.69 +DH042,104.0,106.0,2.668,0.6435,5.436 +DH042,106.0,108.0,3.862,0.1623,9.221 +DH042,108.0,110.0,8.937,0.4544,19.827 +DH042,110.0,112.0,5.252,0.3589,12.132 +DH042,112.0,114.0,0.817,0.0625,1.572 +DH042,114.0,116.0,1.799,0.4221,4.442 +DH042,116.0,118.0,0.624,0.2701,1.072 +DH042,118.0,120.0,0.725,0.0626,2.089 +DH042,120.0,122.0,3.803,0.3483,10.558 +DH042,122.0,124.0,2.733,0.0743,4.57 +DH042,124.0,126.0,2.317,0.2752,5.569 +DH042,126.0,128.0,0.626,0.1666,1.054 +DH042,128.0,130.0,0.839,0.2497,1.927 +DH042,130.0,132.0,1.649,0.2765,3.923 +DH042,132.0,134.0,1.013,0.7029,2.26 +DH042,134.0,136.0,6.12,0.5381,13.559 +DH042,136.0,138.0,0.713,0.174,1.597 +DH042,138.0,140.0,1.529,0.4049,2.644 +DH042,140.0,142.0,3.412,0.219,9.352 +DH042,142.0,144.0,0.087,0.6222,0.208 +DH042,144.0,146.0,0.237,0.3168,0.423 +DH042,146.0,148.0,5.593,0.5448,10.106 +DH042,148.0,150.0,0.779,0.1729,1.681 +DH042,150.0,152.0,0.178,0.2472,0.354 +DH042,152.0,154.0,6.482,0.3933,10.711 +DH042,154.0,156.0,0.082,0.8112,0.158 +DH042,156.0,158.0,11.041,0.0872,30.683 +DH042,158.0,160.0,18.985,0.1063,50.323 +DH042,160.0,162.0,4.191,0.4141,9.243 +DH042,162.0,164.0,2.91,0.096,7.923 +DH042,164.0,166.0,5.297,0.0522,13.763 +DH042,166.0,168.0,0.113,0.5104,0.268 +DH042,168.0,170.0,5.189,0.3356,13.711 +DH042,170.0,172.0,3.824,0.2082,6.822 +DH042,172.0,174.0,30.641,0.0763,85.115 +DH042,174.0,176.0,1.351,0.1515,3.625 +DH042,176.0,178.0,0.732,0.4484,1.485 +DH042,178.0,180.0,3.823,0.3719,7.006 +DH042,180.0,182.0,3.993,0.4768,9.017 +DH042,182.0,184.0,1.468,0.3293,2.83 +DH042,184.0,186.0,6.473,0.0567,9.817 +DH042,186.0,188.0,0.62,0.3495,1.564 +DH042,188.0,190.0,1.601,0.1245,4.4 +DH042,190.0,192.0,1.897,0.6985,5.315 +DH042,192.0,194.0,7.395,0.2688,12.296 +DH042,194.0,196.0,2.971,0.1521,6.357 +DH042,196.0,198.0,0.957,0.222,2.573 +DH042,198.0,200.0,0.407,0.1558,0.929 +DH042,200.0,202.0,4.818,0.2186,10.989 +DH042,202.0,204.0,0.503,0.1076,1.429 +DH042,204.0,206.0,4.107,0.2685,11.776 +DH042,206.0,208.0,1.676,0.7479,3.7 +DH042,208.0,210.0,1.831,0.0982,5.321 +DH042,210.0,212.0,2.243,0.2782,5.962 +DH042,212.0,214.0,3.545,0.1659,7.024 +DH042,214.0,216.0,25.956,0.143,77.552 +DH042,216.0,218.0,0.311,0.1682,0.566 +DH042,218.0,220.0,1.115,0.7276,1.673 +DH042,220.0,222.0,8.427,0.1217,18.166 +DH043,0.0,2.0,0.087,0.0233,0.089 +DH043,2.0,4.0,0.098,0.0246,0.131 +DH043,4.0,6.0,0.067,0.0141,0.089 +DH043,6.0,8.0,0.105,0.0142,0.104 +DH043,8.0,10.0,0.071,0.0108,0.066 +DH043,10.0,12.0,0.133,0.0062,0.161 +DH043,12.0,14.0,0.101,0.0091,0.107 +DH043,14.0,16.0,0.154,0.0169,0.101 +DH043,16.0,18.0,0.021,0.0275,0.013 +DH043,18.0,20.0,0.241,0.0166,0.202 +DH043,20.0,22.0,0.136,0.0172,0.173 +DH043,22.0,24.0,0.098,0.0192,0.135 +DH043,24.0,26.0,0.156,0.0141,0.107 +DH043,26.0,28.0,0.018,0.0154,0.019 +DH043,28.0,30.0,0.106,0.0155,0.068 +DH043,30.0,32.0,0.134,0.0223,0.068 +DH043,32.0,34.0,0.226,0.0265,0.123 +DH043,34.0,36.0,0.066,0.0272,0.05 +DH043,36.0,38.0,0.042,0.0286,0.045 +DH043,38.0,40.0,0.167,0.0396,0.247 +DH043,40.0,42.0,0.232,0.0217,0.273 +DH043,42.0,44.0,0.027,0.0184,0.014 +DH043,44.0,46.0,0.084,0.0071,0.065 +DH043,46.0,48.0,0.121,0.011,0.078 +DH043,48.0,50.0,0.106,0.032,0.141 +DH043,50.0,52.0,0.065,0.0201,0.06 +DH043,52.0,54.0,0.121,0.024,0.166 +DH043,54.0,56.0,0.02,0.0226,0.024 +DH043,56.0,58.0,0.071,0.0059,0.089 +DH043,58.0,60.0,0.054,0.0424,0.07 +DH043,60.0,62.0,0.051,0.0066,0.066 +DH043,62.0,64.0,0.125,0.0164,0.148 +DH043,64.0,66.0,0.067,0.0312,0.082 +DH043,66.0,68.0,0.031,0.0091,0.038 +DH043,68.0,70.0,0.144,0.0097,0.102 +DH043,70.0,72.0,0.093,0.0103,0.089 +DH043,72.0,74.0,0.08,0.0175,0.105 +DH043,74.0,76.0,0.247,0.0144,0.363 +DH043,76.0,78.0,0.104,0.0414,0.148 +DH043,78.0,80.0,0.137,0.0121,0.086 +DH043,80.0,82.0,0.552,0.2251,1.584 +DH043,82.0,84.0,4.617,0.9254,7.998 +DH043,84.0,86.0,0.202,0.1898,0.309 +DH043,86.0,88.0,2.836,0.1967,6.189 +DH043,88.0,90.0,2.621,0.2052,4.133 +DH043,90.0,92.0,0.274,0.2904,0.52 +DH043,92.0,94.0,0.624,0.2153,1.189 +DH043,94.0,96.0,1.052,0.1183,2.424 +DH043,96.0,98.0,1.697,0.1391,3.116 +DH043,98.0,100.0,1.904,0.4675,3.977 +DH043,100.0,102.0,1.674,0.2856,3.13 +DH043,102.0,104.0,4.009,0.2748,6.236 +DH043,104.0,106.0,1.841,0.2585,4.296 +DH043,106.0,108.0,0.346,0.2935,0.734 +DH043,108.0,110.0,1.576,0.511,4.317 +DH043,110.0,112.0,0.266,0.1277,0.548 +DH043,112.0,114.0,3.339,0.1223,6.615 +DH043,114.0,116.0,7.075,0.1065,11.802 +DH043,116.0,118.0,4.226,0.4886,10.125 +DH043,118.0,120.0,3.121,0.0385,5.815 +DH043,120.0,122.0,8.268,2.4789,12.617 +DH043,122.0,124.0,0.498,0.148,1.217 +DH043,124.0,126.0,0.996,0.1065,1.762 +DH043,126.0,128.0,3.578,0.1948,7.18 +DH043,128.0,130.0,0.996,0.1602,2.583 +DH043,130.0,132.0,0.953,0.3734,1.466 +DH043,132.0,134.0,0.271,0.5066,0.57 +DH043,134.0,136.0,0.423,0.1666,0.685 +DH043,136.0,138.0,5.014,0.1657,8.561 +DH043,138.0,140.0,1.774,0.0683,2.82 +DH043,140.0,142.0,4.927,0.1227,7.534 +DH043,142.0,144.0,7.163,0.2333,14.361 +DH043,144.0,146.0,73.805,0.2017,157.205 +DH043,146.0,148.0,0.679,0.038,1.346 +DH043,148.0,150.0,1.456,0.4495,3.533 +DH043,150.0,152.0,0.608,0.106,1.344 +DH043,152.0,154.0,2.046,0.1316,4.535 +DH043,154.0,156.0,1.878,0.7455,3.429 +DH043,156.0,158.0,2.768,0.7952,5.135 +DH043,158.0,160.0,3.323,2.0563,5.118 +DH043,160.0,162.0,8.311,0.1629,24.395 +DH043,162.0,164.0,1.652,0.3227,3.39 +DH043,164.0,166.0,6.974,0.3268,16.08 +DH043,166.0,168.0,2.79,0.0996,7.823 +DH043,168.0,170.0,6.26,0.1933,13.984 +DH043,170.0,172.0,13.839,0.2515,30.26 +DH043,172.0,174.0,1.098,0.1795,2.182 +DH043,174.0,176.0,1.254,0.2053,3.477 +DH043,176.0,178.0,4.447,0.5055,8.341 +DH043,178.0,180.0,0.087,0.1822,0.238 +DH043,180.0,182.0,1.071,0.7129,2.003 +DH043,182.0,184.0,0.836,0.4333,2.447 +DH043,184.0,186.0,0.874,1.1342,2.327 +DH043,186.0,187.0,6.829,0.3315,14.15 +DH044,0.0,2.0,0.175,0.0475,0.171 +DH044,2.0,4.0,0.08,0.0179,0.053 +DH044,4.0,6.0,0.148,0.0208,0.092 +DH044,6.0,8.0,0.159,0.0362,0.194 +DH044,8.0,10.0,0.051,0.0128,0.056 +DH044,10.0,12.0,0.046,0.0115,0.056 +DH044,12.0,14.0,0.428,0.0171,0.393 +DH044,14.0,16.0,0.041,0.0296,0.025 +DH044,16.0,18.0,0.046,0.0127,0.053 +DH044,18.0,20.0,0.051,0.0392,0.046 +DH044,20.0,22.0,0.054,0.0302,0.043 +DH044,22.0,24.0,0.058,0.0287,0.035 +DH044,24.0,26.0,0.128,0.0128,0.182 +DH044,26.0,28.0,0.266,0.014,0.35 +DH044,28.0,30.0,0.097,0.0222,0.126 +DH044,30.0,32.0,0.068,0.0393,0.084 +DH044,32.0,34.0,0.061,0.0109,0.071 +DH044,34.0,36.0,0.148,0.033,0.212 +DH044,36.0,38.0,0.031,0.0267,0.034 +DH044,38.0,40.0,0.091,0.0493,0.054 +DH044,40.0,42.0,0.124,0.011,0.072 +DH044,42.0,44.0,0.119,0.0451,0.153 +DH044,44.0,46.0,0.064,0.0143,0.059 +DH044,46.0,48.0,0.06,0.0359,0.036 +DH044,48.0,50.0,0.033,0.0187,0.042 +DH044,50.0,52.0,0.051,0.0228,0.071 +DH044,52.0,54.0,0.14,0.0359,0.198 +DH044,54.0,56.0,0.084,0.0125,0.043 +DH044,56.0,58.0,0.1,0.0296,0.134 +DH044,58.0,60.0,0.124,0.0119,0.168 +DH044,60.0,62.0,0.112,0.0388,0.056 +DH044,62.0,64.0,0.033,0.0519,0.039 +DH044,64.0,66.0,0.091,0.0102,0.057 +DH044,66.0,68.0,0.124,0.0236,0.1 +DH044,68.0,70.0,0.079,0.0135,0.118 +DH044,70.0,72.0,0.14,0.0141,0.156 +DH044,72.0,74.0,0.097,0.0143,0.052 +DH044,74.0,76.0,0.042,0.011,0.026 +DH044,76.0,78.0,0.07,0.0638,0.102 +DH044,78.0,80.0,0.041,0.0085,0.028 +DH044,80.0,82.0,1.382,0.6474,2.66 +DH044,82.0,84.0,0.206,0.0987,0.515 +DH044,84.0,86.0,3.783,0.0961,5.723 +DH044,86.0,88.0,0.448,0.2242,1.28 +DH044,88.0,90.0,12.856,0.2716,21.068 +DH044,90.0,92.0,13.351,0.1927,38.599 +DH044,92.0,94.0,1.067,0.2399,1.794 +DH044,94.0,96.0,3.276,0.4245,8.334 +DH044,96.0,98.0,1.149,0.2968,2.119 +DH044,98.0,100.0,0.36,0.296,0.967 +DH044,100.0,102.0,1.907,0.3385,5.089 +DH044,102.0,104.0,1.835,0.0909,3.7 +DH044,104.0,106.0,4.49,0.2489,7.036 +DH044,106.0,108.0,0.868,0.3658,1.663 +DH044,108.0,110.0,5.492,0.4509,8.433 +DH044,110.0,112.0,6.956,0.2493,14.638 +DH044,112.0,114.0,0.161,0.1026,0.379 +DH044,114.0,116.0,1.518,0.2445,2.596 +DH044,116.0,118.0,3.136,0.129,6.798 +DH044,118.0,120.0,19.514,0.1682,35.773 +DH044,120.0,122.0,0.978,0.2389,1.607 +DH044,122.0,124.0,0.279,0.0696,0.709 +DH044,124.0,126.0,10.362,0.8024,25.804 +DH044,126.0,128.0,0.678,0.1572,1.895 +DH044,128.0,130.0,0.355,0.2737,0.554 +DH044,130.0,132.0,23.337,0.2088,69.023 +DH044,132.0,134.0,1.923,0.178,4.798 +DH044,134.0,136.0,3.362,0.0845,6.346 +DH044,136.0,138.0,4.864,0.6947,9.377 +DH044,138.0,140.0,7.781,0.1564,22.369 +DH044,140.0,142.0,11.217,0.0745,17.909 +DH044,142.0,144.0,8.62,0.1885,24.655 +DH044,144.0,146.0,1.619,0.2451,3.304 +DH044,146.0,148.0,6.747,0.2252,10.626 +DH044,148.0,150.0,3.354,0.4437,6.035 +DH044,150.0,152.0,17.926,0.2661,40.074 +DH044,152.0,154.0,16.304,0.224,29.887 +DH044,154.0,156.0,1.076,0.3171,1.759 +DH044,156.0,158.0,1.114,0.1434,2.991 +DH044,158.0,160.0,1.199,0.4414,3.54 +DH044,160.0,162.0,9.962,0.2772,25.131 +DH044,162.0,164.0,4.631,0.2071,12.423 +DH044,164.0,166.0,19.418,0.4686,53.377 +DH044,166.0,168.0,7.702,0.1544,18.753 +DH044,168.0,170.0,0.509,0.3713,1.351 +DH044,170.0,172.0,1.345,0.0303,3.783 +DH044,172.0,174.0,0.608,0.125,1.529 +DH044,174.0,176.0,0.647,0.1057,1.495 +DH044,176.0,178.0,6.34,0.1617,12.865 +DH044,178.0,180.0,0.48,0.0697,1.035 +DH044,180.0,182.0,0.306,0.2921,0.492 +DH044,182.0,184.0,0.41,0.3024,1.057 +DH044,184.0,186.0,7.854,0.4494,20.041 +DH044,186.0,188.0,3.1,0.332,6.23 +DH044,188.0,190.0,2.712,0.082,5.346 +DH044,190.0,192.0,3.477,0.7453,8.752 +DH044,192.0,194.0,4.919,0.2378,13.859 +DH044,194.0,196.0,0.392,0.1144,0.993 +DH044,196.0,198.0,4.436,0.4752,7.113 +DH044,198.0,200.0,9.2,0.2364,15.426 +DH044,200.0,202.0,2.096,0.1249,4.028 +DH044,202.0,204.0,1.446,0.2062,3.06 +DH044,204.0,206.0,0.915,0.4825,2.216 +DH044,206.0,208.0,3.215,0.2075,7.096 +DH044,208.0,210.0,0.428,0.0656,0.669 +DH044,210.0,212.0,1.392,0.2075,2.267 +DH044,212.0,214.0,6.655,0.2835,18.716 +DH044,214.0,216.0,1.097,0.2705,2.861 +DH044,216.0,218.0,4.063,0.1009,11.019 +DH044,218.0,220.0,0.432,0.1969,0.932 +DH044,220.0,222.0,2.921,0.1567,7.16 +DH044,222.0,224.0,2.52,0.2352,6.696 +DH044,224.0,226.0,0.639,0.243,1.408 +DH044,226.0,228.0,4.44,0.0923,12.044 +DH044,228.0,230.0,0.118,0.8518,0.31 +DH044,230.0,232.0,0.527,0.2834,0.823 +DH044,232.0,234.0,1.584,0.4557,3.378 +DH044,234.0,236.0,1.378,0.1752,3.69 +DH044,236.0,238.0,0.218,0.2188,0.618 +DH044,238.0,240.0,8.116,0.0798,17.253 +DH044,240.0,242.0,9.433,0.2821,23.861 +DH044,242.0,244.0,3.835,0.3218,7.623 +DH044,244.0,246.0,2.484,0.0994,5.27 +DH044,246.0,248.0,1.128,0.2043,2.791 +DH044,248.0,250.0,0.831,0.1483,1.525 +DH044,250.0,252.0,0.059,0.0298,0.037 +DH044,252.0,254.0,0.045,0.0475,0.039 +DH044,254.0,256.0,0.081,0.0462,0.051 +DH044,256.0,258.0,0.184,0.0254,0.138 +DH044,258.0,260.0,0.076,0.0063,0.087 +DH044,260.0,262.0,0.094,0.0206,0.129 +DH044,262.0,264.0,0.097,0.0251,0.127 +DH044,264.0,266.0,0.114,0.0175,0.119 +DH044,266.0,268.0,0.147,0.0154,0.133 +DH044,268.0,270.0,0.074,0.025,0.074 +DH044,270.0,272.0,0.09,0.0398,0.082 +DH044,272.0,274.0,0.248,0.0199,0.222 +DH044,274.0,276.0,0.088,0.0157,0.099 +DH044,276.0,278.0,0.139,0.0548,0.152 +DH044,278.0,280.0,0.114,0.0167,0.136 +DH044,280.0,282.0,0.08,0.0209,0.089 +DH044,282.0,284.0,0.06,0.022,0.056 +DH044,284.0,286.0,0.144,0.0083,0.12 +DH044,286.0,288.0,0.117,0.0126,0.069 +DH044,288.0,290.0,0.031,0.0174,0.039 +DH044,290.0,292.0,0.11,0.0109,0.136 +DH044,292.0,294.0,0.091,0.0238,0.133 +DH044,294.0,296.0,0.066,0.027,0.066 +DH044,296.0,298.0,0.181,0.0178,0.176 +DH044,298.0,300.0,0.079,0.0191,0.052 +DH044,300.0,302.0,0.033,0.0157,0.022 +DH044,302.0,304.0,0.077,0.0157,0.094 +DH044,304.0,306.0,0.043,0.0339,0.03 +DH044,306.0,308.0,0.072,0.018,0.09 +DH044,308.0,310.0,0.092,0.0136,0.086 +DH044,310.0,312.0,0.066,0.0156,0.084 +DH044,312.0,314.0,0.021,0.0192,0.027 +DH044,314.0,316.0,0.027,0.0154,0.021 +DH044,316.0,318.0,0.176,0.014,0.097 +DH044,318.0,320.0,0.188,0.0134,0.237 +DH044,320.0,322.0,0.232,0.0205,0.294 +DH044,322.0,324.0,0.064,0.0258,0.072 +DH044,324.0,326.0,0.027,0.0153,0.04 +DH044,326.0,328.0,0.088,0.0116,0.082 +DH044,328.0,330.0,0.084,0.0098,0.047 +DH044,330.0,332.0,0.119,0.0325,0.173 +DH044,332.0,334.0,0.042,0.0486,0.037 +DH044,334.0,336.0,0.087,0.0127,0.111 +DH044,336.0,338.0,0.23,0.0208,0.303 +DH044,338.0,340.0,0.084,0.011,0.047 +DH044,340.0,342.0,0.042,0.0204,0.055 +DH044,342.0,344.0,0.09,0.0157,0.12 +DH044,344.0,346.0,0.102,0.0099,0.099 +DH044,346.0,348.0,0.141,0.0159,0.161 +DH044,348.0,350.0,0.074,0.0263,0.038 +DH044,350.0,352.0,0.053,0.0129,0.06 +DH044,352.0,354.0,0.098,0.018,0.09 +DH044,354.0,356.0,0.084,0.018,0.09 +DH044,356.0,358.0,0.159,0.0144,0.161 +DH044,358.0,360.0,0.024,0.0164,0.014 +DH044,360.0,362.0,0.046,0.0615,0.058 +DH044,362.0,364.0,0.171,0.0281,0.162 +DH044,364.0,366.0,0.073,0.0409,0.078 +DH044,366.0,368.0,0.084,0.0209,0.043 +DH044,368.0,370.0,0.085,0.0179,0.078 +DH044,370.0,372.0,0.233,0.01,0.163 +DH044,372.0,374.0,0.066,0.0346,0.052 +DH044,374.0,376.0,0.105,0.0169,0.077 +DH044,376.0,378.0,0.233,0.0114,0.207 +DH044,378.0,380.0,0.044,0.0094,0.039 +DH044,380.0,382.0,0.057,0.0102,0.058 +DH044,382.0,384.0,0.034,0.0195,0.026 +DH044,384.0,386.0,0.019,0.0141,0.024 +DH044,386.0,388.0,0.043,0.0237,0.045 +DH044,388.0,390.0,0.045,0.0182,0.025 +DH044,390.0,392.0,0.049,0.0165,0.063 +DH044,392.0,394.0,0.049,0.023,0.064 +DH044,394.0,396.0,0.075,0.0229,0.102 +DH044,396.0,398.0,0.06,0.0227,0.053 +DH044,398.0,399.0,0.06,0.0105,0.055 +DH045,0.0,2.0,0.068,0.0241,0.053 +DH045,2.0,4.0,0.063,0.0313,0.058 +DH045,4.0,6.0,0.168,0.0355,0.197 +DH045,6.0,8.0,0.074,0.0655,0.047 +DH045,8.0,10.0,0.095,0.0181,0.091 +DH045,10.0,12.0,0.179,0.0138,0.221 +DH045,12.0,14.0,0.165,0.0248,0.191 +DH045,14.0,16.0,0.067,0.0048,0.067 +DH045,16.0,18.0,0.069,0.0173,0.048 +DH045,18.0,20.0,0.071,0.0136,0.064 +DH045,20.0,22.0,0.17,0.0178,0.211 +DH045,22.0,24.0,0.058,0.0204,0.045 +DH045,24.0,26.0,0.285,0.02,0.319 +DH045,26.0,28.0,0.064,0.0393,0.057 +DH045,28.0,30.0,0.136,0.01,0.156 +DH045,30.0,32.0,0.043,0.0208,0.042 +DH045,32.0,34.0,0.078,0.0317,0.052 +DH045,34.0,36.0,0.039,0.0071,0.04 +DH045,36.0,38.0,0.212,0.0113,0.158 +DH045,38.0,40.0,0.082,0.0069,0.111 +DH045,40.0,42.0,0.13,0.0195,0.191 +DH045,42.0,44.0,0.04,0.0194,0.02 +DH045,44.0,46.0,0.075,0.0151,0.077 +DH045,46.0,48.0,0.091,0.0213,0.092 +DH045,48.0,50.0,0.169,0.01,0.148 +DH045,50.0,52.0,0.151,0.0114,0.178 +DH045,52.0,54.0,0.057,0.0133,0.041 +DH045,54.0,56.0,0.058,0.0253,0.08 +DH045,56.0,58.0,0.111,0.0143,0.139 +DH045,58.0,60.0,0.06,0.0288,0.06 +DH045,60.0,62.0,0.023,0.0215,0.031 +DH045,62.0,64.0,0.059,0.0334,0.069 +DH045,64.0,66.0,0.123,0.0438,0.092 +DH045,66.0,68.0,0.072,0.0174,0.063 +DH045,68.0,70.0,0.105,0.0535,0.07 +DH045,70.0,72.0,0.055,0.0137,0.028 +DH045,72.0,74.0,0.024,0.0144,0.02 +DH045,74.0,76.0,0.095,0.0484,0.084 +DH045,76.0,78.0,0.026,0.0116,0.026 +DH045,78.0,80.0,0.087,0.0413,0.084 +DH045,80.0,82.0,6.795,0.1876,20.17 +DH045,82.0,84.0,0.759,0.4841,1.598 +DH045,84.0,86.0,0.392,0.3586,0.793 +DH045,86.0,88.0,1.366,0.779,2.766 +DH045,88.0,90.0,0.529,0.1984,1.027 +DH045,90.0,92.0,0.999,0.2483,2.505 +DH045,92.0,94.0,1.447,0.2788,4.168 +DH045,94.0,96.0,1.96,0.1331,4.329 +DH045,96.0,98.0,5.565,0.8748,10.962 +DH045,98.0,100.0,3.314,0.1336,9.756 +DH045,100.0,102.0,7.912,0.036,18.456 +DH045,102.0,104.0,5.371,0.0898,8.291 +DH045,104.0,106.0,3.499,0.0697,5.513 +DH045,106.0,108.0,3.667,0.3813,6.331 +DH045,108.0,110.0,2.428,0.2811,4.514 +DH045,110.0,112.0,2.145,0.118,5.427 +DH045,112.0,114.0,5.053,0.3846,13.241 +DH045,114.0,116.0,1.498,0.1438,3.501 +DH045,116.0,118.0,0.325,0.0659,0.703 +DH045,118.0,120.0,0.417,0.0944,0.867 +DH045,120.0,122.0,1.357,0.4532,3.575 +DH045,122.0,124.0,0.854,0.4854,2.496 +DH045,124.0,126.0,0.409,0.273,0.842 +DH045,126.0,128.0,0.914,0.9956,2.242 +DH045,128.0,130.0,1.714,0.2388,5.01 +DH045,130.0,132.0,0.959,0.1459,2.61 +DH045,132.0,134.0,0.361,0.4929,0.605 +DH045,134.0,136.0,1.657,0.0621,3.551 +DH045,136.0,138.0,10.561,0.5146,21.574 +DH045,138.0,140.0,0.391,0.0962,0.893 +DH045,140.0,142.0,5.251,0.1177,14.28 +DH045,142.0,144.0,0.573,0.8408,0.949 +DH045,144.0,146.0,2.311,0.2386,5.025 +DH045,146.0,148.0,0.71,0.5681,1.181 +DH045,148.0,150.0,9.015,0.0566,15.399 +DH045,150.0,152.0,15.651,0.3898,42.316 +DH045,152.0,154.0,0.632,0.124,1.502 +DH045,154.0,156.0,3.923,0.4548,8.135 +DH045,156.0,158.0,1.587,0.412,2.706 +DH045,158.0,160.0,1.815,0.072,2.903 +DH045,160.0,162.0,3.774,0.1374,6.214 +DH045,162.0,164.0,2.982,0.2755,5.463 +DH045,164.0,166.0,4.965,0.2822,11.307 +DH045,166.0,168.0,24.056,0.1241,61.728 +DH045,168.0,170.0,2.012,0.321,3.175 +DH045,170.0,172.0,1.531,0.3611,3.513 +DH045,172.0,174.0,1.031,0.6105,2.076 +DH045,174.0,176.0,1.321,0.5395,2.071 +DH045,176.0,178.0,2.15,0.1583,3.88 +DH045,178.0,180.0,1.252,0.4093,2.667 +DH045,180.0,182.0,1.419,0.9644,3.398 +DH045,182.0,184.0,0.41,0.4426,1.122 +DH045,184.0,186.0,13.332,0.2421,31.104 +DH045,186.0,188.0,0.713,0.0604,1.282 +DH045,188.0,190.0,0.453,0.3334,1.034 +DH045,190.0,192.0,1.258,0.3354,2.19 +DH045,192.0,194.0,8.802,0.1344,19.872 +DH045,194.0,196.0,1.038,0.2542,2.251 +DH046,0.0,2.0,0.064,0.0149,0.073 +DH046,2.0,4.0,0.082,0.0236,0.093 +DH046,4.0,6.0,0.058,0.0202,0.035 +DH046,6.0,8.0,0.115,0.0159,0.136 +DH046,8.0,10.0,0.094,0.0408,0.132 +DH046,10.0,12.0,0.086,0.013,0.059 +DH046,12.0,14.0,0.07,0.0085,0.072 +DH046,14.0,16.0,0.092,0.0122,0.047 +DH046,16.0,18.0,0.079,0.0178,0.106 +DH046,18.0,20.0,0.037,0.0506,0.052 +DH046,20.0,22.0,0.116,0.0195,0.072 +DH046,22.0,24.0,0.044,0.0141,0.057 +DH046,24.0,26.0,0.036,0.0119,0.051 +DH046,26.0,28.0,0.109,0.0229,0.144 +DH046,28.0,30.0,0.031,0.024,0.031 +DH046,30.0,32.0,0.067,0.0103,0.077 +DH046,32.0,34.0,0.104,0.0163,0.101 +DH046,34.0,36.0,0.143,0.0201,0.136 +DH046,36.0,38.0,0.054,0.0139,0.068 +DH046,38.0,40.0,0.092,0.0204,0.135 +DH046,40.0,42.0,0.133,0.0185,0.088 +DH046,42.0,44.0,0.128,0.0125,0.188 +DH046,44.0,46.0,0.075,0.039,0.071 +DH046,46.0,48.0,0.195,0.0117,0.145 +DH046,48.0,50.0,0.046,0.0311,0.065 +DH046,50.0,52.0,0.126,0.0179,0.165 +DH046,52.0,54.0,0.015,0.0642,0.019 +DH046,54.0,56.0,0.014,0.0213,0.015 +DH046,56.0,58.0,0.053,0.0129,0.034 +DH046,58.0,60.0,0.169,0.0193,0.183 +DH046,60.0,62.0,0.162,0.0163,0.113 +DH046,62.0,64.0,0.072,0.0238,0.081 +DH046,64.0,66.0,0.12,0.0282,0.103 +DH046,66.0,68.0,0.07,0.0238,0.103 +DH046,68.0,70.0,0.034,0.0234,0.033 +DH046,70.0,72.0,0.041,0.0302,0.035 +DH046,72.0,74.0,0.034,0.0262,0.019 +DH046,74.0,76.0,0.079,0.0156,0.097 +DH046,76.0,78.0,0.077,0.0145,0.095 +DH046,78.0,80.0,0.067,0.0107,0.06 +DH046,80.0,82.0,2.563,0.3084,7.075 +DH046,82.0,84.0,2.972,0.1527,6.079 +DH046,84.0,86.0,3.169,0.2031,8.366 +DH046,86.0,88.0,3.05,0.3381,6.919 +DH046,88.0,90.0,1.814,0.1175,2.941 +DH046,90.0,92.0,6.159,0.159,12.543 +DH046,92.0,94.0,8.949,0.105,15.307 +DH046,94.0,96.0,4.012,0.2237,6.766 +DH046,96.0,98.0,8.574,0.3049,25.197 +DH046,98.0,100.0,5.719,0.0408,14.814 +DH046,100.0,102.0,0.453,0.0942,0.899 +DH046,102.0,104.0,3.832,0.2379,7.409 +DH046,104.0,106.0,10.99,0.2162,27.904 +DH046,106.0,108.0,9.765,0.2659,19.787 +DH046,108.0,110.0,4.424,1.5118,7.572 +DH046,110.0,112.0,2.269,0.3969,5.024 +DH046,112.0,114.0,5.831,0.0211,12.098 +DH046,114.0,116.0,1.967,0.1996,4.234 +DH046,116.0,118.0,6.602,0.149,13.942 +DH046,118.0,120.0,2.128,0.333,5.943 +DH046,120.0,122.0,2.813,0.4374,5.314 +DH046,122.0,124.0,1.213,0.1992,2.527 +DH046,124.0,126.0,4.401,0.243,8.584 +DH046,126.0,128.0,1.705,0.0658,4.314 +DH046,128.0,130.0,2.229,0.9482,4.477 +DH046,130.0,132.0,0.643,0.2622,1.458 +DH046,132.0,134.0,1.688,0.1953,2.607 +DH046,134.0,136.0,21.057,0.1599,58.037 +DH046,136.0,138.0,0.107,0.4312,0.214 +DH046,138.0,140.0,0.63,0.1482,1.214 +DH046,140.0,142.0,2.278,0.324,5.386 +DH046,142.0,144.0,1.028,0.1773,2.08 +DH046,144.0,146.0,0.996,1.9218,1.977 +DH046,146.0,148.0,6.041,0.0971,11.045 +DH046,148.0,150.0,4.594,0.0409,10.053 +DH046,150.0,152.0,3.418,0.2006,7.852 +DH046,152.0,154.0,8.123,0.11,18.063 +DH046,154.0,156.0,1.024,0.3356,2.797 +DH046,156.0,158.0,1.225,0.0562,2.805 +DH046,158.0,160.0,5.3,0.4036,14.542 +DH046,160.0,162.0,4.221,0.1924,12.608 +DH046,162.0,164.0,1.904,0.0207,5.59 +DH046,164.0,166.0,1.283,0.1792,2.0 +DH046,166.0,168.0,0.403,0.2369,0.784 +DH046,168.0,170.0,3.445,0.1382,6.064 +DH046,170.0,172.0,0.672,0.1353,1.401 +DH046,172.0,174.0,3.173,0.1721,8.681 +DH046,174.0,176.0,3.172,0.2371,7.791 +DH046,176.0,178.0,5.363,0.2705,13.937 +DH046,178.0,180.0,8.227,0.2455,23.701 +DH046,180.0,182.0,1.367,0.0517,2.795 +DH046,182.0,184.0,0.717,0.3375,2.112 +DH046,184.0,186.0,3.197,0.0962,5.335 +DH046,186.0,188.0,11.392,0.0782,31.966 +DH046,188.0,190.0,21.142,1.2309,57.399 +DH046,190.0,192.0,1.477,0.2967,2.976 +DH046,192.0,194.0,1.019,0.0925,2.32 +DH046,194.0,196.0,0.881,0.6021,2.578 +DH046,196.0,198.0,2.496,0.4899,6.743 +DH046,198.0,200.0,2.858,0.3034,5.104 +DH046,200.0,202.0,7.596,0.6131,20.884 +DH046,202.0,204.0,18.459,0.1274,39.205 +DH047,0.0,2.0,0.086,0.0178,0.058 +DH047,2.0,4.0,0.045,0.0238,0.03 +DH047,4.0,6.0,0.037,0.0109,0.032 +DH047,6.0,8.0,0.06,0.0233,0.051 +DH047,8.0,10.0,0.147,0.0173,0.131 +DH047,10.0,12.0,0.083,0.0368,0.122 +DH047,12.0,14.0,0.222,0.0296,0.167 +DH047,14.0,16.0,0.167,0.0156,0.213 +DH047,16.0,18.0,0.059,0.0297,0.087 +DH047,18.0,20.0,0.08,0.0257,0.097 +DH047,20.0,22.0,0.05,0.0267,0.068 +DH047,22.0,24.0,0.023,0.0126,0.024 +DH047,24.0,26.0,0.081,0.014,0.082 +DH047,26.0,28.0,0.083,0.025,0.09 +DH047,28.0,30.0,0.077,0.0195,0.116 +DH047,30.0,32.0,0.036,0.0153,0.049 +DH047,32.0,34.0,0.083,0.0139,0.097 +DH047,34.0,36.0,0.065,0.0213,0.056 +DH047,36.0,38.0,0.022,0.025,0.027 +DH047,38.0,40.0,0.113,0.0331,0.062 +DH047,40.0,42.0,0.145,0.0098,0.074 +DH047,42.0,44.0,0.071,0.0187,0.104 +DH047,44.0,46.0,0.107,0.0405,0.127 +DH047,46.0,48.0,0.092,0.0281,0.047 +DH047,48.0,50.0,0.186,0.0148,0.21 +DH047,50.0,52.0,0.045,0.0195,0.04 +DH047,52.0,54.0,0.12,0.0133,0.155 +DH047,54.0,56.0,0.108,0.0368,0.144 +DH047,56.0,58.0,0.249,0.0242,0.35 +DH047,58.0,60.0,0.123,0.0385,0.122 +DH047,60.0,62.0,0.043,0.0273,0.044 +DH047,62.0,64.0,0.073,0.0075,0.062 +DH047,64.0,66.0,0.066,0.0088,0.076 +DH047,66.0,68.0,0.126,0.0137,0.064 +DH047,68.0,70.0,0.043,0.0213,0.051 +DH047,70.0,72.0,0.035,0.0126,0.047 +DH047,72.0,74.0,0.111,0.0199,0.14 +DH047,74.0,76.0,0.076,0.0215,0.079 +DH047,76.0,78.0,0.061,0.0133,0.054 +DH047,78.0,80.0,0.073,0.0513,0.102 +DH047,80.0,82.0,3.151,0.3239,6.419 +DH047,82.0,84.0,0.841,0.6516,1.751 +DH047,84.0,86.0,44.773,0.2982,123.991 +DH047,86.0,88.0,1.757,0.6499,3.669 +DH047,88.0,90.0,2.072,0.3966,3.25 +DH047,90.0,92.0,1.728,0.1048,4.482 +DH047,92.0,94.0,0.513,0.2555,1.29 +DH047,94.0,96.0,2.189,0.0818,4.097 +DH047,96.0,98.0,4.166,0.1196,6.879 +DH047,98.0,100.0,3.541,0.111,10.202 +DH047,100.0,102.0,1.747,0.1827,2.964 +DH047,102.0,104.0,0.568,0.1153,1.295 +DH047,104.0,106.0,0.564,0.395,1.076 +DH047,106.0,108.0,0.391,0.1427,0.667 +DH047,108.0,110.0,1.303,0.3072,2.779 +DH047,110.0,112.0,39.727,0.5602,101.203 +DH047,112.0,114.0,1.444,0.1803,3.88 +DH047,114.0,116.0,0.726,0.1459,1.585 +DH047,116.0,118.0,1.08,0.142,3.083 +DH047,118.0,120.0,0.536,0.4895,1.033 +DH047,120.0,122.0,0.391,0.2278,1.078 +DH047,122.0,124.0,11.142,0.8116,29.313 +DH047,124.0,126.0,0.8,0.1311,2.31 +DH047,126.0,128.0,1.958,0.6679,3.25 +DH047,128.0,130.0,7.136,0.2558,19.671 +DH047,130.0,132.0,0.883,0.2342,2.613 +DH047,132.0,134.0,3.205,0.4249,7.353 +DH047,134.0,136.0,4.081,0.0501,9.671 +DH047,136.0,138.0,0.339,0.1975,0.663 +DH047,138.0,140.0,3.422,0.0803,5.662 +DH047,140.0,142.0,3.141,0.3358,6.215 +DH047,142.0,144.0,3.565,0.0664,7.303 +DH047,144.0,146.0,0.771,0.238,1.601 +DH047,146.0,148.0,8.96,0.2708,23.397 +DH047,148.0,150.0,3.426,1.2385,9.48 +DH047,150.0,152.0,2.073,0.1145,4.529 +DH047,152.0,154.0,5.033,0.1098,7.552 +DH047,154.0,156.0,12.493,0.2517,26.891 +DH047,156.0,158.0,30.369,0.9139,70.849 +DH047,158.0,160.0,10.287,0.1802,30.551 +DH047,160.0,162.0,1.339,0.0754,3.259 +DH047,162.0,164.0,0.412,0.2831,1.171 +DH047,164.0,166.0,4.134,0.2077,11.673 +DH047,166.0,168.0,2.628,0.3276,3.942 +DH047,168.0,170.0,2.05,0.0775,6.022 +DH047,170.0,172.0,4.233,0.2637,11.438 +DH047,172.0,174.0,0.667,0.444,1.14 +DH047,174.0,176.0,4.689,0.0756,9.381 +DH047,176.0,178.0,6.564,0.2091,11.244 +DH047,178.0,180.0,5.415,0.0766,16.016 +DH047,180.0,182.0,3.975,0.127,6.323 +DH047,182.0,184.0,7.276,0.2642,19.852 +DH047,184.0,186.0,2.298,0.1,6.446 +DH047,186.0,188.0,1.756,0.2193,3.884 +DH047,188.0,190.0,6.315,0.4683,18.805 +DH047,190.0,192.0,3.531,0.2456,8.849 +DH047,192.0,194.0,1.293,0.0434,2.853 +DH047,194.0,196.0,0.487,0.4594,1.096 +DH047,196.0,198.0,2.595,0.2157,5.201 +DH047,198.0,200.0,9.5,0.218,22.308 +DH047,200.0,202.0,6.744,0.1023,12.535 +DH047,202.0,204.0,4.047,0.5914,10.057 +DH047,204.0,206.0,3.616,0.16,9.854 +DH047,206.0,208.0,8.282,0.1808,17.983 +DH047,208.0,210.0,0.387,0.4679,1.129 +DH047,210.0,212.0,3.478,0.4156,6.74 +DH047,212.0,214.0,1.823,0.4962,3.512 +DH047,214.0,216.0,0.747,0.185,2.161 +DH047,216.0,218.0,15.377,0.2062,42.578 +DH047,218.0,220.0,7.98,0.0587,15.175 +DH047,220.0,222.0,2.111,0.6282,5.512 +DH047,222.0,224.0,0.718,0.2552,1.376 +DH047,224.0,226.0,1.565,0.3656,4.432 +DH047,226.0,228.0,2.809,0.4799,5.584 +DH047,228.0,230.0,3.147,0.2452,8.108 +DH047,230.0,232.0,14.924,0.3317,28.34 +DH047,232.0,234.0,2.465,0.2978,6.299 +DH047,234.0,236.0,6.519,0.8095,10.104 +DH047,236.0,238.0,18.266,0.5201,28.012 +DH047,238.0,240.0,0.301,0.2389,0.893 +DH047,240.0,242.0,0.878,0.2383,1.328 +DH047,242.0,244.0,6.893,0.1636,16.771 +DH047,244.0,246.0,3.14,0.1113,8.077 +DH047,246.0,248.0,0.912,0.0514,2.168 +DH047,248.0,250.0,6.77,1.0067,17.099 +DH047,250.0,252.0,0.123,0.022,0.128 +DH047,252.0,254.0,0.112,0.0139,0.124 +DH047,254.0,256.0,0.067,0.0349,0.04 +DH047,256.0,258.0,0.04,0.0246,0.041 +DH047,258.0,260.0,0.11,0.03,0.073 +DH047,260.0,262.0,0.056,0.0348,0.08 +DH047,262.0,264.0,0.083,0.0181,0.097 +DH047,264.0,266.0,0.068,0.0081,0.057 +DH047,266.0,268.0,0.124,0.0058,0.114 +DH047,268.0,270.0,0.235,0.0104,0.15 +DH047,270.0,272.0,0.074,0.042,0.078 +DH047,272.0,274.0,0.048,0.0217,0.042 +DH047,274.0,276.0,0.056,0.0182,0.061 +DH047,276.0,278.0,0.057,0.0442,0.073 +DH047,278.0,280.0,0.036,0.0141,0.048 +DH047,280.0,282.0,0.051,0.0213,0.043 +DH047,282.0,284.0,0.04,0.0138,0.031 +DH047,284.0,286.0,0.125,0.014,0.175 +DH047,286.0,288.0,0.069,0.0264,0.072 +DH047,288.0,290.0,0.066,0.0233,0.067 +DH047,290.0,292.0,0.108,0.0232,0.119 +DH047,292.0,294.0,0.067,0.0171,0.038 +DH047,294.0,296.0,0.044,0.0146,0.057 +DH047,296.0,298.0,0.128,0.0212,0.152 +DH047,298.0,300.0,0.061,0.0116,0.035 +DH047,300.0,302.0,0.038,0.0361,0.051 +DH047,302.0,304.0,0.026,0.0212,0.026 +DH047,304.0,306.0,0.093,0.0136,0.054 +DH047,306.0,308.0,0.105,0.0307,0.155 +DH047,308.0,310.0,0.036,0.0228,0.034 +DH047,310.0,312.0,0.155,0.0063,0.163 +DH047,312.0,314.0,0.057,0.0155,0.074 +DH047,314.0,316.0,0.104,0.0252,0.113 +DH047,316.0,318.0,0.074,0.0526,0.098 +DH047,318.0,320.0,0.068,0.0171,0.062 +DH047,320.0,322.0,0.102,0.0113,0.07 +DH047,322.0,324.0,0.022,0.015,0.013 +DH047,324.0,326.0,0.075,0.0175,0.085 +DH047,326.0,328.0,0.045,0.0185,0.054 +DH047,328.0,330.0,0.099,0.0299,0.148 +DH048,0.0,2.0,0.122,0.0128,0.124 +DH048,2.0,4.0,0.262,0.0214,0.148 +DH048,4.0,6.0,0.049,0.0175,0.052 +DH048,6.0,8.0,0.083,0.0141,0.095 +DH048,8.0,10.0,0.168,0.0256,0.11 +DH048,10.0,12.0,0.107,0.0101,0.056 +DH048,12.0,14.0,0.156,0.0161,0.131 +DH048,14.0,16.0,0.114,0.0277,0.1 +DH048,16.0,18.0,0.14,0.0088,0.088 +DH048,18.0,20.0,0.126,0.0212,0.109 +DH048,20.0,22.0,0.075,0.0139,0.092 +DH048,22.0,24.0,0.07,0.0237,0.09 +DH048,24.0,26.0,0.035,0.033,0.03 +DH048,26.0,28.0,0.076,0.0138,0.083 +DH048,28.0,30.0,0.087,0.0257,0.076 +DH048,30.0,32.0,0.104,0.0137,0.096 +DH048,32.0,34.0,0.264,0.0254,0.276 +DH048,34.0,36.0,0.032,0.0222,0.041 +DH048,36.0,38.0,0.055,0.0181,0.069 +DH048,38.0,40.0,0.056,0.0201,0.078 +DH048,40.0,42.0,0.125,0.0205,0.067 +DH048,42.0,44.0,0.148,0.0242,0.074 +DH048,44.0,46.0,0.023,0.0237,0.022 +DH048,46.0,48.0,0.078,0.022,0.076 +DH048,48.0,50.0,0.248,0.0116,0.37 +DH048,50.0,52.0,0.1,0.0207,0.135 +DH048,52.0,54.0,0.081,0.0247,0.099 +DH048,54.0,56.0,0.045,0.0133,0.035 +DH048,56.0,58.0,0.124,0.0156,0.157 +DH048,58.0,60.0,0.316,0.0114,0.293 +DH048,60.0,62.0,0.123,0.03,0.162 +DH048,62.0,64.0,0.243,0.0215,0.15 +DH048,64.0,66.0,0.087,0.0138,0.114 +DH048,66.0,68.0,0.146,0.0083,0.126 +DH048,68.0,70.0,0.144,0.0156,0.147 +DH048,70.0,72.0,0.189,0.0068,0.176 +DH048,72.0,74.0,0.158,0.0175,0.233 +DH048,74.0,76.0,0.087,0.0124,0.054 +DH048,76.0,78.0,0.126,0.0133,0.091 +DH048,78.0,80.0,0.088,0.0142,0.065 +DH048,80.0,82.0,2.426,0.4122,5.012 +DH048,82.0,84.0,0.619,0.3281,1.827 +DH048,84.0,86.0,31.679,0.7071,58.305 +DH048,86.0,88.0,6.232,0.274,13.446 +DH048,88.0,90.0,3.129,1.0356,5.211 +DH048,90.0,92.0,0.66,0.2256,1.404 +DH048,92.0,94.0,0.279,0.0575,0.745 +DH048,94.0,96.0,2.722,0.0512,5.901 +DH048,96.0,98.0,8.202,0.1874,20.154 +DH048,98.0,100.0,4.418,0.317,9.848 +DH048,100.0,102.0,0.751,0.1626,1.968 +DH048,102.0,104.0,12.941,0.3707,35.67 +DH048,104.0,106.0,1.721,0.5512,4.03 +DH048,106.0,108.0,6.184,0.6747,16.224 +DH048,108.0,110.0,2.763,0.607,4.287 +DH048,110.0,112.0,43.95,0.2705,129.528 +DH048,112.0,114.0,1.441,0.3327,3.051 +DH048,114.0,116.0,0.73,0.1036,1.389 +DH048,116.0,118.0,8.385,0.0516,20.687 +DH048,118.0,120.0,10.717,0.0833,27.207 +DH048,120.0,122.0,0.575,0.1072,1.411 +DH048,122.0,124.0,21.076,0.1337,42.532 +DH048,124.0,126.0,0.414,0.4703,1.15 +DH048,126.0,128.0,9.259,0.2359,15.791 +DH048,128.0,130.0,3.18,0.1176,5.996 +DH048,130.0,132.0,0.532,0.6565,1.543 +DH048,132.0,134.0,3.768,0.0975,10.251 +DH048,134.0,136.0,1.421,2.4232,3.734 +DH048,136.0,138.0,0.83,0.1564,2.279 +DH048,138.0,140.0,1.831,0.9811,4.896 +DH048,140.0,142.0,6.58,0.1077,17.499 +DH048,142.0,144.0,2.842,0.1249,5.009 +DH048,144.0,146.0,4.658,0.3445,7.941 +DH048,146.0,148.0,8.241,0.1816,22.278 +DH048,148.0,150.0,12.552,0.092,37.094 +DH048,150.0,152.0,0.786,0.3042,2.346 +DH048,152.0,154.0,1.007,0.953,1.9 +DH048,154.0,156.0,1.937,0.113,3.619 +DH048,156.0,158.0,1.858,0.0769,3.794 +DH048,158.0,160.0,3.569,0.4228,8.566 +DH048,160.0,162.0,4.652,0.4867,10.509 +DH048,162.0,164.0,5.368,0.2171,12.106 +DH048,164.0,166.0,2.569,0.1624,3.973 +DH048,166.0,168.0,4.064,0.4296,7.567 +DH048,168.0,170.0,24.534,0.5179,61.98 +DH048,170.0,172.0,3.833,0.6908,6.105 +DH048,172.0,174.0,24.955,0.1201,49.319 +DH048,174.0,176.0,2.243,0.2142,6.712 +DH048,176.0,178.0,6.613,0.0796,19.662 +DH048,178.0,180.0,8.95,0.934,13.749 +DH048,180.0,182.0,7.417,0.422,11.314 +DH048,182.0,184.0,11.056,0.1958,20.217 +DH048,184.0,186.0,0.494,0.0847,1.156 +DH048,186.0,188.0,4.312,0.1991,11.237 +DH048,188.0,190.0,21.688,0.3171,39.481 +DH048,190.0,192.0,1.947,0.1146,4.797 +DH048,192.0,194.0,0.724,0.0857,1.61 +DH048,194.0,196.0,2.72,0.0355,7.757 +DH048,196.0,198.0,5.121,0.1252,10.331 +DH048,198.0,200.0,2.052,0.115,5.44 +DH048,200.0,202.0,0.644,0.2052,1.19 +DH048,202.0,204.0,2.195,0.8254,5.005 +DH048,204.0,206.0,4.077,0.1354,11.55 +DH048,206.0,208.0,1.6,0.2285,4.594 +DH048,208.0,210.0,1.221,0.1623,2.831 +DH048,210.0,212.0,1.213,0.2563,2.797 +DH048,212.0,214.0,13.431,1.9028,33.669 +DH048,214.0,216.0,3.167,0.5119,4.827 +DH048,216.0,218.0,0.675,0.8963,1.09 +DH048,218.0,220.0,3.262,0.7121,8.242 +DH048,220.0,222.0,2.101,0.1022,3.728 +DH048,222.0,224.0,9.448,0.3851,27.382 +DH048,224.0,226.0,18.539,0.1968,33.54 +DH048,226.0,228.0,2.898,1.0475,5.238 +DH048,228.0,230.0,2.352,0.1934,6.634 +DH048,230.0,232.0,0.932,0.0748,1.993 +DH048,232.0,234.0,1.173,0.1453,2.211 +DH048,234.0,236.0,2.369,0.2245,7.044 +DH048,236.0,238.0,4.928,1.2047,10.416 +DH048,238.0,240.0,5.7,0.1642,13.223 +DH048,240.0,242.0,29.214,0.1207,58.814 +DH048,242.0,244.0,0.952,0.0448,2.632 +DH048,244.0,246.0,0.794,0.2295,2.067 +DH048,246.0,248.0,9.348,0.0498,24.946 +DH048,248.0,250.0,1.508,0.4318,2.402 +DH048,250.0,252.0,0.167,0.0153,0.11 +DH048,252.0,254.0,0.105,0.0306,0.074 +DH048,254.0,256.0,0.1,0.0206,0.088 +DH048,256.0,258.0,0.105,0.0507,0.075 +DH048,258.0,260.0,0.066,0.0147,0.076 +DH048,260.0,262.0,0.023,0.0171,0.034 +DH048,262.0,264.0,0.06,0.0201,0.082 +DH048,264.0,266.0,0.1,0.006,0.145 +DH048,266.0,268.0,0.071,0.0123,0.045 +DH048,268.0,270.0,0.069,0.0328,0.058 +DH048,270.0,272.0,0.072,0.0204,0.085 +DH048,272.0,274.0,0.09,0.0055,0.046 +DH048,274.0,276.0,0.075,0.0282,0.08 +DH048,276.0,278.0,0.095,0.0214,0.138 +DH048,278.0,280.0,0.164,0.021,0.118 +DH048,280.0,282.0,0.056,0.0101,0.077 +DH048,282.0,284.0,0.066,0.0053,0.069 +DH048,284.0,286.0,0.101,0.0178,0.107 +DH048,286.0,288.0,0.084,0.0195,0.046 +DH048,288.0,290.0,0.056,0.0284,0.075 +DH048,290.0,292.0,0.061,0.0428,0.049 +DH048,292.0,294.0,0.055,0.0098,0.067 +DH048,294.0,296.0,0.089,0.0261,0.09 +DH048,296.0,298.0,0.068,0.0098,0.064 +DH048,298.0,300.0,0.032,0.0265,0.038 +DH048,300.0,302.0,0.08,0.0228,0.044 +DH048,302.0,304.0,0.087,0.0368,0.083 +DH048,304.0,306.0,0.067,0.0145,0.087 +DH048,306.0,308.0,0.035,0.0378,0.036 +DH048,308.0,310.0,0.235,0.0179,0.221 +DH048,310.0,312.0,0.122,0.0307,0.099 +DH048,312.0,314.0,0.025,0.0073,0.013 +DH048,314.0,316.0,0.207,0.0096,0.236 +DH048,316.0,318.0,0.067,0.0478,0.058 +DH048,318.0,320.0,0.106,0.0287,0.099 +DH048,320.0,322.0,0.038,0.026,0.028 +DH048,322.0,324.0,0.074,0.0324,0.074 +DH048,324.0,326.0,0.159,0.0351,0.189 +DH048,326.0,328.0,0.022,0.0327,0.016 +DH048,328.0,330.0,0.096,0.0223,0.066 +DH048,330.0,332.0,0.139,0.0157,0.113 +DH048,332.0,334.0,0.067,0.0207,0.043 +DH048,334.0,336.0,0.049,0.0126,0.035 +DH048,336.0,338.0,0.048,0.022,0.051 +DH048,338.0,340.0,0.079,0.0256,0.055 +DH048,340.0,342.0,0.049,0.024,0.028 +DH048,342.0,344.0,0.233,0.0227,0.138 +DH048,344.0,346.0,0.101,0.0115,0.141 +DH048,346.0,348.0,0.072,0.0121,0.089 +DH048,348.0,350.0,0.354,0.0192,0.407 +DH048,350.0,352.0,0.057,0.0232,0.032 +DH048,352.0,354.0,0.043,0.018,0.032 +DH048,354.0,356.0,0.064,0.0117,0.042 +DH048,356.0,358.0,0.062,0.0135,0.04 +DH048,358.0,360.0,0.312,0.0356,0.339 +DH048,360.0,362.0,0.058,0.0423,0.082 +DH048,362.0,364.0,0.148,0.023,0.192 +DH048,364.0,366.0,0.126,0.0233,0.171 +DH048,366.0,368.0,0.076,0.0283,0.042 +DH048,368.0,370.0,0.109,0.0126,0.071 +DH048,370.0,372.0,0.077,0.0165,0.051 +DH048,372.0,374.0,0.142,0.0218,0.129 +DH048,374.0,376.0,0.281,0.0232,0.414 +DH048,376.0,378.0,0.097,0.0154,0.103 +DH048,378.0,380.0,0.095,0.0048,0.108 +DH048,380.0,382.0,0.099,0.0164,0.051 +DH048,382.0,384.0,0.039,0.0366,0.025 +DH048,384.0,386.0,0.046,0.024,0.052 +DH048,386.0,388.0,0.066,0.0145,0.041 +DH048,388.0,390.0,0.184,0.0232,0.116 +DH048,390.0,392.0,0.137,0.0186,0.125 +DH048,392.0,394.0,0.09,0.0246,0.095 +DH048,394.0,396.0,0.041,0.0288,0.03 +DH048,396.0,398.0,0.043,0.02,0.023 +DH048,398.0,400.0,0.139,0.0207,0.085 +DH048,400.0,402.0,0.069,0.0395,0.065 +DH048,402.0,404.0,0.113,0.0187,0.057 +DH048,404.0,406.0,0.083,0.0323,0.122 +DH048,406.0,408.0,0.075,0.0159,0.09 +DH048,408.0,410.0,0.137,0.0312,0.11 +DH048,410.0,412.0,0.152,0.0083,0.21 +DH049,0.0,2.0,0.076,0.0191,0.097 +DH049,2.0,4.0,0.078,0.0151,0.079 +DH049,4.0,6.0,0.186,0.0137,0.205 +DH049,6.0,8.0,0.056,0.0207,0.081 +DH049,8.0,10.0,0.069,0.0366,0.054 +DH049,10.0,12.0,0.073,0.0364,0.067 +DH049,12.0,14.0,0.058,0.0243,0.058 +DH049,14.0,16.0,0.1,0.0172,0.064 +DH049,16.0,18.0,0.162,0.0207,0.16 +DH049,18.0,20.0,0.047,0.039,0.027 +DH049,20.0,22.0,0.097,0.036,0.064 +DH049,22.0,24.0,0.052,0.011,0.051 +DH049,24.0,26.0,0.044,0.0139,0.057 +DH049,26.0,28.0,0.072,0.0244,0.096 +DH049,28.0,30.0,0.072,0.0257,0.089 +DH049,30.0,32.0,0.058,0.011,0.067 +DH049,32.0,34.0,0.037,0.0348,0.044 +DH049,34.0,36.0,0.054,0.0108,0.029 +DH049,36.0,38.0,0.032,0.0235,0.018 +DH049,38.0,40.0,0.104,0.024,0.125 +DH049,40.0,42.0,0.095,0.0321,0.093 +DH049,42.0,44.0,0.096,0.0215,0.1 +DH049,44.0,46.0,0.045,0.0348,0.059 +DH049,46.0,48.0,0.124,0.0136,0.106 +DH049,48.0,50.0,0.072,0.0123,0.061 +DH049,50.0,52.0,0.211,0.0105,0.224 +DH049,52.0,54.0,0.467,0.0293,0.521 +DH049,54.0,56.0,0.043,0.0079,0.038 +DH049,56.0,58.0,0.127,0.0391,0.094 +DH049,58.0,60.0,0.037,0.0173,0.027 +DH049,60.0,62.0,0.14,0.0221,0.185 +DH049,62.0,64.0,0.023,0.0187,0.032 +DH049,64.0,66.0,0.07,0.0151,0.093 +DH049,66.0,68.0,0.046,0.0367,0.055 +DH049,68.0,70.0,0.07,0.018,0.092 +DH049,70.0,72.0,0.049,0.0299,0.057 +DH049,72.0,74.0,0.074,0.0417,0.046 +DH049,74.0,76.0,0.127,0.0303,0.18 +DH049,76.0,78.0,0.076,0.053,0.057 +DH049,78.0,80.0,0.093,0.0155,0.129 +DH049,80.0,82.0,7.078,0.179,15.909 +DH049,82.0,84.0,4.122,0.0942,7.598 +DH049,84.0,86.0,2.222,0.4745,4.368 +DH049,86.0,88.0,1.171,0.17,2.621 +DH049,88.0,90.0,8.446,0.0608,19.85 +DH049,90.0,92.0,3.703,0.1903,7.157 +DH049,92.0,94.0,3.259,0.162,5.106 +DH049,94.0,96.0,5.352,0.1048,9.215 +DH049,96.0,98.0,0.095,0.0477,0.16 +DH049,98.0,100.0,1.348,0.1127,2.537 +DH049,100.0,102.0,1.384,0.1012,3.323 +DH049,102.0,104.0,0.21,0.4029,0.329 +DH049,104.0,106.0,7.124,0.1578,12.833 +DH049,106.0,108.0,1.915,0.2312,2.899 +DH049,108.0,110.0,1.304,0.0834,2.41 +DH049,110.0,112.0,15.063,0.8415,29.549 +DH049,112.0,114.0,0.923,0.1432,2.28 +DH049,114.0,116.0,2.09,0.1004,5.402 +DH049,116.0,118.0,2.363,0.0132,3.752 +DH049,118.0,120.0,1.958,0.1048,4.399 +DH049,120.0,122.0,7.824,0.5257,22.308 +DH049,122.0,124.0,0.57,0.1163,1.421 +DH049,124.0,126.0,0.309,0.6803,0.649 +DH049,126.0,128.0,4.056,0.0537,9.504 +DH049,128.0,130.0,0.226,0.5051,0.43 +DH049,130.0,132.0,4.417,0.2347,9.447 +DH049,132.0,134.0,1.484,0.1896,3.911 +DH049,134.0,136.0,3.621,0.3153,10.759 +DH049,136.0,138.0,16.742,0.0538,41.205 +DH049,138.0,140.0,1.367,0.6213,2.873 +DH049,140.0,142.0,3.885,0.0344,9.37 +DH049,142.0,144.0,27.406,0.2323,64.676 +DH049,144.0,146.0,2.979,0.0961,4.588 +DH049,146.0,148.0,0.389,0.1187,0.89 +DH049,148.0,150.0,8.541,0.3234,13.822 +DH049,150.0,152.0,2.158,0.431,6.038 +DH049,152.0,154.0,0.924,0.3092,2.616 +DH049,154.0,156.0,2.189,0.1957,4.356 +DH049,156.0,158.0,10.662,0.1352,27.57 +DH049,158.0,160.0,0.948,0.1089,2.834 +DH049,160.0,162.0,6.717,0.0978,14.8 +DH049,162.0,164.0,0.377,0.2485,1.063 +DH049,164.0,166.0,5.737,0.3321,10.284 +DH049,166.0,168.0,0.35,0.1352,0.777 +DH049,168.0,170.0,1.166,0.0607,1.827 +DH049,170.0,172.0,1.113,0.5221,2.51 +DH049,172.0,174.0,1.596,0.664,4.427 +DH049,174.0,176.0,12.442,0.1338,23.468 +DH049,176.0,178.0,2.735,0.1585,7.063 +DH049,178.0,180.0,1.428,0.0991,3.423 +DH049,180.0,182.0,1.249,0.5639,3.251 +DH049,182.0,184.0,3.44,0.2002,9.152 +DH049,184.0,186.0,4.422,0.2418,11.384 +DH049,186.0,188.0,0.251,0.7462,0.411 +DH049,188.0,190.0,2.815,0.1849,4.855 +DH049,190.0,192.0,0.567,0.2954,0.875 +DH049,192.0,194.0,61.143,0.2476,122.98 +DH049,194.0,196.0,0.368,0.5046,1.047 +DH049,196.0,198.0,3.076,0.2799,6.685 +DH049,198.0,200.0,3.023,0.1192,8.297 +DH049,200.0,202.0,5.933,0.3192,16.529 +DH049,202.0,204.0,4.127,0.0939,11.261 +DH049,204.0,206.0,0.846,0.1781,1.618 +DH049,206.0,208.0,13.773,0.3077,25.683 +DH049,208.0,209.0,71.827,0.2316,133.552 +DH050,0.0,2.0,0.054,0.0343,0.059 +DH050,2.0,4.0,0.081,0.024,0.108 +DH050,4.0,6.0,0.038,0.0119,0.031 +DH050,6.0,8.0,0.066,0.0091,0.033 +DH050,8.0,10.0,0.076,0.02,0.079 +DH050,10.0,12.0,0.109,0.0125,0.113 +DH050,12.0,14.0,0.143,0.014,0.077 +DH050,14.0,16.0,0.033,0.0181,0.018 +DH050,16.0,18.0,0.025,0.0107,0.03 +DH050,18.0,20.0,0.132,0.007,0.182 +DH050,20.0,22.0,0.126,0.0201,0.15 +DH050,22.0,24.0,0.101,0.0308,0.053 +DH050,24.0,26.0,0.021,0.0325,0.014 +DH050,26.0,28.0,0.08,0.0068,0.083 +DH050,28.0,30.0,0.049,0.01,0.031 +DH050,30.0,32.0,0.06,0.0145,0.079 +DH050,32.0,34.0,0.096,0.0143,0.138 +DH050,34.0,36.0,0.062,0.0162,0.068 +DH050,36.0,38.0,0.044,0.038,0.037 +DH050,38.0,40.0,0.016,0.0191,0.013 +DH050,40.0,42.0,0.104,0.0149,0.13 +DH050,42.0,44.0,0.091,0.0269,0.135 +DH050,44.0,46.0,0.057,0.0416,0.064 +DH050,46.0,48.0,0.205,0.0815,0.143 +DH050,48.0,50.0,0.04,0.016,0.035 +DH050,50.0,52.0,0.173,0.057,0.087 +DH050,52.0,54.0,0.11,0.0128,0.078 +DH050,54.0,56.0,0.08,0.0103,0.113 +DH050,56.0,58.0,0.027,0.0127,0.02 +DH050,58.0,60.0,0.103,0.0179,0.101 +DH050,60.0,62.0,0.21,0.013,0.314 +DH050,62.0,64.0,0.236,0.0172,0.296 +DH050,64.0,66.0,0.08,0.0133,0.074 +DH050,66.0,68.0,0.181,0.0228,0.119 +DH050,68.0,70.0,0.047,0.0125,0.03 +DH050,70.0,72.0,0.142,0.0119,0.084 +DH050,72.0,74.0,0.092,0.0197,0.123 +DH050,74.0,76.0,0.136,0.0091,0.133 +DH050,76.0,78.0,0.072,0.0219,0.077 +DH050,78.0,80.0,0.085,0.0429,0.11 +DH050,80.0,82.0,1.168,0.1747,2.076 +DH050,82.0,84.0,8.947,0.0243,14.825 +DH050,84.0,86.0,8.827,0.1738,24.293 +DH050,86.0,88.0,31.1,0.238,74.118 +DH050,88.0,90.0,40.567,0.3078,76.73 +DH050,90.0,92.0,6.573,0.5754,13.666 +DH050,92.0,94.0,1.245,0.8815,2.159 +DH050,94.0,96.0,9.323,0.2754,17.153 +DH050,96.0,98.0,0.803,0.113,1.756 +DH050,98.0,100.0,0.573,0.245,0.935 +DH050,100.0,102.0,0.261,0.3078,0.478 +DH050,102.0,104.0,2.157,0.1063,5.748 +DH050,104.0,106.0,0.814,0.2358,1.429 +DH050,106.0,108.0,1.202,0.324,2.212 +DH050,108.0,110.0,3.298,0.6537,8.615 +DH050,110.0,112.0,1.101,0.278,2.175 +DH050,112.0,114.0,0.376,0.2966,1.091 +DH050,114.0,116.0,3.98,0.0643,7.663 +DH050,116.0,118.0,0.338,0.3825,0.92 +DH050,118.0,120.0,1.236,0.5495,2.347 +DH050,120.0,122.0,2.542,0.1903,4.004 +DH050,122.0,124.0,7.78,0.4354,16.747 +DH050,124.0,126.0,9.496,0.1072,22.275 +DH050,126.0,128.0,1.909,0.5155,3.866 +DH050,128.0,130.0,6.487,0.2136,10.229 +DH050,130.0,132.0,8.309,0.1174,23.289 +DH050,132.0,134.0,1.8,0.2515,4.249 +DH050,134.0,136.0,2.749,0.5776,8.198 +DH050,136.0,138.0,1.309,0.3065,3.632 +DH050,138.0,140.0,5.605,0.3832,14.342 +DH050,140.0,142.0,3.935,0.0402,8.822 +DH050,142.0,144.0,0.814,0.2868,1.539 +DH050,144.0,146.0,2.356,0.0921,3.825 +DH050,146.0,148.0,0.668,0.4321,1.949 +DH050,148.0,150.0,0.774,0.3117,2.124 +DH050,150.0,152.0,1.16,0.2382,2.683 +DH050,152.0,154.0,0.633,0.2498,1.285 +DH050,154.0,156.0,0.483,0.265,0.861 +DH050,156.0,158.0,2.582,0.3979,5.847 +DH050,158.0,160.0,6.66,0.4201,10.3 +DH050,160.0,162.0,3.61,0.5383,6.883 +DH050,162.0,164.0,0.301,0.1184,0.861 +DH050,164.0,166.0,2.004,0.2971,5.748 +DH050,166.0,168.0,24.79,0.2056,60.464 +DH050,168.0,170.0,0.995,0.1,2.279 +DH050,170.0,172.0,2.3,0.2081,6.898 +DH050,172.0,174.0,1.913,0.2083,5.145 +DH050,174.0,176.0,1.813,0.3435,5.364 +DH050,176.0,178.0,0.484,0.246,0.739 +DH050,178.0,180.0,0.843,0.246,1.766 +DH050,180.0,182.0,0.949,0.1473,2.335 +DH050,182.0,184.0,0.654,0.1376,1.517 +DH050,184.0,186.0,2.163,0.1523,6.016 +DH050,186.0,188.0,0.66,0.2008,1.208 +DH050,188.0,190.0,4.388,0.0768,7.763 +DH050,190.0,192.0,0.895,0.2223,2.289 +DH050,192.0,194.0,25.212,0.0901,67.647 +DH050,194.0,196.0,0.978,0.403,2.628 +DH050,196.0,198.0,10.029,0.3963,23.426 +DH050,198.0,200.0,73.659,0.348,141.882 +DH050,200.0,202.0,2.848,0.3696,4.412 +DH050,202.0,204.0,4.036,0.4834,6.51 +DH050,204.0,206.0,0.805,1.205,2.246 +DH050,206.0,208.0,5.819,0.2301,9.868 +DH050,208.0,210.0,1.509,0.191,3.084 +DH050,210.0,212.0,13.962,0.5723,23.209 +DH050,212.0,214.0,6.475,0.2218,16.052 +DH050,214.0,216.0,4.021,0.0553,9.053 +DH050,216.0,218.0,2.448,0.238,7.128 +DH050,218.0,220.0,3.805,0.5209,5.956 +DH050,220.0,222.0,1.69,1.9179,5.056 +DH050,222.0,224.0,5.63,0.2711,14.55 +DH050,224.0,226.0,3.54,0.3609,6.342 +DH050,226.0,228.0,0.625,0.1113,1.186 +DH050,228.0,230.0,7.021,0.2689,16.178 +DH050,230.0,232.0,11.549,0.0457,23.697 +DH050,232.0,234.0,0.111,0.5866,0.252 +DH050,234.0,236.0,7.096,0.2045,17.008 +DH050,236.0,238.0,1.912,0.3097,5.126 +DH050,238.0,240.0,3.338,0.8588,6.064 +DH050,240.0,242.0,2.05,0.2614,3.091 +DH050,242.0,243.0,1.381,0.1455,3.622 diff --git a/drillholes-demo/data/collar.csv b/drillholes-demo/data/collar.csv new file mode 100644 index 0000000..b928671 --- /dev/null +++ b/drillholes-demo/data/collar.csv @@ -0,0 +1,51 @@ +HOLEID,EAST,NORTH,ELEV,TOTDEPTH,AZ,DIP +DH001,350008.2,7199991.0,408.2,398.0,279.9,-70.4 +DH002,350098.2,7199985.2,404.0,419.0,349.9,-64.0 +DH003,350210.8,7200008.6,395.3,192.0,180.3,-76.4 +DH004,350305.9,7200004.9,409.4,316.0,51.8,-82.6 +DH005,350387.8,7200006.2,405.6,183.0,5.0,-82.9 +DH006,350514.3,7200008.4,404.3,352.0,82.7,-67.6 +DH007,350607.8,7199998.8,399.0,234.0,47.5,-65.5 +DH008,350008.6,7200102.1,395.4,348.0,244.0,-86.8 +DH009,350088.8,7200089.2,391.9,368.0,43.9,-88.0 +DH010,350198.5,7200088.4,408.1,381.0,182.3,-72.2 +DH011,350296.1,7200105.1,399.1,182.0,249.9,-85.6 +DH012,350412.8,7200099.1,394.0,425.0,209.2,-65.3 +DH013,350504.3,7200102.0,396.1,219.0,71.9,-80.7 +DH014,350609.7,7200107.9,401.6,161.0,289.5,-85.7 +DH015,349998.3,7200204.0,393.5,316.0,257.5,-62.4 +DH016,350091.8,7200201.6,407.1,261.0,266.0,-85.0 +DH017,350201.6,7200201.8,405.2,399.0,47.2,-81.5 +DH018,350286.9,7200194.1,404.4,392.0,44.6,-85.4 +DH019,350409.8,7200185.9,398.6,245.0,333.9,-86.5 +DH020,350503.9,7200198.1,402.5,436.0,143.1,-89.4 +DH021,350607.7,7200191.4,401.7,237.0,108.3,-88.3 +DH022,349995.6,7200297.3,403.0,305.0,175.9,-84.8 +DH023,350114.1,7200310.6,391.7,227.0,238.6,-88.4 +DH024,350211.8,7200292.0,398.3,431.0,344.0,-72.3 +DH025,350308.4,7200286.7,390.8,199.0,103.1,-69.6 +DH026,350390.8,7200293.4,399.9,163.0,332.9,-78.2 +DH027,350499.0,7200293.8,396.6,281.0,8.9,-80.5 +DH028,350586.3,7200304.9,392.9,448.0,199.9,-74.9 +DH029,349989.6,7200401.7,392.1,418.0,228.2,-63.7 +DH030,350105.5,7200408.5,401.8,375.0,38.1,-64.5 +DH031,350207.3,7200404.9,393.4,417.0,50.5,-88.7 +DH032,350314.0,7200397.2,408.5,418.0,150.9,-84.6 +DH033,350394.8,7200409.4,401.6,306.0,347.8,-82.9 +DH034,350496.1,7200390.0,396.9,245.0,214.6,-82.5 +DH035,350599.1,7200385.7,401.8,382.0,335.9,-72.9 +DH036,349990.7,7200487.7,390.5,348.0,289.6,-77.5 +DH037,350088.9,7200506.7,409.2,262.0,168.3,-88.5 +DH038,350199.3,7200498.9,399.6,178.0,282.5,-78.8 +DH039,350291.8,7200489.8,405.7,374.0,6.4,-74.3 +DH040,350405.1,7200500.0,391.7,229.0,39.3,-86.9 +DH041,350498.1,7200489.6,399.7,431.0,298.6,-65.0 +DH042,350610.0,7200505.9,399.8,222.0,286.9,-88.4 +DH043,350006.0,7200598.4,408.8,187.0,83.8,-62.3 +DH044,350094.4,7200596.4,401.4,399.0,191.1,-87.0 +DH045,350210.0,7200594.0,399.5,196.0,218.2,-64.7 +DH046,350309.1,7200603.9,395.3,204.0,312.4,-62.9 +DH047,350396.6,7200595.9,396.6,330.0,217.1,-60.6 +DH048,350493.6,7200587.6,400.4,412.0,148.5,-65.9 +DH049,350605.5,7200588.5,398.8,209.0,134.7,-66.6 +DH050,349989.2,7200713.9,390.4,243.0,153.3,-70.7 diff --git a/drillholes-demo/data/lith.csv b/drillholes-demo/data/lith.csv new file mode 100644 index 0000000..d0f1c0d --- /dev/null +++ b/drillholes-demo/data/lith.csv @@ -0,0 +1,275 @@ +HOLEID,FROM,TO,LITHOLOGY +DH001,0.0,26.7,Alluvium +DH001,26.7,50.1,Weathered Granite +DH001,50.1,133.1,Granite +DH001,133.1,170.6,Quartz Diorite +DH001,170.6,268.2,Mineralized Porphyry +DH001,268.2,398.0,Fresh Granite +DH002,0.0,20.6,Alluvium +DH002,20.6,60.2,Weathered Granite +DH002,60.2,118.1,Granite +DH002,118.1,194.8,Quartz Diorite +DH002,194.8,279.6,Mineralized Porphyry +DH002,279.6,419.0,Fresh Granite +DH003,0.0,17.7,Alluvium +DH003,17.7,47.0,Weathered Granite +DH003,47.0,122.8,Granite +DH003,122.8,171.8,Quartz Diorite +DH003,171.8,192.0,Mineralized Porphyry +DH004,0.0,6.5,Alluvium +DH004,6.5,74.4,Weathered Granite +DH004,74.4,119.1,Granite +DH004,119.1,191.9,Quartz Diorite +DH004,191.9,279.3,Mineralized Porphyry +DH004,279.3,316.0,Fresh Granite +DH005,0.0,29.7,Alluvium +DH005,29.7,64.4,Weathered Granite +DH005,64.4,128.5,Granite +DH005,128.5,177.8,Quartz Diorite +DH005,177.8,183.0,Mineralized Porphyry +DH006,0.0,30.7,Alluvium +DH006,30.7,63.9,Weathered Granite +DH006,63.9,115.4,Granite +DH006,115.4,184.9,Quartz Diorite +DH006,184.9,285.2,Mineralized Porphyry +DH006,285.2,352.0,Fresh Granite +DH007,0.0,16.1,Alluvium +DH007,16.1,57.8,Weathered Granite +DH007,57.8,129.4,Granite +DH007,129.4,180.2,Quartz Diorite +DH007,180.2,234.0,Mineralized Porphyry +DH008,0.0,18.8,Alluvium +DH008,18.8,51.5,Weathered Granite +DH008,51.5,127.4,Granite +DH008,127.4,168.9,Quartz Diorite +DH008,168.9,271.0,Mineralized Porphyry +DH008,271.0,348.0,Fresh Granite +DH009,0.0,27.4,Alluvium +DH009,27.4,71.8,Weathered Granite +DH009,71.8,113.2,Granite +DH009,113.2,168.3,Quartz Diorite +DH009,168.3,293.7,Mineralized Porphyry +DH009,293.7,368.0,Fresh Granite +DH010,0.0,10.9,Alluvium +DH010,10.9,53.7,Weathered Granite +DH010,53.7,120.9,Granite +DH010,120.9,191.5,Quartz Diorite +DH010,191.5,287.8,Mineralized Porphyry +DH010,287.8,381.0,Fresh Granite +DH011,0.0,10.3,Alluvium +DH011,10.3,55.7,Weathered Granite +DH011,55.7,119.4,Granite +DH011,119.4,169.4,Quartz Diorite +DH011,169.4,182.0,Mineralized Porphyry +DH012,0.0,14.2,Alluvium +DH012,14.2,48.8,Weathered Granite +DH012,48.8,121.5,Granite +DH012,121.5,186.2,Quartz Diorite +DH012,186.2,267.1,Mineralized Porphyry +DH012,267.1,425.0,Fresh Granite +DH013,0.0,28.5,Alluvium +DH013,28.5,67.4,Weathered Granite +DH013,67.4,129.5,Granite +DH013,129.5,178.4,Quartz Diorite +DH013,178.4,219.0,Mineralized Porphyry +DH014,0.0,12.2,Alluvium +DH014,12.2,55.8,Weathered Granite +DH014,55.8,110.3,Granite +DH014,110.3,161.0,Quartz Diorite +DH015,0.0,16.8,Alluvium +DH015,16.8,52.2,Weathered Granite +DH015,52.2,127.6,Granite +DH015,127.6,174.4,Quartz Diorite +DH015,174.4,273.2,Mineralized Porphyry +DH015,273.2,316.0,Fresh Granite +DH016,0.0,18.2,Alluvium +DH016,18.2,54.1,Weathered Granite +DH016,54.1,116.1,Granite +DH016,116.1,172.1,Quartz Diorite +DH016,172.1,261.0,Mineralized Porphyry +DH017,0.0,32.9,Alluvium +DH017,32.9,59.9,Weathered Granite +DH017,59.9,124.3,Granite +DH017,124.3,191.0,Quartz Diorite +DH017,191.0,295.0,Mineralized Porphyry +DH017,295.0,399.0,Fresh Granite +DH018,0.0,31.7,Alluvium +DH018,31.7,72.3,Weathered Granite +DH018,72.3,128.7,Granite +DH018,128.7,178.8,Quartz Diorite +DH018,178.8,267.4,Mineralized Porphyry +DH018,267.4,392.0,Fresh Granite +DH019,0.0,19.3,Alluvium +DH019,19.3,59.8,Weathered Granite +DH019,59.8,117.2,Granite +DH019,117.2,182.0,Quartz Diorite +DH019,182.0,245.0,Mineralized Porphyry +DH020,0.0,30.1,Alluvium +DH020,30.1,48.3,Weathered Granite +DH020,48.3,111.8,Granite +DH020,111.8,188.8,Quartz Diorite +DH020,188.8,290.4,Mineralized Porphyry +DH020,290.4,436.0,Fresh Granite +DH021,0.0,31.2,Alluvium +DH021,31.2,71.7,Weathered Granite +DH021,71.7,114.4,Granite +DH021,114.4,177.0,Quartz Diorite +DH021,177.0,237.0,Mineralized Porphyry +DH022,0.0,23.2,Alluvium +DH022,23.2,73.2,Weathered Granite +DH022,73.2,115.3,Granite +DH022,115.3,181.7,Quartz Diorite +DH022,181.7,273.9,Mineralized Porphyry +DH022,273.9,305.0,Fresh Granite +DH023,0.0,10.9,Alluvium +DH023,10.9,46.7,Weathered Granite +DH023,46.7,133.5,Granite +DH023,133.5,177.1,Quartz Diorite +DH023,177.1,227.0,Mineralized Porphyry +DH024,0.0,25.4,Alluvium +DH024,25.4,50.8,Weathered Granite +DH024,50.8,110.3,Granite +DH024,110.3,189.4,Quartz Diorite +DH024,189.4,272.9,Mineralized Porphyry +DH024,272.9,431.0,Fresh Granite +DH025,0.0,9.2,Alluvium +DH025,9.2,65.3,Weathered Granite +DH025,65.3,129.4,Granite +DH025,129.4,172.1,Quartz Diorite +DH025,172.1,199.0,Mineralized Porphyry +DH026,0.0,33.9,Alluvium +DH026,33.9,52.9,Weathered Granite +DH026,52.9,117.9,Granite +DH026,117.9,163.0,Quartz Diorite +DH027,0.0,12.6,Alluvium +DH027,12.6,68.3,Weathered Granite +DH027,68.3,128.2,Granite +DH027,128.2,176.3,Quartz Diorite +DH027,176.3,281.0,Mineralized Porphyry +DH028,0.0,11.4,Alluvium +DH028,11.4,45.1,Weathered Granite +DH028,45.1,122.1,Granite +DH028,122.1,194.8,Quartz Diorite +DH028,194.8,266.2,Mineralized Porphyry +DH028,266.2,448.0,Fresh Granite +DH029,0.0,20.6,Alluvium +DH029,20.6,69.3,Weathered Granite +DH029,69.3,107.7,Granite +DH029,107.7,176.9,Quartz Diorite +DH029,176.9,287.4,Mineralized Porphyry +DH029,287.4,418.0,Fresh Granite +DH030,0.0,10.7,Alluvium +DH030,10.7,50.9,Weathered Granite +DH030,50.9,117.3,Granite +DH030,117.3,179.4,Quartz Diorite +DH030,179.4,290.9,Mineralized Porphyry +DH030,290.9,375.0,Fresh Granite +DH031,0.0,25.7,Alluvium +DH031,25.7,74.5,Weathered Granite +DH031,74.5,117.4,Granite +DH031,117.4,177.1,Quartz Diorite +DH031,177.1,292.7,Mineralized Porphyry +DH031,292.7,417.0,Fresh Granite +DH032,0.0,26.9,Alluvium +DH032,26.9,67.6,Weathered Granite +DH032,67.6,107.9,Granite +DH032,107.9,179.0,Quartz Diorite +DH032,179.0,271.0,Mineralized Porphyry +DH032,271.0,418.0,Fresh Granite +DH033,0.0,18.9,Alluvium +DH033,18.9,53.7,Weathered Granite +DH033,53.7,128.9,Granite +DH033,128.9,192.2,Quartz Diorite +DH033,192.2,289.1,Mineralized Porphyry +DH033,289.1,306.0,Fresh Granite +DH034,0.0,13.2,Alluvium +DH034,13.2,52.6,Weathered Granite +DH034,52.6,109.1,Granite +DH034,109.1,193.3,Quartz Diorite +DH034,193.3,245.0,Mineralized Porphyry +DH035,0.0,11.7,Alluvium +DH035,11.7,70.4,Weathered Granite +DH035,70.4,117.0,Granite +DH035,117.0,166.1,Quartz Diorite +DH035,166.1,269.9,Mineralized Porphyry +DH035,269.9,382.0,Fresh Granite +DH036,0.0,28.5,Alluvium +DH036,28.5,51.3,Weathered Granite +DH036,51.3,132.5,Granite +DH036,132.5,190.5,Quartz Diorite +DH036,190.5,290.5,Mineralized Porphyry +DH036,290.5,348.0,Fresh Granite +DH037,0.0,6.5,Alluvium +DH037,6.5,71.0,Weathered Granite +DH037,71.0,114.2,Granite +DH037,114.2,183.6,Quartz Diorite +DH037,183.6,262.0,Mineralized Porphyry +DH038,0.0,8.8,Alluvium +DH038,8.8,68.4,Weathered Granite +DH038,68.4,133.2,Granite +DH038,133.2,178.0,Quartz Diorite +DH039,0.0,18.2,Alluvium +DH039,18.2,71.3,Weathered Granite +DH039,71.3,120.8,Granite +DH039,120.8,187.3,Quartz Diorite +DH039,187.3,289.6,Mineralized Porphyry +DH039,289.6,374.0,Fresh Granite +DH040,0.0,13.6,Alluvium +DH040,13.6,48.5,Weathered Granite +DH040,48.5,112.2,Granite +DH040,112.2,180.1,Quartz Diorite +DH040,180.1,229.0,Mineralized Porphyry +DH041,0.0,22.5,Alluvium +DH041,22.5,56.9,Weathered Granite +DH041,56.9,128.6,Granite +DH041,128.6,192.4,Quartz Diorite +DH041,192.4,272.4,Mineralized Porphyry +DH041,272.4,431.0,Fresh Granite +DH042,0.0,25.3,Alluvium +DH042,25.3,60.7,Weathered Granite +DH042,60.7,110.7,Granite +DH042,110.7,188.9,Quartz Diorite +DH042,188.9,222.0,Mineralized Porphyry +DH043,0.0,26.7,Alluvium +DH043,26.7,72.5,Weathered Granite +DH043,72.5,134.5,Granite +DH043,134.5,175.6,Quartz Diorite +DH043,175.6,187.0,Mineralized Porphyry +DH044,0.0,19.2,Alluvium +DH044,19.2,74.6,Weathered Granite +DH044,74.6,107.8,Granite +DH044,107.8,177.4,Quartz Diorite +DH044,177.4,291.3,Mineralized Porphyry +DH044,291.3,399.0,Fresh Granite +DH045,0.0,28.6,Alluvium +DH045,28.6,56.5,Weathered Granite +DH045,56.5,134.4,Granite +DH045,134.4,191.5,Quartz Diorite +DH045,191.5,196.0,Mineralized Porphyry +DH046,0.0,28.1,Alluvium +DH046,28.1,55.1,Weathered Granite +DH046,55.1,123.2,Granite +DH046,123.2,184.8,Quartz Diorite +DH046,184.8,204.0,Mineralized Porphyry +DH047,0.0,5.7,Alluvium +DH047,5.7,51.6,Weathered Granite +DH047,51.6,126.4,Granite +DH047,126.4,181.9,Quartz Diorite +DH047,181.9,279.9,Mineralized Porphyry +DH047,279.9,330.0,Fresh Granite +DH048,0.0,15.4,Alluvium +DH048,15.4,71.0,Weathered Granite +DH048,71.0,105.9,Granite +DH048,105.9,176.9,Quartz Diorite +DH048,176.9,293.4,Mineralized Porphyry +DH048,293.4,412.0,Fresh Granite +DH049,0.0,27.5,Alluvium +DH049,27.5,52.7,Weathered Granite +DH049,52.7,131.0,Granite +DH049,131.0,187.4,Quartz Diorite +DH049,187.4,209.0,Mineralized Porphyry +DH050,0.0,11.5,Alluvium +DH050,11.5,60.9,Weathered Granite +DH050,60.9,128.4,Granite +DH050,128.4,172.4,Quartz Diorite +DH050,172.4,243.0,Mineralized Porphyry diff --git a/drillholes-demo/data/survey.csv b/drillholes-demo/data/survey.csv new file mode 100644 index 0000000..a67e692 --- /dev/null +++ b/drillholes-demo/data/survey.csv @@ -0,0 +1,585 @@ +HOLEID,DEPTH,AZ,DIP +DH001,0.0,282.7,-72.6 +DH001,30.0,280.3,-70.3 +DH001,60.0,283.5,-70.6 +DH001,90.0,278.8,-69.6 +DH001,120.0,277.6,-72.6 +DH001,150.0,279.7,-70.9 +DH001,180.0,277.2,-71.2 +DH001,210.0,278.6,-71.4 +DH001,240.0,278.7,-69.3 +DH001,270.0,277.9,-67.7 +DH001,300.0,284.1,-70.5 +DH001,330.0,278.2,-70.2 +DH001,360.0,283.4,-69.5 +DH001,390.0,282.9,-70.2 +DH001,398.0,281.2,-71.7 +DH002,0.0,352.2,-65.8 +DH002,30.0,351.8,-61.8 +DH002,60.0,346.2,-63.3 +DH002,90.0,345.9,-62.6 +DH002,120.0,345.7,-61.4 +DH002,150.0,346.3,-61.2 +DH002,180.0,352.9,-63.4 +DH002,210.0,352.7,-62.2 +DH002,240.0,354.4,-65.5 +DH002,270.0,350.8,-66.4 +DH002,300.0,351.1,-66.0 +DH002,330.0,350.5,-63.6 +DH002,360.0,349.6,-63.9 +DH002,390.0,352.5,-62.2 +DH002,419.0,349.8,-63.4 +DH003,0.0,184.6,-78.7 +DH003,30.0,176.5,-78.9 +DH003,60.0,181.9,-76.9 +DH003,90.0,183.0,-75.4 +DH003,120.0,178.6,-74.0 +DH003,150.0,182.9,-77.8 +DH003,180.0,178.9,-77.5 +DH003,192.0,176.9,-78.5 +DH004,0.0,56.2,-83.0 +DH004,30.0,50.6,-81.2 +DH004,60.0,52.3,-80.0 +DH004,90.0,54.6,-82.7 +DH004,120.0,50.6,-79.7 +DH004,150.0,54.0,-79.9 +DH004,180.0,48.0,-80.5 +DH004,210.0,53.2,-84.9 +DH004,240.0,52.7,-81.5 +DH004,270.0,46.9,-82.9 +DH004,300.0,55.1,-83.8 +DH004,316.0,51.4,-82.9 +DH005,0.0,3.0,-80.4 +DH005,30.0,7.8,-85.2 +DH005,60.0,10.0,-80.6 +DH005,90.0,2.8,-80.9 +DH005,120.0,1.1,-79.9 +DH005,150.0,6.7,-82.0 +DH005,180.0,0.9,-80.5 +DH005,183.0,0.3,-84.5 +DH006,0.0,79.1,-65.9 +DH006,30.0,79.7,-65.1 +DH006,60.0,84.3,-70.4 +DH006,90.0,77.8,-70.3 +DH006,120.0,83.8,-65.8 +DH006,150.0,80.1,-65.5 +DH006,180.0,78.3,-65.8 +DH006,210.0,87.0,-66.0 +DH006,240.0,84.7,-65.6 +DH006,270.0,78.1,-69.4 +DH006,300.0,78.9,-67.6 +DH006,330.0,85.2,-66.8 +DH006,352.0,86.2,-69.7 +DH007,0.0,49.8,-67.3 +DH007,30.0,45.2,-64.2 +DH007,60.0,52.3,-64.8 +DH007,90.0,43.0,-64.8 +DH007,120.0,42.9,-63.2 +DH007,150.0,49.6,-67.5 +DH007,180.0,43.4,-67.4 +DH007,210.0,52.3,-65.7 +DH007,234.0,50.3,-64.7 +DH008,0.0,244.7,-88.9 +DH008,30.0,248.5,-88.0 +DH008,60.0,244.8,-85.6 +DH008,90.0,245.5,-84.2 +DH008,120.0,240.5,-86.7 +DH008,150.0,243.0,-87.0 +DH008,180.0,240.2,-89.0 +DH008,210.0,241.8,-88.0 +DH008,240.0,243.3,-86.1 +DH008,270.0,245.3,-87.3 +DH008,300.0,243.1,-88.5 +DH008,330.0,244.9,-87.9 +DH008,348.0,239.4,-87.3 +DH009,0.0,43.6,-89.6 +DH009,30.0,44.6,-87.6 +DH009,60.0,45.9,-87.1 +DH009,90.0,45.4,-89.1 +DH009,120.0,46.8,-87.7 +DH009,150.0,43.2,-87.2 +DH009,180.0,42.5,-87.9 +DH009,210.0,46.3,-85.7 +DH009,240.0,48.1,-88.0 +DH009,270.0,44.1,-86.2 +DH009,300.0,42.0,-86.0 +DH009,330.0,43.8,-90.3 +DH009,360.0,39.6,-85.9 +DH009,368.0,39.5,-89.3 +DH010,0.0,180.6,-74.2 +DH010,30.0,180.4,-70.7 +DH010,60.0,177.4,-70.2 +DH010,90.0,185.9,-73.0 +DH010,120.0,178.8,-71.6 +DH010,150.0,178.5,-73.0 +DH010,180.0,186.9,-69.2 +DH010,210.0,185.0,-73.3 +DH010,240.0,184.2,-71.0 +DH010,270.0,181.2,-71.4 +DH010,300.0,177.4,-73.9 +DH010,330.0,182.6,-74.2 +DH010,360.0,179.0,-70.2 +DH010,381.0,187.2,-71.9 +DH011,0.0,253.3,-82.7 +DH011,30.0,246.3,-85.9 +DH011,60.0,248.8,-88.1 +DH011,90.0,252.5,-86.0 +DH011,120.0,249.6,-87.7 +DH011,150.0,246.7,-83.2 +DH011,180.0,245.3,-87.2 +DH011,182.0,247.8,-85.7 +DH012,0.0,210.1,-65.3 +DH012,30.0,205.0,-66.8 +DH012,60.0,212.6,-64.5 +DH012,90.0,210.7,-64.3 +DH012,120.0,211.8,-68.0 +DH012,150.0,207.9,-65.1 +DH012,180.0,207.6,-63.2 +DH012,210.0,209.0,-63.7 +DH012,240.0,212.7,-65.3 +DH012,270.0,213.3,-64.8 +DH012,300.0,212.7,-66.3 +DH012,330.0,209.2,-65.1 +DH012,360.0,205.2,-65.9 +DH012,390.0,213.4,-64.5 +DH012,420.0,206.0,-66.3 +DH012,425.0,206.1,-68.2 +DH013,0.0,76.2,-81.0 +DH013,30.0,70.0,-80.1 +DH013,60.0,67.0,-82.0 +DH013,90.0,73.9,-79.9 +DH013,120.0,76.7,-80.0 +DH013,150.0,71.7,-79.1 +DH013,180.0,75.9,-79.4 +DH013,210.0,76.5,-79.0 +DH013,219.0,75.6,-83.0 +DH014,0.0,291.8,-86.1 +DH014,30.0,290.0,-84.8 +DH014,60.0,294.2,-82.8 +DH014,90.0,287.4,-84.3 +DH014,120.0,292.0,-86.6 +DH014,150.0,285.7,-88.5 +DH014,161.0,292.3,-85.8 +DH015,0.0,262.4,-62.6 +DH015,30.0,262.3,-62.9 +DH015,60.0,260.4,-64.9 +DH015,90.0,258.1,-60.6 +DH015,120.0,261.7,-60.5 +DH015,150.0,252.9,-63.2 +DH015,180.0,253.0,-64.7 +DH015,210.0,259.3,-61.1 +DH015,240.0,260.2,-60.2 +DH015,270.0,259.9,-60.6 +DH015,300.0,253.0,-64.0 +DH015,316.0,258.7,-60.3 +DH016,0.0,261.0,-84.9 +DH016,30.0,267.8,-87.8 +DH016,60.0,265.0,-82.6 +DH016,90.0,267.7,-86.6 +DH016,120.0,269.5,-85.9 +DH016,150.0,269.5,-86.2 +DH016,180.0,266.9,-85.6 +DH016,210.0,263.7,-82.7 +DH016,240.0,262.9,-87.5 +DH016,261.0,264.4,-83.7 +DH017,0.0,50.3,-78.5 +DH017,30.0,45.2,-82.1 +DH017,60.0,43.6,-81.1 +DH017,90.0,52.2,-80.3 +DH017,120.0,48.2,-82.1 +DH017,150.0,51.4,-81.5 +DH017,180.0,43.5,-82.3 +DH017,210.0,42.9,-83.3 +DH017,240.0,42.4,-81.8 +DH017,270.0,48.5,-82.4 +DH017,300.0,46.4,-78.7 +DH017,330.0,49.7,-81.3 +DH017,360.0,45.0,-79.1 +DH017,390.0,44.6,-82.5 +DH017,399.0,51.3,-81.3 +DH018,0.0,47.0,-84.9 +DH018,30.0,46.1,-86.6 +DH018,60.0,42.0,-86.5 +DH018,90.0,41.2,-83.2 +DH018,120.0,42.4,-85.0 +DH018,150.0,47.5,-83.7 +DH018,180.0,44.0,-85.5 +DH018,210.0,49.5,-84.4 +DH018,240.0,47.7,-83.0 +DH018,270.0,47.5,-87.3 +DH018,300.0,45.2,-87.8 +DH018,330.0,46.1,-82.7 +DH018,360.0,44.7,-85.8 +DH018,390.0,40.0,-82.6 +DH018,392.0,40.6,-88.2 +DH019,0.0,331.4,-89.1 +DH019,30.0,333.5,-86.4 +DH019,60.0,332.0,-89.2 +DH019,90.0,330.0,-87.2 +DH019,120.0,329.5,-85.3 +DH019,150.0,331.0,-87.7 +DH019,180.0,332.8,-87.0 +DH019,210.0,328.9,-88.8 +DH019,240.0,337.5,-89.5 +DH019,245.0,334.0,-86.6 +DH020,0.0,141.4,-89.8 +DH020,30.0,145.9,-87.4 +DH020,60.0,140.7,-90.5 +DH020,90.0,140.5,-89.5 +DH020,120.0,144.9,-91.0 +DH020,150.0,141.4,-86.8 +DH020,180.0,138.6,-89.6 +DH020,210.0,145.2,-91.5 +DH020,240.0,138.6,-91.6 +DH020,270.0,147.3,-92.3 +DH020,300.0,140.0,-92.2 +DH020,330.0,139.2,-88.7 +DH020,360.0,140.5,-89.0 +DH020,390.0,144.0,-87.3 +DH020,420.0,138.1,-87.3 +DH020,436.0,144.3,-91.4 +DH021,0.0,111.0,-86.2 +DH021,30.0,105.8,-85.8 +DH021,60.0,107.8,-87.7 +DH021,90.0,113.1,-89.1 +DH021,120.0,111.4,-89.4 +DH021,150.0,111.3,-87.7 +DH021,180.0,105.5,-88.8 +DH021,210.0,106.5,-90.8 +DH021,237.0,103.6,-89.2 +DH022,0.0,171.1,-86.8 +DH022,30.0,178.2,-83.6 +DH022,60.0,178.3,-85.9 +DH022,90.0,179.8,-84.2 +DH022,120.0,172.2,-86.9 +DH022,150.0,177.8,-86.8 +DH022,180.0,176.0,-81.8 +DH022,210.0,170.9,-87.7 +DH022,240.0,180.8,-84.3 +DH022,270.0,172.2,-82.4 +DH022,300.0,179.7,-84.6 +DH022,305.0,177.1,-86.2 +DH023,0.0,234.1,-87.8 +DH023,30.0,236.5,-87.4 +DH023,60.0,242.0,-91.3 +DH023,90.0,239.6,-90.0 +DH023,120.0,242.3,-89.9 +DH023,150.0,239.7,-88.1 +DH023,180.0,237.6,-87.3 +DH023,210.0,240.9,-88.0 +DH023,227.0,241.2,-85.5 +DH024,0.0,343.2,-72.2 +DH024,30.0,339.1,-70.5 +DH024,60.0,344.2,-72.9 +DH024,90.0,339.9,-70.0 +DH024,120.0,343.0,-71.2 +DH024,150.0,340.5,-69.5 +DH024,180.0,340.8,-74.1 +DH024,210.0,347.6,-69.8 +DH024,240.0,341.1,-72.5 +DH024,270.0,346.3,-70.0 +DH024,300.0,342.8,-72.2 +DH024,330.0,346.4,-70.9 +DH024,360.0,346.8,-71.9 +DH024,390.0,340.0,-69.9 +DH024,420.0,347.7,-70.5 +DH024,431.0,340.0,-74.1 +DH025,0.0,105.5,-72.5 +DH025,30.0,107.9,-70.3 +DH025,60.0,105.3,-67.3 +DH025,90.0,102.0,-70.7 +DH025,120.0,104.2,-69.1 +DH025,150.0,102.2,-69.0 +DH025,180.0,107.5,-69.8 +DH025,199.0,100.1,-70.3 +DH026,0.0,331.8,-80.4 +DH026,30.0,329.5,-77.1 +DH026,60.0,331.3,-75.5 +DH026,90.0,330.3,-80.6 +DH026,120.0,335.4,-75.9 +DH026,150.0,330.7,-80.0 +DH026,163.0,329.8,-78.1 +DH027,0.0,8.6,-81.9 +DH027,30.0,4.4,-80.6 +DH027,60.0,13.5,-79.6 +DH027,90.0,8.9,-82.8 +DH027,120.0,6.4,-81.7 +DH027,150.0,11.5,-78.2 +DH027,180.0,12.9,-77.6 +DH027,210.0,13.7,-77.8 +DH027,240.0,4.6,-82.7 +DH027,270.0,6.9,-80.2 +DH027,281.0,4.9,-78.4 +DH028,0.0,201.1,-74.6 +DH028,30.0,196.6,-76.4 +DH028,60.0,196.5,-72.8 +DH028,90.0,200.7,-73.5 +DH028,120.0,197.9,-75.7 +DH028,150.0,198.9,-73.3 +DH028,180.0,202.6,-76.7 +DH028,210.0,204.3,-77.2 +DH028,240.0,203.9,-77.3 +DH028,270.0,197.5,-72.8 +DH028,300.0,196.7,-75.4 +DH028,330.0,199.4,-76.4 +DH028,360.0,202.0,-72.8 +DH028,390.0,203.6,-75.9 +DH028,420.0,200.2,-76.4 +DH028,448.0,197.3,-76.9 +DH029,0.0,232.6,-61.4 +DH029,30.0,231.0,-63.6 +DH029,60.0,228.1,-63.5 +DH029,90.0,228.6,-64.1 +DH029,120.0,224.5,-65.9 +DH029,150.0,232.7,-63.8 +DH029,180.0,232.7,-65.7 +DH029,210.0,228.7,-65.5 +DH029,240.0,225.7,-66.5 +DH029,270.0,224.4,-61.2 +DH029,300.0,226.4,-63.1 +DH029,330.0,227.9,-64.3 +DH029,360.0,228.5,-65.6 +DH029,390.0,233.1,-61.8 +DH029,418.0,230.6,-63.9 +DH030,0.0,34.6,-62.0 +DH030,30.0,36.5,-67.2 +DH030,60.0,36.5,-62.7 +DH030,90.0,39.3,-63.0 +DH030,120.0,41.0,-66.2 +DH030,150.0,42.3,-64.9 +DH030,180.0,39.5,-67.5 +DH030,210.0,43.0,-65.8 +DH030,240.0,33.7,-64.8 +DH030,270.0,34.4,-66.6 +DH030,300.0,39.4,-65.1 +DH030,330.0,42.3,-65.6 +DH030,360.0,40.4,-64.7 +DH030,375.0,39.7,-63.9 +DH031,0.0,50.2,-86.0 +DH031,30.0,48.9,-90.6 +DH031,60.0,52.3,-86.6 +DH031,90.0,45.9,-89.0 +DH031,120.0,54.4,-87.2 +DH031,150.0,55.4,-88.5 +DH031,180.0,52.1,-89.9 +DH031,210.0,55.0,-89.5 +DH031,240.0,52.9,-89.3 +DH031,270.0,51.1,-87.4 +DH031,300.0,50.6,-86.3 +DH031,330.0,49.7,-87.8 +DH031,360.0,48.9,-89.3 +DH031,390.0,49.9,-90.9 +DH031,417.0,46.4,-87.7 +DH032,0.0,152.5,-83.6 +DH032,30.0,146.1,-85.6 +DH032,60.0,147.9,-82.9 +DH032,90.0,154.5,-86.1 +DH032,120.0,152.6,-86.8 +DH032,150.0,148.7,-86.8 +DH032,180.0,148.7,-83.6 +DH032,210.0,155.0,-86.4 +DH032,240.0,151.3,-83.4 +DH032,270.0,155.4,-83.9 +DH032,300.0,148.5,-83.8 +DH032,330.0,149.1,-81.7 +DH032,360.0,149.9,-83.5 +DH032,390.0,146.1,-85.2 +DH032,418.0,154.7,-83.9 +DH033,0.0,347.2,-80.3 +DH033,30.0,351.3,-84.0 +DH033,60.0,348.2,-83.0 +DH033,90.0,349.1,-83.9 +DH033,120.0,345.2,-80.4 +DH033,150.0,352.0,-80.8 +DH033,180.0,352.6,-81.4 +DH033,210.0,350.4,-81.3 +DH033,240.0,347.6,-83.2 +DH033,270.0,345.2,-82.0 +DH033,300.0,345.7,-84.4 +DH033,306.0,348.7,-83.4 +DH034,0.0,211.8,-80.6 +DH034,30.0,218.2,-84.5 +DH034,60.0,209.7,-83.5 +DH034,90.0,217.6,-80.5 +DH034,120.0,211.0,-80.9 +DH034,150.0,210.8,-83.2 +DH034,180.0,219.6,-84.3 +DH034,210.0,211.1,-83.0 +DH034,240.0,215.8,-79.9 +DH034,245.0,219.4,-85.1 +DH035,0.0,332.3,-71.2 +DH035,30.0,333.6,-70.6 +DH035,60.0,337.5,-75.2 +DH035,90.0,339.2,-74.8 +DH035,120.0,335.1,-72.6 +DH035,150.0,335.9,-71.8 +DH035,180.0,337.4,-69.9 +DH035,210.0,340.9,-72.8 +DH035,240.0,331.9,-71.5 +DH035,270.0,340.7,-74.0 +DH035,300.0,335.5,-73.4 +DH035,330.0,331.4,-71.9 +DH035,360.0,334.4,-71.2 +DH035,382.0,339.2,-71.0 +DH036,0.0,288.8,-78.6 +DH036,30.0,292.1,-75.7 +DH036,60.0,289.5,-75.1 +DH036,90.0,286.0,-75.2 +DH036,120.0,285.6,-79.6 +DH036,150.0,289.9,-80.1 +DH036,180.0,285.1,-80.5 +DH036,210.0,289.0,-75.9 +DH036,240.0,284.9,-76.6 +DH036,270.0,292.8,-79.5 +DH036,300.0,286.1,-75.3 +DH036,330.0,292.8,-77.3 +DH036,348.0,292.8,-79.9 +DH037,0.0,167.2,-87.1 +DH037,30.0,165.9,-87.0 +DH037,60.0,168.3,-87.0 +DH037,90.0,167.9,-89.3 +DH037,120.0,165.5,-90.2 +DH037,150.0,170.8,-90.8 +DH037,180.0,164.2,-90.4 +DH037,210.0,165.1,-86.6 +DH037,240.0,167.3,-85.6 +DH037,262.0,164.7,-87.6 +DH038,0.0,282.0,-79.4 +DH038,30.0,286.3,-75.9 +DH038,60.0,286.2,-80.6 +DH038,90.0,279.7,-77.9 +DH038,120.0,280.4,-77.4 +DH038,150.0,283.2,-78.5 +DH038,178.0,285.8,-77.5 +DH039,0.0,1.7,-77.0 +DH039,30.0,7.4,-74.4 +DH039,60.0,4.0,-74.8 +DH039,90.0,9.0,-72.3 +DH039,120.0,7.0,-75.0 +DH039,150.0,4.1,-74.2 +DH039,180.0,4.5,-73.9 +DH039,210.0,8.2,-76.9 +DH039,240.0,1.4,-76.0 +DH039,270.0,10.3,-73.4 +DH039,300.0,3.1,-72.0 +DH039,330.0,6.1,-74.4 +DH039,360.0,10.8,-76.9 +DH039,374.0,3.6,-73.8 +DH040,0.0,36.3,-85.8 +DH040,30.0,36.4,-89.3 +DH040,60.0,36.4,-87.4 +DH040,90.0,36.1,-89.1 +DH040,120.0,42.9,-88.0 +DH040,150.0,37.9,-89.6 +DH040,180.0,37.9,-88.3 +DH040,210.0,40.4,-88.7 +DH040,229.0,43.2,-84.3 +DH041,0.0,294.6,-67.4 +DH041,30.0,294.8,-64.3 +DH041,60.0,294.8,-62.9 +DH041,90.0,301.1,-63.1 +DH041,120.0,298.9,-62.0 +DH041,150.0,294.0,-65.6 +DH041,180.0,296.8,-62.3 +DH041,210.0,299.4,-63.2 +DH041,240.0,295.3,-62.1 +DH041,270.0,298.6,-65.0 +DH041,300.0,303.3,-65.7 +DH041,330.0,297.6,-64.5 +DH041,360.0,294.9,-66.1 +DH041,390.0,295.5,-67.4 +DH041,420.0,302.3,-64.5 +DH041,431.0,297.2,-65.5 +DH042,0.0,286.2,-87.6 +DH042,30.0,291.2,-85.8 +DH042,60.0,285.8,-89.4 +DH042,90.0,286.4,-88.0 +DH042,120.0,286.5,-87.4 +DH042,150.0,287.4,-89.5 +DH042,180.0,285.4,-89.1 +DH042,210.0,282.8,-90.4 +DH042,222.0,289.1,-89.1 +DH043,0.0,80.9,-61.9 +DH043,30.0,86.4,-63.8 +DH043,60.0,87.1,-59.7 +DH043,90.0,84.8,-61.3 +DH043,120.0,79.3,-59.6 +DH043,150.0,82.7,-59.8 +DH043,180.0,84.6,-65.3 +DH043,187.0,79.2,-61.2 +DH044,0.0,191.7,-89.8 +DH044,30.0,193.5,-84.9 +DH044,60.0,191.1,-87.2 +DH044,90.0,186.2,-85.3 +DH044,120.0,189.4,-84.7 +DH044,150.0,189.8,-86.6 +DH044,180.0,188.8,-89.0 +DH044,210.0,193.8,-87.0 +DH044,240.0,191.5,-84.2 +DH044,270.0,195.7,-84.9 +DH044,300.0,188.0,-86.4 +DH044,330.0,194.9,-87.8 +DH044,360.0,187.1,-85.1 +DH044,390.0,190.9,-86.6 +DH044,399.0,195.9,-86.4 +DH045,0.0,217.4,-65.5 +DH045,30.0,217.4,-67.0 +DH045,60.0,221.1,-62.7 +DH045,90.0,216.0,-65.9 +DH045,120.0,221.9,-67.6 +DH045,150.0,218.4,-64.9 +DH045,180.0,220.1,-66.7 +DH045,196.0,219.9,-65.4 +DH046,0.0,313.6,-65.7 +DH046,30.0,312.0,-62.8 +DH046,60.0,309.5,-65.1 +DH046,90.0,309.3,-63.8 +DH046,120.0,308.4,-60.2 +DH046,150.0,311.4,-61.0 +DH046,180.0,317.1,-65.4 +DH046,204.0,313.9,-60.7 +DH047,0.0,218.4,-61.0 +DH047,30.0,216.4,-63.4 +DH047,60.0,217.4,-57.6 +DH047,90.0,221.7,-63.4 +DH047,120.0,219.2,-61.8 +DH047,150.0,221.1,-63.3 +DH047,180.0,221.5,-58.6 +DH047,210.0,213.3,-63.2 +DH047,240.0,220.4,-62.7 +DH047,270.0,217.4,-58.1 +DH047,300.0,217.8,-61.2 +DH047,330.0,216.6,-63.2 +DH048,0.0,153.2,-67.0 +DH048,30.0,145.4,-67.2 +DH048,60.0,153.1,-68.3 +DH048,90.0,152.2,-64.7 +DH048,120.0,151.8,-63.0 +DH048,150.0,151.9,-63.2 +DH048,180.0,144.8,-64.1 +DH048,210.0,149.0,-65.6 +DH048,240.0,152.5,-63.1 +DH048,270.0,150.5,-66.0 +DH048,300.0,148.1,-66.6 +DH048,330.0,147.1,-66.6 +DH048,360.0,144.4,-68.4 +DH048,390.0,151.3,-66.2 +DH048,412.0,152.8,-65.2 +DH049,0.0,130.1,-68.7 +DH049,30.0,131.8,-63.7 +DH049,60.0,131.9,-66.5 +DH049,90.0,139.1,-63.7 +DH049,120.0,132.1,-69.3 +DH049,150.0,131.2,-69.2 +DH049,180.0,131.7,-66.2 +DH049,209.0,138.8,-66.4 +DH050,0.0,154.6,-72.5 +DH050,30.0,156.3,-70.0 +DH050,60.0,156.9,-68.0 +DH050,90.0,151.8,-73.2 +DH050,120.0,150.6,-71.1 +DH050,150.0,157.8,-71.4 +DH050,180.0,156.0,-70.5 +DH050,210.0,150.1,-71.8 +DH050,240.0,154.8,-69.7 +DH050,243.0,152.6,-72.3 diff --git a/drillholes-demo/data_generator.py b/drillholes-demo/data_generator.py new file mode 100644 index 0000000..eae323d --- /dev/null +++ b/drillholes-demo/data_generator.py @@ -0,0 +1,130 @@ +""" +Generate synthetic Western Australia mineral exploration drillhole data. +Modeled on the Kaggle "mineral-exploration-drillholes-western-australia" structure. +Au-Cu porphyry prospect, ~50 holes in a 7x7 grid pattern. +Run once: python data_generator.py +""" + +import numpy as np +import pandas as pd +import pathlib + +DATA_PATH = pathlib.Path(__file__).parent / "data" +DATA_PATH.mkdir(exist_ok=True) + +rng = np.random.default_rng(42) + +EAST_ORIGIN = 350000.0 +NORTH_ORIGIN = 7200000.0 +SPACING = 100.0 +N_HOLES = 50 + +# --- COLLAR --- + +hole_ids = [f"DH{i:03d}" for i in range(1, N_HOLES + 1)] + +cols = 7 +east_base = [EAST_ORIGIN + (i % cols) * SPACING for i in range(N_HOLES)] +north_base = [NORTH_ORIGIN + (i // cols) * SPACING for i in range(N_HOLES)] + +collar = pd.DataFrame({ + "HOLEID": hole_ids, + "EAST": np.round(np.array(east_base) + rng.uniform(-15, 15, N_HOLES), 1), + "NORTH": np.round(np.array(north_base) + rng.uniform(-15, 15, N_HOLES), 1), + "ELEV": np.round(400 + rng.uniform(-10, 10, N_HOLES), 1), + "TOTDEPTH": np.round(rng.uniform(150, 450, N_HOLES), 0), + "AZ": np.round(rng.uniform(0, 360, N_HOLES), 1), + "DIP": np.round(rng.uniform(-90, -60, N_HOLES), 1), +}) + +collar.to_csv(DATA_PATH / "collar.csv", index=False) +print(f"collar.csv: {len(collar)} holes") + +# --- SURVEY --- + +survey_rows = [] +for _, hole in collar.iterrows(): + depths = np.arange(0, hole["TOTDEPTH"] + 30, 30) + for d in depths: + d = min(d, hole["TOTDEPTH"]) + survey_rows.append({ + "HOLEID": hole["HOLEID"], + "DEPTH": round(float(d), 1), + "AZ": round(float(hole["AZ"]) + float(rng.uniform(-5, 5)), 1), + "DIP": round(float(hole["DIP"]) + float(rng.uniform(-3, 3)), 1), + }) + +survey = pd.DataFrame(survey_rows).drop_duplicates(["HOLEID", "DEPTH"]) +survey.to_csv(DATA_PATH / "survey.csv", index=False) +print(f"survey.csv: {len(survey)} stations") + +# --- LITHOLOGY --- + +LITH_SEQUENCE = [ + ("Alluvium", 0, 20), + ("Weathered Granite", 20, 60), + ("Granite", 60, 120), + ("Quartz Diorite", 120, 180), + ("Mineralized Porphyry",180, 280), + ("Fresh Granite", 280, 9999), +] + +lith_rows = [] +for _, hole in collar.iterrows(): + depth = 0.0 + for lith, base_from, base_to in LITH_SEQUENCE: + jitter = float(rng.uniform(-15, 15)) + actual_from = round(depth, 1) + actual_to = round(min(float(hole["TOTDEPTH"]), base_to + jitter), 1) + if actual_from >= float(hole["TOTDEPTH"]): + break + actual_to = max(actual_to, actual_from + 2.0) + actual_to = min(actual_to, float(hole["TOTDEPTH"])) + lith_rows.append({ + "HOLEID": hole["HOLEID"], + "FROM": actual_from, + "TO": actual_to, + "LITHOLOGY": lith, + }) + depth = actual_to + if depth >= float(hole["TOTDEPTH"]): + break + +lith = pd.DataFrame(lith_rows) +lith.to_csv(DATA_PATH / "lith.csv", index=False) +print(f"lith.csv: {len(lith)} intervals") + +# --- ASSAY (2m composites) --- + +assay_rows = [] +for _, hole in collar.iterrows(): + depth = 0.0 + tot = float(hole["TOTDEPTH"]) + while depth < tot: + to = min(depth + 2.0, tot) + mid = (depth + to) / 2.0 + in_zone = 80 <= mid <= 250 + + if in_zone: + au = float(max(0, rng.lognormal(mean=0.8, sigma=1.2))) + cu = float(max(0, rng.lognormal(mean=-1.5, sigma=0.8))) + ag = au * float(rng.uniform(1.5, 3.0)) + else: + au = float(max(0, rng.lognormal(mean=-2.5, sigma=0.6))) + cu = float(max(0, rng.lognormal(mean=-4.0, sigma=0.5))) + ag = au * float(rng.uniform(0.5, 1.5)) + + assay_rows.append({ + "HOLEID": hole["HOLEID"], + "FROM": round(depth, 1), + "TO": round(to, 1), + "Au_ppm": round(au, 3), + "Cu_pct": round(cu, 4), + "Ag_ppm": round(ag, 3), + }) + depth = to + +assay = pd.DataFrame(assay_rows) +assay.to_csv(DATA_PATH / "assay.csv", index=False) +print(f"assay.csv: {len(assay)} intervals") +print("Done — all CSVs written to data/") diff --git a/drillholes-demo/pages/__init__.py b/drillholes-demo/pages/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/drillholes-demo/pages/block_model.py b/drillholes-demo/pages/block_model.py new file mode 100644 index 0000000..2b3445b --- /dev/null +++ b/drillholes-demo/pages/block_model.py @@ -0,0 +1,108 @@ +from dash import dcc, html +import dash_ag_grid as dag +import dash_mantine_components as dmc +from dash_iconify import DashIconify + +from utils import load_data + +COLUMN_DEFS = [ + { + "field": "HOLEID", + "headerName": "Hole ID", + "pinned": "left", + "lockPinned": True, + "filter": "agTextColumnFilter", + "minWidth": 110, + }, + {"field": "FROM", "headerName": "From (m)", "filter": "agNumberColumnFilter", "minWidth": 110}, + {"field": "TO", "headerName": "To (m)", "filter": "agNumberColumnFilter", "minWidth": 110}, + { + "field": "Au_ppm", + "headerName": "Au (g/t)", + "filter": "agNumberColumnFilter", + "minWidth": 110, + "cellStyle": { + "styleConditions": [ + {"condition": "params.value >= 1.0", "style": {"backgroundColor": "#c6efce", "color": "#276221", "fontWeight": "600"}}, + {"condition": "params.value >= 0.3 && params.value < 1.0", "style": {"backgroundColor": "#ffeb9c", "color": "#9c6500"}}, + ], + "defaultStyle": {"backgroundColor": "white", "color": "#495057"}, + }, + }, + { + "field": "Cu_pct", + "headerName": "Cu (%)", + "filter": "agNumberColumnFilter", + "minWidth": 110, + "cellStyle": { + "styleConditions": [ + {"condition": "params.value >= 0.5", "style": {"backgroundColor": "#c6efce", "color": "#276221", "fontWeight": "600"}}, + {"condition": "params.value >= 0.2 && params.value < 0.5", "style": {"backgroundColor": "#ffeb9c", "color": "#9c6500"}}, + ], + "defaultStyle": {"backgroundColor": "white", "color": "#495057"}, + }, + }, + { + "field": "Ag_ppm", + "headerName": "Ag (ppm)", + "filter": "agNumberColumnFilter", + "minWidth": 110, + "cellStyle": { + "styleConditions": [ + {"condition": "params.value >= 5.0", "style": {"backgroundColor": "#c6efce", "color": "#276221", "fontWeight": "600"}}, + {"condition": "params.value >= 1.0 && params.value < 5.0", "style": {"backgroundColor": "#ffeb9c", "color": "#9c6500"}}, + ], + "defaultStyle": {"backgroundColor": "white", "color": "#495057"}, + }, + }, +] + + +def layout(): + _, assay, _, _ = load_data() + + return dmc.Stack([ + dmc.Group([ + DashIconify(icon="tabler:cube", width=22, color="#868e96"), + dmc.Title("Block Model", order=3, c="dark"), + ], gap="sm"), + + dmc.Group([ + dcc.Input( + id="bm-quick-filter", + placeholder="Search all columns...", + debounce=True, + style={"width": 280, "padding": "6px 10px", "border": "1px solid #dee2e6", "borderRadius": 6, "fontSize": 13}, + ), + dmc.Text(id="bm-row-count", size="sm", c="dimmed"), + dmc.Button( + "Export CSV", + id="bm-export-btn", + leftSection=DashIconify(icon="tabler:download", width=16), + variant="light", + color="gray", + size="sm", + ), + ], gap="sm", align="center"), + + dag.AgGrid( + id="bm-grid", + columnDefs=COLUMN_DEFS, + rowData=assay.to_dict("records"), + columnSize="autoSize", + dashGridOptions={ + "theme": "themeAlpine", + "pagination": True, + "paginationPageSize": 20, + "paginationPageSizeSelector": [20, 50, 100], + }, + defaultColDef={ + "filter": True, + "floatingFilter": True, + "sortable": True, + "resizable": True, + "minWidth": 100, + }, + style={"height": "600px"}, + ), + ], gap="md", p="md") diff --git a/drillholes-demo/pages/comparison.py b/drillholes-demo/pages/comparison.py new file mode 100644 index 0000000..a4d6ed3 --- /dev/null +++ b/drillholes-demo/pages/comparison.py @@ -0,0 +1,202 @@ +""" +Comparison page — compare Au/Cu/Ag grade profiles across multiple holes +side by side, with shared depth axis. +""" + +import plotly.graph_objects as go +from plotly.subplots import make_subplots +from dash import html, dcc +import dash_mantine_components as dmc +import plotly.express as px + +from utils import load_data, CHART_LAYOUT, GRADE_COLORS, GRADE_LABELS + + +DEFAULT_HOLES = ["DH001", "DH002", "DH003", "DH004", "DH005"] +DEFAULT_GRADE = "Au_ppm" +SUBPLOT_COLORS = px.colors.qualitative.Set2 + + +def build_comparison_figure(selected_holes, grade_col): + collar, assay, lith, _ = load_data() + + if not selected_holes: + fig = go.Figure() + fig.update_layout(**{**CHART_LAYOUT, "height": 500, + "title_text": "Select at least one hole"}) + return fig + + n = len(selected_holes) + grade_label = GRADE_LABELS.get(grade_col, grade_col) + + fig = make_subplots( + rows=1, cols=n, + shared_yaxes=True, + subplot_titles=selected_holes, + horizontal_spacing=max(0.01, 0.04 - 0.003 * n), + ) + for ann in fig.layout.annotations: + ann.font = dict(size=10, color="#495057") + + for i, hole_id in enumerate(selected_holes, start=1): + hole_assay = assay[assay["HOLEID"] == hole_id].sort_values("FROM") + if hole_assay.empty: + continue + + mid_depths = (hole_assay["FROM"] + hole_assay["TO"]) / 2 + widths = hole_assay["TO"] - hole_assay["FROM"] + color = SUBPLOT_COLORS[(i - 1) % len(SUBPLOT_COLORS)] + + grade_max = float(hole_assay[grade_col].quantile(0.98)) or 1.0 + + fig.add_trace(go.Bar( + x=hole_assay[grade_col], + y=mid_depths, + orientation="h", + width=widths, + marker=dict( + color=hole_assay[grade_col], + colorscale=[ + [0, "#f0f0f0"], + [0.4, color], + [1.0, "#212529"], + ], + cmin=0, cmax=grade_max, + showscale=False, + line_width=0, + ), + name=hole_id, + showlegend=False, + hovertemplate=f"{hole_id}
Depth: %{{y:.1f}} m
{grade_label}: %{{x:.4g}}", + ), row=1, col=i) + + # Best intercept annotation + peak_idx = hole_assay[grade_col].idxmax() + peak_row = hole_assay.loc[peak_idx] + fig.add_annotation( + x=float(peak_row[grade_col]), + y=float((peak_row["FROM"] + peak_row["TO"]) / 2), + xref=f"x{i}" if i > 1 else "x", + yref="y", + text=f" {peak_row[grade_col]:.2g} ←peak", + showarrow=False, + font=dict(size=8, color="#d48806"), + xanchor="left", + ) + + fig.update_xaxes( + title_text=grade_label, + title_font=dict(color="#495057", size=10), + showgrid=True, gridcolor="#e9ecef", + tickfont=dict(color="#6c757d", size=8), + zeroline=True, zerolinecolor="#ced4da", + row=1, col=i, + ) + + fig.update_yaxes( + autorange="reversed", + title_text="Depth (m ↓)", + showgrid=True, gridcolor="#e9ecef", + tickfont=dict(color="#6c757d"), + title_font=dict(color="#495057"), + row=1, col=1, + ) + fig.update_layout(**{ + **CHART_LAYOUT, + "height": 650, + "margin": dict(l=60, r=20, t=45, b=50), + "bargap": 0, "bargroupgap": 0, + "hoverlabel": dict(bgcolor="#ffffff", font_color="#212529", bordercolor="#dee2e6"), + "title_text": f"{grade_label} Grade Profile Comparison", + "title_font": dict(color="#212529", size=13), + }) + return fig + + +def layout(): + collar, assay, _, _ = load_data() + all_hole_ids = sorted(collar["HOLEID"].tolist()) + + default_total_m = int(collar.loc[collar["HOLEID"].isin(DEFAULT_HOLES), "TOTDEPTH"].sum()) + + badge_strip = dmc.Group(gap="sm", id="comparison-badges", children=[ + dmc.Badge(f"Holes selected: {len(DEFAULT_HOLES)}", color="orange", variant="light", + id="badge-hole-count", size="lg"), + dmc.Badge(f"Combined meters: {default_total_m:,} m", color="gray", variant="light", + id="badge-total-meters", size="lg"), + dmc.Badge(f"Grade: {GRADE_LABELS[DEFAULT_GRADE]}", color="orange", variant="filled", + id="badge-grade", size="lg"), + ]) + + return dmc.Stack([ + # Header + badge strip + dmc.Group([ + html.Div([ + html.P("Grade Profile Comparison", className="section-title"), + html.P( + "Side-by-side grade profiles across selected holes on a shared depth axis.", + className="section-description", + ), + ], style={"flex": 1}), + badge_strip, + ], justify="space-between", align="center", wrap="nowrap"), + + dmc.Grid(gutter="md", children=[ + # Controls panel + dmc.GridCol( + dmc.Paper([ + html.P("Grade Type", className="section-title"), + html.P( + "Au = gold (g/t). Cu = copper (%). Ag = silver (ppm).", + className="section-description", + ), + dmc.SegmentedControl( + id="grade-selector", + data=[ + {"value": "Au_ppm", "label": "Au (g/t)"}, + {"value": "Cu_pct", "label": "Cu (%)"}, + {"value": "Ag_ppm", "label": "Ag (ppm)"}, + ], + value=DEFAULT_GRADE, + color="orange", + size="xs", + fullWidth=True, + mb="md", + ), + html.P("Select Holes (up to 10)", className="section-title"), + dmc.CheckboxGroup( + id="hole-checklist", + value=DEFAULT_HOLES, + children=dmc.Stack([ + dmc.Checkbox( + label=h, value=h, + styles={"label": {"color": "#495057", "fontSize": "0.8rem"}}, + ) + for h in all_hole_ids[:20] + ], gap=6), + ), + ], p="md", radius="md", withBorder=True, className="chart-paper", + style={"maxHeight": "700px", "overflowY": "auto"}), + span={"base": 12, "md": 3}, + ), + + # Comparison chart + dmc.GridCol( + dmc.Paper([ + html.P("Grade Profiles", className="section-title"), + html.P( + "Each panel is one hole's grade profile vs. downhole depth on a shared Y-axis. " + "Peak-grade interval is annotated.", + className="section-description", + ), + dcc.Graph( + id="comparison-chart", + figure=build_comparison_figure(DEFAULT_HOLES, DEFAULT_GRADE), + config={"displayModeBar": True, "scrollZoom": True}, + style={"height": "650px"}, + ), + ], p="md", radius="md", withBorder=True, className="chart-paper"), + span={"base": 12, "md": 9}, + ), + ]), + ], gap="md") diff --git a/drillholes-demo/pages/cross_section.py b/drillholes-demo/pages/cross_section.py new file mode 100644 index 0000000..4b6ef5a --- /dev/null +++ b/drillholes-demo/pages/cross_section.py @@ -0,0 +1,543 @@ +""" +Cross-Section page — showcases Plotly.js multi-axis shapes. + +Each geological formation contact is a line shape whose left endpoint +anchors to one subplot x-axis and the right endpoint anchors to a DIFFERENT +subplot x-axis, via the new xref array syntax: xref=["x", "x2"]. +When the user pans or zooms col 1, only the left endpoint pixel moves; +the right endpoint stays locked to col 2's coordinate system — correct +geological cross-section behaviour. +""" + +import plotly.graph_objects as go +from plotly.subplots import make_subplots +from dash import html, dcc +import dash_mantine_components as dmc +from dash_iconify import DashIconify +import dash_tour_component as dtc +import numpy as np + +from utils import load_data, CHART_LAYOUT, LITH_COLORS, compute_trace_easting_elevation, kpi_card +from components.overview_widgets import collar_map, summary_table, depth_histogram + +# Formation contacts: approximate elevations (m RL) at deposit centre +FORMATION_CONTACTS = [ + {"name": "Alluvium / Weathered Granite", "elev": 382, "color": "#8B6914", "dip_m_per_m": 0.04}, + {"name": "Weathered Granite / Granite", "elev": 350, "color": "#7B5C2A", "dip_m_per_m": 0.06}, + {"name": "Granite / Quartz Diorite", "elev": 290, "color": "#6B4E2A", "dip_m_per_m": 0.08}, + {"name": "Porphyry Top (mineralised)", "elev": 220, "color": "#A0522D", "dip_m_per_m": 0.10}, +] + +AXIS_STYLE = dict( + showgrid=True, gridcolor="#e9ecef", + tickfont=dict(color="#6c757d"), + title_font=dict(color="#495057"), + zeroline=False, +) + +CS_TOUR_STEPS = [ + { + "selector": "#cs-chart-paper", + "content": "Welcome to Cross-Section View! Step through to discover all the interactive features on this page.", + "position": "bottom", + }, + { + "selector": "#cross-section-chart", + "content": "Hover anywhere on the chart — a gold cursor line tracks your elevation across all three panels simultaneously. Click once to pin a start elevation, then click again to measure the vertical distance between any two contacts.", + "position": "right", + }, + { + "selector": "#cross-section-chart", + "content": "Drag the Elevation (Y) axis — hover the tick labels on the left edge, then drag up or down to pan the elevation range. Scroll over the axis to zoom into any elevation band. Double-click anywhere to reset.", + "position": "right", + }, + { + "selector": "#cross-section-chart", + "content": "Each of the three panels has its own independent X-axis. Scroll or drag within Section A to zoom its grade range — Sections B and C stay exactly where they are.", + "position": "top", + }, + { + "selector": "#cs-formation-legend", + "content": "These dotted formation contact lines span all three panels simultaneously. Each endpoint is anchored to its own panel axis — zoom Section A and only its segment moves, keeping the geology correct.", + "position": "bottom", + }, +] + + +def _build_figure(collar, survey, orientation="EW"): + """ + Build the cross-section figure with multi-axis formation shapes. + orientation: "EW" groups holes by northing thirds; "NS" by easting thirds. + """ + if orientation == "EW": + sort_col, split_col = "NORTH", "EAST" + x_title = "Easting (m)" + else: + sort_col, split_col = "EAST", "NORTH" + x_title = "Northing (m)" + + sorted_collar = collar.sort_values(sort_col).reset_index(drop=True) + n = len(sorted_collar) + thirds = [ + sorted_collar.iloc[: n // 3], + sorted_collar.iloc[n // 3: 2 * n // 3], + sorted_collar.iloc[2 * n // 3:], + ] + section_labels = ["Section A (South)" if orientation == "EW" else "Section A (West)", + "Section B (Central)", + "Section C (North)" if orientation == "EW" else "Section C (East)"] + + fig = make_subplots( + rows=1, cols=3, + shared_yaxes=False, + column_widths=[0.33, 0.34, 0.33], + subplot_titles=section_labels, + horizontal_spacing=0.04, + ) + + for ann in fig.layout.annotations: + ann.font = dict(size=11, color="#495057") + + colors = ["#1971c2", "#2f9e44", "#e67700", "#c92a2a", "#862e9c", + "#0c8599", "#1864ab", "#5c940d", "#e67700", "#a61e4d"] + + for col_idx, (section_holes, _) in enumerate(zip(thirds, section_labels), start=1): + for hi, (_, hole) in enumerate(section_holes.iterrows()): + east_list, elev_list = compute_trace_easting_elevation( + hole["HOLEID"], collar, survey + ) + x_vals = east_list if orientation == "EW" else [hole["NORTH"]] * len(east_list) + + fig.add_trace(go.Scatter( + x=x_vals, + y=elev_list, + mode="lines", + line=dict(color=colors[hi % len(colors)], width=2), + name=hole["HOLEID"], + hovertemplate=( + f"{hole['HOLEID']}
" + f"{x_title[:-4]}: %{{x:.0f}} m
" + "Elevation RL: %{y:.0f} m" + ), + legendgroup=hole["HOLEID"], + showlegend=(col_idx == 1), + ), row=1, col=col_idx) + + x0 = east_list[0] if orientation == "EW" else hole["NORTH"] + fig.add_trace(go.Scatter( + x=[x0], + y=[elev_list[0]], + mode="markers+text", + marker=dict(color=colors[hi % len(colors)], size=7, symbol="triangle-down"), + text=[hole["HOLEID"]] if hi == 0 else [], + textposition="top center", + textfont=dict(size=7, color="#6c757d"), + showlegend=False, + hoverinfo="skip", + legendgroup=hole["HOLEID"], + ), row=1, col=col_idx) + + # ─── Multi-axis formation contact shapes ───────────────────────────────── + def section_x_range(section_holes): + xs = section_holes["EAST"].tolist() if orientation == "EW" else section_holes["NORTH"].tolist() + if not xs: + return 350000, 350600 + return min(xs) - 20, max(xs) + 20 + + x_ranges = [section_x_range(s) for s in thirds] + mids = [(lo + hi) / 2 for lo, hi in x_ranges] + + # ─── Sentinel traces for plot-wide hover ───────────────────────────────── + # Invisible scatter points spanning the elevation range ensure hoverData + # fires anywhere in the chart, not just near actual hole trace data. + elev_sentinel = list(np.linspace(50, 450, 150)) + for col_idx, x_range in enumerate(x_ranges, start=1): + x_mid = (x_range[0] + x_range[1]) / 2 + fig.add_trace(go.Scatter( + x=[x_mid] * len(elev_sentinel), + y=elev_sentinel, + mode="markers", + marker=dict(opacity=0, size=3), + hoverinfo="skip", + showlegend=False, + ), row=1, col=col_idx) + + # ─── Elevation cursor + measure shapes (one per panel) ──────────────────── + # Each shape anchored to its own yref so they align correctly even when + # panels are zoomed independently. + for cidx, (xref, yref, x_range) in enumerate( + zip(["x", "x2", "x3"], ["y", "y2", "y3"], x_ranges), start=1 + ): + fig.add_shape( + type="line", + x0=x_range[0], x1=x_range[1], + y0=-1000, y1=-1000, + xref=xref, yref=yref, + line=dict(color="#e8a020", width=1.5, dash="dash"), + name=f"elev-cursor-{cidx}", + visible=False, + ) + fig.add_shape( + type="rect", + x0=x_range[0], x1=x_range[1], + y0=0, y1=0, + xref=xref, yref=yref, + fillcolor="rgba(232,160,32,0.12)", + line=dict(color="#e8a020", width=1), + name=f"measure-span-{cidx}", + visible=False, + ) + + for contact in FORMATION_CONTACTS: + elev_base = contact["elev"] + dip = contact["dip_m_per_m"] + color = contact["color"] + + # Elevation at each panel's (lo, hi) x-edge, computed from the dip slope + ys = [ + (elev_base + dip * (x_ranges[i][0] - mids[i]), + elev_base + dip * (x_ranges[i][1] - mids[i])) + for i in range(3) + ] + + # Single multi-axis path traversing both panels and the gaps between them. + # Each coordinate in the path maps to the matching xref entry. + fig.add_shape( + type="path", + path=( + f"M {x_ranges[0][0]} {ys[0][0]} " + f"L {x_ranges[0][1]} {ys[0][1]} " + f"L {x_ranges[1][0]} {ys[1][0]} " + f"L {x_ranges[1][1]} {ys[1][1]} " + f"L {x_ranges[2][0]} {ys[2][0]} " + f"L {x_ranges[2][1]} {ys[2][1]}" + ), + xref=["x", "x", "x2", "x2", "x3", "x3"], + yref=["y", "y", "y2", "y2", "y3", "y3"], + line=dict(color=color, width=1.5, dash="dot"), + layer="below", + ) + + # Label at right edge of col3, anchored to panel 3's own y-axis. + x_col3_right = x_ranges[2][1] + elev_label = ys[2][1] + fig.add_annotation( + x=x_col3_right, + y=elev_label, + xref="x3", yref="y3", + text=contact["name"], + showarrow=False, + xanchor="left", + font=dict(size=9, color=color), + bgcolor="rgba(255,255,255,0.85)", + ) + + # ─── Spanning Mineralised Porphyry Zone rect ───────────────────────────── + porphyry_top = 220 + porphyry_bottom = 90 + + fig.add_shape( + type="rect", + xref=["x", "x3"], + yref=["y", "y3"], + x0=x_ranges[0][0], y0=porphyry_bottom, + x1=x_ranges[2][1], y1=porphyry_top, + fillcolor="rgba(232, 160, 32, 0.10)", + line=dict(color="#e8a020", width=1, dash="dash"), + layer="below", + label=dict( + text="Mineralised Porphyry Zone", + textposition="top left", + font=dict(size=10, color="#d48806", family="Inter, sans-serif"), + padding=6, + ), + ) + + # ─── Layout ────────────────────────────────────────────────────────────── + fig.update_layout(**{ + **CHART_LAYOUT, + "height": 600, + "margin": dict(l=60, r=140, t=50, b=50), + "hovermode": "closest", + "legend": dict( + bgcolor="#ffffff", + bordercolor="#dee2e6", + font=dict(color="#495057", size=9), + orientation="v", + x=1.01, y=1, + ), + "hoverlabel": dict(bgcolor="#ffffff", font_color="#212529", bordercolor="#dee2e6"), + }) + + for col_idx in range(1, 4): + fig.update_yaxes( + title_text="Elevation RL (m)" if col_idx == 1 else None, + showgrid=True, gridcolor="#e9ecef", + tickfont=dict(color="#6c757d"), + title_font=dict(color="#495057"), + zeroline=False, + range=[150, 450], + row=1, col=col_idx, + ) + fig.update_xaxes( + title_text=x_title, + showgrid=True, gridcolor="#e9ecef", + tickfont=dict(color="#6c757d"), + title_font=dict(color="#495057"), + zeroline=False, + row=1, col=col_idx, + ) + + return fig + + +def layout(): + collar, assay, lith, survey = load_data() + + total_holes = len(collar) + total_meters = int(collar["TOTDEPTH"].sum()) + east_range = collar["EAST"].max() - collar["EAST"].min() + north_range = collar["NORTH"].max() - collar["NORTH"].min() + area_km2 = (east_range * north_range) / 1e6 + + formation_legend = dmc.Group( + id="cs-formation-legend", + gap="md", + children=[ + dmc.Group(gap="xs", children=[ + html.Span(style={ + "display": "inline-block", + "width": "24px", "height": "3px", + "borderTop": f"2px dotted {c['color']}", + "verticalAlign": "middle", + }), + dmc.Text(c["name"], size="xs", c="dimmed"), + ]) + for c in FORMATION_CONTACTS + ], + ) + + feature_chips = dmc.Group(gap="xs", mt="xs", mb="xs", children=[ + dmc.Tooltip( + label="Hover the Elevation (Y) axis tick labels and drag up/down to pan · scroll over the axis to zoom · double-click anywhere to reset", + multiline=True, w=300, withArrow=True, position="bottom", + children=dmc.Badge("↕ Drag Y-Axis", color="blue", variant="light", size="sm", + style={"cursor": "help"}), + ), + ]) + + things_to_try = dmc.Paper([ + dmc.Group(gap="xs", mb="sm", children=[ + DashIconify(icon="tabler:bulb", width=16, color="#e8a020"), + dmc.Text("Things to Try", fw=600, size="sm", c="orange"), + ]), + dmc.Stack(gap="sm", children=[ + dmc.Group(gap="sm", wrap="nowrap", align="flex-start", children=[ + dmc.ThemeIcon( + DashIconify(icon="tabler:arrows-up-down", width=14), + size="sm", variant="light", color="blue", radius="xl", + style={"flexShrink": 0}, + ), + html.Div([ + dmc.Text("Drag the Elevation (Y) axis", fw=600, size="xs"), + dmc.Text( + "Hover the tick labels on the left edge and drag up or down to pan. " + "Scroll over the axis to zoom into any elevation band.", + size="xs", c="dimmed", + ), + ]), + ]), + dmc.Group(gap="sm", wrap="nowrap", align="flex-start", children=[ + dmc.ThemeIcon( + DashIconify(icon="tabler:zoom", width=14), + size="sm", variant="light", color="teal", radius="xl", + style={"flexShrink": 0}, + ), + html.Div([ + dmc.Text("Zoom any single panel independently", fw=600, size="xs"), + dmc.Text( + "Each section panel has its own X-axis. Scroll or drag within Section A — " + "Sections B and C are completely unaffected.", + size="xs", c="dimmed", + ), + ]), + ]), + dmc.Group(gap="sm", wrap="nowrap", align="flex-start", children=[ + dmc.ThemeIcon( + DashIconify(icon="tabler:line-dashed", width=14), + size="sm", variant="light", color="orange", radius="xl", + style={"flexShrink": 0}, + ), + html.Div([ + dmc.Text("Watch the formation contacts span all panels", fw=600, size="xs"), + dmc.Text( + "Dotted lines and the Porphyry Zone rect are anchored to each panel's own axis " + "via xref/yref arrays. Zoom Section A — only its segment moves.", + size="xs", c="dimmed", + ), + ]), + ]), + dmc.Group(gap="sm", wrap="nowrap", align="flex-start", children=[ + dmc.ThemeIcon( + DashIconify(icon="tabler:rotate-2", width=14), + size="sm", variant="light", color="gray", radius="xl", + style={"flexShrink": 0}, + ), + html.Div([ + dmc.Text("Double-click to reset view", fw=600, size="xs"), + dmc.Text( + "Double-click anywhere on the chart to reset all axes to their default range.", + size="xs", c="dimmed", + ), + ]), + ]), + dmc.Group(gap="sm", wrap="nowrap", align="flex-start", children=[ + dmc.ThemeIcon( + DashIconify(icon="tabler:crosshair", width=14), + size="sm", variant="light", color="grape", radius="xl", + style={"flexShrink": 0}, + ), + html.Div([ + dmc.Text("Hover to track elevation · click to pin", fw=600, size="xs"), + dmc.Text( + "A gold cursor line tracks your elevation across all three panels simultaneously. " + "Click anywhere to pin the marker at that elevation.", + size="xs", c="dimmed", + ), + ]), + ]), + ]), + ], p="md", radius="md", withBorder=True, className="tip-paper") + + return [ + dtc.DashTour( + id="cs-tour", + isOpen=False, + accentColor="#e8a020", + rounded=8, + showNumber=True, + steps=CS_TOUR_STEPS, + ), + + dmc.Stack([ + things_to_try, + + dmc.SimpleGrid( + cols={"base": 2, "md": 4}, + spacing="md", + children=[ + kpi_card("Total Holes", str(total_holes), "drillholes in program", icon="tabler:drone"), + kpi_card("Meters Drilled", f"{total_meters:,} m", "cumulative penetration", icon="tabler:ruler-measure"), + kpi_card("Prospect Area", f"{area_km2:.2f} km²", "surface footprint", icon="tabler:map-pin"), + kpi_card("Section Panels", "3", "South · Central · North", icon="tabler:chart-grid-dots"), + ], + ), + + # Cross-section chart card + dmc.Paper([ + dmc.Group([ + html.Div([ + html.P("Cross-Section View", className="section-title"), + html.P( + "Three geographic panels. Drag the Elevation axis to pan · " + "scroll to zoom · hover a panel's X-axis to zoom grade independently.", + className="section-description", + ), + ], style={"flex": 1}), + html.Div( + id="cs-orientation-group", + children=dmc.Group(gap="xs", align="center", children=[ + dmc.Button( + dmc.Group([DashIconify(icon="tabler:help", width=13), "Tour"], + gap=4, align="center"), + id="cs-tour-btn", + variant="subtle", + color="gray", + size="xs", + ), + dmc.SegmentedControl( + id="section-orientation", + data=[ + {"value": "EW", "label": "E–W Sections"}, + {"value": "NS", "label": "N–S Sections"}, + ], + value="EW", + color="orange", + size="xs", + ), + ]), + ), + ], justify="space-between", align="flex-start", wrap="nowrap", mb="xs"), + + # Feature interaction chips + feature_chips, + + formation_legend, + + # Chart with Y-axis hint overlay + html.Div( + style={"position": "relative"}, + children=[ + html.Div( + id="cs-yaxis-hint", + className="y-axis-hint", + children=[ + DashIconify(icon="tabler:arrows-up-down", width=10, color="#adb5bd"), + " drag · scroll to zoom", + ], + ), + dcc.Graph( + id="cross-section-chart", + figure=_build_figure(collar, survey, "EW"), + config={"displayModeBar": True, "scrollZoom": True}, + style={"height": "600px", "marginTop": "8px"}, + ), + ], + ), + ], id="cs-chart-paper", p="md", radius="md", withBorder=True, className="chart-paper"), + + dmc.Grid(gutter="md", children=[ + dmc.GridCol( + dmc.Paper([ + html.P("Collar Plan Map", className="section-title"), + html.P( + "Plan view of drillhole collar positions. Marker colour = total depth drilled. " + "Equal-aspect projection preserves true spatial relationships.", + className="section-description", + ), + dcc.Graph( + figure=collar_map(collar), + config={"displayModeBar": False, "scrollZoom": True}, + ), + ], p="md", radius="md", withBorder=True, className="chart-paper"), + span={"base": 12, "md": 8}, + ), + dmc.GridCol( + dmc.Paper([ + html.P("Hole Summary", className="section-title"), + html.P( + "AZ = azimuth from North. DIP = downhole inclination (negative = sub-vertical).", + className="section-description", + ), + html.Div(summary_table(collar), className="table-scroll"), + dmc.Text( + f"Showing 20 of {total_holes} holes · scroll for more", + size="xs", c="dimmed", mt="xs", + ), + ], p="md", radius="md", withBorder=True, className="chart-paper"), + span={"base": 12, "md": 4}, + ), + ]), + + # Depth distribution + dmc.Paper([ + html.P("Hole Depth Distribution", className="section-title"), + html.P( + "Most holes target the 200–350 m depth range where the Au-Cu mineralized porphyry sits. " + "Shallower holes test the weathered zone; deeper holes test the fresh granite footwall.", + className="section-description", + ), + dcc.Graph(figure=depth_histogram(collar), config={"displayModeBar": False}), + ], p="md", radius="md", withBorder=True, className="chart-paper"), + ], gap="md"), + ] diff --git a/drillholes-demo/pages/downhole_logs.py b/drillholes-demo/pages/downhole_logs.py new file mode 100644 index 0000000..7148832 --- /dev/null +++ b/drillholes-demo/pages/downhole_logs.py @@ -0,0 +1,430 @@ +""" +Downhole Logs page — showcases Plotly.js plot-wide hover/click events. + +Two new-feature demonstrations: +1. Depth cursor: a horizontal gold line that tracks the mouse across ALL + four strip-log panels simultaneously, even over empty areas between + data points (plot-wide hover events via transparent sentinel traces + + clientside callback for zero-latency response). + +2. Click-to-measure: clicking anywhere on the plot (plot-wide click events) + records a start depth, then a second click computes the interval + thickness and draws a shaded span across all panels. +""" + +import plotly.graph_objects as go +from plotly.subplots import make_subplots +from dash import html, dcc +import dash_mantine_components as dmc +from dash_iconify import DashIconify +import dash_tour_component as dtc +import numpy as np +import pandas as pd + +from utils import load_data, CHART_LAYOUT, LITH_COLORS, LITH_ORDER + +DL_TOUR_STEPS = [ + { + "selector": "#strip-log-chart-paper", + "content": "Welcome to Downhole Logs! Step through to discover all the interactive features on this page.", + "position": "bottom", + }, + { + "selector": "#strip-log-chart", + "content": "Hover anywhere on the chart — even over lithology blocks and empty areas — to see a gold dashed cursor track depth across all four panels simultaneously.", + "position": "right", + }, + { + "selector": "#strip-log-chart", + "content": "Click once anywhere to mark a start depth (a gold line snaps to that position). Then click a second time to measure the interval — a shaded span appears across all panels and the exact thickness is shown.", + "position": "right", + }, + { + "selector": "#hole-selector", + "content": "Use this dropdown to switch between drillholes. All four panels update together.", + "position": "bottom", + }, +] + + +def _strip_log_figure(hole_id: str, collar, assay, lith, survey) -> go.Figure: + hole_assay = assay[assay["HOLEID"] == hole_id].sort_values("FROM") + hole_lith = lith[lith["HOLEID"] == hole_id].sort_values("FROM") + hole_survey = survey[survey["HOLEID"] == hole_id].sort_values("DEPTH") + hole_collar = collar[collar["HOLEID"] == hole_id].iloc[0] + + max_depth = float(hole_collar["TOTDEPTH"]) + depth_range = list(np.arange(0, max_depth + 5, 5)) + + fig = make_subplots( + rows=1, cols=4, + shared_yaxes=True, + column_widths=[0.14, 0.30, 0.30, 0.26], + subplot_titles=["Lithology", "Au Grade (g/t)", "Cu Grade (%)", "Hole Deviation (°)"], + horizontal_spacing=0.03, + ) + + for ann in fig.layout.annotations: + ann.font = dict(size=11, color="#495057") + + # ── Col 1: Lithology rectangles ───────────────────────────────────────── + for _, row in hole_lith.iterrows(): + color = LITH_COLORS.get(row["LITHOLOGY"], "#aaa") + fig.add_shape( + type="rect", + x0=0, x1=1, + y0=row["FROM"], y1=row["TO"], + xref="x", yref="y", + fillcolor=color, + line_width=0, + layer="below", + ) + mid = (row["FROM"] + row["TO"]) / 2 + if row["TO"] - row["FROM"] >= 8: + fig.add_annotation( + x=0.5, y=mid, + text=row["LITHOLOGY"], + xref="x", yref="y", + showarrow=False, + font=dict(size=8, color="#212529"), + bgcolor="rgba(255,255,255,0.75)", + borderpad=2, + ) + + # Invisible trace on col1 so axis is registered + fig.add_trace(go.Scatter( + x=[0.5] * len(depth_range), + y=depth_range, + mode="markers", + marker=dict(opacity=0, size=1), + hoverinfo="skip", + showlegend=False, + ), row=1, col=1) + + fig.update_xaxes( + showticklabels=False, showgrid=False, zeroline=False, + range=[0, 1], row=1, col=1, + ) + + # ── Col 2: Au grade bars ───────────────────────────────────────────────── + mid_depths = (hole_assay["FROM"] + hole_assay["TO"]) / 2 + widths = hole_assay["TO"] - hole_assay["FROM"] + + fig.add_trace(go.Bar( + x=hole_assay["Au_ppm"], + y=mid_depths, + orientation="h", + width=widths, + marker=dict( + color=hole_assay["Au_ppm"], + colorscale=[[0, "#f8f9fa"], [0.3, "#e8a020"], [1, "#ff6b35"]], + cmin=0, cmax=float(hole_assay["Au_ppm"].quantile(0.99)), + showscale=False, + line_width=0, + ), + hovertemplate="Depth: %{y:.1f} m
Au: %{x:.3f} g/t", + name="Au (g/t)", + showlegend=False, + ), row=1, col=2) + + # Sentinel trace for hover coverage on col2 + fig.add_trace(go.Scatter( + x=[0] * len(depth_range), y=depth_range, + mode="markers", marker=dict(opacity=0, size=3), + hoverinfo="skip", showlegend=False, + ), row=1, col=2) + + # ── Col 3: Cu grade bars ───────────────────────────────────────────────── + fig.add_trace(go.Bar( + x=hole_assay["Cu_pct"], + y=mid_depths, + orientation="h", + width=widths, + marker=dict( + color=hole_assay["Cu_pct"], + colorscale=[[0, "#f8f9fa"], [0.3, "#FF8C00"], [1, "#ff4444"]], + cmin=0, cmax=float(hole_assay["Cu_pct"].quantile(0.99)), + showscale=False, + line_width=0, + ), + hovertemplate="Depth: %{y:.1f} m
Cu: %{x:.4f} %", + name="Cu (%)", + showlegend=False, + ), row=1, col=3) + + fig.add_trace(go.Scatter( + x=[0] * len(depth_range), y=depth_range, + mode="markers", marker=dict(opacity=0, size=3), + hoverinfo="skip", showlegend=False, + ), row=1, col=3) + + # ── Col 4: Survey dip line ──────────────────────────────────────────────── + fig.add_trace(go.Scatter( + x=hole_survey["DIP"], + y=hole_survey["DEPTH"], + mode="lines+markers", + line=dict(color="#1971c2", width=2), + marker=dict(size=4, color="#1971c2"), + hovertemplate="Depth: %{y:.1f} m
Dip: %{x:.1f}° from vertical", + name="Dip (°)", + showlegend=False, + ), row=1, col=4) + + fig.add_trace(go.Scatter( + x=[hole_survey["DIP"].mean()] * len(depth_range), y=depth_range, + mode="markers", marker=dict(opacity=0, size=3), + hoverinfo="skip", showlegend=False, + ), row=1, col=4) + + # ── Depth cursor shape ────────────────────────────────────────────────── + # xref="paper" spans the full plot width across all 4 panels. + # Updated by a clientside callback on hoverData (plot-wide hover feature). + fig.add_shape( + type="line", + x0=0, x1=1, + y0=-10, y1=-10, + xref="paper", yref="y", + line=dict(color="#e8a020", width=1.5, dash="dash"), + name="depth-cursor", + visible=False, + ) + + # ── Measurement span shape (hidden initially) ──────────────────────────── + fig.add_shape( + type="rect", + x0=0, x1=1, + y0=0, y1=0, + xref="paper", yref="y", + fillcolor="rgba(232,160,32,0.12)", + line=dict(color="#e8a020", width=1), + name="measure-span", + visible=False, + ) + + # ── Layout ──────────────────────────────────────────────────────────────── + fig.update_yaxes( + autorange="reversed", + title_text="Depth (m ↓ downhole)", + showgrid=True, gridcolor="#e9ecef", + tickfont=dict(color="#6c757d"), + title_font=dict(color="#495057"), + range=[max_depth + 5, -5], + row=1, col=1, + ) + for col_idx in range(2, 5): + fig.update_xaxes( + showgrid=True, gridcolor="#e9ecef", + tickfont=dict(color="#6c757d"), + zeroline=True, zerolinecolor="#ced4da", + row=1, col=col_idx, + ) + fig.update_xaxes( + title_text="Au (g/t) — gold grade", title_font=dict(color="#495057"), row=1, col=2, + ) + fig.update_xaxes( + title_text="Cu (%) — copper grade", title_font=dict(color="#495057"), row=1, col=3, + ) + fig.update_xaxes( + title_text="Dip (°) from vertical", title_font=dict(color="#495057"), row=1, col=4, + ) + + fig.update_layout(**{ + **CHART_LAYOUT, + "height": 750, + "margin": dict(l=60, r=20, t=40, b=50), + "hovermode": "y", + "hoverdistance": 30, + "bargap": 0, + "bargroupgap": 0, + "hoverlabel": dict(bgcolor="#ffffff", font_color="#212529", bordercolor="#dee2e6"), + }) + + return fig + + +def layout(): + collar, assay, lith, survey = load_data() + hole_ids = sorted(collar["HOLEID"].tolist()) + default_hole = hole_ids[0] + + default_depth = int(collar.loc[collar["HOLEID"] == default_hole, "TOTDEPTH"].iloc[0]) + default_lith_count = int(lith[lith["HOLEID"] == default_hole].shape[0]) + + things_to_try = dmc.Paper([ + dmc.Group(gap="xs", mb="sm", children=[ + DashIconify(icon="tabler:bulb", width=16, color="#e8a020"), + dmc.Text("Things to Try", fw=600, size="sm", c="orange"), + ]), + dmc.Stack(gap="sm", children=[ + dmc.Group(gap="sm", wrap="nowrap", align="flex-start", children=[ + dmc.ThemeIcon( + DashIconify(icon="tabler:arrow-move-down", width=14), + size="sm", variant="light", color="orange", radius="xl", + style={"flexShrink": 0}, + ), + html.Div([ + dmc.Text("Hover to track depth", fw=600, size="xs"), + dmc.Text( + "The gold depth cursor tracks your mouse across all four panels simultaneously, " + "even over lithology rectangles and empty areas.", + size="xs", c="dimmed", + ), + ]), + ]), + dmc.Group(gap="sm", wrap="nowrap", align="flex-start", children=[ + dmc.ThemeIcon( + DashIconify(icon="tabler:vector-triangle", width=14), + size="sm", variant="light", color="grape", radius="xl", + style={"flexShrink": 0}, + ), + html.Div([ + dmc.Text("Click once · click again to measure", fw=600, size="xs"), + dmc.Text( + "Click anywhere to mark a start depth (a gold line appears and the readout confirms it). " + "Click a second time — the shaded span and thickness annotation appear across all panels.", + size="xs", c="dimmed", + ), + ]), + ]), + dmc.Group(gap="sm", wrap="nowrap", align="flex-start", children=[ + dmc.ThemeIcon( + DashIconify(icon="tabler:rotate-2", width=14), + size="sm", variant="light", color="gray", radius="xl", + style={"flexShrink": 0}, + ), + html.Div([ + dmc.Text("Clear and restart", fw=600, size="xs"), + dmc.Text( + "Hit the Clear button to dismiss the span and reset to a fresh measurement.", + size="xs", c="dimmed", + ), + ]), + ]), + dmc.Group(gap="sm", wrap="nowrap", align="flex-start", children=[ + dmc.ThemeIcon( + DashIconify(icon="tabler:adjustments-horizontal", width=14), + size="sm", variant="light", color="blue", radius="xl", + style={"flexShrink": 0}, + ), + html.Div([ + dmc.Text("Switch drillholes", fw=600, size="xs"), + dmc.Text( + "Use the Hole Selector dropdown to jump between holes — all panels update together.", + size="xs", c="dimmed", + ), + ]), + ]), + ]), + ], p="md", radius="md", withBorder=True, className="tip-paper") + + return [ + dtc.DashTour( + id="dl-tour", + isOpen=False, + accentColor="#e8a020", + rounded=8, + showNumber=True, + steps=DL_TOUR_STEPS, + ), + dmc.Stack([ + things_to_try, + + dmc.SimpleGrid( + cols={"base": 1, "sm": 2}, + spacing="md", + children=[ + dmc.Paper([ + dmc.Group([ + dmc.Text("Current Hole Depth", size="xs", c="dimmed", tt="uppercase", fw=600), + DashIconify(icon="tabler:arrow-down-to-arc", width=16, color="#868e96"), + ], justify="space-between"), + dmc.Text(f"{default_depth} m", id="kpi-hole-depth", size="xl", fw=700, c="dark", mt=4), + dmc.Text("total drilled depth", size="xs", c="dimmed"), + ], p="md", radius="md", withBorder=True, className="kpi-card"), + dmc.Paper([ + dmc.Group([ + dmc.Text("Lithology Intervals", size="xs", c="dimmed", tt="uppercase", fw=600), + DashIconify(icon="tabler:layers-difference", width=16, color="#868e96"), + ], justify="space-between"), + dmc.Text(str(default_lith_count), id="kpi-lith-count", size="xl", fw=700, c="dark", mt=4), + dmc.Text("logged intervals for hole", size="xs", c="dimmed"), + ], p="md", radius="md", withBorder=True, className="kpi-card"), + ], + ), + + # Strip log card + dmc.Paper([ + dmc.Group([ + html.Div([ + html.P("Downhole Strip Log", className="section-title"), + html.P( + "Four-panel strip log: lithology, Au (g/t), Cu (%), hole deviation. " + "Hover anywhere to track depth across all panels. Click once to start an interval, " + "click again to measure its thickness.", + className="section-description", + ), + ], style={"flex": 1}), + html.Div(children=dmc.Group(gap="xs", align="center", children=[ + dmc.Button( + dmc.Group([DashIconify(icon="tabler:help", width=13), "Tour"], + gap=4, align="center"), + id="dl-tour-btn", + variant="subtle", + color="gray", + size="xs", + ), + dmc.Select( + id="hole-selector", + label="Select Hole", + data=[{"value": h, "label": h} for h in hole_ids], + value=default_hole, + w=160, + size="xs", + styles={"label": {"color": "#6c757d", "fontSize": "0.75rem"}}, + ), + ])), + ], justify="space-between", align="flex-end", wrap="nowrap", mb="xs"), + dmc.Group(gap="xs", mt="xs", mb="xs", children=[ + dmc.Tooltip( + label=( + "Click once anywhere on the chart to mark a start depth — " + "a gold line appears. Click a second time to measure the interval " + "and see the thickness." + ), + multiline=True, w=300, withArrow=True, position="bottom", + children=dmc.Badge( + "⊕ Click to Measure", color="orange", variant="light", size="sm", + style={"cursor": "help"}, + ), + ), + ]), + + # Measurement readout + dmc.Group(gap="xs", mb="sm", children=[ + dmc.Text("Interval:", size="sm", c="dimmed"), + html.Div(id="measure-readout", className="measure-readout", + children="Click a depth to start measuring"), + dmc.Button("Clear", id="measure-clear-btn", variant="subtle", + color="gray", size="xs"), + ]), + + dcc.Graph( + id="strip-log-chart", + figure=_strip_log_figure(default_hole, collar, assay, lith, survey), + config={"displayModeBar": True, "scrollZoom": True}, + style={"height": "750px"}, + ), + ], id="strip-log-chart-paper", p="md", radius="md", withBorder=True, className="chart-paper"), + + dmc.Paper([ + html.P("Lithology Key", className="section-title"), + dmc.Group(gap="md", wrap="wrap", children=[ + dmc.Group(gap="xs", children=[ + html.Span(className="lith-swatch", style={"backgroundColor": color}), + dmc.Text(lith_name, size="xs", c="dimmed"), + ]) + for lith_name, color in LITH_COLORS.items() + ]), + ], p="md", radius="md", withBorder=True, className="chart-paper"), + ], gap="md"), + ] diff --git a/drillholes-demo/pages/explorer.py b/drillholes-demo/pages/explorer.py new file mode 100644 index 0000000..62bb50f --- /dev/null +++ b/drillholes-demo/pages/explorer.py @@ -0,0 +1,146 @@ +""" +Explorer page — port of the "Drill-Hole Cross-Section Explorer" CodePen. + +Dash owns the page shell only. The chart (4-hole subplots, multi-axis spanning +geological bands) and all hover/click interactivity are built in +assets/explorer.js using Plotly.js 3.x's hoveranywhere/clickanywhere flags. +The sidebar exposes id-tagged spans the JS writes into directly. +""" + +from dash import html, dcc +import dash_mantine_components as dmc +from dash_iconify import DashIconify + + +def _things_to_try(): + return dmc.Paper([ + dmc.Group(gap="xs", mb="sm", children=[ + DashIconify(icon="tabler:bulb", width=16, color="#e8a020"), + dmc.Text("Things to Try", fw=600, size="sm", c="orange"), + ]), + dmc.Stack(gap="sm", children=[ + dmc.Group(gap="sm", wrap="nowrap", align="flex-start", children=[ + dmc.ThemeIcon( + DashIconify(icon="tabler:crosshair", width=14), + size="sm", variant="light", color="grape", radius="xl", + style={"flexShrink": 0}, + ), + html.Div([ + dmc.Text("Hover anywhere to track depth", fw=600, size="xs"), + dmc.Text( + "A horizontal crosshair plus depth pill follows the cursor across all four " + "hole panels — including the empty space between them. Powered by Plotly 3.x's " + "hoveranywhere flag.", + size="xs", c="dimmed", + ), + ]), + ]), + dmc.Group(gap="sm", wrap="nowrap", align="flex-start", children=[ + dmc.ThemeIcon( + DashIconify(icon="tabler:layers-intersect", width=14), + size="sm", variant="light", color="orange", radius="xl", + style={"flexShrink": 0}, + ), + html.Div([ + dmc.Text("Multi-axis spanning bands", fw=600, size="xs"), + dmc.Text( + "Geological units are quadrilateral paths anchored to consecutive y-axes " + '(yref=["y","y2","y2","y"]) — they connect adjacent subplots automatically ' + "even when each hole has its own axis pair.", + size="xs", c="dimmed", + ), + ]), + ]), + dmc.Group(gap="sm", wrap="nowrap", align="flex-start", children=[ + dmc.ThemeIcon( + DashIconify(icon="tabler:vector-triangle", width=14), + size="sm", variant="light", color="red", radius="xl", + style={"flexShrink": 0}, + ), + html.Div([ + dmc.Text("Click two points to measure", fw=600, size="xs"), + dmc.Text( + "Click two depths inside the same hole panel to drop markers and read out the " + "depth interval. A third click resets. Cross-hole clicks are ignored.", + size="xs", c="dimmed", + ), + ]), + ]), + dmc.Group(gap="sm", wrap="nowrap", align="flex-start", children=[ + dmc.ThemeIcon( + DashIconify(icon="tabler:zoom", width=14), + size="sm", variant="light", color="teal", radius="xl", + style={"flexShrink": 0}, + ), + html.Div([ + dmc.Text("Each hole is independent", fw=600, size="xs"), + dmc.Text( + "Every hole has its own x/y axis pair. Pan or zoom one panel without disturbing " + "the others — the spanning geological bands stretch correctly.", + size="xs", c="dimmed", + ), + ]), + ]), + ]), + ], p="md", radius="md", withBorder=True, className="tip-paper") + + +def _sidebar(): + cursor_panel = dmc.Paper([ + dmc.Text("Cursor Position", className="explorer-panel-title"), + html.Div(className="explorer-info-row", children=[ + html.Span("Depth", className="explorer-info-label"), + html.Span("--", id="cursor-depth", className="explorer-info-value"), + ]), + html.Div(className="explorer-info-row", children=[ + html.Span("Hole", className="explorer-info-label"), + html.Span("--", id="cursor-hole", className="explorer-info-value"), + ]), + html.Div(className="explorer-info-row", children=[ + html.Span("Value", className="explorer-info-label"), + html.Span("--", id="cursor-value", className="explorer-info-value"), + ]), + ], p="md", radius="md", withBorder=True, className="chart-paper explorer-info-panel") + + measure_panel = dmc.Paper([ + dmc.Text("Click-to-Measure", className="explorer-panel-title"), + dmc.Text( + "Click two points in the same subplot to measure the depth interval. " + "Click again to reset.", + size="xs", c="dimmed", mb=6, + ), + html.Div(id="distance-result", className="explorer-distance-result"), + ], p="md", radius="md", withBorder=True, className="chart-paper explorer-info-panel") + + return dmc.Stack([cursor_panel, measure_panel], gap="md") + + +def _chart_paper(): + return dmc.Paper([ + html.P("Drill-Hole Cross-Section Explorer", className="section-title"), + html.P( + "Four drill holes side by side. Geological units span between panels via multi-axis " + "shapes. Hover anywhere for the depth crosshair; click two points within one hole to " + "measure interval thickness.", + className="section-description", + ), + html.Div( + id="explorer-chart", + style={"height": "640px", "width": "100%"}, + ), + ], p="md", radius="md", withBorder=True, className="chart-paper") + + +def layout(): + return [ + # Hidden dcc.Graph forces Dash 4 to lazy-load Plotly.js on this page. + # The visible chart is rendered by assets/explorer.js into #explorer-chart. + dcc.Graph(id="_explorer-plotly-loader", figure={}, style={"display": "none"}), + dmc.Stack([ + _things_to_try(), + dmc.Grid(gutter="md", children=[ + dmc.GridCol(_sidebar(), span={"base": 12, "md": 3}), + dmc.GridCol(_chart_paper(), span={"base": 12, "md": 9}), + ]), + ], gap="md"), + ] diff --git a/drillholes-demo/requirements.txt b/drillholes-demo/requirements.txt new file mode 100644 index 0000000..294daa7 --- /dev/null +++ b/drillholes-demo/requirements.txt @@ -0,0 +1,9 @@ +dash>=3.0.0 +dash-ag-grid>=33.0.0 +dash-mantine-components>=0.14.0 +dash-iconify>=0.1.2 +dash-tour-component>=0.0.2 +plotly>=6.0.0 +pandas>=2.0.0 +numpy>=1.26.0 +gunicorn>=21.0.0 diff --git a/drillholes-demo/utils.py b/drillholes-demo/utils.py new file mode 100644 index 0000000..cc0f823 --- /dev/null +++ b/drillholes-demo/utils.py @@ -0,0 +1,210 @@ +import pathlib +from functools import lru_cache +import numpy as np +import pandas as pd +from dash import html +import dash_mantine_components as dmc +from dash_iconify import DashIconify + +PATH = pathlib.Path(__file__).parent +DATA_PATH = PATH / "data" + +LITH_COLORS = { + "Alluvium": "#C2B280", + "Weathered Granite": "#D4A574", + "Granite": "#9E8B6B", + "Quartz Diorite": "#8B7355", + "Mineralized Porphyry": "#A0522D", + "Fresh Granite": "#6B5B45", +} + +LITH_ORDER = list(LITH_COLORS.keys()) + +CHART_LAYOUT = dict( + paper_bgcolor="#ffffff", + plot_bgcolor="#f8f9fa", + font=dict(family="Inter, sans-serif", size=12, color="#495057"), + margin=dict(l=50, r=20, t=40, b=50), +) + +# Keep alias so any external references still work +DARK_CHART_LAYOUT = CHART_LAYOUT + +GRADE_COLORS = { + "Au_ppm": "#FFD700", + "Cu_pct": "#FF8C00", + "Ag_ppm": "#C0C0C0", +} + +GRADE_LABELS = { + "Au_ppm": "Au (g/t)", + "Cu_pct": "Cu (%)", + "Ag_ppm": "Ag (ppm)", +} + + +@lru_cache(maxsize=1) +def load_data(): + collar = pd.read_csv(DATA_PATH / "collar.csv") + assay = pd.read_csv(DATA_PATH / "assay.csv") + lith = pd.read_csv(DATA_PATH / "lith.csv") + survey = pd.read_csv(DATA_PATH / "survey.csv") + return collar, assay, lith, survey + + +def compute_trace_easting_elevation(hole_id, collar_df, survey_df): + """ + Minimum-curvature method: converts downhole survey (depth, az, dip) + to (easting, elevation) pairs for cross-section plotting. + """ + hole = collar_df[collar_df["HOLEID"] == hole_id].iloc[0] + surveys = survey_df[survey_df["HOLEID"] == hole_id].sort_values("DEPTH").copy() + + e, z = float(hole["EAST"]), float(hole["ELEV"]) + east_list, elev_list = [e], [z] + + prev_depth = 0.0 + prev_az = np.radians(float(hole["AZ"])) + prev_dip = np.radians(abs(float(hole["DIP"]))) + + for _, svy in surveys.iterrows(): + dl = float(svy["DEPTH"]) - prev_depth + if dl <= 0: + continue + az2 = np.radians(float(svy["AZ"])) + dip2 = np.radians(abs(float(svy["DIP"]))) + + dl_cos = (np.cos(dip2 - prev_dip) + - np.sin(prev_dip) * np.sin(dip2) * (1 - np.cos(az2 - prev_az))) + rf = 2.0 / (1.0 + dl_cos) if abs(1.0 + dl_cos) > 0.001 else 1.0 + + de = (dl / 2.0) * (np.sin(prev_dip) * np.sin(prev_az) + + np.sin(dip2) * np.sin(az2)) * rf + dz = -(dl / 2.0) * (np.cos(prev_dip) + np.cos(dip2)) * rf + + e += de + z += dz + east_list.append(round(e, 2)) + elev_list.append(round(z, 2)) + + prev_depth = float(svy["DEPTH"]) + prev_az, prev_dip = az2, dip2 + + return east_list, elev_list + + +NAV_ITEMS = [ + {"label": "Cross-Section", "href": "/", "icon": "tabler:chart-grid-dots", "id": "nav-cross-section"}, + {"label": "Explorer", "href": "/explorer", "icon": "tabler:compass", "id": "nav-explorer"}, + {"label": "Downhole Logs", "href": "/downhole-logs", "icon": "tabler:align-left", "id": "nav-downhole"}, + {"label": "Comparison", "href": "/comparison", "icon": "tabler:columns-3", "id": "nav-comparison"}, + {"label": "Block Model", "href": "/block-model", "icon": "tabler:cube", "id": "nav-block-model"}, +] + + +def create_header(): + brand = dmc.Group([ + html.Img(src="/assets/plotly-logo.png", height=40, alt="Plotly"), + dmc.Divider(orientation="vertical", size="sm"), + html.Div([ + html.P("Drillhole Visualizer", className="brand-title"), + html.P("Western Australia", className="brand-subtitle"), + ]), + ], gap="sm", align="center", wrap="nowrap") + + status = dmc.Group([ + dmc.Group([ + DashIconify(icon="tabler:circle-filled", width=10, color="#40c057"), + dmc.Text("Active", size="xs", c="dimmed"), + ], gap=4), + dmc.Divider(orientation="vertical", size="sm"), + dmc.Text("Prospect", size="xs", c="dimmed"), + dmc.Badge("WA Au-Cu Porphyry", color="orange", variant="light", size="sm"), + dmc.Divider(orientation="vertical", size="sm"), + dmc.Text("Last Survey", size="xs", c="dimmed"), + dmc.Text("Apr 2026", size="xs", fw=500), + dmc.ActionIcon( + DashIconify(icon="tabler:bell", width=18), + variant="subtle", + color="gray", + size="lg", + ), + ], gap="sm", wrap="nowrap") + + return dmc.Paper( + dmc.Group([brand, status], justify="space-between", align="center"), + px="md", + py="sm", + radius=0, + withBorder=False, + className="app-header", + ) + + +def create_nav_sidebar(): + nav_links = [ + dmc.NavLink( + label=item["label"], + leftSection=DashIconify(icon=item["icon"], width=16), + href=item["href"], + id=item["id"], + variant="subtle", + ) + for item in NAV_ITEMS + ] + + return html.Div( + [ + dmc.Group( + [ + dmc.Text("Navigation", id="sidebar-title", size="xs", fw=600, c="dimmed", tt="uppercase"), + dmc.ActionIcon( + DashIconify(icon="charm:cross", width=14, id="sidebar-btn-icon"), + id="sidebar-btn", + size="sm", + variant="subtle", + color="gray", + ), + ], + id="sidebar-title-div", + justify="space-between", + align="center", + className="title-pad space-between", + ), + html.Div( + [ + dmc.Space(h="35vh"), + html.Div( + html.Div("▾ Navigation ▾", className="sidebar-collapsed-title"), + style={"transform": "rotate(270deg)"}, + ), + ], + id="sidebar-collapsed-title-div", + style={"display": "none"}, + ), + html.Div( + html.Div( + html.Div(nav_links, id="sidebar-inner-div", className="sidebar-inner"), + id="sidebar-outer-div", + className="sidebar-outer", + ), + id="sidebar-btn-div", + ), + ], + id="filter-sidebar", + className="filter-sidebar flex-column", + ) + + +def kpi_card(title, value, unit="", icon=None): + header_children = [ + dmc.Text(title, size="xs", c="dimmed", tt="uppercase", fw=600), + ] + if icon: + header_children.append(DashIconify(icon=icon, width=16, color="#868e96")) + + return dmc.Paper([ + dmc.Group(header_children, justify="space-between", align="center"), + dmc.Text(value, size="xl", fw=700, c="dark", mt=4), + dmc.Text(unit, size="xs", c="dimmed") if unit else None, + ], p="md", radius="md", withBorder=True, className="kpi-card") diff --git a/investments-dashboard/Procfile b/investments-dashboard/Procfile new file mode 100644 index 0000000..673048e --- /dev/null +++ b/investments-dashboard/Procfile @@ -0,0 +1 @@ +web: uvicorn app:server --host 0.0.0.0 --port 8000 diff --git a/investments-dashboard/app.py b/investments-dashboard/app.py new file mode 100644 index 0000000..3bbc775 --- /dev/null +++ b/investments-dashboard/app.py @@ -0,0 +1,230 @@ +import dash +from dash import html, dcc, Input, Output, callback +import dash_mantine_components as dmc +from dash_iconify import DashIconify + +from pages import dashboard, performance, portfolio, fees +from callbacks import dashboard as dashboard_callbacks +from callbacks import performance as performance_callbacks +from callbacks import portfolio as portfolio_callbacks +from callbacks import fees as fees_callbacks +from callbacks import export_all as export_all_callbacks + +app = dash.Dash( + __name__, + backend="fastapi", + websocket_callbacks=True, + suppress_callback_exceptions=True, + external_stylesheets=dmc.styles.ALL, + title="Investment Insights" +) +server = app.server + +def create_nav_link(icon, label, href): + return dmc.NavLink( + label=label, + leftSection=DashIconify(icon=icon, width=20), + href=href, + variant="subtle", + active=True, + ) + +def create_header(): + return dmc.Paper( + dmc.Group([ + dmc.Group([ + dmc.Title("Investment Insights", order=3), + dmc.Divider(orientation="vertical", size="sm"), + html.Img(src="/assets/DE-logo.png", height=40), + ], gap="sm", align="center", wrap="nowrap"), + dmc.Group([ + dmc.Group([ + DashIconify(icon="tabler:circle-filled", width=10, color="#40c057"), + dmc.Text("Market Open", size="xs", c="dimmed"), + ], gap=4), + dmc.Text("NYSE", size="xs", fw=500), + dmc.Divider(orientation="vertical", size="sm"), + dmc.Text("Last Updated", size="xs", c="dimmed"), + dmc.Text("Apr 8, 2026 3:45 PM", size="xs", fw=500), + dmc.Divider(orientation="vertical", size="sm"), + dmc.Button( + "Download PDF", + id="generate-pdf-all-btn", + size="xs", + variant="light", + color="blue", + leftSection=DashIconify(icon="tabler:file-type-pdf", width=14), + ), + dmc.ActionIcon( + DashIconify(icon="tabler:bell", width=20), + variant="subtle", + size="lg", + ), + ], gap="sm", align="center", wrap="nowrap"), + ], justify="space-between", align="center", wrap="nowrap"), + p="md", + withBorder=True, + radius=0, + ) + +def create_navbar(): + return dmc.Paper( + dmc.Stack([ + dmc.Stack([ + dmc.Text("Navigation", size="xs", c="dimmed", fw=600, tt="uppercase", mb="xs"), + dmc.NavLink( + label="Dashboard", + leftSection=DashIconify(icon="tabler:dashboard", width=20), + href="/", + id="nav-dashboard", + ), + dmc.NavLink( + label="Price Performance", + leftSection=DashIconify(icon="tabler:chart-line", width=20), + href="/performance", + id="nav-performance", + ), + dmc.NavLink( + label="Portfolio Analysis", + leftSection=DashIconify(icon="tabler:chart-donut", width=20), + href="/portfolio", + id="nav-portfolio", + ), + dmc.NavLink( + label="Fees & Distributions", + leftSection=DashIconify(icon="tabler:receipt", width=20), + href="/fees", + id="nav-fees", + ), + dmc.Divider(my="md"), + dmc.Text("Fund Info", size="xs", c="dimmed", fw=600, tt="uppercase", mb="xs"), + dmc.Stack([ + dmc.Group([ + dmc.Text("Fund:", size="sm", c="dimmed"), + dmc.Text("500 Index Fund", size="sm", fw=500), + ], justify="space-between"), + dmc.Group([ + dmc.Text("Category:", size="sm", c="dimmed"), + dmc.Text("Large Blend", size="sm", fw=500), + ], justify="space-between"), + dmc.Group([ + dmc.Text("Expense:", size="sm", c="dimmed"), + dmc.Badge("0.14%", color="green", size="sm"), + ], justify="space-between"), + ], gap="xs"), + dmc.Divider(my="md"), + dmc.Text("Resources", size="xs", c="dimmed", fw=600, tt="uppercase", mb="xs"), + dmc.Anchor( + dmc.NavLink( + label="Prospectus", + leftSection=DashIconify(icon="tabler:file-text", width=18), + rightSection=DashIconify(icon="tabler:external-link", width=14, color="gray"), + variant="subtle", + py=6, + ), + href="https://www.sec.gov/cgi-bin/browse-edgar?action=getcompany&CIK=0000036405&type=485&dateb=&owner=include&count=40", + target="_blank", + underline=False, + ), + dmc.Anchor( + dmc.NavLink( + label="Fact Sheet", + leftSection=DashIconify(icon="tabler:file-description", width=18), + rightSection=DashIconify(icon="tabler:external-link", width=14, color="gray"), + variant="subtle", + py=6, + ), + href="https://investor.vanguard.com/investment-products/mutual-funds/profile/vfiax", + target="_blank", + underline=False, + ), + dmc.Anchor( + dmc.NavLink( + label="Annual Report", + leftSection=DashIconify(icon="tabler:report", width=18), + rightSection=DashIconify(icon="tabler:external-link", width=14, color="gray"), + variant="subtle", + py=6, + ), + href="https://www.sec.gov/cgi-bin/browse-edgar?action=getcompany&CIK=0000036405&type=N-CSR&dateb=&owner=include&count=40", + target="_blank", + underline=False, + ), + dmc.Anchor( + dmc.NavLink( + label="Tax Documents", + leftSection=DashIconify(icon="tabler:file-invoice", width=18), + rightSection=DashIconify(icon="tabler:external-link", width=14, color="gray"), + variant="subtle", + py=6, + ), + href="https://investor.vanguard.com/client-benefits/tax-center", + target="_blank", + underline=False, + ), + ], gap=4, style={"flex": 1}), + ], gap="md", justify="space-between", h="100%"), + p="md", + h="100%", + withBorder=True, + radius=0, + style={"minWidth": "250px"} + ) + +app.layout = dmc.MantineProvider( + id="mantine-provider", + forceColorScheme="light", + children=[ + dcc.Location(id="url", refresh=False), + dcc.Download(id="download-pdf-all"), + html.Div(id="pdf-status-all", style={"display": "none"}), + dmc.AppShell( + [ + dmc.AppShellHeader(create_header()), + dmc.AppShellNavbar(create_navbar()), + dmc.AppShellMain( + dmc.Container( + id="page-content", + fluid=True, + p="md", + ) + ), + ], + header={"height": 73}, + navbar={"width": 280, "breakpoint": "sm", "collapsed": {"mobile": True}}, + padding="md", + ), + ] +) + +@callback( + Output("page-content", "children"), + Input("url", "pathname") +) +def display_page(pathname): + if pathname == "/performance": + return performance.layout + elif pathname == "/portfolio": + return portfolio.layout + elif pathname == "/fees": + return fees.layout + else: + return dashboard.layout + +@callback( + [Output("nav-dashboard", "active"), + Output("nav-performance", "active"), + Output("nav-portfolio", "active"), + Output("nav-fees", "active")], + Input("url", "pathname") +) +def update_nav_active(pathname): + return [ + pathname == "/" or pathname is None, + pathname == "/performance", + pathname == "/portfolio", + pathname == "/fees", + ] + +if __name__ == "__main__": + app.run(debug=True) diff --git a/investments-dashboard/assets/DE-logo.png b/investments-dashboard/assets/DE-logo.png new file mode 100644 index 0000000..a037590 Binary files /dev/null and b/investments-dashboard/assets/DE-logo.png differ diff --git a/investments-dashboard/assets/styles.css b/investments-dashboard/assets/styles.css new file mode 100644 index 0000000..a462441 --- /dev/null +++ b/investments-dashboard/assets/styles.css @@ -0,0 +1,137 @@ +/* Financial Dashboard V2 - Custom Styles */ + +/* Global */ +body { + font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; +} + +.mantine-AppShell-header .mantine-Title-root { + white-space: nowrap; +} + +.mantine-AppShell-header img { + flex-shrink: 0; +} + +/* Scrollbar styling */ +::-webkit-scrollbar { + width: 8px; + height: 8px; +} + +::-webkit-scrollbar-track { + background: rgba(0, 0, 0, 0.05); + border-radius: 4px; +} + +::-webkit-scrollbar-thumb { + background: rgba(0, 0, 0, 0.2); + border-radius: 4px; +} + +::-webkit-scrollbar-thumb:hover { + background: rgba(0, 0, 0, 0.3); +} + +/* Chart containers */ +.js-plotly-plot .plotly .modebar { + top: 5px !important; + right: 5px !important; +} + +.js-plotly-plot .plotly .modebar-btn { + font-size: 14px !important; +} + +/* Table styling */ +.mantine-Table-table { + font-size: 0.875rem; +} + +.mantine-Table-th { + background-color: rgba(0, 0, 0, 0.02); +} + +/* Dark mode table adjustments */ +[data-mantine-color-scheme="dark"] .mantine-Table-th { + background-color: rgba(255, 255, 255, 0.05); +} + +/* NavLink active state */ +.mantine-NavLink-root[data-active="true"] { + font-weight: 600; +} + +/* Paper hover effect */ +.mantine-Paper-root { + transition: box-shadow 0.2s ease; +} + +.mantine-Paper-root:hover { + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08); +} + +/* KPI card animations */ +@keyframes fadeInUp { + from { + opacity: 0; + transform: translateY(10px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +@keyframes pulse { + 0%, 100% { opacity: 1; } + 50% { opacity: 0.3; } +} + +/* Progress bars */ +.mantine-Progress-root { + background-color: rgba(0, 0, 0, 0.05); +} + +/* Badge styling */ +.mantine-Badge-root { + text-transform: none; +} + +/* Date picker */ +.mantine-DatePickerInput-input { + min-height: 36px; +} + +/* Multi-select */ +.mantine-MultiSelect-input { + min-height: 36px; +} + +/* Responsive adjustments */ +@media (max-width: 768px) { + .mantine-AppShell-navbar { + display: none; + } + + .mantine-Container-root { + padding: 0.5rem; + } +} + +/* Print styles */ +@media print { + .mantine-AppShell-header, + .mantine-AppShell-navbar, + .mantine-Button-root, + .mantine-Select-root, + .mantine-MultiSelect-root { + display: none !important; + } + + .mantine-Paper-root { + break-inside: avoid; + box-shadow: none !important; + border: 1px solid #dee2e6 !important; + } +} diff --git a/investments-dashboard/callbacks/__init__.py b/investments-dashboard/callbacks/__init__.py new file mode 100644 index 0000000..ac1e363 --- /dev/null +++ b/investments-dashboard/callbacks/__init__.py @@ -0,0 +1,5 @@ +from . import dashboard +from . import performance +from . import portfolio +from . import fees +from . import export_all diff --git a/investments-dashboard/callbacks/dashboard.py b/investments-dashboard/callbacks/dashboard.py new file mode 100644 index 0000000..5e88189 --- /dev/null +++ b/investments-dashboard/callbacks/dashboard.py @@ -0,0 +1,224 @@ +import asyncio +import random +from datetime import datetime + +from dash import callback, ctx, Input, Output, State, dcc, set_props, html +import dash_mantine_components as dmc +from dash_iconify import DashIconify + +from utils.data_loader import get_fund_metrics, get_returns_data, get_time_series_data, df_fund_facts, calculate_risk_metrics +from components.charts import create_hypothetical_growth_chart, create_sparkline, CHART_COLORS, CHART_LAYOUT +import plotly.graph_objects as go + +def get_metrics_for_fund(fund_id, period="1Y"): + """Get metrics for a specific fund and period""" + ts = get_time_series_data() + returns = get_returns_data() + facts = dict(zip(df_fund_facts['label'], df_fund_facts['value'])) + + if fund_id == "calibre": + col = 'Calibre Index Fund' + fund_name = "Calibre Index Fund" + else: + col = '"S&P 500 Index, y"' + fund_name = "500 Index Fund" + + latest_price = ts[col].iloc[-1] + + period_map = { + "1Y": 252, + "3Y": 252 * 3, + "5Y": 252 * 5, + "10Y": 252 * 10, + "All": len(ts) + } + + lookback = min(period_map.get(period, 252), len(ts) - 1) + start_price = ts[col].iloc[-lookback] if lookback < len(ts) else ts[col].iloc[0] + period_return = ((latest_price - start_price) / start_price) * 100 + + fund_returns = returns[returns['Entity'].str.contains('500 Index Fund', na=False)].iloc[0] + + return { + 'nav': latest_price, + 'period_return': period_return, + 'period': period, + '1y_return': fund_returns['1Y'], + '3y_return': fund_returns['3Y'], + '5y_return': fund_returns['5Y'], + '10y_return': fund_returns['10Y'], + 'fund_name': fund_name, + 'expense_ratio': facts.get('Expense ratio as of 04/27/2017', '0.14%'), + 'category': facts.get('Category', 'Large Blend'), + 'asset_class': facts.get('Asset Class', 'Domestic Stock'), + 'min_investment': facts.get('Minimum investment', '$3,000'), + } + +def create_dynamic_growth_chart(fund_id, initial=10000, show_benchmark=True): + """Create growth chart for selected fund""" + ts = get_time_series_data() + + col = 'Calibre Index Fund' if fund_id == "calibre" else '"S&P 500 Index, y"' + fund_name = "Calibre Index Fund" if fund_id == "calibre" else "500 Index Fund" + benchmark_col = '"S&P 500 Index, y"' + + yearly_data = ts.set_index('Date').resample('YE').last().reset_index() + yearly_data = yearly_data.tail(10) + + first_price = yearly_data[col].iloc[0] + fund_values = [initial * (p / first_price) for p in yearly_data[col]] + years = yearly_data['Date'].dt.year.astype(str).tolist() + + first_bench = yearly_data[benchmark_col].iloc[0] + benchmark_values = [initial * (p / first_bench) for p in yearly_data[benchmark_col]] + + fig = go.Figure() + + fig.add_trace(go.Scatter( + x=years, + y=fund_values, + name=fund_name, + fill='tozeroy', + line={'color': CHART_COLORS['primary'], 'width': 2}, + fillcolor='rgba(34, 139, 230, 0.1)', + hovertemplate='$%{y:,.2f}', + )) + + if show_benchmark: + fig.add_trace(go.Scatter( + x=years, + y=benchmark_values, + name='S&P 500 Index', + line={'color': CHART_COLORS['gray'], 'width': 2, 'dash': 'dash'}, + hovertemplate='$%{y:,.2f}', + )) + + fig.update_layout( + **CHART_LAYOUT, + title={'text': f'Hypothetical Growth of ${initial:,}', 'x': 0, 'font': {'size': 16, 'weight': 600}}, + legend={'orientation': 'h', 'y': -0.15}, + yaxis={'showgrid': True, 'gridcolor': 'rgba(0,0,0,0.05)', 'tickprefix': '$', 'tickformat': ','}, + xaxis={'showgrid': False}, + ) + + return fig + +@callback( + [Output("kpi-nav-value", "children"), + Output("kpi-nav-trend", "children"), + Output("kpi-nav-trend", "c"), + Output("kpi-period-value", "children"), + Output("kpi-period-title", "children"), + Output("kpi-period-subtitle", "children"), + Output("kpi-expense-value", "children"), + Output("kpi-category-value", "children"), + Output("kpi-category-subtitle", "children"), + Output("growth-chart", "figure"), + Output("quick-1y", "children"), + Output("quick-3y", "children"), + Output("quick-5y", "children"), + Output("quick-min", "children"), + Output("risk-volatility-bar", "value"), + Output("risk-volatility-value", "children"), + Output("risk-beta-bar", "value"), + Output("risk-beta-value", "children"), + Output("risk-sharpe-bar", "value"), + Output("risk-sharpe-value", "children"), + Output("risk-alpha-bar", "value"), + Output("risk-alpha-value", "children")], + [Input("dashboard-fund-select", "value"), + Input("dashboard-period", "value"), + Input("benchmark-toggle", "checked"), + Input("investment-amount", "value")] +) +def update_dashboard(fund, period, show_benchmark, investment): + metrics = get_metrics_for_fund(fund, period) + risk = calculate_risk_metrics(fund, period) + + investment = investment or 10000 + + nav_value = f"${metrics['nav']:.2f}" + trend_icon = "↑" if metrics['period_return'] > 0 else "↓" + trend_value = f"{trend_icon} {abs(metrics['period_return']):.1f}% {period}" + trend_color = "teal" if metrics['period_return'] > 0 else "red" + + period_labels = {"1Y": "1 Year", "3Y": "3 Year", "5Y": "5 Year", "10Y": "10 Year", "All": "All Time"} + period_title = f"{period_labels.get(period, period)} Return" + + period_return_map = {"1Y": metrics['1y_return'], "3Y": metrics['3y_return'], + "5Y": metrics['5y_return'], "10Y": metrics['10y_return'], "All": metrics['period_return']} + period_value = f"{period_return_map.get(period, metrics['1y_return']):.2f}%" + + growth_chart = create_dynamic_growth_chart(fund, investment, show_benchmark) + + return ( + nav_value, + trend_value, + trend_color, + period_value, + period_title, + "vs S&P 500", + metrics['expense_ratio'], + metrics['category'], + metrics['asset_class'], + growth_chart, + f"{metrics['1y_return']:.2f}%", + f"{metrics['3y_return']:.2f}%", + f"{metrics['5y_return']:.2f}%", + metrics['min_investment'].replace('"', ''), + risk['volatility_pct'], + risk['volatility_level'], + risk['beta_pct'], + f"{risk['beta']:.2f}", + risk['sharpe_pct'], + f"{risk['sharpe']:.2f}", + risk['alpha_pct'], + f"{risk['alpha']:.2f}%", + ) + +@callback( + Output("live-streaming", "data"), + Input("live-toggle", "checked"), +) +def toggle_streaming(checked): + return checked + + +@callback(persistent=True) +async def stream_market_prices(): + ws = ctx.websocket + prices = {"AAPL": 189.50, "GOOGL": 176.30, "MSFT": 420.15, "AMZN": 185.60, "TSLA": 178.90} + base_prices = dict(prices) + history = {s: [p] for s, p in prices.items()} + + while not ws.is_shutdown: + streaming = await ws.get_prop("live-streaming", "data") + if streaming: + for sym in prices: + change_pct = round(random.gauss(0, 0.3), 2) + prices[sym] = round(prices[sym] * (1 + change_pct / 100), 2) + history[sym].append(prices[sym]) + if len(history[sym]) > 30: + history[sym] = history[sym][-30:] + + dollar_change = round(prices[sym] - base_prices[sym], 2) + total_pct = round((prices[sym] - base_prices[sym]) / base_prices[sym] * 100, 2) + sign = "+" if dollar_change >= 0 else "" + color = "#40c057" if dollar_change >= 0 else "#fa5252" + + set_props(f"live-price-{sym}", {"children": f"${prices[sym]:.2f}"}) + set_props(f"live-change-{sym}", { + "children": f"{sign}{dollar_change:.2f} ({sign}{total_pct:.2f}%)", + "style": {"color": color}, + }) + + selected = await ws.get_prop("sparkline-symbol", "value") + if selected and selected in history: + fig = create_sparkline(history[selected], selected) + set_props("sparkline-chart", {"figure": fig}) + + await asyncio.sleep(1) + else: + await asyncio.sleep(0.5) + + diff --git a/investments-dashboard/callbacks/export_all.py b/investments-dashboard/callbacks/export_all.py new file mode 100644 index 0000000..42067e3 --- /dev/null +++ b/investments-dashboard/callbacks/export_all.py @@ -0,0 +1,56 @@ +from datetime import datetime + +from dash import callback, Input, Output, dcc, html + +from utils.pdf_export import create_pdf_report +from utils.data_loader import get_time_series_data, get_sector_allocation +from components.charts import ( + create_hypothetical_growth_chart, + create_performance_line_chart, + create_sector_donut_chart, + create_fee_comparison_chart, +) +from pages.performance import create_drawdown_chart + + +@callback( + Output("download-pdf-all", "data"), + Output("pdf-status-all", "children"), + Input("generate-pdf-all-btn", "n_clicks"), + prevent_initial_call=True, +) +def generate_all_pdf(n_clicks): + if not n_clicks: + return None, "" + try: + ts_data = get_time_series_data() + sector_data = get_sector_allocation() + + figures = [ + create_hypothetical_growth_chart().to_dict(), + create_performance_line_chart(ts_data, "Performance Over Time").to_dict(), + create_drawdown_chart(ts_data).to_dict(), + create_sector_donut_chart(sector_data, "Sector Allocation").to_dict(), + create_fee_comparison_chart().to_dict(), + ] + titles = [ + "Hypothetical Growth", + "Price Performance", + "Drawdown Analysis", + "Sector Allocation", + "Fee Comparison", + ] + + pdf_bytes = create_pdf_report( + figures=figures, + titles=titles, + report_title="Investment Report", + ) + filename = f"investment_report_{datetime.now().strftime('%Y%m%d_%H%M%S')}.pdf" + return dcc.send_bytes(pdf_bytes, filename), "" + except Exception as e: + import traceback + return None, html.Div( + f"PDF error: {e}\n{traceback.format_exc()}", + style={"color": "red", "white-space": "pre-wrap", "fontSize": "12px"}, + ) diff --git a/investments-dashboard/callbacks/fees.py b/investments-dashboard/callbacks/fees.py new file mode 100644 index 0000000..755e7ab --- /dev/null +++ b/investments-dashboard/callbacks/fees.py @@ -0,0 +1,129 @@ +from dash import callback, Input, Output, State, dcc, html +import plotly.graph_objects as go +import pandas as pd +from datetime import datetime + +from utils.data_loader import get_dividend_history +from components.charts import CHART_COLORS, CHART_LAYOUT + +def calculate_fees(investment, years, fund_expense=0.0014, avg_expense=0.0099, annual_return=0.07): + """Calculate fee impact over time""" + fund_values = [] + avg_values = [] + + fund_value = investment + avg_value = investment + + for _ in range(years): + fund_value *= (1 + annual_return - fund_expense) + avg_value *= (1 + annual_return - avg_expense) + fund_values.append(fund_value) + avg_values.append(avg_value) + + fund_fees = investment * (1 + annual_return) ** years - fund_values[-1] + avg_fees = investment * (1 + annual_return) ** years - avg_values[-1] + savings = avg_fees - fund_fees + + return { + 'fund_values': fund_values, + 'avg_values': avg_values, + 'fund_final': fund_values[-1], + 'avg_final': avg_values[-1], + 'fund_fees': fund_fees, + 'avg_fees': avg_fees, + 'savings': savings + } + +def create_dynamic_fee_comparison(investment, years): + """Create fee comparison chart with custom investment amount""" + results = calculate_fees(investment, years) + + fig = go.Figure() + + fig.add_trace(go.Bar( + x=['Category Average', 'This Fund'], + y=[results['avg_fees'], results['fund_fees']], + marker_color=[CHART_COLORS['gray'], CHART_COLORS['primary']], + text=[f"${results['avg_fees']:,.0f}", f"${results['fund_fees']:,.0f}"], + textposition='outside', + )) + + fig.add_annotation( + x=1, y=results['fund_fees'] + results['savings'] * 0.15, + text=f"Save ${results['savings']:,.0f}", + showarrow=True, + arrowhead=2, + arrowcolor=CHART_COLORS['secondary'], + font={'color': CHART_COLORS['secondary'], 'weight': 600}, + ) + + fig.update_layout( + **CHART_LAYOUT, + title={'text': f'Fees on ${investment:,} Over {years} Years', 'x': 0, 'font': {'size': 16, 'weight': 600}}, + yaxis={'showgrid': True, 'gridcolor': 'rgba(0,0,0,0.05)', 'tickprefix': '$', 'tickformat': ','}, + showlegend=False, + ) + + return fig + +def create_dynamic_cost_impact(investment, years): + """Create cost impact chart with custom parameters""" + all_years = list(range(1, years + 1)) + results = calculate_fees(investment, years) + + fig = go.Figure() + + fig.add_trace(go.Scatter( + x=all_years, + y=results['avg_values'], + name='Category Avg (0.99%)', + line={'color': CHART_COLORS['gray'], 'width': 2}, + )) + + fig.add_trace(go.Scatter( + x=all_years, + y=results['fund_values'], + name='This Fund (0.14%)', + line={'color': CHART_COLORS['primary'], 'width': 2}, + fill='tonexty', + fillcolor='rgba(34, 139, 230, 0.1)', + )) + + fig.update_layout( + **CHART_LAYOUT, + title={'text': f'Long-Term Cost Impact (7% annual return)', 'x': 0, 'font': {'size': 16, 'weight': 600}}, + xaxis={'title': 'Years'}, + yaxis={'title': 'Portfolio Value', 'tickprefix': '$', 'tickformat': ','}, + legend={'orientation': 'h', 'y': -0.15}, + ) + + return fig + +@callback( + [Output("fee-comparison-chart", "figure"), + Output("cost-impact-chart", "figure"), + Output("savings-amount", "children"), + Output("final-value-fund", "children"), + Output("final-value-avg", "children")], + [Input("investment-amount", "value"), + Input("time-horizon", "value")] +) +def update_fee_calculations(amount, years): + if amount is None or amount <= 0: + amount = 10000 + if years is None or years <= 0: + years = 10 + + results = calculate_fees(amount, years) + + fee_chart = create_dynamic_fee_comparison(amount, years) + cost_chart = create_dynamic_cost_impact(amount, years) + + return ( + fee_chart, + cost_chart, + f"${results['savings']:,.0f}", + f"${results['fund_final']:,.0f}", + f"${results['avg_final']:,.0f}" + ) + diff --git a/investments-dashboard/callbacks/performance.py b/investments-dashboard/callbacks/performance.py new file mode 100644 index 0000000..b042c18 --- /dev/null +++ b/investments-dashboard/callbacks/performance.py @@ -0,0 +1,341 @@ +from dash import callback, Input, Output, State, dcc, html +import plotly.graph_objects as go +import pandas as pd +from datetime import datetime, timedelta + +from utils.data_loader import get_time_series_data +from components.charts import CHART_COLORS, CHART_LAYOUT + +BENCHMARK_COLUMNS = { + "calibre": ("Calibre Index Fund", CHART_COLORS['primary']), + "msci": ("MSCI EAFE Index Fund (ETF)", CHART_COLORS['secondary']), + "sp500": ('"S&P 500 Index, y"', CHART_COLORS['tertiary']), +} + +BENCHMARK_LABELS = { + "calibre": "Calibre Index Fund", + "msci": "MSCI EAFE Index", + "sp500": "S&P 500", +} + +def calculate_date_range_from_period(period, df): + """Calculate date range based on period selector""" + if period == "All" or not period: + return None + + end_date = df['Date'].max() + + period_map = { + "1M": timedelta(days=30), + "3M": timedelta(days=90), + "6M": timedelta(days=180), + "1Y": timedelta(days=365), + "3Y": timedelta(days=365 * 3), + "5Y": timedelta(days=365 * 5), + } + + delta = period_map.get(period, timedelta(days=365)) + start_date = end_date - delta + + return [start_date.strftime('%Y-%m-%d'), end_date.strftime('%Y-%m-%d')] + +def filter_data_by_date(df, date_range): + """Filter dataframe by date range""" + if date_range and len(date_range) == 2 and date_range[0] and date_range[1]: + start_date = pd.to_datetime(date_range[0]) + end_date = pd.to_datetime(date_range[1]) + return df[(df['Date'] >= start_date) & (df['Date'] <= end_date)] + return df + +def normalize_series(df, columns): + """Normalize series to start at 100""" + normalized_df = df.copy() + for col in columns: + if col in normalized_df.columns: + first_val = normalized_df[col].iloc[0] + if first_val != 0: + normalized_df[col] = (normalized_df[col] / first_val) * 100 + return normalized_df + +def calculate_moving_average(df, col_name, window): + """Calculate moving average""" + if col_name in df.columns and window > 0: + return df[col_name].rolling(window=window).mean() + return None + +def calculate_performance_metrics(df, col_name): + """Calculate volatility, max drawdown, Sharpe, best/worst day""" + if col_name not in df.columns or len(df) < 2: + return { + 'volatility': 0, 'max_drawdown': 0, 'sharpe': 0, + 'best_day': 0, 'worst_day': 0 + } + + returns = df[col_name].pct_change().dropna() + + if len(returns) == 0: + return { + 'volatility': 0, 'max_drawdown': 0, 'sharpe': 0, + 'best_day': 0, 'worst_day': 0 + } + + volatility = returns.std() * (252 ** 0.5) * 100 + + prices = df[col_name].values + peak = prices[0] + max_dd = 0 + for price in prices: + if price > peak: + peak = price + dd = (price - peak) / peak * 100 + if dd < max_dd: + max_dd = dd + + risk_free = 0.02 + excess = returns.mean() * 252 - risk_free + std_ann = returns.std() * (252 ** 0.5) + sharpe = excess / std_ann if std_ann > 0 else 0 + + best_day = returns.max() * 100 + worst_day = returns.min() * 100 + + return { + 'volatility': volatility, + 'max_drawdown': max_dd, + 'sharpe': sharpe, + 'best_day': best_day, + 'worst_day': worst_day + } + +def create_dynamic_performance_chart(df, benchmarks, normalize=False, ma_period=None, log_scale=False, title="Performance Over Time"): + """Create performance chart with selected benchmarks, normalization, MA, and log scale""" + fig = go.Figure() + + columns_to_plot = [] + for benchmark in benchmarks: + if benchmark in BENCHMARK_COLUMNS: + col_name, _ = BENCHMARK_COLUMNS[benchmark] + if col_name in df.columns: + columns_to_plot.append(col_name) + + plot_df = df.copy() + if normalize and columns_to_plot: + plot_df = normalize_series(plot_df, columns_to_plot) + + for benchmark in benchmarks: + if benchmark in BENCHMARK_COLUMNS: + col_name, color = BENCHMARK_COLUMNS[benchmark] + if col_name in plot_df.columns: + fig.add_trace(go.Scatter( + x=plot_df['Date'], + y=plot_df[col_name], + name=BENCHMARK_LABELS.get(benchmark, benchmark), + line={'color': color, 'width': 2}, + hovertemplate='%{y:.2f}' + )) + + if ma_period and ma_period != "none": + window = int(ma_period) + ma = calculate_moving_average(plot_df, col_name, window) + if ma is not None: + fig.add_trace(go.Scatter( + x=plot_df['Date'], + y=ma, + name=f"{BENCHMARK_LABELS.get(benchmark, benchmark)} {window}MA", + line={'color': color, 'width': 1, 'dash': 'dot'}, + hovertemplate='%{y:.2f}' + )) + + y_prefix = '' if normalize else '$' + y_type = 'log' if log_scale else 'linear' + + fig.update_layout( + **CHART_LAYOUT, + title={'text': title, 'x': 0, 'font': {'size': 16, 'weight': 600}}, + legend={'orientation': 'h', 'y': -0.15}, + xaxis={ + 'showgrid': True, + 'gridcolor': 'rgba(0,0,0,0.05)', + }, + yaxis={'showgrid': True, 'gridcolor': 'rgba(0,0,0,0.05)', 'tickprefix': y_prefix, 'type': y_type}, + ) + + return fig + +def create_dynamic_drawdown_chart(df, benchmarks, show_all=False): + """Calculate and plot drawdown for selected benchmarks""" + fig = go.Figure() + + colors = [CHART_COLORS['danger'], CHART_COLORS['secondary'], CHART_COLORS['tertiary']] + fill_colors = ['rgba(250, 82, 82, 0.2)', 'rgba(64, 192, 87, 0.15)', 'rgba(250, 176, 5, 0.15)'] + + benchmarks_to_show = benchmarks if show_all else [benchmarks[0]] if benchmarks else ["calibre"] + + for idx, benchmark in enumerate(benchmarks_to_show): + col_name = BENCHMARK_COLUMNS.get(benchmark, BENCHMARK_COLUMNS["calibre"])[0] + + if col_name not in df.columns: + continue + + prices = df[col_name].values + peak = prices[0] + drawdowns = [] + + for price in prices: + if price > peak: + peak = price + drawdown = (price - peak) / peak * 100 + drawdowns.append(drawdown) + + color = colors[idx % len(colors)] + fill = fill_colors[idx % len(fill_colors)] if idx == 0 else 'rgba(0,0,0,0)' + + fig.add_trace(go.Scatter( + x=df['Date'], + y=drawdowns, + fill='tozeroy' if idx == 0 else 'none', + line={'color': color, 'width': 2 if idx == 0 else 1}, + fillcolor=fill, + name=BENCHMARK_LABELS.get(benchmark, benchmark), + )) + + fig.update_layout( + **CHART_LAYOUT, + title={'text': 'Drawdown Analysis', 'x': 0, 'font': {'size': 16, 'weight': 600}}, + yaxis={'showgrid': True, 'gridcolor': 'rgba(0,0,0,0.05)', 'ticksuffix': '%'}, + showlegend=len(benchmarks_to_show) > 1, + legend={'orientation': 'h', 'y': -0.15}, + ) + return fig + +def create_rolling_returns_chart(df, benchmarks, show_all=False, window=252): + """Create rolling returns chart for selected benchmarks""" + fig = go.Figure() + + if len(df) < window + 1: + fig.update_layout( + **CHART_LAYOUT, + title={'text': f'Rolling 1-Year Returns', 'x': 0, 'font': {'size': 16, 'weight': 600}}, + annotations=[{'text': 'Insufficient data for rolling calculation', 'showarrow': False, 'x': 0.5, 'y': 0.5, 'xref': 'paper', 'yref': 'paper'}] + ) + return fig + + benchmarks_to_show = benchmarks if show_all else [benchmarks[0]] if benchmarks else ["calibre"] + + for idx, benchmark in enumerate(benchmarks_to_show): + col_name, color = BENCHMARK_COLUMNS.get(benchmark, BENCHMARK_COLUMNS["calibre"]) + + if col_name not in df.columns: + continue + + rolling_returns = (df[col_name] / df[col_name].shift(window) - 1) * 100 + + fill = 'tozeroy' if idx == 0 else 'none' + fill_color = 'rgba(34, 139, 230, 0.15)' if idx == 0 else 'rgba(0,0,0,0)' + + fig.add_trace(go.Scatter( + x=df['Date'], + y=rolling_returns, + fill=fill, + line={'color': color, 'width': 2 if idx == 0 else 1}, + fillcolor=fill_color, + name=BENCHMARK_LABELS.get(benchmark, benchmark), + )) + + fig.add_hline(y=0, line_dash="dash", line_color="gray", line_width=1) + + fig.update_layout( + **CHART_LAYOUT, + title={'text': f'Rolling 1-Year Returns', 'x': 0, 'font': {'size': 16, 'weight': 600}}, + yaxis={'showgrid': True, 'gridcolor': 'rgba(0,0,0,0.05)', 'ticksuffix': '%'}, + showlegend=len(benchmarks_to_show) > 1, + legend={'orientation': 'h', 'y': -0.15}, + ) + return fig + +def calculate_stats(df, col_name="Calibre Index Fund"): + """Calculate stats for the filtered data""" + if col_name not in df.columns: + col_name = "Calibre Index Fund" + + high_val = df[col_name].max() + high_date = df.loc[df[col_name].idxmax(), 'Date'] + + low_val = df[col_name].min() + low_date = df.loc[df[col_name].idxmin(), 'Date'] + + current_val = df[col_name].iloc[-1] + + total_return = ((df[col_name].iloc[-1] - df[col_name].iloc[0]) / df[col_name].iloc[0]) * 100 + + return { + 'high': high_val, + 'high_date': high_date, + 'low': low_val, + 'low_date': low_date, + 'current': current_val, + 'total_return': total_return + } + +@callback( + [Output("performance-chart", "figure"), + Output("drawdown-chart", "figure"), + Output("rolling-returns-chart", "figure"), + Output("period-high-value", "children"), + Output("period-high-date", "children"), + Output("period-low-value", "children"), + Output("period-low-date", "children"), + Output("current-price-value", "children"), + Output("total-return-value", "children"), + Output("total-return-value", "c"), + Output("perf-volatility", "children"), + Output("perf-max-drawdown", "children"), + Output("perf-sharpe", "children"), + Output("perf-best-day", "children"), + Output("perf-worst-day", "children")], + [Input("benchmark-selector", "value"), + Input("performance-period", "value"), + Input("normalize-toggle", "checked"), + Input("ma-selector", "value"), + Input("log-scale-toggle", "checked")] +) +def update_performance(benchmarks, period, normalize, ma_period, log_scale): + df = get_time_series_data() + + date_range = calculate_date_range_from_period(period, df) + filtered_df = filter_data_by_date(df, date_range) + + if not benchmarks: + benchmarks = ["calibre"] + + primary_benchmark = benchmarks[0] if benchmarks else "calibre" + col_name = BENCHMARK_COLUMNS.get(primary_benchmark, BENCHMARK_COLUMNS["calibre"])[0] + + perf_chart = create_dynamic_performance_chart(filtered_df, benchmarks, normalize, ma_period, log_scale) + drawdown_chart = create_dynamic_drawdown_chart(filtered_df, benchmarks, show_all=normalize) + rolling_chart = create_rolling_returns_chart(filtered_df, benchmarks, show_all=normalize) + + stats = calculate_stats(filtered_df, col_name) + metrics = calculate_performance_metrics(filtered_df, col_name) + + high_date_str = stats['high_date'].strftime('%Y-%m-%d') if hasattr(stats['high_date'], 'strftime') else str(stats['high_date']) + low_date_str = stats['low_date'].strftime('%Y-%m-%d') if hasattr(stats['low_date'], 'strftime') else str(stats['low_date']) + + return ( + perf_chart, + drawdown_chart, + rolling_chart, + f"${stats['high']:.2f}", + high_date_str, + f"${stats['low']:.2f}", + low_date_str, + f"${stats['current']:.2f}", + f"{stats['total_return']:.1f}%", + "green" if stats['total_return'] > 0 else "red", + f"{metrics['volatility']:.1f}%", + f"{metrics['max_drawdown']:.1f}%", + f"{metrics['sharpe']:.2f}", + f"+{metrics['best_day']:.1f}%", + f"{metrics['worst_day']:.1f}%", + ) + diff --git a/investments-dashboard/callbacks/portfolio.py b/investments-dashboard/callbacks/portfolio.py new file mode 100644 index 0000000..418bccf --- /dev/null +++ b/investments-dashboard/callbacks/portfolio.py @@ -0,0 +1,192 @@ +from dash import callback, Input, Output, State, dcc, html +import plotly.graph_objects as go +import plotly.express as px +from datetime import datetime + +from utils.data_loader import get_sector_allocation +from components.charts import CHART_COLORS, CHART_LAYOUT + +sector_data = get_sector_allocation() + +def create_sector_bar_with_highlight(highlighted_sector=None): + """Create sector bar chart with optional highlight""" + fig = go.Figure() + + colors = [CHART_COLORS['primary'] if (highlighted_sector is None or s == highlighted_sector) + else 'rgba(34, 139, 230, 0.3)' + for s in sector_data['Sector']] + + fig.add_trace(go.Bar( + y=sector_data['Sector'], + x=sector_data['Fund'], + name='Fund', + orientation='h', + marker_color=colors, + )) + + benchmark_colors = [CHART_COLORS['gray'] if (highlighted_sector is None or s == highlighted_sector) + else 'rgba(134, 142, 150, 0.3)' + for s in sector_data['Sector']] + + fig.add_trace(go.Bar( + y=sector_data['Sector'], + x=sector_data['Benchmark'], + name='Benchmark', + orientation='h', + marker_color=benchmark_colors, + )) + + title = 'Sector Allocation vs Benchmark' + if highlighted_sector: + title = f'Sector Allocation - {highlighted_sector} Highlighted' + + fig.update_layout( + **CHART_LAYOUT, + title={'text': title, 'x': 0, 'font': {'size': 16, 'weight': 600}}, + barmode='group', + bargap=0.3, + legend={'orientation': 'h', 'y': -0.15}, + xaxis={'title': 'Allocation %', 'ticksuffix': '%'}, + yaxis={'title': ''}, + height=450, + ) + + return fig + +@callback( + [Output("allocation-view", "style"), + Output("characteristics-view", "style"), + Output("risk-view", "style")], + Input("portfolio-view", "value") +) +def switch_portfolio_view(view): + """Switch between allocation, characteristics, and risk views""" + hidden = {"display": "none"} + visible = {"display": "block"} + + if view == "allocation": + return visible, hidden, hidden + elif view == "characteristics": + return hidden, visible, hidden + else: + return hidden, hidden, visible + +@callback( + Output("sector-bar-chart", "figure"), + Input("sector-donut", "clickData"), + State("sector-donut", "figure"), + prevent_initial_call=True +) +def highlight_sector(click_data, current_figure): + """Highlight selected sector in bar chart (synced with donut toggle)""" + if click_data and 'points' in click_data: + selected_idx = click_data['points'][0].get('pointNumber', None) + sector_name = click_data['points'][0].get('label', None) + + current_pull = current_figure.get('data', [{}])[0].get('pull', []) + already_selected = ( + current_pull and + selected_idx is not None and + len(current_pull) > selected_idx and + current_pull[selected_idx] > 0 + ) + + if not already_selected: + return create_sector_bar_with_highlight(sector_name) + return create_sector_bar_with_highlight(None) + +@callback( + Output("sector-detail-text", "children"), + Input("sector-donut", "clickData"), + State("sector-donut", "figure") +) +def update_sector_detail(click_data, current_figure): + """Show sector details when clicked (synced with donut toggle)""" + if click_data and 'points' in click_data: + point = click_data['points'][0] + selected_idx = point.get('pointNumber', None) + sector = point.get('label', 'Unknown') + value = point.get('value', 0) + + current_pull = current_figure.get('data', [{}])[0].get('pull', []) if current_figure else [] + already_selected = ( + current_pull and + selected_idx is not None and + len(current_pull) > selected_idx and + current_pull[selected_idx] > 0 + ) + + if not already_selected: + return f"Selected: {sector} ({value:.1f}% allocation)" + return "Click on a sector to see details" + +@callback( + Output("sector-donut", "figure"), + Input("sector-donut", "clickData"), + State("sector-donut", "figure"), + prevent_initial_call=True +) +def highlight_donut_sector(click_data, current_figure): + """Highlight selected sector in donut chart (click again to reset)""" + import re + colors = px.colors.qualitative.Set3[:len(sector_data)] + + pull_values = [0] * len(sector_data) + opacities = [1] * len(sector_data) + + if click_data and 'points' in click_data: + selected_idx = click_data['points'][0].get('pointNumber', None) + if selected_idx is not None: + current_pull = current_figure.get('data', [{}])[0].get('pull', []) + already_selected = ( + current_pull and + len(current_pull) > selected_idx and + current_pull[selected_idx] > 0 + ) + + if not already_selected: + pull_values = [0.15 if i == selected_idx else 0 for i in range(len(sector_data))] + opacities = [1 if i == selected_idx else 0.4 for i in range(len(sector_data))] + + adjusted_colors = [] + for i, c in enumerate(colors): + if c.startswith('rgb('): + rgb_match = re.match(r'rgb\((\d+),\s*(\d+),\s*(\d+)\)', c) + if rgb_match: + r, g, b = rgb_match.groups() + adjusted_colors.append(f'rgba({r}, {g}, {b}, {opacities[i]})') + else: + adjusted_colors.append(c) + elif c.startswith('#'): + rgb = px.colors.hex_to_rgb(c) + adjusted_colors.append(f'rgba({rgb[0]}, {rgb[1]}, {rgb[2]}, {opacities[i]})') + else: + adjusted_colors.append(c) + + fig = go.Figure(go.Pie( + labels=sector_data['Sector'], + values=sector_data['Fund'], + hole=0.6, + marker={'colors': adjusted_colors, 'line': {'color': 'white', 'width': 2}}, + textinfo='percent', + textposition='outside', + pull=pull_values, + hovertemplate='%{label}
%{value:.1f}%' + )) + + fig.update_layout( + **CHART_LAYOUT, + title={'text': 'Sector Allocation (Click to highlight)', 'x': 0, 'font': {'size': 16, 'weight': 600}}, + showlegend=True, + legend={'orientation': 'v', 'x': 1.05, 'y': 0.5}, + annotations=[{ + 'text': 'Sectors', + 'x': 0.5, 'y': 0.5, + 'font': {'size': 14, 'weight': 600}, + 'showarrow': False + }] + ) + + return fig + + diff --git a/investments-dashboard/components/__init__.py b/investments-dashboard/components/__init__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/investments-dashboard/components/__init__.py @@ -0,0 +1 @@ + diff --git a/investments-dashboard/components/charts.py b/investments-dashboard/components/charts.py new file mode 100644 index 0000000..9377d30 --- /dev/null +++ b/investments-dashboard/components/charts.py @@ -0,0 +1,232 @@ +import dash_mantine_components as dmc +from dash import dcc +import plotly.graph_objects as go +import plotly.express as px + +CHART_COLORS = { + 'primary': '#228be6', + 'secondary': '#40c057', + 'tertiary': '#fab005', + 'danger': '#fa5252', + 'gray': '#868e96', +} + +CHART_LAYOUT = { + 'paper_bgcolor': 'rgba(0,0,0,0)', + 'plot_bgcolor': 'rgba(0,0,0,0)', + 'font': {'family': 'Inter, sans-serif'}, + 'margin': {'l': 40, 'r': 20, 't': 40, 'b': 40}, + 'hovermode': 'x unified', + 'hoverlabel': { + 'bgcolor': 'white', + 'bordercolor': '#dee2e6', + 'font': {'family': 'Inter, sans-serif', 'size': 13, 'color': '#333'}, + }, +} + +def create_performance_line_chart(df, title="Performance Over Time"): + """Create multi-series line chart for fund performance""" + + fig = go.Figure() + + fig.add_trace(go.Scatter( + x=df['Date'], + y=df['Calibre Index Fund'], + name='Calibre Index Fund', + line={'color': CHART_COLORS['primary'], 'width': 2}, + hovertemplate='%{y:.2f}' + )) + + fig.add_trace(go.Scatter( + x=df['Date'], + y=df['MSCI EAFE Index Fund (ETF)'], + name='MSCI EAFE Index', + line={'color': CHART_COLORS['secondary'], 'width': 2}, + hovertemplate='%{y:.2f}' + )) + + fig.update_layout( + **CHART_LAYOUT, + title={'text': title, 'x': 0, 'font': {'size': 16, 'weight': 600}}, + legend={'orientation': 'h', 'y': -0.15}, + xaxis={ + 'showgrid': True, + 'gridcolor': 'rgba(0,0,0,0.05)', + 'rangeselector': { + 'buttons': [ + {'count': 1, 'label': '1M', 'step': 'month'}, + {'count': 6, 'label': '6M', 'step': 'month'}, + {'count': 1, 'label': 'YTD', 'step': 'year', 'stepmode': 'todate'}, + {'count': 1, 'label': '1Y', 'step': 'year'}, + {'count': 3, 'label': '3Y', 'step': 'year'}, + {'count': 5, 'label': '5Y', 'step': 'year'}, + {'step': 'all', 'label': 'All'} + ], + 'bgcolor': 'rgba(0,0,0,0.02)', + 'activecolor': CHART_COLORS['primary'], + }, + 'rangeslider': {'visible': False}, + }, + yaxis={'showgrid': True, 'gridcolor': 'rgba(0,0,0,0.05)', 'tickprefix': '$'}, + ) + fig.update_layout(margin={'l': 40, 'r': 20, 't': 100, 'b': 40}) + + return fig + +def create_sparkline(prices, symbol=""): + """Minimal area sparkline for live price history""" + color = CHART_COLORS['secondary'] if len(prices) > 1 and prices[-1] >= prices[0] else CHART_COLORS['danger'] + hex_to_rgba = lambda c, a: f"rgba({int(c[1:3],16)},{int(c[3:5],16)},{int(c[5:7],16)},{a})" + + fig = go.Figure(go.Scatter( + y=prices, + mode='lines', + fill='tozeroy', + line={'color': color, 'width': 2.5}, + fillcolor=hex_to_rgba(color, 0.15), + hovertemplate='$%{y:.2f}', + )) + + if len(prices) > 1: + ymin, ymax = min(prices), max(prices) + padding = max((ymax - ymin) * 0.3, 0.10) + yrange = [ymin - padding, ymax + padding] + else: + yrange = None + + fig.update_layout( + paper_bgcolor='rgba(0,0,0,0)', + plot_bgcolor='rgba(0,0,0,0)', + font={'family': 'Inter, sans-serif'}, + margin={'l': 0, 'r': 0, 't': 20, 'b': 0}, + xaxis={'visible': False}, + yaxis={'visible': False, 'range': yrange}, + showlegend=False, + title={'text': symbol, 'x': 0, 'font': {'size': 13, 'weight': 600}}, + hovermode='x unified', + ) + return fig + +def create_sector_donut_chart(sector_data, title="Sector Allocation"): + """Create donut chart for sector allocation""" + + colors = px.colors.qualitative.Set3[:len(sector_data)] + + fig = go.Figure(go.Pie( + labels=sector_data['Sector'], + values=sector_data['Fund'], + hole=0.6, + marker={'colors': colors}, + textinfo='percent', + textposition='outside', + hovertemplate='%{label}
%{value:.1f}%' + )) + + fig.update_layout( + **CHART_LAYOUT, + title={'text': title, 'x': 0, 'font': {'size': 16, 'weight': 600}}, + showlegend=True, + legend={'orientation': 'v', 'x': 1.05, 'y': 0.5}, + annotations=[{ + 'text': 'Sectors', + 'x': 0.5, 'y': 0.5, + 'font': {'size': 14, 'weight': 600}, + 'showarrow': False + }] + ) + + return fig + +def create_hypothetical_growth_chart(initial=10000): + """Create hypothetical growth of $10k chart""" + + years = ['2008', '2010', '2012', '2014', '2016', '2018'] + fund_values = [10000, 11500, 14000, 18500, 22000, 27500] + benchmark_values = [10000, 10800, 13200, 17000, 20500, 25000] + + fig = go.Figure() + + fig.add_trace(go.Scatter( + x=years, + y=fund_values, + name='Calibre Index Fund', + fill='tozeroy', + line={'color': CHART_COLORS['primary'], 'width': 2}, + fillcolor='rgba(34, 139, 230, 0.1)', + hovertemplate='$%{y:,.2f}', + )) + + fig.add_trace(go.Scatter( + x=years, + y=benchmark_values, + name='S&P 500 Index', + line={'color': CHART_COLORS['gray'], 'width': 2, 'dash': 'dash'}, + hovertemplate='$%{y:,.2f}', + )) + + fig.update_layout( + **CHART_LAYOUT, + title={'text': f'Hypothetical Growth of ${initial:,}', 'x': 0, 'font': {'size': 16, 'weight': 600}}, + legend={'orientation': 'h', 'y': -0.15}, + yaxis={'showgrid': True, 'gridcolor': 'rgba(0,0,0,0.05)', 'tickprefix': '$', 'tickformat': ','}, + xaxis={'showgrid': False}, + ) + + return fig + +def create_fee_comparison_chart(fund_fee=329, avg_fee=2242): + """Create fee comparison bar chart""" + + savings = avg_fee - fund_fee + + fig = go.Figure() + + fig.add_trace(go.Bar( + x=['Category Average', 'This Fund'], + y=[avg_fee, fund_fee], + marker_color=[CHART_COLORS['gray'], CHART_COLORS['primary']], + text=[f'${avg_fee:,}', f'${fund_fee:,}'], + textposition='outside', + )) + + fig.add_annotation( + x=1, y=fund_fee + 300, + text=f'Save ${savings:,}', + showarrow=True, + arrowhead=2, + arrowcolor=CHART_COLORS['secondary'], + font={'color': CHART_COLORS['secondary'], 'weight': 600}, + ) + + fig.update_layout( + **CHART_LAYOUT, + title={'text': 'Fees on $10,000 Over 10 Years', 'x': 0, 'font': {'size': 16, 'weight': 600}}, + yaxis={'showgrid': True, 'gridcolor': 'rgba(0,0,0,0.05)', 'tickprefix': '$'}, + showlegend=False, + ) + + return fig + +def create_dividend_timeline(dividend_data): + """Create dividend history chart""" + + df = dividend_data.copy() + df['Amount'] = df['Amount'].str.replace('$', '').astype(float) + + fig = go.Figure() + + fig.add_trace(go.Bar( + x=df['Payable_Date'], + y=df['Amount'], + marker_color=CHART_COLORS['primary'], + name='Dividend', + )) + + fig.update_layout( + **CHART_LAYOUT, + title={'text': 'Dividend History', 'x': 0, 'font': {'size': 16, 'weight': 600}}, + yaxis={'showgrid': True, 'gridcolor': 'rgba(0,0,0,0.05)', 'tickprefix': '$'}, + xaxis={'title': 'Payment Date'}, + ) + + return fig diff --git a/investments-dashboard/components/kpi_cards.py b/investments-dashboard/components/kpi_cards.py new file mode 100644 index 0000000..036d311 --- /dev/null +++ b/investments-dashboard/components/kpi_cards.py @@ -0,0 +1,87 @@ +import dash_mantine_components as dmc +from dash import html +from dash_iconify import DashIconify + +def create_kpi_card(title, value, subtitle=None, trend=None, trend_positive=True, icon=None): + """Create a KPI card with optional trend indicator""" + + trend_color = "teal" if trend_positive else "red" + trend_icon = "tabler:trending-up" if trend_positive else "tabler:trending-down" + + content = [ + dmc.Group([ + dmc.Text(title, size="sm", c="dimmed", fw=500), + DashIconify(icon=icon, width=20, color="gray") if icon else None, + ], justify="space-between"), + dmc.Group([ + dmc.Text(value, size="xl", fw=700), + dmc.Group([ + DashIconify(icon=trend_icon, width=16, color=trend_color) if trend else None, + dmc.Text(trend, size="sm", c=trend_color, fw=500) if trend else None, + ], gap=4) if trend else None, + ], justify="space-between", mt="xs"), + ] + + if subtitle: + content.append(dmc.Text(subtitle, size="xs", c="dimmed", mt=4)) + + return dmc.Paper( + dmc.Stack(content, gap="xs"), + p="md", + radius="md", + withBorder=True, + style={"minWidth": "200px"} + ) + +def create_kpi_grid(metrics): + """Create a grid of KPI cards from metrics dict""" + + cards = [ + create_kpi_card( + title="Net Asset Value", + value=f"${metrics['nav']:.2f}", + trend=f"{metrics['ytd_return']:.1f}% YTD", + trend_positive=metrics['ytd_return'] > 0, + icon="tabler:currency-dollar" + ), + create_kpi_card( + title="1 Year Return", + value=f"{metrics['1y_return']:.2f}%", + subtitle="vs S&P 500", + trend_positive=True, + icon="tabler:chart-line" + ), + create_kpi_card( + title="Expense Ratio", + value=metrics['expense_ratio'], + subtitle="vs 0.99% category avg", + trend="85% lower", + trend_positive=True, + icon="tabler:percentage" + ), + create_kpi_card( + title="Category", + value=metrics['category'], + subtitle=metrics['asset_class'], + icon="tabler:category" + ), + ] + + return dmc.SimpleGrid( + cards, + cols={"base": 1, "sm": 2, "lg": 4}, + spacing="md" + ) + +def create_stat_card(label, value, description=None): + """Simple stat card for fund facts""" + return dmc.Paper( + dmc.Stack([ + dmc.Text(label, size="xs", c="dimmed", tt="uppercase", fw=600), + dmc.Text(value, size="lg", fw=600), + dmc.Text(description, size="xs", c="dimmed") if description else None, + ], gap=4), + p="sm", + radius="sm", + withBorder=True, + ) diff --git a/investments-dashboard/components/tables.py b/investments-dashboard/components/tables.py new file mode 100644 index 0000000..e14c6c8 --- /dev/null +++ b/investments-dashboard/components/tables.py @@ -0,0 +1,103 @@ +import dash_mantine_components as dmc +from dash import html +import pandas as pd + +def create_data_table(df, title=None, striped=True): + """Create a styled Mantine table from DataFrame""" + + columns = df.columns.tolist() + + header = dmc.TableThead( + dmc.TableTr([ + dmc.TableTh(col, style={'fontWeight': 600}) for col in columns + ]) + ) + + rows = [] + for _, row in df.iterrows(): + cells = [] + for i, val in enumerate(row): + style = {} + if isinstance(val, str): + if '%' in val: + try: + num = float(val.replace('%', '')) + style['color'] = '#40c057' if num > 0 else '#fa5252' if num < 0 else None + style['fontWeight'] = 500 + except: + pass + cells.append(dmc.TableTd(val, style=style)) + rows.append(dmc.TableTr(cells)) + + body = dmc.TableTbody(rows) + + table = dmc.Table( + [header, body], + striped=striped, + highlightOnHover=True, + withTableBorder=True, + withColumnBorders=True, + ) + + if title: + return dmc.Stack([ + dmc.Text(title, fw=600, size="lg"), + dmc.ScrollArea(table, type="auto"), + ], gap="sm") + + return dmc.ScrollArea(table, type="auto") + +def create_returns_table(df): + """Create formatted returns comparison table""" + return create_data_table(df, title="Average Annual Returns") + +def create_fund_facts_table(df): + """Create fund facts key-value table""" + + rows = [] + for _, row in df.iterrows(): + rows.append( + dmc.TableTr([ + dmc.TableTd(row['label'], style={'fontWeight': 500, 'color': 'dimmed'}), + dmc.TableTd(str(row['value']).replace('"', ''), style={'fontWeight': 600}), + ]) + ) + + return dmc.Table( + dmc.TableTbody(rows), + withTableBorder=True, + highlightOnHover=True, + ) + +def create_dividend_table(df): + """Create dividend history table""" + return create_data_table(df, title="Distribution History") + +def create_comparison_table(data, columns, title=None): + """Create a generic comparison table""" + + header = dmc.TableThead( + dmc.TableTr([dmc.TableTh(col, style={'fontWeight': 600}) for col in columns]) + ) + + rows = [] + for row_data in data: + cells = [dmc.TableTd(cell) for cell in row_data] + rows.append(dmc.TableTr(cells)) + + body = dmc.TableTbody(rows) + + table = dmc.Table( + [header, body], + striped=True, + highlightOnHover=True, + withTableBorder=True, + ) + + if title: + return dmc.Stack([ + dmc.Text(title, fw=600, size="lg"), + table + ], gap="sm") + + return table diff --git a/investments-dashboard/data/df_after_tax.csv b/investments-dashboard/data/df_after_tax.csv new file mode 100644 index 0000000..9ca9949 --- /dev/null +++ b/investments-dashboard/data/df_after_tax.csv @@ -0,0 +1,10 @@ +A,B,C,D,E,F +'-,1 Year,3 Year,5 Year,10 Year,Since Inception 08/31/1976 +500 Index Fund Inv,'-,'-,'-,'-,'- +Returns before taxes,21.67%,11.26%,15.62%,8.37%,11.11% +Returns after taxes on distributions,21.15%,10.75%,15.10%,7.95%,— +Returns after taxes on distributions and sale of fund shares,12.64%,8.71%,12.51%,6.75%,— +Average Large Blend Fund,'-,'-,'-,'-,'- +Returns before taxes,20.44%,9.70%,14.24%,7.61%,— +Returns after taxes on distributions,—,—,—,—,— +Returns after taxes on distributions and sale of fund shares,—,—,—,—,— diff --git a/investments-dashboard/data/df_avg_returns.csv b/investments-dashboard/data/df_avg_returns.csv new file mode 100644 index 0000000..b659957 --- /dev/null +++ b/investments-dashboard/data/df_avg_returns.csv @@ -0,0 +1,4 @@ +A,B,C,D,E,F +'-,1 Year,3 Year,5 Year,10 Year,Since Inception 08/31/1976 +500 Index Fund Inv,16.94%,11.00%,14.57%,9.60%,11.12% +S&P 500 Index*,17.10%,11.14%,14.73%,9.73%,'- diff --git a/investments-dashboard/data/df_current_prices.csv b/investments-dashboard/data/df_current_prices.csv new file mode 100644 index 0000000..b8c13ad --- /dev/null +++ b/investments-dashboard/data/df_current_prices.csv @@ -0,0 +1,7 @@ +label,price,percent +Price as of 02/27/2018,$254.07, +Change,'-$3.23,'-1.26% +SEC yield,,1.67% +52-week high 01/26/2018,$265.42, +52-week low 04/13/2017,$215.11, +Range,$50.31,23.39% diff --git a/investments-dashboard/data/df_dividend.csv b/investments-dashboard/data/df_dividend.csv new file mode 100644 index 0000000..9a2e8ef --- /dev/null +++ b/investments-dashboard/data/df_dividend.csv @@ -0,0 +1,8 @@ +A,B,C,D,E,F,G,H +Distribution Type,Most Recent Distribution,Record Date,Reinvest Date,Payable Date,Reinvest Price,Distribution Yield,SEC Yield +Dividend,$1.12620,12/21/2017,12/22/2017,12/26/2017,$247.63,—,1.77% B +Dividend,$1.12900,09/18/2017,09/19/2017,09/20/2017,$231.32,—,— +Dividend,$0.96000,06/21/2017,06/22/2017,06/23/2017,$224.71,—,— +Dividend,$0.96100,03/20/2017,03/21/2017,03/22/2017,$216.27,—,— +Dividend,$1.25400,12/20/2016,12/21/2016,12/22/2016,$208.90,—,— +Dividend,$0.85200,09/09/2016,09/12/2016,09/13/2016,$199.17,—,— diff --git a/investments-dashboard/data/df_equity_char.csv b/investments-dashboard/data/df_equity_char.csv new file mode 100644 index 0000000..766bdf9 --- /dev/null +++ b/investments-dashboard/data/df_equity_char.csv @@ -0,0 +1,13 @@ +A,B,C +'-,500 Index Fund Inv,S&P 500 Index +Number of stocks,507,505 +Median market cap,$105.4 billion,$105.4 billion +Price/earnings ratio,23.9x,24.3x +Price/book ratio,3.3x,3.3x +Return on equity,16.1%,16.1% +Earnings growth rate,9.9%,8.9% +Foreign holdings,0.1%,— +Turnover rate (as of fiscal year end December),4.1%,— +Short-term reserves,0.0%,— +Fund total net assets,$421.1 billion,— +Share class total net assets,$29.0 billion,— diff --git a/investments-dashboard/data/df_equity_diver.csv b/investments-dashboard/data/df_equity_diver.csv new file mode 100644 index 0000000..ef345d8 --- /dev/null +++ b/investments-dashboard/data/df_equity_diver.csv @@ -0,0 +1,14 @@ +A,B,C +'-,500 Index Fund Inv as of 01/31/2018,S&P 500 Index as of 01/31/2018 +Consumer Discretionary,12.60%,12.60% +Consumer Staples,7.90%,7.90% +Energy,6.00%,6.00% +Financials,14.90%,14.90% +Health Care,13.90%,13.90% +Industrials,10.30%,10.30% +Information Technology,24.20%,24.20% +Materials,2.90%,2.90% +Other,0.00%,— +Real Estate,2.70%,2.70% +Telecommunication Services,1.90%,1.90% +Utilities,2.70%,2.70% diff --git a/investments-dashboard/data/df_expenses.csv b/investments-dashboard/data/df_expenses.csv new file mode 100644 index 0000000..5fa99cf --- /dev/null +++ b/investments-dashboard/data/df_expenses.csv @@ -0,0 +1,4 @@ +A,B +'-,Expense Ratio +500 Index Fund Inv,0.14% +Average expense ratio of similar funds*,0.99% diff --git a/investments-dashboard/data/df_fund_facts.csv b/investments-dashboard/data/df_fund_facts.csv new file mode 100644 index 0000000..9136141 --- /dev/null +++ b/investments-dashboard/data/df_fund_facts.csv @@ -0,0 +1,7 @@ +label,value +Asset Class,Domestic Stock - General +Category,Large Blend +Expense ratio as of 04/27/2017,0.14% +Minimum investment,"""$3,000""" +Fund number,0040 +Fund advisor,Equity Index Group diff --git a/investments-dashboard/data/df_graph.csv b/investments-dashboard/data/df_graph.csv new file mode 100644 index 0000000..6ca62e7 --- /dev/null +++ b/investments-dashboard/data/df_graph.csv @@ -0,0 +1,2564 @@ +Date,Calibre Index Fund,"""Nasdaq Composite, x""","""Nasdaq Composite, y""","""MSCI EAFE Index Fund (ETF), x""",MSCI EAFE Index Fund (ETF),"""Dow Jones Industrial Average, y""","""S&P 500 Index, y""" +2007-12-31,135.149994,2018-02-07,7051.97998,2008-01-02,78.22,13264.820313,1468.359985 +2008-01-02,133.220001,2018-02-08,6777.160156,2008-01-03,78.35,13043.959961,1447.160034 +2008-01-03,133.220001,2018-02-09,6874.490234000001,2008-01-04,76.57,13056.719727,1447.160034 +2008-01-04,129.949997,2018-02-12,6981.959961,2008-01-07,76.65,12800.179688,1411.630005 +2008-01-07,130.369995,2018-02-13,7013.509765999999,2008-01-08,76.22,12827.490234,1416.180054 +2008-01-08,128.020004,2018-02-14,7143.620117,2008-01-09,76.77,12589.070313,1390.189941 +2008-01-09,129.770004,2018-02-15,7256.430176000001,2008-01-10,76.69,12735.30957,1409.130005 +2008-01-10,130.800003,2018-02-16,7239.470215,2008-01-11,75.16,12853.089844,1420.329956 +2008-01-11,129.03999299999998,2018-02-20,7234.310059,2008-01-14,76.36,12606.299805,1401.02002 +2008-01-14,130.440002,2018-02-21,7218.22998,2008-01-15,73.88,12778.150391,1416.25 +2008-01-15,127.190002,2018-02-22,7210.089844,2008-01-16,72.39,12501.110352,1380.949951 +2008-01-16,126.480003,2018-02-23,7337.390137,2008-01-17,71.3,12466.160156,1373.199951 +2008-01-17,122.809998,2018-02-26,7421.459961,2008-01-18,71.71,12159.209961,1333.25 +2008-01-18,122.07,2018-02-27,7330.350098000001,2008-01-22,69.71,12099.299805,1325.189941 +2008-01-22,120.709999,2018-02-28,7273.009765999999,2008-01-23,69.3,11971.19043,1310.5 +2008-01-23,123.300003,2018-03-01,7180.560059,2008-01-24,71.73,12270.169922,1338.599976 +2008-01-24,124.540001,2018-03-02,7257.870117,2008-01-25,70.69,12378.610352,1352.069946 +2008-01-25,122.57,2018-03-05,7330.709961,2008-01-28,71.48,12207.169922,1330.609985 +2008-01-28,124.720001,2018-03-06,7372.009765999999,2008-01-29,71.91,12383.889648,1353.959961 +2008-01-29,125.5,,,2008-01-30,71.58,12480.299805,1362.300049 +2008-01-30,124.910004,,,2008-01-31,72.34,12442.830078,1355.810059 +2008-01-31,127.019997,,,2008-02-01,73.55,12650.360352,1378.550049 +2008-02-01,128.580002,,,2008-02-04,72.8,12743.19043,1395.420044 +2008-02-04,127.230003,,,2008-02-05,69.46,12635.160156,1380.819946 +2008-02-05,123.16999799999999,,,2008-02-06,69.4,12265.129883,1336.640015 +2008-02-06,122.279999,,,2008-02-07,69.05,12200.099609,1326.449951 +2008-02-07,123.279999,,,2008-02-08,68.34,12247.0,1336.910034 +2008-02-08,122.760002,,,2008-02-11,68.7,12182.129883,1331.290039 +2008-02-11,123.489998,,,2008-02-12,70.18,12240.009766,1339.130005 +2008-02-12,124.389999,,,2008-02-13,70.66,12373.410156,1348.859985 +2008-02-13,126.129997,,,2008-02-14,70.34,12552.240234,1367.209961 +2008-02-14,124.440002,,,2008-02-15,70.6,12376.980469,1348.859985 +2008-02-15,124.550003,,,2008-02-19,71.29,12348.209961,1349.98999 +2008-02-19,124.449997,,,2008-02-20,70.92,12337.219727,1348.780029 +2008-02-20,125.489998,,,2008-02-21,70.79,12427.259766,1360.030029 +2008-02-21,123.91999799999999,,,2008-02-22,71.69,12284.299805,1342.530029 +2008-02-22,124.910004,,,2008-02-25,72.83,12381.019531,1353.109985 +2008-02-25,126.639999,,,2008-02-26,73.91,12570.219727,1371.800049 +2008-02-26,127.519997,,,2008-02-27,74.15,12684.919922,1381.290039 +2008-02-27,127.43,,,2008-02-28,73.44,12694.280273,1380.02002 +2008-02-28,126.300003,,,2008-02-29,71.6,12582.179688,1367.680054 +2008-02-29,122.889999,,,2008-03-03,71.81,12266.389648,1330.630005 +2008-03-03,122.949997,,,2008-03-04,70.72,12258.900391,1331.339966 +2008-03-04,122.529999,,,2008-03-05,71.57,12213.799805,1326.75 +2008-03-05,123.230003,,,2008-03-06,70.55,12254.990234,1333.699951 +2008-03-06,120.540001,,,2008-03-07,69.72,12040.389648,1304.339966 +2008-03-07,119.519997,,,2008-03-10,69.37,11893.69043,1293.369995 +2008-03-10,117.690002,,,2008-03-11,71.56,11740.150391,1273.369995 +2008-03-11,122.059998,,,2008-03-12,71.56,12156.80957,1320.650024 +2008-03-12,120.989998,,,2008-03-13,71.68,12110.240234,1308.77002 +2008-03-13,121.620003,,,2008-03-14,69.95,12145.740234,1315.47998 +2008-03-14,119.089996,,,2008-03-17,68.89,11951.089844,1288.140015 +2008-03-17,118.040001,,,2008-03-18,71.0,11972.25,1276.599976 +2008-03-18,123.050003,,,2008-03-19,68.43,12392.660156,1330.73999 +2008-03-19,120.059998,,,2008-03-20,69.46,12099.660156,1298.420044 +2008-03-20,122.940002,,,2008-03-24,70.73,12361.320313,1329.51001 +2008-03-24,124.82,,,2008-03-25,71.76,12548.639648,1349.880005 +2008-03-25,125.110001,,,2008-03-26,71.76,12532.599609,1352.98999 +2008-03-26,124.019997,,,2008-03-27,71.7,12422.860352,1341.130005 +2008-03-27,122.019997,,,2008-03-28,71.64,12302.459961,1325.76001 +2008-03-28,121.059998,,,2008-03-31,71.9,12216.400391,1315.219971 +2008-03-31,121.75,,,2008-04-01,74.17,12262.889648,1322.699951 +2008-04-01,126.120003,,,2008-04-02,74.33,12654.360352,1370.180054 +2008-04-02,125.900002,,,2008-04-03,74.55,12608.919922,1367.530029 +2008-04-03,126.059998,,,2008-04-04,74.8,12626.030273,1369.310059 +2008-04-04,126.160004,,,2008-04-07,75.26,12609.419922,1370.400024 +2008-04-07,126.360001,,,2008-04-08,74.47,12612.429688,1372.540039 +2008-04-08,125.760002,,,2008-04-09,73.86,12576.44043,1365.540039 +2008-04-09,124.75,,,2008-04-10,73.63,12527.259766,1354.48999 +2008-04-10,125.309998,,,2008-04-11,72.64,12581.980469,1360.550049 +2008-04-11,122.769997,,,2008-04-14,72.8,12325.419922,1332.829956 +2008-04-14,122.349998,,,2008-04-15,73.31,12302.05957,1328.319946 +2008-04-15,122.91999799999999,,,2008-04-16,75.62,12362.469727,1334.430054 +2008-04-16,125.720001,,,2008-04-17,74.78,12619.269531,1364.709961 +2008-04-17,125.809998,,,2008-04-18,75.31,12620.490234,1365.560059 +2008-04-18,128.080002,,,2008-04-21,75.9,12849.360352,1390.329956 +2008-04-21,127.889999,,,2008-04-22,75.11,12825.019531,1388.170044 +2008-04-22,126.760002,,,2008-04-23,75.5,12720.230469,1375.939941 +2008-04-23,127.129997,,,2008-04-24,75.01,12763.219727,1379.930054 +2008-04-24,127.949997,,,2008-04-25,75.63,12848.950195,1388.819946 +2008-04-25,128.779999,,,2008-04-28,76.07,12891.860352,1397.839966 +2008-04-28,128.649994,,,2008-04-29,75.4,12871.75,1396.369995 +2008-04-29,128.149994,,,2008-04-30,75.81,12831.94043,1390.939941 +2008-04-30,127.66999799999999,,,2008-05-01,76.27,12820.129883,1385.589966 +2008-05-01,129.880005,,,2008-05-02,76.48,13010.0,1409.339966 +2008-05-02,130.300003,,,2008-05-05,76.61,13058.200195,1413.900024 +2008-05-05,129.720001,,,2008-05-06,77.18,12969.540039,1407.48999 +2008-05-06,130.71000700000002,,,2008-05-07,75.83,13020.830078,1418.26001 +2008-05-07,128.399994,,,2008-05-08,76.49,12814.349609,1392.569946 +2008-05-08,128.869995,,,2008-05-09,75.88,12866.780273,1397.680054 +2008-05-09,128.029999,,,2008-05-12,76.64,12745.879883,1388.280029 +2008-05-12,129.449997,,,2008-05-13,76.38,12876.30957,1403.579956 +2008-05-13,129.429993,,,2008-05-14,76.38,12832.179688,1403.040039 +2008-05-14,129.970001,,,2008-05-15,77.68,12898.379883,1408.660034 +2008-05-15,131.369995,,,2008-05-16,78.52,12992.660156,1423.569946 +2008-05-16,131.53999299999998,,,2008-05-19,78.2,12986.799805,1425.349976 +2008-05-19,131.669998,,,2008-05-20,77.48,13028.160156,1426.630005 +2008-05-20,130.449997,,,2008-05-21,76.6,12828.679688,1413.400024 +2008-05-21,128.360001,,,2008-05-22,77.49,12601.19043,1390.709961 +2008-05-22,128.720001,,,2008-05-23,76.61,12625.620117,1394.349976 +2008-05-23,127.019997,,,2008-05-27,76.46,12479.629883,1375.930054 +2008-05-27,127.889999,,,2008-05-28,76.45,12548.349609,1385.349976 +2008-05-28,128.419998,,,2008-05-29,76.28,12594.030273,1390.839966 +2008-05-29,129.119995,,,2008-05-30,76.71,12646.219727,1398.26001 +2008-05-30,129.309998,,,2008-06-02,75.91,12638.320313,1400.380005 +2008-06-02,127.959999,,,2008-06-03,75.75,12503.820313,1385.670044 +2008-06-03,127.220001,,,2008-06-04,75.31,12402.849609,1377.650024 +2008-06-04,127.239998,,,2008-06-05,76.56,12390.480469,1377.199951 +2008-06-05,129.729996,,,2008-06-06,74.36,12604.450195,1404.050049 +2008-06-06,125.739998,,,2008-06-09,74.26,12209.80957,1360.680054 +2008-06-09,125.839996,,,2008-06-10,73.0,12280.320313,1361.76001 +2008-06-10,125.540001,,,2008-06-11,72.07,12289.759766,1358.439941 +2008-06-11,123.440002,,,2008-06-12,71.82,12083.769531,1335.48999 +2008-06-12,123.860001,,,2008-06-13,72.48,12141.580078,1339.869995 +2008-06-13,125.720001,,,2008-06-16,72.85,12307.349609,1360.030029 +2008-06-16,125.730003,,,2008-06-17,73.07,12269.080078,1360.140015 +2008-06-17,124.879997,,,2008-06-18,72.47,12160.299805,1350.930054 +2008-06-18,123.66999799999999,,,2008-06-19,72.33,12029.05957,1337.810059 +2008-06-19,124.16999799999999,,,2008-06-20,70.75,12063.089844,1342.829956 +2008-06-20,121.870003,,,2008-06-23,70.74,11842.69043,1317.930054 +2008-06-23,121.870003,,,2008-06-24,70.42,11842.360352,1318.0 +2008-06-24,121.529999,,,2008-06-25,69.85,11807.429688,1314.290039 +2008-06-25,122.25,,,2008-06-26,68.08,11811.830078,1321.969971 +2008-06-26,118.120003,,,2008-06-27,68.26,11453.419922,1283.150024 +2008-06-27,117.68,,,2008-06-30,68.67,11346.509766,1278.380005 +2008-06-30,117.83000200000001,,,2008-07-01,67.93,11350.009766,1280.0 +2008-07-01,118.309998,,,2008-07-02,66.85,11382.259766,1284.910034 +2008-07-02,116.160004,,,2008-07-03,67.28,11215.509766,1261.52002 +2008-07-03,116.290001,,,2008-07-07,66.7,11288.540039,1262.900024 +2008-07-07,115.32,,,2008-07-08,67.05,11231.959961,1252.310059 +2008-07-08,117.33000200000001,,,2008-07-09,66.18,11384.209961,1273.699951 +2008-07-09,114.66999799999999,,,2008-07-10,66.75,11147.44043,1244.689941 +2008-07-10,115.470001,,,2008-07-11,65.7,11229.019531,1253.390015 +2008-07-11,114.199997,,,2008-07-14,65.56,11100.540039,1239.48999 +2008-07-14,113.16999799999999,,,2008-07-15,64.51,11055.19043,1228.300049 +2008-07-15,111.940002,,,2008-07-16,65.7,10962.540039,1214.910034 +2008-07-16,114.760002,,,2008-07-17,66.7,11239.280273,1245.359985 +2008-07-17,116.139999,,,2008-07-18,67.13,11446.660156,1260.319946 +2008-07-18,116.18,,,2008-07-21,67.52,11496.570313,1260.680054 +2008-07-21,116.120003,,,2008-07-22,67.75,11467.339844,1260.0 +2008-07-22,117.690002,,,2008-07-23,68.0,11602.5,1277.0 +2008-07-23,118.160004,,,2008-07-24,66.76,11632.379883,1282.189941 +2008-07-24,115.43,,,2008-07-25,66.9,11349.280273,1252.540039 +2008-07-25,115.91999799999999,,,2008-07-28,65.78,11370.69043,1257.76001 +2008-07-28,113.760002,,,2008-07-29,66.43,11131.080078,1234.369995 +2008-07-29,116.43,,,2008-07-30,67.05,11397.55957,1263.199951 +2008-07-30,118.379997,,,2008-07-31,66.39,11583.69043,1284.26001 +2008-07-31,116.849998,,,2008-08-01,65.4,11378.019531,1267.380005 +2008-08-01,116.199997,,,2008-08-04,64.78,11326.320313,1260.310059 +2008-08-04,115.160004,,,2008-08-05,66.42,11284.150391,1249.01001 +2008-08-05,118.470001,,,2008-08-06,66.44,11615.769531,1284.880005 +2008-08-06,118.93,,,2008-08-07,65.11,11656.070313,1289.189941 +2008-08-07,116.809998,,,2008-08-08,65.38,11431.429688,1266.069946 +2008-08-08,119.599998,,,2008-08-11,65.32,11734.320313,1296.319946 +2008-08-11,120.459999,,,2008-08-12,64.85,11782.349609,1305.319946 +2008-08-12,119.010002,,,2008-08-13,63.83,11642.469727,1289.589966 +2008-08-13,118.709999,,,2008-08-14,63.58,11532.959961,1285.829956 +2008-08-14,119.370003,,,2008-08-15,63.16,11615.929688,1292.930054 +2008-08-15,119.870003,,,2008-08-18,62.84,11659.900391,1298.199951 +2008-08-18,118.07,,,2008-08-19,62.13,11479.389648,1278.599976 +2008-08-19,116.980003,,,2008-08-20,62.5,11348.549805,1266.689941 +2008-08-20,117.709999,,,2008-08-21,62.75,11417.429688,1274.540039 +2008-08-21,118.010002,,,2008-08-22,63.04,11430.209961,1277.719971 +2008-08-22,119.360001,,,2008-08-25,62.05,11628.05957,1292.199951 +2008-08-25,117.019997,,,2008-08-26,62.36,11386.25,1266.839966 +2008-08-26,117.449997,,,2008-08-27,62.95,11412.870117,1271.51001 +2008-08-27,118.410004,,,2008-08-28,63.76,11502.509766,1281.660034 +2008-08-28,120.18,,,2008-08-29,63.57,11715.179688,1300.680054 +2008-08-29,118.540001,,,2008-09-02,62.59,11543.959961,1282.829956 +2008-09-02,118.050003,,,2008-09-03,62.33,11516.919922,1277.579956 +2008-09-03,117.870003,,,2008-09-04,59.66,11532.879883,1274.97998 +2008-09-04,114.349998,,,2008-09-05,59.44,11188.230469,1236.829956 +2008-09-05,114.860001,,,2008-09-08,60.77,11220.959961,1242.310059 +2008-09-08,117.230003,,,2008-09-09,58.8,11510.740234,1267.790039 +2008-09-09,113.230003,,,2008-09-10,59.37,11230.730469,1224.51001 +2008-09-10,113.93,,,2008-09-11,59.24,11268.919922,1232.040039 +2008-09-11,115.540001,,,2008-09-12,60.4,11433.709961,1249.050049 +2008-09-12,115.790001,,,2008-09-15,57.83,11421.990234,1251.699951 +2008-09-15,110.360001,,,2008-09-16,57.4,10917.509766,1192.699951 +2008-09-16,112.269997,,,2008-09-17,55.21,11059.019531,1213.599976 +2008-09-17,106.980003,,,2008-09-18,57.72,10609.660156,1156.390015 +2008-09-18,111.639999,,,2008-09-19,61.81,11019.69043,1206.51001 +2008-09-19,116.139999,,,2008-09-22,59.7,11388.44043,1255.079956 +2008-09-22,111.709999,,,2008-09-23,58.86,11015.69043,1207.089966 +2008-09-23,109.959999,,,2008-09-24,59.03,10854.169922,1188.219971 +2008-09-24,109.75,,,2008-09-25,60.39,10825.169922,1185.869995 +2008-09-25,111.269997,,,2008-09-26,59.75,11022.05957,1209.180054 +2008-09-26,111.650002,,,2008-09-29,53.08,11143.129883,1213.27002 +2008-09-29,101.849998,,,2008-09-30,56.3,10365.450195,1106.420044 +2008-09-30,107.370003,,,2008-10-01,55.88,10850.660156,1166.359985 +2008-10-01,106.900002,,,2008-10-02,53.44,10831.070313,1161.060059 +2008-10-02,102.610001,,,2008-10-03,53.23,10482.849609,1114.280029 +2008-10-03,101.230003,,,2008-10-06,50.22,10325.379883,1099.22998 +2008-10-06,97.33000200000001,,,2008-10-07,47.87,9955.5,1056.890015 +2008-10-07,91.739998,,,2008-10-08,46.8,9447.110352,996.2299800000001 +2008-10-08,90.75,,,2008-10-09,44.0,9258.099609,984.9400019999999 +2008-10-09,83.839996,,,2008-10-10,42.36,8579.19043,909.919983 +2008-10-10,82.870003,,,2008-10-13,49.09,8451.19043,899.2199710000001 +2008-10-13,92.459999,,,2008-10-14,48.08,9387.610352,1003.349976 +2008-10-14,91.970001,,,2008-10-15,42.95,9310.990234,998.01001 +2008-10-15,83.66999799999999,,,2008-10-16,45.48,8577.910156,907.840027 +2008-10-16,87.230003,,,2008-10-17,44.51,8979.259766,946.429993 +2008-10-17,86.690002,,,2008-10-20,47.35,8852.219727,940.5499880000001 +2008-10-20,90.82,,,2008-10-21,44.68,9265.429688,985.400024 +2008-10-21,88.029999,,,2008-10-22,41.18,9033.660156,955.0499880000001 +2008-10-22,82.66999799999999,,,2008-10-23,42.33,8519.209961,896.7800289999999 +2008-10-23,83.720001,,,2008-10-24,39.59,8691.25,908.1099849999999 +2008-10-24,80.82,,,2008-10-27,37.51,8378.950195,876.7700199999999 +2008-10-27,78.25,,,2008-10-28,42.68,8175.77002,848.919983 +2008-10-28,86.699997,,,2008-10-29,42.78,9065.120117,940.51001 +2008-10-29,85.75,,,2008-10-30,44.28,8990.959961,930.090027 +2008-10-30,87.989998,,,2008-10-31,44.57,9180.69043,954.090027 +2008-10-31,89.339996,,,2008-11-03,44.75,9325.009766,968.75 +2008-11-03,89.120003,,,2008-11-04,47.82,9319.830078,966.2999880000001 +2008-11-04,92.75,,,2008-11-05,45.22,9625.280273,1005.75 +2008-11-05,87.91999799999999,,,2008-11-06,42.3,9139.269531,952.7700199999999 +2008-11-06,83.519997,,,2008-11-07,44.69,8695.790039,904.8800050000001 +2008-11-07,85.959999,,,2008-11-10,44.02,8943.80957,930.98999 +2008-11-10,84.889999,,,2008-11-11,42.57,8870.540039,919.2100220000001 +2008-11-11,83.010002,,,2008-11-12,40.28,8693.959961,898.9500119999999 +2008-11-12,78.75,,,2008-11-13,43.71,8282.660156,852.2999880000001 +2008-11-13,84.199997,,,2008-11-14,41.2,8835.25,911.2899779999999 +2008-11-14,80.699997,,,2008-11-17,40.45,8497.30957,873.2899779999999 +2008-11-17,78.629997,,,2008-11-18,40.52,8273.580078,850.75 +2008-11-18,79.43,,,2008-11-19,37.81,8424.75,859.1199949999999 +2008-11-19,74.58000200000001,,,2008-11-20,35.73,7997.279785,806.580017 +2008-11-20,69.57,,,2008-11-21,38.27,7552.290039,752.4400019999999 +2008-11-21,73.989998,,,2008-11-24,40.56,8046.419922,800.030029 +2008-11-24,78.779999,,,2008-11-25,41.3,8443.389648,851.8099980000001 +2008-11-25,79.300003,,,2008-11-26,41.75,8479.469727,857.3900150000001 +2008-11-26,82.139999,,,2008-11-28,41.73,8726.610352,887.679993 +2008-11-28,82.93,,,2008-12-01,38.32,8829.040039,896.23999 +2008-12-01,75.540001,,,2008-12-02,40.4,8149.089844,816.210022 +2008-12-02,78.559998,,,2008-12-03,40.94,8419.089844,848.8099980000001 +2008-12-03,80.629997,,,2008-12-04,39.68,8591.69043,870.73999 +2008-12-04,78.269997,,,2008-12-05,40.18,8376.240234,845.2199710000001 +2008-12-05,81.120003,,,2008-12-08,42.09,8635.419922,876.070007 +2008-12-08,84.25,,,2008-12-09,41.7,8934.179688,909.7000119999999 +2008-12-09,82.309998,,,2008-12-10,42.8,8691.330078,888.669983 +2008-12-10,83.290001,,,2008-12-11,42.61,8761.419922,899.23999 +2008-12-11,80.940002,,,2008-12-12,43.03,8565.089844,873.590027 +2008-12-12,81.510002,,,2008-12-15,43.14,8629.679688,879.7299800000001 +2008-12-15,80.489998,,,2008-12-16,45.62,8564.530273,868.570007 +2008-12-16,84.620003,,,2008-12-17,45.49,8924.139648,913.179993 +2008-12-17,83.809998,,,2008-12-18,44.0,8824.339844,904.419983 +2008-12-18,82.050003,,,2008-12-19,43.36,8604.990234,885.2800289999999 +2008-12-19,82.269997,,,2008-12-22,43.06,8579.110352,887.8800050000001 +2008-12-22,80.779999,,,2008-12-23,42.2,8519.69043,871.6300050000001 +2008-12-23,80.0,,,2008-12-24,42.76,8419.490234,863.159973 +2008-12-24,80.5,,,2008-12-26,42.96,8468.480469,868.150024 +2008-12-26,80.230003,,,2008-12-29,42.97,8515.549805,872.7999880000001 +2008-12-29,79.970001,,,2008-12-30,44.26,8483.929688,869.419983 +2008-12-30,81.93,,,2008-12-31,44.86,8668.389648,890.6400150000001 +2008-12-31,83.089996,,,2009-01-02,45.44,8776.389648,903.25 +2009-01-02,85.75,,,2009-01-05,44.71,9034.69043,931.7999880000001 +2009-01-05,85.349998,,,2009-01-06,45.19,8952.889648,927.4500119999999 +2009-01-06,86.019997,,,2009-01-07,44.41,9015.099609,934.7000119999999 +2009-01-07,83.480003,,,2009-01-08,45.07,8769.700195,906.650024 +2009-01-08,83.769997,,,2009-01-09,43.51,8742.459961,909.7299800000001 +2009-01-09,81.980003,,,2009-01-12,42.46,8599.179688,890.349976 +2009-01-12,80.139999,,,2009-01-13,41.68,8473.969727,870.26001 +2009-01-13,80.279999,,,2009-01-14,39.97,8448.55957,871.7899779999999 +2009-01-14,77.599998,,,2009-01-15,40.33,8200.139648,842.6199949999999 +2009-01-15,77.709999,,,2009-01-16,40.57,8212.490234,843.73999 +2009-01-16,78.300003,,,2009-01-20,37.6,8281.219727,850.1199949999999 +2009-01-20,74.16999799999999,,,2009-01-21,39.44,7949.089844,805.219971 +2009-01-21,77.400002,,,2009-01-22,38.52,8228.099609,840.23999 +2009-01-22,76.230003,,,2009-01-23,38.25,8122.799805,827.5 +2009-01-23,76.639999,,,2009-01-26,39.0,8077.560059,831.950012 +2009-01-26,77.059998,,,2009-01-27,39.76,8116.029785,836.570007 +2009-01-27,77.910004,,,2009-01-28,40.93,8174.72998,845.7100220000001 +2009-01-28,80.529999,,,2009-01-29,39.07,8375.450195,874.090027 +2009-01-29,77.870003,,,2009-01-30,38.7,8149.009765999999,845.1400150000001 +2009-01-30,76.099998,,,2009-02-02,38.32,8000.859863,825.880005 +2009-02-02,76.050003,,,2009-02-03,39.42,7936.75,825.4400019999999 +2009-02-03,77.260002,,,2009-02-04,39.22,8078.359863,838.51001 +2009-02-04,76.739998,,,2009-02-05,39.78,7956.660156,832.22998 +2009-02-05,78.0,,,2009-02-06,40.7,8063.069823999999,845.849976 +2009-02-06,80.129997,,,2009-02-09,40.69,8280.589844,868.599976 +2009-02-09,80.25,,,2009-02-10,38.67,8270.870117,869.8900150000001 +2009-02-10,76.309998,,,2009-02-11,39.09,7888.879883,827.159973 +2009-02-11,76.949997,,,2009-02-12,38.97,7939.529785,833.73999 +2009-02-12,77.099998,,,2009-02-13,38.55,7932.759765999999,835.1900019999999 +2009-02-13,76.33000200000001,,,2009-02-17,36.5,7850.410156,826.840027 +2009-02-17,72.870003,,,2009-02-18,36.47,7552.600098000001,789.169983 +2009-02-18,72.809998,,,2009-02-19,36.42,7555.629883,788.419983 +2009-02-19,71.989998,,,2009-02-20,35.89,7465.950195,778.9400019999999 +2009-02-20,71.190002,,,2009-02-23,34.52,7365.669922,770.049988 +2009-02-23,68.720001,,,2009-02-24,35.96,7114.779785,743.330017 +2009-02-24,71.470001,,,2009-02-25,34.97,7350.939941,773.1400150000001 +2009-02-25,70.730003,,,2009-02-26,34.68,7270.890137,764.900024 +2009-02-26,69.629997,,,2009-02-27,34.68,7182.080078,752.830017 +2009-02-27,67.989998,,,2009-03-02,32.69,7062.930176000001,735.090027 +2009-03-02,64.83000200000001,,,2009-03-03,32.56,6763.290039,700.820007 +2009-03-03,64.400002,,,2009-03-04,34.01,6726.02002,696.330017 +2009-03-04,65.959999,,,2009-03-05,32.64,6875.839844,712.869995 +2009-03-05,63.16,,,2009-03-06,32.58,6594.439941,682.549988 +2009-03-06,63.259997999999996,,,2009-03-09,31.7,6626.939941,683.380005 +2009-03-09,62.650002,,,2009-03-10,33.83,6547.049805,676.530029 +2009-03-10,66.629997,,,2009-03-11,34.02,6926.490234000001,719.599976 +2009-03-11,66.82,,,2009-03-12,34.79,6930.399901999999,721.3599849999999 +2009-03-12,69.550003,,,2009-03-13,35.02,7170.060059,750.73999 +2009-03-13,70.089996,,,2009-03-16,35.4,7223.97998,756.549988 +2009-03-16,69.839996,,,2009-03-17,36.33,7216.970215,753.8900150000001 +2009-03-17,72.08000200000001,,,2009-03-18,37.37,7395.700195,778.119995 +2009-03-18,73.57,,,2009-03-19,37.35,7486.580078,794.349976 +2009-03-19,72.629997,,,2009-03-20,36.83,7400.799805,784.039978 +2009-03-20,71.199997,,,2009-03-23,39.48,7278.379883,768.539978 +2009-03-23,76.239998,,,2009-03-24,38.24,7775.859863,822.919983 +2009-03-24,74.690002,,,2009-03-25,38.83,7659.970215,806.119995 +2009-03-25,75.410004,,,2009-03-26,39.35,7749.810059,813.880005 +2009-03-26,76.639999,,,2009-03-27,38.09,7924.560059,832.8599849999999 +2009-03-27,75.110001,,,2009-03-30,36.64,7776.180176000001,815.9400019999999 +2009-03-30,72.489998,,,2009-03-31,37.59,7522.02002,787.530029 +2009-03-31,73.440002,,,2009-04-01,38.57,7608.919922,797.869995 +2009-04-01,74.66999799999999,,,2009-04-02,40.31,7761.600098000001,811.080017 +2009-04-02,76.82,,,2009-04-03,40.54,7978.080078,834.380005 +2009-04-03,77.57,,,2009-04-06,39.7,8017.589844,842.5 +2009-04-06,76.91999799999999,,,2009-04-07,38.87,7975.850098000001,835.47998 +2009-04-07,75.139999,,,2009-04-08,39.26,7789.560059,815.549988 +2009-04-08,76.029999,,,2009-04-09,40.31,7837.109863,825.159973 +2009-04-09,78.91999799999999,,,2009-04-13,40.71,8083.379883,856.5599980000001 +2009-04-13,79.110001,,,2009-04-14,40.32,8057.810059,858.7299800000001 +2009-04-14,77.519997,,,2009-04-15,40.85,7920.180176000001,841.5 +2009-04-15,78.5,,,2009-04-16,41.11,8029.620117,852.0599980000001 +2009-04-16,79.720001,,,2009-04-17,40.97,8125.430176000001,865.2999880000001 +2009-04-17,80.120003,,,2009-04-20,39.29,8131.330078,869.599976 +2009-04-20,76.709999,,,2009-04-21,40.19,7841.72998,832.3900150000001 +2009-04-21,78.33000200000001,,,2009-04-22,39.87,7969.560059,850.080017 +2009-04-22,77.739998,,,2009-04-23,40.87,7886.569823999999,843.5499880000001 +2009-04-23,78.519997,,,2009-04-24,41.5,7957.060059,851.919983 +2009-04-24,79.839996,,,2009-04-27,41.01,8076.290039,866.2299800000001 +2009-04-27,79.040001,,,2009-04-28,40.62,8025.0,857.51001 +2009-04-28,78.82,,,2009-04-29,41.66,8016.950195,855.159973 +2009-04-29,80.529999,,,2009-04-30,41.92,8185.72998,873.6400150000001 +2009-04-30,80.459999,,,2009-05-01,42.41,8168.120117,872.8099980000001 +2009-05-01,80.900002,,,2009-05-04,44.17,8212.410156,877.5200199999999 +2009-05-04,83.639999,,,2009-05-05,43.73,8426.740234,907.23999 +2009-05-05,83.339996,,,2009-05-06,44.79,8410.650391,903.7999880000001 +2009-05-06,84.800003,,,2009-05-07,44.04,8512.280273,919.5300289999999 +2009-05-07,83.699997,,,2009-05-08,45.95,8409.849609,907.3900150000001 +2009-05-08,85.699997,,,2009-05-11,44.78,8574.650391,929.2299800000001 +2009-05-11,83.910004,,,2009-05-12,45.26,8418.769531,909.23999 +2009-05-12,83.83000200000001,,,2009-05-13,43.72,8469.110352,908.349976 +2009-05-13,81.610001,,,2009-05-14,44.15,8284.889648,883.919983 +2009-05-14,82.459999,,,2009-05-15,43.75,8331.320313,893.070007 +2009-05-15,81.550003,,,2009-05-18,45.42,8268.639648,882.8800050000001 +2009-05-18,84.029999,,,2009-05-19,45.83,8504.080078,909.7100220000001 +2009-05-19,83.900002,,,2009-05-20,46.13,8474.849609,908.1300050000001 +2009-05-20,83.470001,,,2009-05-21,45.78,8422.040039,903.4699710000001 +2009-05-21,82.099998,,,2009-05-22,46.04,8292.129883,888.330017 +2009-05-22,81.980003,,,2009-05-26,46.96,8277.320313,887.0 +2009-05-26,84.139999,,,2009-05-27,46.05,8473.490234,910.330017 +2009-05-27,82.559998,,,2009-05-28,46.52,8300.019531,893.0599980000001 +2009-05-28,83.839996,,,2009-05-29,47.45,8403.799805,906.830017 +2009-05-29,84.980003,,,2009-06-01,48.62,8500.330078,919.1400150000001 +2009-06-01,87.16999799999999,,,2009-06-02,49.04,8721.44043,942.8699949999999 +2009-06-02,87.349998,,,2009-06-03,47.58,8740.870117,944.73999 +2009-06-03,86.16999799999999,,,2009-06-04,47.88,8675.240234,931.76001 +2009-06-04,87.18,,,2009-06-05,47.29,8750.240234,942.4600220000001 +2009-06-05,86.959999,,,2009-06-08,47.19,8763.129883,940.090027 +2009-06-08,86.900002,,,2009-06-09,47.77,8764.490234,939.1400150000001 +2009-06-09,87.209999,,,2009-06-10,47.86,8763.05957,942.429993 +2009-06-10,86.910004,,,2009-06-11,48.68,8739.019531,939.150024 +2009-06-11,87.459999,,,2009-06-12,48.43,8770.919922,944.8900150000001 +2009-06-12,87.58000200000001,,,2009-06-15,46.69,8799.259766,946.2100220000001 +2009-06-15,85.510002,,,2009-06-16,46.15,8612.129883,923.7199710000001 +2009-06-16,84.43,,,2009-06-17,46.28,8504.669922,911.9699710000001 +2009-06-17,84.32,,,2009-06-18,46.2,8497.179688,910.7100220000001 +2009-06-18,85.040001,,,2009-06-19,46.93,8555.599609,918.3699949999999 +2009-06-19,85.300003,,,2009-06-22,45.42,8539.730469,921.2299800000001 +2009-06-22,82.709999,,,2009-06-23,45.06,8339.009766,893.0399779999999 +2009-06-23,82.459999,,,2009-06-24,45.1,8322.910156,895.099976 +2009-06-24,83.010002,,,2009-06-25,46.05,8299.860352,900.9400019999999 +2009-06-25,84.790001,,,2009-06-26,45.96,8472.400391,920.26001 +2009-06-26,84.68,,,2009-06-29,46.35,8438.389648,918.900024 +2009-06-29,85.440002,,,2009-06-30,45.81,8529.379883,927.2299800000001 +2009-06-30,84.720001,,,2009-07-01,46.57,8447.0,919.320007 +2009-07-01,85.099998,,,2009-07-02,45.23,8504.05957,923.330017 +2009-07-02,82.629997,,,2009-07-06,45.29,8280.740234,896.419983 +2009-07-06,82.839996,,,2009-07-07,44.19,8324.870117,898.7199710000001 +2009-07-07,81.209999,,,2009-07-08,44.01,8163.600098000001,881.0300289999999 +2009-07-08,81.120003,,,2009-07-09,44.55,8178.410156,879.5599980000001 +2009-07-09,81.410004,,,2009-07-10,44.03,8183.169922,882.679993 +2009-07-10,81.08000200000001,,,2009-07-13,44.8,8146.52002,879.1300050000001 +2009-07-13,83.099998,,,2009-07-14,45.04,8331.679688,901.0499880000001 +2009-07-14,83.540001,,,2009-07-15,46.58,8359.490234,905.840027 +2009-07-15,86.029999,,,2009-07-16,46.99,8616.209961,932.679993 +2009-07-16,86.779999,,,2009-07-17,46.82,8711.820313,940.73999 +2009-07-17,86.75,,,2009-07-20,47.73,8743.94043,940.3800050000001 +2009-07-20,87.739998,,,2009-07-21,48.03,8848.150391,951.1300050000001 +2009-07-21,88.07,,,2009-07-22,48.15,8915.94043,954.580017 +2009-07-22,88.019997,,,2009-07-23,48.96,8881.259766,954.070007 +2009-07-23,90.08000200000001,,,2009-07-24,49.26,9069.290039,976.2899779999999 +2009-07-24,90.360001,,,2009-07-27,49.31,9093.240234,979.26001 +2009-07-27,90.629997,,,2009-07-28,49.1,9108.509766,982.179993 +2009-07-28,90.389999,,,2009-07-29,48.7,9096.719727,979.6199949999999 +2009-07-29,89.989998,,,2009-07-30,49.65,9070.719727,975.150024 +2009-07-30,91.07,,,2009-07-31,50.41,9154.459961,986.75 +2009-07-31,91.139999,,,2009-08-03,51.58,9171.610352,987.4799800000001 +2009-08-03,92.540001,,,2009-08-04,51.5,9286.55957,1002.6300050000001 +2009-08-04,92.82,,,2009-08-05,51.29,9320.19043,1005.650024 +2009-08-05,92.58000200000001,,,2009-08-06,50.97,9280.969727,1002.7199710000001 +2009-08-06,92.07,,,2009-08-07,50.92,9256.259766,997.080017 +2009-08-07,93.300003,,,2009-08-10,50.61,9370.070313,1010.4799800000001 +2009-08-10,92.989998,,,2009-08-12,50.89,9337.950195,1007.099976 +2009-08-11,91.839996,,,2009-08-13,51.67,9241.450195,994.349976 +2009-08-12,92.93,,,2009-08-14,51.23,9361.610352,1005.8099980000001 +2009-08-13,93.58000200000001,,,2009-08-17,49.58,9398.19043,1012.7299800000001 +2009-08-14,92.779999,,,2009-08-18,50.44,9321.400391,1004.090027 +2009-08-17,90.550003,,,2009-08-19,50.87,9135.339844,979.7299800000001 +2009-08-18,91.489998,,,2009-08-20,51.23,9217.94043,989.669983 +2009-08-19,92.129997,,,2009-08-21,52.35,9279.160156,996.4600220000001 +2009-08-20,93.139999,,,2009-08-24,52.34,9350.049805,1007.3699949999999 +2009-08-21,94.889999,,,2009-08-25,52.86,9505.959961,1026.130005 +2009-08-24,94.839996,,,2009-08-26,52.64,9509.280273,1025.569946 +2009-08-25,95.059998,,,2009-08-27,53.04,9539.290039,1028.0 +2009-08-26,95.089996,,,2009-08-28,53.07,9543.519531,1028.119995 +2009-08-27,95.360001,,,2009-08-31,52.68,9580.629883,1030.97998 +2009-08-28,95.18,,,2009-09-01,51.37,9544.200195,1028.930054 +2009-08-31,94.41999799999999,,,2009-09-02,51.31,9496.280273,1020.6199949999999 +2009-09-01,92.33000200000001,,,2009-09-03,51.71,9310.599609,998.0399779999999 +2009-09-02,92.050003,,,2009-09-04,52.5,9280.669922,994.75 +2009-09-03,92.839996,,,2009-09-08,53.54,9344.610352,1003.23999 +2009-09-04,94.07,,,2009-09-09,54.2,9441.269531,1016.400024 +2009-09-08,94.910004,,,2009-09-10,54.68,9497.339844,1025.390015 +2009-09-09,95.650002,,,2009-09-11,54.61,9547.219727,1033.369995 +2009-09-10,96.650002,,,2009-09-14,54.72,9627.480469,1044.140015 +2009-09-11,96.540001,,,2009-09-15,54.73,9605.410156,1042.72998 +2009-09-14,97.150002,,,2009-09-16,55.81,9626.799805,1049.339966 +2009-09-15,97.459999,,,2009-09-17,55.45,9683.410156,1052.630005 +2009-09-16,98.959999,,,2009-09-18,55.6,9791.709961,1068.76001 +2009-09-17,98.66999799999999,,,2009-09-21,55.01,9783.919922,1065.48999 +2009-09-18,98.93,,,2009-09-22,55.77,9820.200195,1068.300049 +2009-09-21,98.589996,,,2009-09-23,55.29,9778.860352,1064.660034 +2009-09-22,99.239998,,,2009-09-24,54.48,9829.870117,1071.660034 +2009-09-23,98.239998,,,2009-09-25,54.25,9748.549805,1060.869995 +2009-09-24,97.32,,,2009-09-28,54.99,9707.44043,1050.780029 +2009-09-25,96.730003,,,2009-09-29,54.66,9665.19043,1044.380005 +2009-09-28,97.980003,,,2009-09-30,54.68,9789.360352,1062.97998 +2009-09-29,97.769997,,,2009-10-01,53.25,9742.200195,1060.609985 +2009-09-30,97.449997,,,2009-10-02,52.66,9712.280273,1057.079956 +2009-10-01,94.940002,,,2009-10-05,53.42,9509.280273,1029.849976 +2009-10-02,94.519997,,,2009-10-06,54.32,9487.669922,1025.209961 +2009-10-05,95.91999799999999,,,2009-10-07,54.52,9599.75,1040.459961 +2009-10-06,97.239998,,,2009-10-08,55.31,9731.25,1054.719971 +2009-10-07,97.550003,,,2009-10-09,55.17,9725.580078,1057.579956 +2009-10-08,98.279999,,,2009-10-12,55.5,9786.870117,1065.47998 +2009-10-09,98.839996,,,2009-10-13,55.38,9864.94043,1071.48999 +2009-10-12,99.269997,,,2009-10-14,56.71,9885.799805,1076.189941 +2009-10-13,99.0,,,2009-10-15,56.97,9871.05957,1073.189941 +2009-10-14,100.739998,,,2009-10-16,56.11,10015.860352,1092.02002 +2009-10-15,101.160004,,,2009-10-19,57.01,10062.94043,1096.560059 +2009-10-16,100.339996,,,2009-10-20,56.71,9995.910156,1087.680054 +2009-10-19,101.279999,,,2009-10-21,56.52,10092.19043,1097.910034 +2009-10-20,100.660004,,,2009-10-22,57.07,10041.480469,1091.060059 +2009-10-21,99.779999,,,2009-10-23,56.17,9949.360352,1081.400024 +2009-10-22,100.849998,,,2009-10-26,55.32,10081.30957,1092.910034 +2009-10-23,99.620003,,,2009-10-27,54.88,9972.179688,1079.599976 +2009-10-26,98.449997,,,2009-10-28,53.56,9867.959961,1066.949951 +2009-10-27,98.120003,,,2009-10-29,55.14,9882.169922,1063.410034 +2009-10-28,96.220001,,,2009-10-30,53.3,9762.69043,1042.630005 +2009-10-29,98.389999,,,2009-11-02,53.82,9962.580078,1066.109985 +2009-10-30,95.629997,,,2009-11-03,53.61,9712.730469,1036.189941 +2009-11-02,96.25,,,2009-11-04,54.15,9789.44043,1042.880005 +2009-11-03,96.480003,,,2009-11-05,54.85,9771.910156,1045.410034 +2009-11-04,96.620003,,,2009-11-06,55.01,9802.139648,1046.5 +2009-11-05,98.480003,,,2009-11-09,56.55,10005.959961,1066.630005 +2009-11-06,98.739998,,,2009-11-10,56.25,10023.419922,1069.300049 +2009-11-09,100.959999,,,2009-11-11,56.42,10226.94043,1093.079956 +2009-11-10,100.980003,,,2009-11-12,55.6,10246.969727,1093.01001 +2009-11-11,101.489998,,,2009-11-13,56.38,10291.259766,1098.51001 +2009-11-12,100.459999,,,2009-11-16,57.28,10197.469727,1087.23999 +2009-11-13,101.040001,,,2009-11-17,56.9,10270.469727,1093.47998 +2009-11-16,102.519997,,,2009-11-18,56.72,10406.959961,1109.300049 +2009-11-17,102.620003,,,2009-11-19,55.65,10437.419922,1110.319946 +2009-11-18,102.589996,,,2009-11-20,55.34,10426.30957,1109.800049 +2009-11-19,101.209999,,,2009-11-23,56.33,10332.44043,1094.900024 +2009-11-20,100.910004,,,2009-11-24,56.1,10318.160156,1091.380005 +2009-11-23,102.279999,,,2009-11-25,56.85,10450.950195,1106.23999 +2009-11-24,102.239998,,,2009-11-27,55.21,10433.709961,1105.650024 +2009-11-25,102.709999,,,2009-11-30,55.39,10464.400391,1110.630005 +2009-11-27,100.959999,,,2009-12-01,56.91,10309.919922,1091.48999 +2009-11-30,101.349998,,,2009-12-02,57.0,10344.839844,1095.630005 +2009-12-01,102.58000200000001,,,2009-12-03,56.87,10471.580078,1108.859985 +2009-12-02,102.629997,,,2009-12-04,56.67,10452.679688,1109.23999 +2009-12-03,101.769997,,,2009-12-07,56.36,10366.150391,1099.920044 +2009-12-04,102.33000200000001,,,2009-12-08,55.38,10388.900391,1105.97998 +2009-12-07,102.08000200000001,,,2009-12-09,55.31,10390.110352,1103.25 +2009-12-08,101.050003,,,2009-12-10,55.48,10285.969727,1091.939941 +2009-12-09,101.43,,,2009-12-11,55.46,10337.049805,1095.949951 +2009-12-10,102.029999,,,2009-12-14,56.0,10405.830078,1102.349976 +2009-12-11,102.41999799999999,,,2009-12-15,55.38,10471.5,1106.410034 +2009-12-14,103.139999,,,2009-12-16,56.03,10501.049805,1114.109985 +2009-12-15,102.57,,,2009-12-17,54.71,10452.0,1107.930054 +2009-12-16,102.690002,,,2009-12-18,54.84,10441.120117,1109.180054 +2009-12-17,101.480003,,,2009-12-21,55.0,10308.259766,1096.079956 +2009-12-18,102.07,,,2009-12-22,54.85,10328.889648,1102.469971 +2009-12-21,103.150002,,,2009-12-23,55.35,10414.139648,1114.050049 +2009-12-22,103.519997,,,2009-12-24,55.57,10464.929688,1118.02002 +2009-12-23,103.790001,,,2009-12-28,55.81,10466.44043,1120.589966 +2009-12-24,104.339996,,,2009-12-29,55.9,10520.089844,1126.47998 +2009-12-28,103.809998,,,2009-12-30,55.67,10547.080078,1127.780029 +2009-12-29,103.68,,,2009-12-31,55.28,10545.410156,1126.199951 +2009-12-30,103.709999,,,2010-01-04,56.73,10548.509766,1126.420044 +2009-12-31,102.66999799999999,,,2010-01-05,56.78,10428.049805,1115.099976 +2010-01-04,104.32,,,2010-01-06,57.02,10583.959961,1132.98999 +2010-01-05,104.639999,,,2010-01-07,56.8,10572.019531,1136.52002 +2010-01-06,104.75,,,2010-01-08,57.25,10573.679688,1137.140015 +2010-01-07,105.16999799999999,,,2010-01-11,57.72,10606.860352,1141.689941 +2010-01-08,105.480003,,,2010-01-12,57.04,10618.19043,1144.97998 +2010-01-11,105.660004,,,2010-01-13,57.52,10663.990234,1146.97998 +2010-01-12,104.66999799999999,,,2010-01-14,57.96,10627.259766,1136.219971 +2010-01-13,105.550003,,,2010-01-15,57.05,10680.769531,1145.680054 +2010-01-14,105.809998,,,2010-01-19,57.61,10710.549805,1148.459961 +2010-01-15,104.66999799999999,,,2010-01-20,56.14,10609.650391,1136.030029 +2010-01-19,105.970001,,,2010-01-21,54.94,10725.429688,1150.22998 +2010-01-20,104.860001,,,2010-01-22,53.87,10603.150391,1138.040039 +2010-01-21,102.879997,,,2010-01-25,54.53,10389.879883,1116.47998 +2010-01-22,100.599998,,,2010-01-26,54.22,10172.980469,1091.76001 +2010-01-25,101.059998,,,2010-01-27,54.16,10196.860352,1096.780029 +2010-01-26,100.639999,,,2010-01-28,53.25,10194.290039,1092.170044 +2010-01-27,101.139999,,,2010-01-29,52.48,10236.160156,1097.5 +2010-01-28,99.949997,,,2010-02-01,53.44,10120.459961,1084.530029 +2010-01-29,98.970001,,,2010-02-02,54.33,10067.330078,1073.869995 +2010-02-01,100.379997,,,2010-02-03,53.76,10185.530273,1089.189941 +2010-02-02,101.68,,,2010-02-04,51.57,10296.849609,1103.319946 +2010-02-03,101.160004,,,2010-02-05,51.48,10270.549805,1097.280029 +2010-02-04,98.010002,,,2010-02-08,50.46,10002.179688,1063.109985 +2010-02-05,98.290001,,,2010-02-09,52.05,10012.230469,1066.189941 +2010-02-08,97.449997,,,2010-02-10,51.72,9908.389648,1056.73999 +2010-02-09,98.730003,,,2010-02-11,52.2,10058.639648,1070.52002 +2010-02-10,98.529999,,,2010-02-12,51.75,10038.379883,1068.130005 +2010-02-11,99.5,,,2010-02-16,52.9,10144.19043,1078.469971 +2010-02-12,99.25,,,2010-02-17,52.97,10099.139648,1075.51001 +2010-02-16,101.050003,,,2010-02-18,53.27,10268.80957,1094.869995 +2010-02-17,101.5,,,2010-02-19,52.94,10309.240234,1099.51001 +2010-02-18,102.16999799999999,,,2010-02-22,53.04,10392.900391,1106.75 +2010-02-19,102.410004,,,2010-02-23,52.29,10402.349609,1109.170044 +2010-02-22,102.300003,,,2010-02-24,52.62,10383.379883,1108.01001 +2010-02-23,101.07,,,2010-02-25,52.3,10282.410156,1094.599976 +2010-02-24,102.07,,,2010-02-26,52.62,10374.160156,1105.23999 +2010-02-25,101.879997,,,2010-03-01,53.03,10321.030273,1102.939941 +2010-02-26,102.029999,,,2010-03-02,53.43,10325.259766,1104.48999 +2010-03-01,103.059998,,,2010-03-03,54.07,10403.790039,1115.709961 +2010-03-02,103.300003,,,2010-03-04,53.93,10405.980469,1118.310059 +2010-03-03,103.360001,,,2010-03-05,54.98,10396.759766,1118.790039 +2010-03-04,103.75,,,2010-03-08,54.98,10444.139648,1122.969971 +2010-03-05,105.209999,,,2010-03-09,54.85,10566.200195,1138.699951 +2010-03-08,105.209999,,,2010-03-10,55.08,10552.519531,1138.5 +2010-03-09,105.389999,,,2010-03-11,55.29,10564.379883,1140.449951 +2010-03-10,105.879997,,,2010-03-12,55.66,10567.330078,1145.609985 +2010-03-11,106.33000200000001,,,2010-03-15,55.27,10611.839844,1150.23999 +2010-03-12,106.309998,,,2010-03-16,55.97,10624.69043,1149.98999 +2010-03-15,106.360001,,,2010-03-17,56.27,10642.150391,1150.51001 +2010-03-16,107.199997,,,2010-03-18,55.94,10685.980469,1159.459961 +2010-03-17,107.83000200000001,,,2010-03-19,55.37,10733.669922,1166.209961 +2010-03-18,107.790001,,,2010-03-22,55.53,10779.169922,1165.829956 +2010-03-19,107.239998,,,2010-03-23,55.92,10741.980469,1159.900024 +2010-03-22,107.790001,,,2010-03-24,55.0,10785.889648,1165.810059 +2010-03-23,108.58000200000001,,,2010-03-25,54.97,10888.830078,1174.170044 +2010-03-24,107.980003,,,2010-03-26,55.51,10836.150391,1167.719971 +2010-03-25,107.800003,,,2010-03-29,55.98,10841.209961,1165.72998 +2010-03-26,107.879997,,,2010-03-30,55.98,10850.360352,1166.589966 +2010-03-29,108.07,,,2010-03-31,55.98,10895.860352,1173.219971 +2010-03-30,108.089996,,,2010-04-01,56.97,10907.419922,1173.27002 +2010-03-31,107.730003,,,2010-04-05,57.03,10856.629883,1169.430054 +2010-04-01,108.540001,,,2010-04-06,56.87,10927.070313,1178.099976 +2010-04-05,109.400002,,,2010-04-07,56.47,10973.549805,1187.439941 +2010-04-06,109.589996,,,2010-04-08,56.41,10969.990234,1189.439941 +2010-04-07,108.989998,,,2010-04-09,57.15,10897.519531,1182.449951 +2010-04-08,109.360001,,,2010-04-12,57.33,10927.070313,1186.439941 +2010-04-09,110.089996,,,2010-04-13,57.28,10997.349609,1194.369995 +2010-04-12,110.290001,,,2010-04-14,58.04,11005.969727,1196.47998 +2010-04-13,110.370003,,,2010-04-15,58.0,11019.419922,1197.300049 +2010-04-14,111.599998,,,2010-04-16,56.72,11123.110352,1210.650024 +2010-04-15,111.699997,,,2010-04-19,56.57,11144.570313,1211.670044 +2010-04-16,109.900002,,,2010-04-20,56.92,11018.660156,1192.130005 +2010-04-19,110.389999,,,2010-04-21,56.55,11092.049805,1197.52002 +2010-04-20,111.279999,,,2010-04-22,56.04,11117.05957,1207.170044 +2010-04-21,111.16999799999999,,,2010-04-23,56.46,11124.919922,1205.939941 +2010-04-22,111.43,,,2010-04-26,56.52,11134.290039,1208.670044 +2010-04-23,112.220001,,,2010-04-27,54.25,11204.280273,1217.280029 +2010-04-26,111.739998,,,2010-04-28,54.26,11205.030273,1212.050049 +2010-04-27,109.120003,,,2010-04-29,55.1,10991.990234,1183.709961 +2010-04-28,109.849998,,,2010-04-30,54.41,11045.269531,1191.359985 +2010-04-29,111.279999,,,2010-05-03,54.8,11167.320313,1206.780029 +2010-04-30,109.43,,,2010-05-04,52.63,11008.610352,1186.689941 +2010-05-03,110.860001,,,2010-05-05,51.62,11151.830078,1202.26001 +2010-05-04,108.220001,,,2010-05-06,49.32,10926.769531,1173.599976 +2010-05-05,107.540001,,,2010-05-07,49.21,10866.830078,1165.869995 +2010-05-06,104.08000200000001,,,2010-05-10,52.4,10520.320313,1128.150024 +2010-05-07,102.480003,,,2010-05-11,51.55,10380.429688,1110.880005 +2010-05-10,106.989998,,,2010-05-12,52.13,10785.139648,1159.72998 +2010-05-11,106.650002,,,2010-05-13,51.45,10748.259766,1155.790039 +2010-05-12,108.150002,,,2010-05-14,49.99,10896.910156,1171.670044 +2010-05-13,106.849998,,,2010-05-17,50.06,10782.950195,1157.439941 +2010-05-14,104.839996,,,2010-05-18,48.98,10620.160156,1135.680054 +2010-05-17,104.970001,,,2010-05-19,49.17,10625.830078,1136.939941 +2010-05-18,103.5,,,2010-05-20,47.46,10510.950195,1120.800049 +2010-05-19,102.980003,,,2010-05-21,48.62,10444.370117,1115.050049 +2010-05-20,98.970001,,,2010-05-24,47.51,10068.009766,1071.589966 +2010-05-21,100.459999,,,2010-05-25,47.32,10193.389648,1087.689941 +2010-05-24,99.160004,,,2010-05-26,46.62,10066.570313,1073.650024 +2010-05-25,99.199997,,,2010-05-27,49.27,10043.75,1074.030029 +2010-05-26,98.650002,,,2010-05-28,48.32,9974.450195,1067.949951 +2010-05-27,101.93,,,2010-06-01,47.84,10258.990234,1103.060059 +2010-05-28,100.68,,,2010-06-02,49.12,10136.629883,1089.410034 +2010-06-01,98.949997,,,2010-06-03,48.97,10024.019531,1070.709961 +2010-06-02,101.519997,,,2010-06-04,46.88,10249.540039,1098.380005 +2010-06-03,101.940002,,,2010-06-07,46.29,10255.280273,1102.829956 +2010-06-04,98.43,,,2010-06-08,47.03,9931.969727,1064.880005 +2010-06-07,97.110001,,,2010-06-09,46.86,9816.490234,1050.469971 +2010-06-08,98.190002,,,2010-06-10,48.84,9939.980469,1062.0 +2010-06-09,97.610001,,,2010-06-11,48.91,9899.25,1055.689941 +2010-06-10,100.489998,,,2010-06-14,49.22,10172.530273,1086.839966 +2010-06-11,100.959999,,,2010-06-15,50.78,10211.070313,1091.599976 +2010-06-14,100.779999,,,2010-06-16,50.54,10190.889648,1089.630005 +2010-06-15,103.150002,,,2010-06-17,50.7,10404.769531,1115.22998 +2010-06-16,103.099998,,,2010-06-18,50.61,10409.459961,1114.609985 +2010-06-17,103.239998,,,2010-06-21,50.6,10434.169922,1116.040039 +2010-06-18,103.379997,,,2010-06-22,49.96,10450.639648,1117.51001 +2010-06-21,102.980003,,,2010-06-23,49.43,10442.410156,1113.199951 +2010-06-22,101.339996,,,2010-06-24,48.57,10293.519531,1095.310059 +2010-06-23,101.040001,,,2010-06-25,48.85,10298.44043,1092.040039 +2010-06-24,99.339996,,,2010-06-28,48.49,10152.799805,1073.689941 +2010-06-25,99.620003,,,2010-06-29,46.83,10143.80957,1076.76001 +2010-06-28,98.93,,,2010-06-30,46.51,10138.519531,1074.569946 +2010-06-29,95.870003,,,2010-07-01,47.19,9870.299805,1041.23999 +2010-06-30,94.910004,,,2010-07-02,47.09,9774.019531,1030.709961 +2010-07-01,94.610001,,,2010-07-06,48.03,9732.530273,1027.369995 +2010-07-02,94.16999799999999,,,2010-07-07,49.52,9686.480469,1022.580017 +2010-07-06,94.66999799999999,,,2010-07-08,50.01,9743.620117,1028.060059 +2010-07-07,97.690002,,,2010-07-09,50.06,10018.280273,1060.27002 +2010-07-08,98.610001,,,2010-07-12,49.87,10138.990234,1070.25 +2010-07-09,99.32,,,2010-07-13,50.79,10198.030273,1077.959961 +2010-07-12,99.389999,,,2010-07-14,50.97,10216.269531,1078.75 +2010-07-13,100.93,,,2010-07-15,51.22,10363.019531,1095.339966 +2010-07-14,100.910004,,,2010-07-16,49.58,10366.719727,1095.170044 +2010-07-15,101.029999,,,2010-07-19,49.9,10359.30957,1096.47998 +2010-07-16,98.129997,,,2010-07-20,50.24,10097.900391,1064.880005 +2010-07-19,98.709999,,,2010-07-21,49.33,10154.429688,1071.25 +2010-07-20,99.839996,,,2010-07-22,50.99,10229.959961,1083.47998 +2010-07-21,98.57,,,2010-07-23,51.59,10120.530273,1069.589966 +2010-07-22,100.800003,,,2010-07-26,51.95,10322.299805,1093.670044 +2010-07-23,101.629997,,,2010-07-27,52.1,10424.620117,1102.660034 +2010-07-26,102.760002,,,2010-07-28,51.83,10525.429688,1115.01001 +2010-07-27,102.660004,,,2010-07-29,52.07,10537.69043,1113.839966 +2010-07-28,101.949997,,,2010-07-30,51.91,10497.879883,1106.130005 +2010-07-29,101.540001,,,2010-08-02,53.66,10467.160156,1101.530029 +2010-07-30,101.550003,,,2010-08-03,53.58,10465.94043,1101.599976 +2010-08-02,103.790001,,,2010-08-04,53.63,10674.379883,1125.859985 +2010-08-03,103.290001,,,2010-08-05,53.59,10636.379883,1120.459961 +2010-08-04,103.949997,,,2010-08-06,53.75,10680.429688,1127.23999 +2010-08-05,103.82,,,2010-08-09,53.81,10674.980469,1125.810059 +2010-08-06,103.449997,,,2010-08-10,53.38,10653.55957,1121.640015 +2010-08-09,104.010002,,,2010-08-11,50.95,10698.75,1127.790039 +2010-08-10,103.400002,,,2010-08-12,50.89,10644.25,1121.060059 +2010-08-11,100.529999,,,2010-08-13,50.71,10378.830078,1089.469971 +2010-08-12,100.0,,,2010-08-16,51.12,10319.950195,1083.609985 +2010-08-13,99.599998,,,2010-08-17,51.69,10303.150391,1079.25 +2010-08-16,99.620003,,,2010-08-18,51.67,10302.009766,1079.380005 +2010-08-17,100.860001,,,2010-08-19,50.84,10405.849609,1092.540039 +2010-08-18,101.029999,,,2010-08-20,50.31,10415.540039,1094.160034 +2010-08-19,99.32,,,2010-08-23,50.21,10271.209961,1075.630005 +2010-08-20,98.949997,,,2010-08-24,49.52,10213.620117,1071.689941 +2010-08-23,98.550003,,,2010-08-25,49.57,10174.410156,1067.359985 +2010-08-24,97.129997,,,2010-08-26,49.55,10040.450195,1051.869995 +2010-08-25,97.459999,,,2010-08-27,50.52,10060.05957,1055.329956 +2010-08-26,96.709999,,,2010-08-30,49.79,9985.80957,1047.219971 +2010-08-27,98.339996,,,2010-08-31,49.94,10150.650391,1064.589966 +2010-08-30,96.910004,,,2010-09-01,51.72,10009.730469,1048.920044 +2010-08-31,96.949997,,,2010-09-02,52.01,10014.719727,1049.329956 +2010-09-01,99.82,,,2010-09-03,52.49,10269.469727,1080.290039 +2010-09-02,100.739998,,,2010-09-07,51.76,10320.099609,1090.099976 +2010-09-03,102.07,,,2010-09-08,52.16,10447.929688,1104.51001 +2010-09-07,100.910004,,,2010-09-09,52.65,10340.69043,1091.839966 +2010-09-08,101.58000200000001,,,2010-09-10,52.81,10387.009766,1098.869995 +2010-09-09,102.07,,,2010-09-13,53.77,10415.240234,1104.180054 +2010-09-10,102.57,,,2010-09-14,54.13,10462.769531,1109.550049 +2010-09-13,103.739998,,,2010-09-15,54.15,10544.129883,1121.900024 +2010-09-14,103.66999799999999,,,2010-09-16,53.89,10526.490234,1121.099976 +2010-09-15,104.040001,,,2010-09-17,53.63,10572.730469,1125.069946 +2010-09-16,104.019997,,,2010-09-20,54.56,10594.830078,1124.660034 +2010-09-17,104.099998,,,2010-09-21,54.55,10607.849609,1125.589966 +2010-09-20,105.690002,,,2010-09-22,54.47,10753.620117,1142.709961 +2010-09-21,105.41999799999999,,,2010-09-23,53.88,10761.030273,1139.780029 +2010-09-22,104.91999799999999,,,2010-09-24,55.38,10739.30957,1134.280029 +2010-09-23,103.519997,,,2010-09-27,55.1,10662.419922,1124.829956 +2010-09-24,105.709999,,,2010-09-28,55.42,10860.259766,1148.670044 +2010-09-27,105.120003,,,2010-09-29,55.33,10812.040039,1142.160034 +2010-09-28,105.639999,,,2010-09-30,54.92,10858.139648,1147.699951 +2010-09-29,105.379997,,,2010-10-01,55.47,10835.280273,1144.72998 +2010-09-30,105.059998,,,2010-10-04,54.67,10788.049805,1141.199951 +2010-10-01,105.519997,,,2010-10-05,56.22,10829.679688,1146.23999 +2010-10-04,104.68,,,2010-10-06,56.69,10751.269531,1137.030029 +2010-10-05,106.860001,,,2010-10-07,56.5,10944.719727,1160.75 +2010-10-06,106.849998,,,2010-10-08,56.87,10967.650391,1159.969971 +2010-10-07,106.66999799999999,,,2010-10-11,56.8,10948.580078,1158.060059 +2010-10-08,107.32,,,2010-10-12,56.68,11006.480469,1165.150024 +2010-10-11,107.339996,,,2010-10-13,57.32,11010.339844,1165.319946 +2010-10-12,107.75,,,2010-10-14,57.72,11020.400391,1169.77002 +2010-10-13,108.519997,,,2010-10-15,57.53,11096.080078,1178.099976 +2010-10-14,108.129997,,,2010-10-18,57.66,11094.570313,1173.810059 +2010-10-15,108.349998,,,2010-10-19,56.39,11062.780273,1176.189941 +2010-10-18,109.129997,,,2010-10-20,57.45,11143.69043,1184.709961 +2010-10-19,107.400002,,,2010-10-21,57.14,10978.620117,1165.900024 +2010-10-20,108.550003,,,2010-10-22,57.29,11107.969727,1178.170044 +2010-10-21,108.75,,,2010-10-25,57.51,11146.570313,1180.26001 +2010-10-22,109.0,,,2010-10-26,57.14,11132.55957,1183.079956 +2010-10-25,109.239998,,,2010-10-27,56.59,11164.049805,1185.619995 +2010-10-26,109.239998,,,2010-10-28,57.03,11169.459961,1185.640015 +2010-10-27,108.959999,,,2010-10-29,57.01,11126.280273,1182.449951 +2010-10-28,109.089996,,,2010-11-01,56.8,11113.950195,1183.780029 +2010-10-29,109.040001,,,2010-11-02,57.74,11118.490234,1183.26001 +2010-11-01,109.139999,,,2010-11-03,58.14,11124.620117,1184.380005 +2010-11-02,109.989998,,,2010-11-04,59.46,11188.719727,1193.569946 +2010-11-03,110.41999799999999,,,2010-11-05,59.2,11215.129883,1197.959961 +2010-11-04,112.559998,,,2010-11-08,58.84,11434.839844,1221.060059 +2010-11-05,113.010002,,,2010-11-09,58.25,11444.080078,1225.849976 +2010-11-08,112.779999,,,2010-11-10,58.42,11406.839844,1223.25 +2010-11-09,111.910004,,,2010-11-11,57.92,11346.75,1213.400024 +2010-11-10,112.41999799999999,,,2010-11-12,57.44,11357.040039,1218.709961 +2010-11-11,111.949997,,,2010-11-15,57.4,11283.099609,1213.540039 +2010-11-12,110.629997,,,2010-11-16,56.05,11192.580078,1199.209961 +2010-11-15,110.5,,,2010-11-17,56.36,11201.969727,1197.75 +2010-11-16,108.739998,,,2010-11-18,57.77,11023.5,1178.339966 +2010-11-17,108.779999,,,2010-11-19,57.77,11007.879883,1178.589966 +2010-11-18,110.449997,,,2010-11-22,57.15,11181.230469,1196.689941 +2010-11-19,110.739998,,,2010-11-23,55.43,11203.549805,1199.72998 +2010-11-22,110.57,,,2010-11-24,56.31,11178.580078,1197.839966 +2010-11-23,108.989998,,,2010-11-26,55.37,11036.370117,1180.72998 +2010-11-24,110.620003,,,2010-11-29,54.88,11187.280273,1198.349976 +2010-11-26,109.82,,,2010-11-30,54.26,11091.870117,1189.400024 +2010-11-29,109.699997,,,2010-12-01,55.8,11052.490234,1187.76001 +2010-11-30,109.040001,,,2010-12-02,56.86,11006.019531,1180.550049 +2010-12-01,111.410004,,,2010-12-03,57.41,11255.780273,1206.069946 +2010-12-02,112.839996,,,2010-12-06,57.15,11362.410156,1221.530029 +2010-12-03,113.139999,,,2010-12-07,57.18,11382.089844,1224.709961 +2010-12-06,113.0,,,2010-12-08,57.35,11362.19043,1223.119995 +2010-12-07,113.059998,,,2010-12-09,57.5,11359.160156,1223.75 +2010-12-08,113.510002,,,2010-12-10,57.63,11372.480469,1228.280029 +2010-12-09,113.949997,,,2010-12-13,58.25,11370.05957,1233.0 +2010-12-10,114.639999,,,2010-12-14,58.34,11410.320313,1240.400024 +2010-12-13,114.660004,,,2010-12-15,57.57,11428.55957,1240.459961 +2010-12-14,114.760002,,,2010-12-16,57.89,11476.540039,1241.589966 +2010-12-15,114.18,,,2010-12-17,57.57,11457.469727,1235.22998 +2010-12-16,114.889999,,,2010-12-20,57.7,11499.25,1242.869995 +2010-12-17,114.980003,,,2010-12-21,57.64,11491.910156,1243.910034 +2010-12-20,115.279999,,,2010-12-22,57.75,11478.129883,1247.079956 +2010-12-21,115.989998,,,2010-12-23,57.72,11533.160156,1254.599976 +2010-12-22,116.400002,,,2010-12-27,57.6,11559.490234,1258.839966 +2010-12-23,115.720001,,,2010-12-28,57.65,11573.490234,1256.77002 +2010-12-27,115.790001,,,2010-12-29,58.15,11555.030273,1257.540039 +2010-12-28,115.879997,,,2010-12-30,57.87,11575.540039,1258.51001 +2010-12-29,116.019997,,,2010-12-31,58.22,11585.379883,1259.780029 +2010-12-30,115.839996,,,2011-01-03,58.7,11569.709961,1257.880005 +2010-12-31,115.82,,,2011-01-04,58.52,11577.509766,1257.640015 +2011-01-03,117.129997,,,2011-01-05,58.27,11670.75,1271.869995 +2011-01-04,116.980003,,,2011-01-06,57.6,11691.179688,1270.199951 +2011-01-05,117.58000200000001,,,2011-01-07,57.37,11722.889648,1276.560059 +2011-01-06,117.379997,,,2011-01-10,57.27,11697.30957,1273.849976 +2011-01-07,117.160004,,,2011-01-11,57.66,11674.759766,1271.5 +2011-01-10,117.0,,,2011-01-12,58.93,11637.450195,1269.75 +2011-01-11,117.43,,,2011-01-13,59.09,11671.879883,1274.47998 +2011-01-12,118.5,,,2011-01-14,59.45,11755.44043,1285.959961 +2011-01-13,118.300003,,,2011-01-18,59.84,11731.900391,1283.76001 +2011-01-14,119.18,,,2011-01-19,59.43,11787.379883,1293.23999 +2011-01-18,119.349998,,,2011-01-20,58.92,11837.929688,1295.02002 +2011-01-19,118.150002,,,2011-01-21,59.24,11825.290039,1281.920044 +2011-01-20,118.0,,,2011-01-24,59.87,11822.799805,1280.26001 +2011-01-21,118.290001,,,2011-01-25,59.75,11871.839844,1283.349976 +2011-01-24,118.980003,,,2011-01-26,60.13,11980.519531,1290.839966 +2011-01-25,119.010002,,,2011-01-27,60.27,11977.19043,1291.180054 +2011-01-26,119.519997,,,2011-01-28,58.93,11985.44043,1296.630005 +2011-01-27,119.790001,,,2011-01-31,59.44,11989.830078,1299.540039 +2011-01-28,117.650002,,,2011-02-01,60.85,11823.700195,1276.339966 +2011-01-31,118.550003,,,2011-02-02,60.78,11891.929688,1286.119995 +2011-02-01,120.529999,,,2011-02-03,60.81,12040.160156,1307.589966 +2011-02-02,120.220001,,,2011-02-04,60.79,12041.969727,1304.030029 +2011-02-03,120.519997,,,2011-02-07,60.98,12062.259766,1307.099976 +2011-02-04,120.870003,,,2011-02-08,61.38,12092.150391,1310.869995 +2011-02-07,121.629997,,,2011-02-09,61.2,12161.629883,1319.050049 +2011-02-08,122.16999799999999,,,2011-02-10,60.8,12233.150391,1324.569946 +2011-02-09,121.849998,,,2011-02-11,60.83,12239.889648,1320.880005 +2011-02-10,121.949997,,,2011-02-14,60.95,12229.290039,1321.869995 +2011-02-11,122.639999,,,2011-02-15,60.82,12273.259766,1329.150024 +2011-02-14,122.949997,,,2011-02-16,61.5,12268.19043,1332.319946 +2011-02-15,122.57,,,2011-02-17,61.71,12226.639648,1328.01001 +2011-02-16,123.360001,,,2011-02-18,61.91,12288.169922,1336.319946 +2011-02-17,123.75,,,2011-02-22,60.13,12318.139648,1340.430054 +2011-02-18,123.989998,,,2011-02-23,60.22,12391.25,1343.01001 +2011-02-22,121.440002,,,2011-02-24,60.27,12212.790039,1315.439941 +2011-02-23,120.699997,,,2011-02-25,61.04,12105.780273,1307.400024 +2011-02-24,120.610001,,,2011-02-28,61.55,12068.5,1306.099976 +2011-02-25,121.91999799999999,,,2011-03-01,60.69,12130.450195,1319.880005 +2011-02-28,122.599998,,,2011-03-02,60.99,12226.339844,1327.219971 +2011-03-01,120.66999799999999,,,2011-03-03,61.79,12058.019531,1306.329956 +2011-03-02,120.879997,,,2011-03-04,61.23,12066.799805,1308.439941 +2011-03-03,122.970001,,,2011-03-07,60.62,12258.200195,1330.969971 +2011-03-04,122.059998,,,2011-03-08,60.85,12169.879883,1321.150024 +2011-03-07,121.050003,,,2011-03-09,60.85,12090.030273,1310.130005 +2011-03-08,122.150002,,,2011-03-10,59.35,12214.379883,1321.819946 +2011-03-09,122.0,,,2011-03-11,59.34,12213.089844,1320.02002 +2011-03-10,119.699997,,,2011-03-14,58.28,11984.610352,1295.109985 +2011-03-11,120.58000200000001,,,2011-03-15,57.06,12044.400391,1304.280029 +2011-03-14,119.849998,,,2011-03-16,55.31,11993.160156,1296.390015 +2011-03-15,118.510002,,,2011-03-17,57.13,11855.419922,1281.869995 +2011-03-16,116.209999,,,2011-03-18,57.9,11613.299805,1256.880005 +2011-03-17,117.760002,,,2011-03-21,59.37,11774.589844,1273.719971 +2011-03-18,118.269997,,,2011-03-22,59.18,11858.519531,1279.209961 +2011-03-21,120.040001,,,2011-03-23,59.25,12036.530273,1298.380005 +2011-03-22,119.629997,,,2011-03-24,60.04,12018.629883,1293.77002 +2011-03-23,119.980003,,,2011-03-25,59.38,12086.019531,1297.540039 +2011-03-24,120.589996,,,2011-03-28,59.35,12170.55957,1309.660034 +2011-03-25,120.980003,,,2011-03-29,59.66,12220.589844,1313.800049 +2011-03-28,120.639999,,,2011-03-30,60.37,12197.879883,1310.189941 +2011-03-29,121.519997,,,2011-03-31,60.09,12279.009766,1319.439941 +2011-03-30,122.339996,,,2011-04-01,60.65,12350.610352,1328.26001 +2011-03-31,122.120003,,,2011-04-04,60.73,12319.730469,1325.829956 +2011-04-01,122.730003,,,2011-04-05,60.57,12376.719727,1332.410034 +2011-04-04,122.779999,,,2011-04-06,61.08,12400.030273,1332.869995 +2011-04-05,122.760002,,,2011-04-07,60.78,12393.900391,1332.630005 +2011-04-06,123.08000200000001,,,2011-04-08,61.28,12426.75,1335.540039 +2011-04-07,122.900002,,,2011-04-11,61.16,12409.490234,1333.51001 +2011-04-08,122.400002,,,2011-04-12,60.59,12380.049805,1328.170044 +2011-04-11,122.059998,,,2011-04-13,60.74,12381.110352,1324.459961 +2011-04-12,121.120003,,,2011-04-14,61.04,12263.580078,1314.160034 +2011-04-13,121.150002,,,2011-04-15,60.95,12270.990234,1314.410034 +2011-04-14,121.160004,,,2011-04-18,59.7,12285.150391,1314.52002 +2011-04-15,121.639999,,,2011-04-19,60.14,12341.830078,1319.680054 +2011-04-18,120.300003,,,2011-04-20,61.71,12201.589844,1305.140015 +2011-04-19,120.989998,,,2011-04-21,62.07,12266.75,1312.619995 +2011-04-20,122.629997,,,2011-04-25,62.07,12453.540039,1330.359985 +2011-04-21,123.279999,,,2011-04-26,62.56,12505.990234,1337.380005 +2011-04-25,123.08000200000001,,,2011-04-27,63.32,12479.879883,1335.25 +2011-04-26,124.18,,,2011-04-28,63.76,12595.370117,1347.23999 +2011-04-27,124.980003,,,2011-04-29,63.46,12690.959961,1355.660034 +2011-04-28,125.43,,,2011-05-02,63.87,12763.30957,1360.47998 +2011-04-29,125.720001,,,2011-05-03,63.35,12810.540039,1363.609985 +2011-05-02,125.5,,,2011-05-04,62.82,12807.360352,1361.219971 +2011-05-03,125.08000200000001,,,2011-05-05,61.55,12807.509766,1356.619995 +2011-05-04,124.239998,,,2011-05-06,61.6,12723.580078,1347.319946 +2011-05-05,123.120003,,,2011-05-09,62.04,12584.169922,1335.099976 +2011-05-06,123.599998,,,2011-05-10,62.63,12638.740234,1340.199951 +2011-05-09,124.16999799999999,,,2011-05-11,61.37,12684.679688,1346.290039 +2011-05-10,125.16999799999999,,,2011-05-12,61.57,12760.360352,1357.160034 +2011-05-11,123.849998,,,2011-05-13,60.61,12630.030273,1342.079956 +2011-05-12,124.470001,,,2011-05-16,60.5,12695.919922,1348.650024 +2011-05-13,123.470001,,,2011-05-17,60.64,12595.75,1337.77002 +2011-05-16,122.709999,,,2011-05-18,60.99,12548.370117,1329.469971 +2011-05-17,122.690002,,,2011-05-19,61.36,12479.580078,1328.97998 +2011-05-18,123.800003,,,2011-05-20,60.43,12560.179688,1340.680054 +2011-05-19,124.08000200000001,,,2011-05-23,59.08,12605.320313,1343.599976 +2011-05-20,123.120003,,,2011-05-24,59.42,12512.040039,1333.27002 +2011-05-23,121.650002,,,2011-05-25,59.8,12381.259766,1317.369995 +2011-05-24,121.550003,,,2011-05-26,60.36,12356.209961,1316.280029 +2011-05-25,121.949997,,,2011-05-27,60.8,12394.660156,1320.469971 +2011-05-26,122.459999,,,2011-05-31,62.06,12402.759766,1325.689941 +2011-05-27,122.980003,,,2011-06-01,60.59,12441.580078,1331.099976 +2011-05-31,124.279999,,,2011-06-02,60.91,12569.790039,1345.199951 +2011-06-01,121.470001,,,2011-06-03,60.93,12290.139648,1314.550049 +2011-06-02,121.32,,,2011-06-06,60.14,12248.549805,1312.939941 +2011-06-03,120.150002,,,2011-06-07,60.68,12151.259766,1300.160034 +2011-06-06,118.860001,,,2011-06-08,59.93,12089.959961,1286.170044 +2011-06-07,118.75,,,2011-06-09,60.55,12070.80957,1284.939941 +2011-06-08,118.269997,,,2011-06-10,59.11,12048.94043,1279.560059 +2011-06-09,119.150002,,,2011-06-13,59.22,12124.360352,1289.0 +2011-06-10,117.480003,,,2011-06-14,60.26,11951.910156,1270.97998 +2011-06-13,117.599998,,,2011-06-15,58.27,11952.969727,1271.829956 +2011-06-14,119.089996,,,2011-06-16,58.07,12076.110352,1287.869995 +2011-06-15,117.019997,,,2011-06-17,58.68,11897.269531,1265.420044 +2011-06-16,117.239998,,,2011-06-20,58.6,11961.519531,1267.640015 +2011-06-17,117.599998,,,2011-06-21,59.85,12004.360352,1271.5 +2011-06-20,118.230003,,,2011-06-22,58.14,12080.379883,1278.359985 +2011-06-21,119.83000200000001,,,2011-06-23,57.65,12190.009766,1295.52002 +2011-06-22,119.059998,,,2011-06-24,57.1,12109.669922,1287.140015 +2011-06-23,118.190002,,,2011-06-27,57.6,12050.0,1283.5 +2011-06-24,116.800003,,,2011-06-28,58.26,11934.580078,1268.449951 +2011-06-27,117.870003,,,2011-06-29,59.28,12043.55957,1280.099976 +2011-06-28,119.41999799999999,,,2011-06-30,60.14,12188.69043,1296.670044 +2011-06-29,120.43,,,2011-07-01,60.8,12261.419922,1307.410034 +2011-06-30,121.650002,,,2011-07-05,60.44,12414.339844,1320.640015 +2011-07-01,123.410004,,,2011-07-06,60.06,12582.769531,1339.670044 +2011-07-05,123.25,,,2011-07-07,60.59,12569.870117,1337.880005 +2011-07-06,123.41999799999999,,,2011-07-08,59.82,12626.019531,1339.219971 +2011-07-07,124.720001,,,2011-07-11,58.03,12719.490234,1353.219971 +2011-07-08,123.849998,,,2011-07-12,57.66,12657.200195,1343.800049 +2011-07-11,121.610001,,,2011-07-13,58.48,12505.759766,1319.48999 +2011-07-12,121.07,,,2011-07-14,57.99,12446.879883,1313.640015 +2011-07-13,121.459999,,,2011-07-15,58.18,12491.610352,1317.719971 +2011-07-14,120.639999,,,2011-07-18,57.32,12437.120117,1308.869995 +2011-07-15,121.309998,,,2011-07-19,58.2,12479.730469,1316.140015 +2011-07-18,120.33000200000001,,,2011-07-20,58.87,12385.160156,1305.439941 +2011-07-19,122.290001,,,2011-07-21,60.13,12587.419922,1326.72998 +2011-07-20,122.230003,,,2011-07-22,60.22,12571.910156,1325.839966 +2011-07-21,123.889999,,,2011-07-25,59.79,12724.410156,1343.800049 +2011-07-22,124.010002,,,2011-07-26,60.16,12681.160156,1345.02002 +2011-07-25,123.309998,,,2011-07-27,58.69,12592.799805,1337.430054 +2011-07-26,122.800003,,,2011-07-28,58.56,12501.299805,1331.939941 +2011-07-27,120.309998,,,2011-07-29,58.65,12302.549805,1304.890015 +2011-07-28,119.93,,,2011-08-01,57.97,12240.110352,1300.670044 +2011-07-29,119.160004,,,2011-08-02,56.44,12143.240234,1292.280029 +2011-08-01,118.660004,,,2011-08-03,56.79,12132.490234,1286.939941 +2011-08-02,115.629997,,,2011-08-04,52.79,11866.620117,1254.050049 +2011-08-03,116.25,,,2011-08-05,53.75,11896.44043,1260.339966 +2011-08-04,110.699997,,,2011-08-08,49.73,11383.679688,1200.069946 +2011-08-05,110.639999,,,2011-08-09,53.08,11444.610352,1199.380005 +2011-08-08,103.279999,,,2011-08-10,49.89,10809.849609,1119.459961 +2011-08-09,108.18,,,2011-08-11,52.3,11239.769531,1172.530029 +2011-08-10,103.449997,,,2011-08-12,52.91,10719.94043,1120.76001 +2011-08-11,108.25,,,2011-08-15,54.13,11143.30957,1172.640015 +2011-08-12,108.82,,,2011-08-16,53.34,11269.019531,1178.810059 +2011-08-15,111.199997,,,2011-08-17,53.65,11482.900391,1204.48999 +2011-08-16,110.139999,,,2011-08-18,51.03,11405.929688,1192.76001 +2011-08-17,110.269997,,,2011-08-19,50.17,11410.209961,1193.890015 +2011-08-18,105.360001,,,2011-08-22,50.47,10990.580078,1140.650024 +2011-08-19,103.779999,,,2011-08-23,52.16,10817.650391,1123.530029 +2011-08-22,103.809998,,,2011-08-24,52.15,10854.650391,1123.819946 +2011-08-23,107.360001,,,2011-08-25,50.87,11176.759766,1162.349976 +2011-08-24,108.790001,,,2011-08-26,51.69,11320.709961,1177.599976 +2011-08-25,107.099998,,,2011-08-29,52.93,11149.820313,1159.27002 +2011-08-26,108.730003,,,2011-08-30,52.63,11284.540039,1176.800049 +2011-08-29,111.82,,,2011-08-31,53.59,11539.25,1210.079956 +2011-08-30,112.099998,,,2011-09-01,52.91,11559.950195,1212.920044 +2011-08-31,112.66999799999999,,,2011-09-02,51.7,11613.530273,1218.890015 +2011-09-01,111.339996,,,2011-09-06,50.02,11493.570313,1204.420044 +2011-09-02,108.529999,,,2011-09-07,51.52,11240.259766,1173.969971 +2011-09-06,107.730003,,,2011-09-08,50.49,11139.299805,1165.23999 +2011-09-07,110.839996,,,2011-09-09,48.76,11414.860352,1198.619995 +2011-09-08,109.660004,,,2011-09-12,48.56,11295.80957,1185.900024 +2011-09-09,106.739998,,,2011-09-13,49.09,10992.129883,1154.22998 +2011-09-12,107.489998,,,2011-09-14,49.8,11061.120117,1162.27002 +2011-09-13,108.5,,,2011-09-15,50.89,11105.849609,1172.869995 +2011-09-14,109.959999,,,2011-09-16,50.85,11246.730469,1188.680054 +2011-09-15,111.879997,,,2011-09-19,49.48,11433.179688,1209.109985 +2011-09-16,112.519997,,,2011-09-20,49.7,11509.089844,1216.01001 +2011-09-19,111.410004,,,2011-09-21,48.25,11401.009766,1204.089966 +2011-09-20,111.230003,,,2011-09-22,46.66,11408.660156,1202.089966 +2011-09-21,107.959999,,,2011-09-23,47.19,11124.839844,1166.76001 +2011-09-22,103.970001,,,2011-09-26,48.16,10733.830078,1129.560059 +2011-09-23,104.610001,,,2011-09-27,49.35,10771.480469,1136.430054 +2011-09-26,107.050003,,,2011-09-28,48.54,11043.860352,1162.949951 +2011-09-27,108.199997,,,2011-09-29,49.46,11190.69043,1175.380005 +2011-09-28,105.989998,,,2011-09-30,47.75,11010.900391,1151.060059 +2011-09-29,106.849998,,,2011-10-03,46.52,11153.980469,1160.400024 +2011-09-30,104.18,,,2011-10-04,47.3,10913.379883,1131.420044 +2011-10-03,101.220001,,,2011-10-05,48.03,10655.299805,1099.22998 +2011-10-04,103.510002,,,2011-10-06,49.32,10808.709961,1123.949951 +2011-10-05,105.410004,,,2011-10-07,48.98,10939.950195,1144.030029 +2011-10-06,107.349998,,,2011-10-10,50.83,11123.330078,1164.969971 +2011-10-07,106.480003,,,2011-10-11,50.76,11103.120117,1155.459961 +2011-10-10,110.110001,,,2011-10-12,51.5,11433.179688,1194.890015 +2011-10-11,110.16999799999999,,,2011-10-13,51.52,11416.299805,1195.540039 +2011-10-12,111.269997,,,2011-10-14,52.12,11518.849609,1207.25 +2011-10-13,110.949997,,,2011-10-17,50.92,11478.129883,1203.660034 +2011-10-14,112.870003,,,2011-10-18,51.65,11644.490234,1224.579956 +2011-10-17,110.690002,,,2011-10-19,50.68,11397.0,1200.859985 +2011-10-18,112.949997,,,2011-10-20,50.85,11577.049805,1225.380005 +2011-10-19,111.540001,,,2011-10-21,52.1,11504.620117,1209.880005 +2011-10-20,112.050003,,,2011-10-24,52.86,11541.780273,1215.390015 +2011-10-21,114.160004,,,2011-10-25,51.95,11808.790039,1238.25 +2011-10-24,115.629997,,,2011-10-26,52.68,11913.620117,1254.189941 +2011-10-25,113.309998,,,2011-10-27,55.43,11706.620117,1229.050049 +2011-10-26,114.5,,,2011-10-28,55.2,11869.040039,1242.0 +2011-10-27,118.440002,,,2011-10-31,52.37,12208.549805,1284.589966 +2011-10-28,118.480003,,,2011-11-01,50.69,12231.110352,1285.089966 +2011-10-31,115.550003,,,2011-11-02,51.17,11955.009766,1253.300049 +2011-11-01,112.33000200000001,,,2011-11-03,52.46,11657.959961,1218.280029 +2011-11-02,114.150002,,,2011-11-04,51.8,11836.040039,1237.900024 +2011-11-03,116.309998,,,2011-11-07,52.02,12044.469727,1261.150024 +2011-11-04,115.58000200000001,,,2011-11-08,52.62,11983.240234,1253.22998 +2011-11-07,116.32,,,2011-11-09,49.95,12068.389648,1261.119995 +2011-11-08,117.75,,,2011-11-10,50.54,12170.179688,1275.920044 +2011-11-09,113.440002,,,2011-11-11,51.8,11780.94043,1229.099976 +2011-11-10,114.43,,,2011-11-14,50.88,11893.860352,1239.699951 +2011-11-11,116.660004,,,2011-11-15,50.74,12153.679688,1263.849976 +2011-11-14,115.559998,,,2011-11-16,49.77,12078.980469,1251.780029 +2011-11-15,116.139999,,,2011-11-17,49.23,12096.160156,1257.810059 +2011-11-16,114.239998,,,2011-11-18,49.4,11905.589844,1236.910034 +2011-11-17,112.33000200000001,,,2011-11-21,48.15,11770.730469,1216.130005 +2011-11-18,112.290001,,,2011-11-22,48.01,11796.160156,1215.650024 +2011-11-21,110.199997,,,2011-11-23,46.68,11547.30957,1192.97998 +2011-11-22,109.75,,,2011-11-25,46.45,11493.719727,1188.040039 +2011-11-23,107.33000200000001,,,2011-11-28,48.44,11257.549805,1161.790039 +2011-11-25,107.059998,,,2011-11-29,48.75,11231.650391,1158.670044 +2011-11-28,110.199997,,,2011-11-30,51.29,11523.009766,1192.550049 +2011-11-29,110.480003,,,2011-12-01,50.8,11555.629883,1195.189941 +2011-11-30,115.279999,,,2011-12-02,50.83,12045.679688,1246.959961 +2011-12-01,115.07,,,2011-12-05,51.37,12020.030273,1244.579956 +2011-12-02,115.040001,,,2011-12-06,51.13,12019.419922,1244.280029 +2011-12-05,116.230003,,,2011-12-07,51.49,12097.830078,1257.079956 +2011-12-06,116.360001,,,2011-12-08,49.81,12150.129883,1258.469971 +2011-12-07,116.629997,,,2011-12-09,51.04,12196.370117,1261.01001 +2011-12-08,114.16999799999999,,,2011-12-12,49.53,11997.700195,1234.349976 +2011-12-09,116.089996,,,2011-12-13,48.88,12184.259766,1255.189941 +2011-12-12,114.360001,,,2011-12-14,48.27,12021.389648,1236.469971 +2011-12-13,113.389999,,,2011-12-15,48.56,11954.94043,1225.72998 +2011-12-14,112.120003,,,2011-12-16,48.35,11823.480469,1211.819946 +2011-12-15,112.489998,,,2011-12-19,47.9,11868.80957,1215.75 +2011-12-16,112.860001,,,2011-12-20,49.01,11866.389648,1219.660034 +2011-12-19,111.529999,,,2011-12-21,48.73,11766.259766,1205.349976 +2011-12-20,114.879997,,,2011-12-22,49.18,12103.580078,1241.300049 +2011-12-21,115.099998,,,2011-12-23,49.5,12107.740234,1243.719971 +2011-12-22,115.43,,,2011-12-27,49.31,12169.650391,1254.0 +2011-12-23,116.470001,,,2011-12-28,48.43,12294.0,1265.329956 +2011-12-27,116.480003,,,2011-12-29,49.31,12291.349609,1265.430054 +2011-12-28,115.059998,,,2011-12-30,49.53,12151.410156,1249.640015 +2011-12-29,116.290001,,,2012-01-03,50.89,12287.040039,1263.02002 +2011-12-30,115.800003,,,2012-01-04,50.58,12217.55957,1257.599976 +2012-01-03,117.589996,,,2012-01-05,49.84,12397.379883,1277.060059 +2012-01-04,117.639999,,,2012-01-06,49.15,12418.419922,1277.300049 +2012-01-05,117.980003,,,2012-01-09,49.36,12415.700195,1281.060059 +2012-01-06,117.730003,,,2012-01-10,50.09,12359.919922,1277.810059 +2012-01-09,117.989998,,,2012-01-11,49.95,12392.69043,1280.699951 +2012-01-10,119.040001,,,2012-01-12,50.14,12462.469727,1292.079956 +2012-01-11,119.089996,,,2012-01-13,49.61,12449.450195,1292.47998 +2012-01-12,119.370003,,,2012-01-17,50.16,12471.019531,1295.5 +2012-01-13,118.779999,,,2012-01-18,51.03,12422.05957,1289.089966 +2012-01-17,119.199997,,,2012-01-19,51.66,12482.070313,1293.670044 +2012-01-18,120.540001,,,2012-01-20,51.93,12578.950195,1308.040039 +2012-01-19,121.139999,,,2012-01-23,52.13,12623.980469,1314.5 +2012-01-20,121.230003,,,2012-01-24,51.84,12720.480469,1315.380005 +2012-01-23,121.279999,,,2012-01-25,52.38,12708.820313,1316.0 +2012-01-24,121.160004,,,2012-01-26,52.4,12675.75,1314.650024 +2012-01-25,122.209999,,,2012-01-27,52.49,12758.849609,1326.060059 +2012-01-26,121.519997,,,2012-01-30,51.87,12734.629883,1318.430054 +2012-01-27,121.33000200000001,,,2012-01-31,52.14,12660.459961,1316.329956 +2012-01-30,121.019997,,,2012-02-01,52.97,12653.719727,1313.01001 +2012-01-31,120.970001,,,2012-02-03,53.91,12632.910156,1312.410034 +2012-02-01,122.07,,,2012-02-06,53.64,12716.459961,1324.089966 +2012-02-02,122.209999,,,2012-02-07,53.97,12705.410156,1325.540039 +2012-02-03,124.010002,,,2012-02-08,54.16,12862.230469,1344.900024 +2012-02-06,123.959999,,,2012-02-09,54.3,12845.129883,1344.329956 +2012-02-07,124.209999,,,2012-02-10,53.28,12878.200195,1347.050049 +2012-02-08,124.519997,,,2012-02-13,53.9,12883.950195,1349.959961 +2012-02-09,124.709999,,,2012-02-14,53.48,12890.459961,1351.949951 +2012-02-10,123.849998,,,2012-02-15,53.54,12801.230469,1342.640015 +2012-02-13,124.720001,,,2012-02-16,54.28,12874.040039,1351.77002 +2012-02-14,124.620003,,,2012-02-17,54.52,12878.280273,1350.5 +2012-02-15,124.0,,,2012-02-21,54.53,12780.950195,1343.22998 +2012-02-16,125.379997,,,2012-02-22,54.34,12904.080078,1358.040039 +2012-02-17,125.68,,,2012-02-23,54.82,12949.870117,1361.22998 +2012-02-21,125.769997,,,2012-02-24,55.15,12965.69043,1362.209961 +2012-02-22,125.349998,,,2012-02-27,54.87,12938.669922,1357.660034 +2012-02-23,125.910004,,,2012-02-28,55.38,12984.69043,1363.459961 +2012-02-24,126.139999,,,2012-02-29,54.7,12982.950195,1365.73999 +2012-02-27,126.32,,,2012-03-01,55.28,12981.509766,1367.589966 +2012-02-28,126.760002,,,2012-03-02,54.76,13005.120117,1372.180054 +2012-02-29,126.18,,,2012-03-05,54.48,12952.070313,1365.680054 +2012-03-01,126.970001,,,2012-03-06,52.74,12980.299805,1374.089966 +2012-03-02,126.559998,,,2012-03-07,53.39,12977.570313,1369.630005 +2012-03-05,126.08000200000001,,,2012-03-08,54.53,12962.80957,1364.329956 +2012-03-06,124.139999,,,2012-03-09,54.37,12759.150391,1343.359985 +2012-03-07,125.040001,,,2012-03-12,54.21,12837.330078,1352.630005 +2012-03-08,126.279999,,,2012-03-13,55.08,12907.94043,1365.910034 +2012-03-09,126.739998,,,2012-03-14,54.63,12922.019531,1370.869995 +2012-03-12,126.760002,,,2012-03-15,55.13,12959.709961,1371.089966 +2012-03-13,129.100006,,,2012-03-16,55.49,13177.679688,1395.949951 +2012-03-14,128.949997,,,2012-03-19,55.8,13194.099609,1394.280029 +2012-03-15,129.720001,,,2012-03-20,55.15,13252.759766,1402.599976 +2012-03-16,129.869995,,,2012-03-21,54.76,13232.620117,1404.170044 +2012-03-19,130.380005,,,2012-03-22,54.37,13239.129883,1409.75 +2012-03-20,129.990005,,,2012-03-23,54.78,13170.19043,1405.52002 +2012-03-21,129.759995,,,2012-03-26,55.47,13124.620117,1402.890015 +2012-03-22,128.830002,,,2012-03-27,55.14,13046.139648,1392.780029 +2012-03-23,128.690002,,,2012-03-28,54.75,13080.730469,1397.109985 +2012-03-26,130.479996,,,2012-03-29,54.42,13241.629883,1416.51001 +2012-03-27,130.119995,,,2012-03-30,54.9,13197.730469,1412.52002 +2012-03-28,129.509995,,,2012-04-02,55.51,13126.209961,1405.540039 +2012-03-29,129.300003,,,2012-04-03,54.57,13145.820313,1403.280029 +2012-03-30,129.779999,,,2012-04-04,53.35,13212.040039,1408.469971 +2012-04-02,130.759995,,,2012-04-05,53.02,13264.490234,1419.040039 +2012-04-03,130.270004,,,2012-04-09,52.78,13199.549805,1413.380005 +2012-04-04,128.940002,,,2012-04-10,51.67,13074.75,1398.959961 +2012-04-05,128.91000400000001,,,2012-04-11,52.38,13060.139648,1398.079956 +2012-04-09,127.440002,,,2012-04-12,53.33,12929.589844,1382.199951 +2012-04-10,125.269997,,,2012-04-13,52.34,12715.929688,1358.589966 +2012-04-11,126.220001,,,2012-04-16,52.68,12805.389648,1368.709961 +2012-04-12,127.959999,,,2012-04-17,53.54,12986.580078,1387.569946 +2012-04-13,126.360001,,,2012-04-18,53.28,12849.589844,1370.26001 +2012-04-16,126.300003,,,2012-04-19,52.94,12921.410156,1369.569946 +2012-04-17,128.259995,,,2012-04-20,53.43,13115.540039,1390.780029 +2012-04-18,127.739998,,,2012-04-23,52.38,13032.75,1385.140015 +2012-04-19,126.980003,,,2012-04-24,52.8,12964.099609,1376.920044 +2012-04-20,127.139999,,,2012-04-25,53.52,13029.259766,1378.530029 +2012-04-23,126.07,,,2012-04-26,53.84,12927.169922,1366.939941 +2012-04-24,126.529999,,,2012-04-27,54.06,13001.55957,1371.969971 +2012-04-25,128.270004,,,2012-04-30,53.75,13090.719727,1390.689941 +2012-04-26,129.139999,,,2012-05-01,53.97,13204.620117,1399.97998 +2012-04-27,129.449997,,,2012-05-02,53.57,13228.30957,1403.359985 +2012-04-30,128.949997,,,2012-05-03,53.08,13213.629883,1397.910034 +2012-05-01,129.679993,,,2012-05-04,52.27,13279.320313,1405.819946 +2012-05-02,129.369995,,,2012-05-07,52.65,13268.570313,1402.310059 +2012-05-03,128.399994,,,2012-05-08,51.86,13206.589844,1391.569946 +2012-05-04,126.33000200000001,,,2012-05-09,51.25,13038.269531,1369.099976 +2012-05-07,126.379997,,,2012-05-10,51.48,13008.530273,1369.579956 +2012-05-08,125.849998,,,2012-05-11,51.17,12932.089844,1363.719971 +2012-05-09,125.040001,,,2012-05-14,50.18,12835.05957,1354.579956 +2012-05-10,125.400002,,,2012-05-15,49.55,12855.040039,1357.98999 +2012-05-11,124.980003,,,2012-05-16,49.02,12820.599609,1353.390015 +2012-05-14,123.610001,,,2012-05-17,48.46,12695.349609,1338.349976 +2012-05-15,122.91999799999999,,,2012-05-18,48.13,12632.0,1330.660034 +2012-05-16,122.41999799999999,,,2012-05-21,49.17,12598.549805,1324.800049 +2012-05-17,120.589996,,,2012-05-22,48.99,12442.490234,1304.859985 +2012-05-18,119.699997,,,2012-05-23,48.59,12369.379883,1295.219971 +2012-05-21,121.620003,,,2012-05-24,48.27,12504.480469,1315.98999 +2012-05-22,121.68,,,2012-05-25,48.1,12502.80957,1316.630005 +2012-05-23,121.889999,,,2012-05-29,48.71,12496.150391,1318.859985 +2012-05-24,122.08000200000001,,,2012-05-30,47.56,12529.75,1320.680054 +2012-05-25,121.82,,,2012-05-31,47.76,12454.830078,1317.819946 +2012-05-29,123.18,,,2012-06-01,46.55,12580.69043,1332.420044 +2012-05-30,121.449997,,,2012-06-04,46.95,12419.860352,1313.319946 +2012-05-31,121.190002,,,2012-06-05,47.23,12393.450195,1310.329956 +2012-06-01,118.209999,,,2012-06-06,48.58,12118.570313,1278.040039 +2012-06-04,118.220001,,,2012-06-07,48.67,12101.459961,1278.180054 +2012-06-05,118.900002,,,2012-06-08,48.51,12127.950195,1285.5 +2012-06-06,121.66999799999999,,,2012-06-11,48.01,12414.790039,1315.130005 +2012-06-07,121.66999799999999,,,2012-06-12,48.85,12460.959961,1314.98999 +2012-06-08,122.660004,,,2012-06-13,48.44,12554.200195,1325.660034 +2012-06-11,121.110001,,,2012-06-14,48.82,12411.230469,1308.930054 +2012-06-12,122.529999,,,2012-06-15,49.48,12573.799805,1324.180054 +2012-06-13,121.709999,,,2012-06-18,49.36,12496.379883,1314.880005 +2012-06-14,123.029999,,,2012-06-19,50.18,12651.910156,1329.099976 +2012-06-15,124.300003,,,2012-06-20,50.47,12767.169922,1342.839966 +2012-06-18,124.480003,,,2012-06-21,48.04,12741.820313,1344.780029 +2012-06-19,125.699997,,,2012-06-22,48.49,12837.330078,1357.97998 +2012-06-20,125.5,,,2012-06-25,47.36,12824.389648,1355.689941 +2012-06-21,122.720001,,,2012-06-26,47.68,12573.570313,1325.51001 +2012-06-22,122.989998,,,2012-06-27,48.11,12640.780273,1335.02002 +2012-06-25,121.040001,,,2012-06-28,48.22,12502.660156,1313.719971 +2012-06-26,121.620003,,,2012-06-29,49.96,12534.669922,1319.98999 +2012-06-27,122.739998,,,2012-07-02,50.28,12627.009766,1331.849976 +2012-06-28,122.489998,,,2012-07-03,50.75,12602.259766,1329.040039 +2012-06-29,125.550003,,,2012-07-05,49.91,12880.089844,1362.160034 +2012-07-02,125.860001,,,2012-07-06,49.44,12871.389648,1365.51001 +2012-07-03,126.66999799999999,,,2012-07-09,49.33,12943.660156,1374.02002 +2012-07-05,126.08000200000001,,,2012-07-10,49.03,12896.669922,1367.579956 +2012-07-06,124.93,,,2012-07-11,49.15,12772.469727,1354.680054 +2012-07-09,124.730003,,,2012-07-12,48.7,12736.290039,1352.459961 +2012-07-10,123.720001,,,2012-07-13,49.34,12653.120117,1341.469971 +2012-07-11,123.730003,,,2012-07-16,49.34,12604.530273,1341.449951 +2012-07-12,123.110001,,,2012-07-17,49.48,12573.269531,1334.76001 +2012-07-13,125.139999,,,2012-07-18,49.87,12777.089844,1356.780029 +2012-07-16,124.849998,,,2012-07-19,50.34,12727.209961,1353.640015 +2012-07-17,125.779999,,,2012-07-20,49.17,12805.540039,1363.670044 +2012-07-18,126.639999,,,2012-07-23,48.14,12908.700195,1372.780029 +2012-07-19,126.989998,,,2012-07-24,47.62,12943.360352,1376.51001 +2012-07-20,125.720001,,,2012-07-25,47.88,12822.570313,1362.660034 +2012-07-23,124.599998,,,2012-07-26,49.32,12721.459961,1350.52002 +2012-07-24,123.470001,,,2012-07-27,50.39,12617.320313,1338.310059 +2012-07-25,123.440002,,,2012-07-30,50.31,12676.049805,1337.890015 +2012-07-26,125.480003,,,2012-07-31,50.0,12887.929688,1360.02002 +2012-07-27,127.879997,,,2012-08-01,50.01,13075.660156,1385.969971 +2012-07-30,127.83000200000001,,,2012-08-02,49.31,13073.009766,1385.300049 +2012-07-31,127.269997,,,2012-08-03,50.99,13008.679688,1379.319946 +2012-08-01,126.91999799999999,,,2012-08-06,51.35,12976.129883,1375.319946 +2012-08-02,125.980003,,,2012-08-07,51.82,12878.879883,1365.0 +2012-08-03,128.399994,,,2012-08-08,51.75,13096.169922,1390.98999 +2012-08-06,128.690002,,,2012-08-09,51.78,13117.509766,1394.22998 +2012-08-07,129.350006,,,2012-08-10,51.87,13168.599609,1401.349976 +2012-08-08,129.470001,,,2012-08-13,51.62,13175.639648,1402.219971 +2012-08-09,129.580002,,,2012-08-14,51.74,13165.19043,1402.800049 +2012-08-10,129.869995,,,2012-08-15,51.59,13207.950195,1405.869995 +2012-08-13,129.729996,,,2012-08-16,52.22,13169.429688,1404.109985 +2012-08-14,129.740005,,,2012-08-17,52.3,13172.139648,1403.930054 +2012-08-15,129.929993,,,2012-08-20,52.24,13164.780273,1405.530029 +2012-08-16,130.860001,,,2012-08-21,52.54,13250.110352,1415.51001 +2012-08-17,131.110001,,,2012-08-22,52.48,13275.200195,1418.160034 +2012-08-20,131.100006,,,2012-08-23,52.18,13271.639648,1418.130005 +2012-08-21,130.649994,,,2012-08-24,52.1,13203.580078,1413.170044 +2012-08-22,130.690002,,,2012-08-27,52.13,13172.759766,1413.48999 +2012-08-23,129.630005,,,2012-08-28,52.08,13057.459961,1402.079956 +2012-08-24,130.490005,,,2012-08-29,51.92,13157.969727,1411.130005 +2012-08-27,130.419998,,,2012-08-30,51.15,13124.669922,1410.439941 +2012-08-28,130.330002,,,2012-08-31,51.6,13102.990234,1409.300049 +2012-08-29,130.46000700000002,,,2012-09-04,51.34,13107.480469,1410.48999 +2012-08-30,129.46000700000002,,,2012-09-05,51.2,13000.709961,1399.47998 +2012-08-31,130.119995,,,2012-09-06,52.46,13090.839844,1406.579956 +2012-09-04,129.970001,,,2012-09-07,53.26,13035.94043,1404.939941 +2012-09-05,129.869995,,,2012-09-10,52.84,13047.480469,1403.439941 +2012-09-06,132.53999299999998,,,2012-09-11,53.44,13292.0,1432.119995 +2012-09-07,133.080002,,,2012-09-12,53.79,13306.639648,1437.920044 +2012-09-10,132.270004,,,2012-09-13,54.62,13254.290039,1429.079956 +2012-09-11,132.679993,,,2012-09-14,55.15,13323.360352,1433.560059 +2012-09-12,133.0,,,2012-09-17,54.86,13333.349609,1436.560059 +2012-09-13,135.179993,,,2012-09-18,54.63,13539.860352000002,1459.98999 +2012-09-14,135.720001,,,2012-09-19,54.86,13593.370116999999,1465.77002 +2012-09-17,135.300003,,,2012-09-20,54.5,13553.099609,1461.189941 +2012-09-18,135.130005,,,2012-09-21,54.52,13564.639647999998,1459.319946 +2012-09-19,135.28999299999998,,,2012-09-24,54.35,13577.959961000002,1461.050049 +2012-09-20,135.240005,,,2012-09-25,54.0,13596.929688,1460.26001 +2012-09-21,134.570007,,,2012-09-26,53.45,13579.469727000002,1460.150024 +2012-09-24,134.270004,,,2012-09-27,54.07,13558.919922,1456.890015 +2012-09-25,132.880005,,,2012-09-28,53.0,13457.549805,1441.589966 +2012-09-26,132.139999,,,2012-10-01,53.44,13413.509766,1433.319946 +2012-09-27,133.429993,,,2012-10-02,53.64,13485.969727000002,1447.150024 +2012-09-28,132.830002,,,2012-10-03,53.42,13437.129883000001,1440.670044 +2012-10-01,133.179993,,,2012-10-04,54.06,13515.110352000002,1444.48999 +2012-10-02,133.309998,,,2012-10-05,54.14,13482.360352000002,1445.75 +2012-10-03,133.820007,,,2012-10-08,53.82,13494.610352000002,1450.98999 +2012-10-04,134.779999,,,2012-10-09,53.04,13575.360352000002,1461.400024 +2012-10-05,134.779999,,,2012-10-10,52.89,13610.150391,1460.930054 +2012-10-08,134.320007,,,2012-10-11,53.23,13583.650391,1455.880005 +2012-10-09,132.990005,,,2012-10-12,53.17,13473.530272999998,1441.47998 +2012-10-10,132.179993,,,2012-10-15,53.69,13344.969727,1432.560059 +2012-10-11,132.229996,,,2012-10-16,54.59,13326.389648,1432.839966 +2012-10-12,131.830002,,,2012-10-17,55.09,13328.849609,1428.589966 +2012-10-15,132.899994,,,2012-10-18,54.86,13424.230469,1440.130005 +2012-10-16,134.259995,,,2012-10-19,54.11,13551.780272999998,1454.920044 +2012-10-17,134.830002,,,2012-10-22,54.52,13557.0,1460.910034 +2012-10-18,134.509995,,,2012-10-23,53.35,13548.94043,1457.339966 +2012-10-19,132.279999,,,2012-10-24,53.38,13343.509766,1433.189941 +2012-10-22,132.33999599999999,,,2012-10-25,53.7,13345.889648,1433.819946 +2012-10-23,130.429993,,,2012-10-26,53.61,13102.530273,1413.109985 +2012-10-24,130.029999,,,2012-10-31,53.57,13077.339844,1408.75 +2012-10-25,130.419998,,,2012-11-01,54.21,13103.679688,1412.969971 +2012-10-26,130.320007,,,2012-11-02,53.66,13107.209961,1411.939941 +2012-10-31,130.360001,,,2012-11-05,53.56,13096.459961,1412.160034 +2012-11-01,131.78999299999998,,,2012-11-06,54.07,13232.620117,1427.589966 +2012-11-02,130.550003,,,2012-11-07,53.26,13093.160156,1414.199951 +2012-11-05,130.850006,,,2012-11-08,52.8,13112.44043,1417.26001 +2012-11-06,131.880005,,,2012-11-09,52.8,13245.679688,1428.390015 +2012-11-07,128.869995,,,2012-11-12,52.78,12932.730469,1394.530029 +2012-11-08,127.300003,,,2012-11-13,52.49,12811.320313,1377.51001 +2012-11-09,127.519997,,,2012-11-14,51.96,12815.389648,1379.849976 +2012-11-12,127.529999,,,2012-11-15,52.1,12815.080078,1380.030029 +2012-11-13,127.07,,,2012-11-16,52.09,12756.179688,1374.530029 +2012-11-14,125.349998,,,2012-11-19,53.19,12570.950195,1355.48999 +2012-11-15,125.160004,,,2012-11-20,53.3,12542.379883,1353.329956 +2012-11-16,125.779999,,,2012-11-21,53.39,12588.30957,1359.880005 +2012-11-19,128.279999,,,2012-11-23,54.54,12795.959961,1386.890015 +2012-11-20,128.380005,,,2012-11-26,54.41,12788.509766,1387.810059 +2012-11-21,128.679993,,,2012-11-27,54.14,12836.889648,1391.030029 +2012-11-23,130.369995,,,2012-11-28,54.53,13009.530273,1409.150024 +2012-11-26,130.110001,,,2012-11-29,55.0,12967.370117,1406.290039 +2012-11-27,129.440002,,,2012-11-30,55.07,12878.129883,1398.939941 +2012-11-28,130.490005,,,2012-12-03,55.14,12985.110352,1409.930054 +2012-11-29,131.070007,,,2012-12-04,55.28,13021.820313,1415.949951 +2012-11-30,131.08999599999999,,,2012-12-05,55.36,13025.580078,1416.180054 +2012-12-03,130.479996,,,2012-12-06,55.47,12965.599609,1409.459961 +2012-12-04,130.259995,,,2012-12-07,55.5,12951.780273,1407.050049 +2012-12-05,130.509995,,,2012-12-10,55.55,13034.490234,1409.280029 +2012-12-06,130.970001,,,2012-12-11,55.87,13074.040039,1413.939941 +2012-12-07,131.360001,,,2012-12-12,56.05,13155.129883,1418.069946 +2012-12-10,131.41000400000001,,,2012-12-13,55.88,13169.879883,1418.550049 +2012-12-11,132.270004,,,2012-12-14,56.08,13248.44043,1427.839966 +2012-12-12,132.360001,,,2012-12-17,56.32,13245.450195,1428.47998 +2012-12-13,131.559998,,,2012-12-18,56.28,13170.719727,1419.449951 +2012-12-14,131.020004,,,2012-12-19,56.48,13135.009766,1413.579956 +2012-12-17,132.570007,,,2012-12-20,56.86,13235.389648,1430.359985 +2012-12-18,134.100006,,,2012-12-21,56.51,13350.959961,1446.790039 +2012-12-19,133.08999599999999,,,2012-12-24,56.36,13251.969727,1435.810059 +2012-12-20,133.83999599999999,,,2012-12-26,56.35,13311.719727,1443.689941 +2012-12-21,131.690002,,,2012-12-27,56.61,13190.839844,1430.150024 +2012-12-24,131.380005,,,2012-12-28,56.01,13138.929688,1426.660034 +2012-12-26,130.75,,,2012-12-31,56.86,13114.589844,1419.829956 +2012-12-27,130.619995,,,2013-01-02,57.74,13096.30957,1418.099976 +2012-12-28,129.190002,,,2013-01-03,57.18,12938.110352,1402.430054 +2012-12-31,131.369995,,,2013-01-04,57.47,13104.139648,1426.189941 +2013-01-02,134.740005,,,2013-01-07,57.22,13412.549805,1462.420044 +2013-01-03,134.46000700000002,,,2013-01-08,56.9,13391.360352,1459.369995 +2013-01-04,135.110001,,,2013-01-09,57.19,13435.209961000002,1466.469971 +2013-01-07,134.690002,,,2013-01-10,57.92,13384.290039,1461.890015 +2013-01-08,134.300003,,,2013-01-11,58.04,13328.849609,1457.150024 +2013-01-09,134.649994,,,2013-01-14,58.11,13390.509766,1461.02002 +2013-01-10,135.679993,,,2013-01-15,58.02,13471.219727000002,1472.119995 +2013-01-11,135.679993,,,2013-01-16,57.74,13488.429688,1472.050049 +2013-01-14,135.559998,,,2013-01-17,58.21,13507.320313,1470.680054 +2013-01-15,135.71000700000002,,,2013-01-18,58.15,13534.889647999998,1472.339966 +2013-01-16,135.75,,,2013-01-22,58.18,13511.230469,1472.630005 +2013-01-17,136.520004,,,2013-01-23,58.12,13596.019531,1480.939941 +2013-01-18,136.979996,,,2013-01-24,58.4,13649.700195,1485.97998 +2013-01-22,137.600006,,,2013-01-25,59.03,13712.209961000002,1492.560059 +2013-01-23,137.800003,,,2013-01-28,58.74,13779.330078,1494.810059 +2013-01-24,137.809998,,,2013-01-29,59.14,13825.330078,1494.819946 +2013-01-25,138.559998,,,2013-01-30,59.2,13895.980469,1502.959961 +2013-01-28,138.309998,,,2013-01-31,58.98,13881.929688,1500.180054 +2013-01-29,139.020004,,,2013-02-01,59.45,13954.419922,1507.839966 +2013-01-30,138.509995,,,2013-02-04,58.38,13910.419922,1501.959961 +2013-01-31,138.169998,,,2013-02-05,58.65,13860.580078,1498.109985 +2013-02-01,139.559998,,,2013-02-06,58.64,14009.790038999998,1513.170044 +2013-02-04,137.949997,,,2013-02-07,58.16,13880.080078,1495.709961 +2013-02-05,139.399994,,,2013-02-08,58.53,13979.299805,1511.290039 +2013-02-06,139.490005,,,2013-02-11,58.47,13986.519531,1512.119995 +2013-02-07,139.300003,,,2013-02-12,58.76,13944.049805,1509.390015 +2013-02-08,140.08999599999999,,,2013-02-13,58.9,13992.969727000002,1517.930054 +2013-02-11,140.009995,,,2013-02-14,58.58,13971.240234,1517.01001 +2013-02-12,140.240005,,,2013-02-15,58.43,14018.700195,1519.430054 +2013-02-13,140.380005,,,2013-02-19,59.12,13982.910156,1520.329956 +2013-02-14,140.5,,,2013-02-20,58.54,13973.389647999998,1521.380005 +2013-02-15,140.360001,,,2013-02-21,57.66,13981.759766,1519.790039 +2013-02-19,141.41000400000001,,,2013-02-22,58.49,14035.669922,1530.939941 +2013-02-20,139.66000400000001,,,2013-02-25,57.09,13927.540038999998,1511.949951 +2013-02-21,138.809998,,,2013-02-26,57.55,13880.620116999999,1502.420044 +2013-02-22,140.050003,,,2013-02-27,58.28,14000.570313,1515.599976 +2013-02-25,137.490005,,,2013-02-28,58.22,13784.169922,1487.849976 +2013-02-26,138.33999599999999,,,2013-03-01,58.1,13900.129883000001,1496.939941 +2013-02-27,140.139999,,,2013-03-04,58.35,14075.370116999999,1515.98999 +2013-02-28,140.020004,,,2013-03-05,58.93,14054.490234,1514.680054 +2013-03-01,140.350006,,,2013-03-06,59.08,14089.660156,1518.199951 +2013-03-04,141.0,,,2013-03-07,59.25,14127.820313,1525.199951 +2013-03-05,142.350006,,,2013-03-08,59.38,14253.769531,1539.790039 +2013-03-06,142.53999299999998,,,2013-03-11,59.56,14296.240234,1541.459961 +2013-03-07,142.820007,,,2013-03-12,59.26,14329.490234,1544.26001 +2013-03-08,143.470001,,,2013-03-13,59.16,14397.070313,1551.180054 +2013-03-11,143.940002,,,2013-03-14,59.75,14447.290038999998,1556.219971 +2013-03-12,143.600006,,,2013-03-15,59.87,14450.05957,1552.47998 +2013-03-13,143.83999599999999,,,2013-03-18,59.21,14455.280272999998,1554.52002 +2013-03-14,144.649994,,,2013-03-19,59.03,14539.139647999998,1563.22998 +2013-03-15,144.41000400000001,,,2013-03-20,59.39,14514.110352000002,1560.699951 +2013-03-18,143.619995,,,2013-03-21,58.85,14452.05957,1552.099976 +2013-03-19,143.270004,,,2013-03-22,59.36,14455.820313,1548.339966 +2013-03-20,144.229996,,,2013-03-25,58.62,14511.730469,1558.709961 +2013-03-21,142.399994,,,2013-03-26,58.98,14421.490234,1545.800049 +2013-03-22,143.419998,,,2013-03-27,58.7,14512.030272999998,1556.890015 +2013-03-25,142.940002,,,2013-03-28,58.98,14447.75,1551.689941 +2013-03-26,144.100006,,,2013-04-01,58.17,14559.650391,1563.77002 +2013-03-27,144.029999,,,2013-04-02,58.81,14526.160156,1562.849976 +2013-03-28,144.610001,,,2013-04-03,58.52,14578.540038999998,1569.189941 +2013-04-01,143.970001,,,2013-04-04,59.04,14572.849609,1562.170044 +2013-04-02,144.71000700000002,,,2013-04-05,58.77,14662.009766,1570.25 +2013-04-03,143.21000700000002,,,2013-04-08,59.0,14550.349609,1553.689941 +2013-04-04,143.800003,,,2013-04-09,59.21,14606.110352000002,1559.97998 +2013-04-05,143.179993,,,2013-04-10,60.08,14565.25,1553.280029 +2013-04-08,144.130005,,,2013-04-11,60.56,14613.480469,1563.069946 +2013-04-09,144.639999,,,2013-04-12,60.41,14673.459961000002,1568.609985 +2013-04-10,146.419998,,,2013-04-15,59.22,14802.240234,1587.72998 +2013-04-11,146.940002,,,2013-04-16,60.06,14865.139647999998,1593.369995 +2013-04-12,146.529999,,,2013-04-17,58.81,14865.05957,1588.849976 +2013-04-15,143.169998,,,2013-04-18,58.63,14599.200195,1552.359985 +2013-04-16,145.21000700000002,,,2013-04-19,59.1,14756.780272999998,1574.569946 +2013-04-17,143.130005,,,2013-04-22,59.35,14618.589844,1552.01001 +2013-04-18,142.179993,,,2013-04-23,60.19,14537.139647999998,1541.609985 +2013-04-19,143.440002,,,2013-04-24,60.71,14547.509766,1555.25 +2013-04-22,144.110001,,,2013-04-25,61.03,14567.169922,1562.5 +2013-04-23,145.610001,,,2013-04-26,61.08,14719.459961000002,1578.780029 +2013-04-24,145.630005,,,2013-04-29,61.86,14676.299805,1578.790039 +2013-04-25,146.220001,,,2013-04-30,61.94,14700.799805,1585.160034 +2013-04-26,145.96000700000002,,,2013-05-01,61.57,14712.549805,1582.23999 +2013-04-29,147.009995,,,2013-05-02,61.76,14818.75,1593.609985 +2013-04-30,147.369995,,,2013-05-03,62.55,14839.799805,1597.569946 +2013-05-01,146.009995,,,2013-05-06,62.47,14700.950195,1582.699951 +2013-05-02,147.389999,,,2013-05-07,62.57,14831.580078,1597.589966 +2013-05-03,148.96000700000002,,,2013-05-08,63.23,14973.959961000002,1614.420044 +2013-05-06,149.240005,,,2013-05-09,62.62,14968.889647999998,1617.5 +2013-05-07,150.029999,,,2013-05-10,62.69,15056.200195,1625.959961 +2013-05-08,150.720001,,,2013-05-13,62.66,15105.120116999999,1632.689941 +2013-05-09,150.229996,,,2013-05-14,62.78,15082.620116999999,1626.670044 +2013-05-10,150.880005,,,2013-05-15,63.05,15118.490234,1633.699951 +2013-05-13,150.899994,,,2013-05-16,62.62,15091.679688,1633.77002 +2013-05-14,152.46000700000002,,,2013-05-17,63.05,15215.25,1650.339966 +2013-05-15,153.28999299999998,,,2013-05-20,63.4,15275.69043,1658.780029 +2013-05-16,152.529999,,,2013-05-21,63.53,15233.219727000002,1650.469971 +2013-05-17,154.100006,,,2013-05-22,62.89,15354.400391,1667.469971 +2013-05-20,153.990005,,,2013-05-23,61.99,15335.280272999998,1666.290039 +2013-05-21,154.259995,,,2013-05-24,61.45,15387.580078,1669.160034 +2013-05-22,153.009995,,,2013-05-28,61.61,15307.169922,1655.349976 +2013-05-23,152.580002,,,2013-05-29,61.02,15294.5,1650.51001 +2013-05-24,152.509995,,,2013-05-30,61.26,15303.099609,1649.599976 +2013-05-28,153.46000700000002,,,2013-05-31,60.07,15409.389647999998,1660.060059 +2013-05-29,152.41000400000001,,,2013-06-03,60.3,15302.799805,1648.359985 +2013-05-30,152.990005,,,2013-06-04,60.52,15324.530272999998,1654.410034 +2013-05-31,150.800003,,,2013-06-05,59.17,15115.570313,1630.73999 +2013-06-03,151.71000700000002,,,2013-06-06,59.5,15254.030272999998,1640.420044 +2013-06-04,150.880005,,,2013-06-07,60.3,15177.540038999998,1631.380005 +2013-06-05,148.83999599999999,,,2013-06-10,60.36,14960.589844,1608.900024 +2013-06-06,150.119995,,,2013-06-11,59.62,15040.620116999999,1622.560059 +2013-06-07,152.050003,,,2013-06-12,59.55,15248.120116999999,1643.380005 +2013-06-10,152.0,,,2013-06-13,60.46,15238.589844,1642.810059 +2013-06-11,150.46000700000002,,,2013-06-14,59.8,15122.019531,1626.130005 +2013-06-12,149.229996,,,2013-06-17,60.66,14995.230469,1612.52002 +2013-06-13,151.46000700000002,,,2013-06-18,61.09,15176.080078,1636.359985 +2013-06-14,150.570007,,,2013-06-19,59.95,15070.179688,1626.72998 +2013-06-17,151.71000700000002,,,2013-06-20,57.75,15179.849609,1639.040039 +2013-06-18,152.889999,,,2013-06-21,57.94,15318.230469,1651.810059 +2013-06-19,150.779999,,,2013-06-24,57.03,15112.19043,1628.930054 +2013-06-20,147.029999,,,2013-06-25,57.76,14758.320313,1588.189941 +2013-06-21,146.720001,,,2013-06-26,57.98,14799.400391,1592.430054 +2013-06-24,144.940002,,,2013-06-27,57.41,14659.55957,1573.089966 +2013-06-25,146.330002,,,2013-06-28,57.3,14760.30957,1588.030029 +2013-06-26,147.759995,,,2013-07-01,57.84,14910.139647999998,1603.26001 +2013-06-27,148.690002,,,2013-07-02,57.55,15024.490234,1613.199951 +2013-06-28,148.059998,,,2013-07-03,57.57,14909.599609,1606.280029 +2013-07-01,148.869995,,,2013-07-05,57.84,14974.959961000002,1614.959961 +2013-07-02,148.820007,,,2013-07-08,58.2,14932.410156,1614.079956 +2013-07-03,148.940002,,,2013-07-09,58.52,14988.370116999999,1615.410034 +2013-07-05,150.46000700000002,,,2013-07-10,58.69,15135.839844,1631.890015 +2013-07-08,151.300003,,,2013-07-11,60.21,15224.69043,1640.459961 +2013-07-09,152.389999,,,2013-07-12,59.81,15300.339844,1652.319946 +2013-07-10,152.429993,,,2013-07-15,60.18,15291.660156,1652.619995 +2013-07-11,154.509995,,,2013-07-16,60.14,15460.919922,1675.02002 +2013-07-12,154.979996,,,2013-07-17,60.32,15464.299805,1680.189941 +2013-07-15,155.199997,,,2013-07-18,60.72,15484.259766,1682.5 +2013-07-16,154.619995,,,2013-07-19,60.67,15451.849609,1676.26001 +2013-07-17,155.059998,,,2013-07-22,61.01,15470.519531,1680.910034 +2013-07-18,155.860001,,,2013-07-23,61.14,15548.540038999998,1689.369995 +2013-07-19,156.119995,,,2013-07-24,61.06,15543.740234,1692.089966 +2013-07-22,156.429993,,,2013-07-25,61.18,15545.549805,1695.530029 +2013-07-23,156.139999,,,2013-07-26,60.8,15567.740234,1692.390015 +2013-07-24,155.550003,,,2013-07-29,60.22,15542.240234,1685.939941 +2013-07-25,155.949997,,,2013-07-30,60.21,15555.610352000002,1690.25 +2013-07-26,156.080002,,,2013-07-31,60.35,15558.830078,1691.6500239999998 +2013-07-29,155.5,,,2013-08-01,61.17,15521.969727000002,1685.3299559999998 +2013-07-30,155.570007,,,2013-08-02,61.67,15520.589844,1685.959961 +2013-07-31,155.570007,,,2013-08-05,61.54,15499.540038999998,1685.72998 +2013-08-01,157.529999,,,2013-08-06,61.45,15628.019531,1706.869995 +2013-08-02,157.78999299999998,,,2013-08-07,61.18,15658.360352000002,1709.6700440000002 +2013-08-05,157.570007,,,2013-08-08,61.74,15612.129883000001,1707.140015 +2013-08-06,156.679993,,,2013-08-09,61.84,15518.740234,1697.369995 +2013-08-07,156.130005,,,2013-08-12,61.67,15470.669922,1690.910034 +2013-08-08,156.770004,,,2013-08-13,62.07,15498.320313,1697.47998 +2013-08-09,156.240005,,,2013-08-14,62.1,15425.509766,1691.4200440000002 +2013-08-12,156.059998,,,2013-08-15,61.58,15419.679688,1689.469971 +2013-08-13,156.529999,,,2013-08-16,61.69,15451.009766,1694.160034 +2013-08-14,155.75,,,2013-08-19,61.25,15337.660156,1685.390015 +2013-08-15,153.550003,,,2013-08-20,61.17,15112.19043,1661.319946 +2013-08-16,153.050003,,,2013-08-21,60.45,15081.469727000002,1655.829956 +2013-08-19,152.16000400000001,,,2013-08-22,61.04,15010.740234,1646.060059 +2013-08-20,152.740005,,,2013-08-23,61.57,15002.990234,1652.349976 +2013-08-21,151.860001,,,2013-08-26,61.12,14897.549805,1642.800049 +2013-08-22,153.169998,,,2013-08-27,60.08,14963.740234,1656.959961 +2013-08-23,153.800003,,,2013-08-28,60.01,15010.509766,1663.5 +2013-08-26,153.179993,,,2013-08-29,59.91,14946.459961000002,1656.780029 +2013-08-27,150.75,,,2013-08-30,59.17,14776.129883000001,1630.47998 +2013-08-28,151.190002,,,2013-09-03,60.31,14824.509766,1634.959961 +2013-08-29,151.509995,,,2013-09-04,60.85,14840.950195,1638.170044 +2013-08-30,151.03999299999998,,,2013-09-05,60.8,14810.30957,1632.969971 +2013-09-03,151.679993,,,2013-09-06,61.13,14833.959961000002,1639.77002 +2013-09-04,152.940002,,,2013-09-09,61.97,14930.870116999999,1653.079956 +2013-09-05,153.130005,,,2013-09-10,62.67,14937.480469,1655.079956 +2013-09-06,153.16000400000001,,,2013-09-11,62.89,14922.5,1655.170044 +2013-09-09,154.690002,,,2013-09-12,62.53,15063.120116999999,1671.709961 +2013-09-10,155.830002,,,2013-09-13,62.83,15191.05957,1683.9899899999998 +2013-09-11,156.330002,,,2013-09-16,63.32,15326.599609,1689.130005 +2013-09-12,155.83999599999999,,,2013-09-17,63.36,15300.639647999998,1683.4200440000002 +2013-09-13,156.270004,,,2013-09-18,65.05,15376.05957,1687.9899899999998 +2013-09-16,157.149994,,,2013-09-19,64.74,15494.780272999998,1697.5999760000002 +2013-09-17,157.820007,,,2013-09-20,64.26,15529.730469,1704.7600100000002 +2013-09-18,159.740005,,,2013-09-23,64.25,15676.94043,1725.52002 +2013-09-19,159.470001,,,2013-09-24,64.15,15636.549805,1722.339966 +2013-09-20,157.570007,,,2013-09-25,64.22,15451.089844,1709.910034 +2013-09-23,156.830002,,,2013-09-26,64.49,15401.379883000001,1701.839966 +2013-09-24,156.440002,,,2013-09-27,64.26,15334.589844,1697.4200440000002 +2013-09-25,156.009995,,,2013-09-30,63.8,15273.259766,1692.77002 +2013-09-26,156.58999599999999,,,2013-10-01,64.14,15328.299805,1698.6700440000002 +2013-09-27,155.96000700000002,,,2013-10-02,64.12,15258.240234,1691.75 +2013-09-30,155.020004,,,2013-10-03,63.7,15129.669922,1681.550049 +2013-10-01,156.270004,,,2013-10-04,63.85,15191.700195,1695.0 +2013-10-02,156.190002,,,2013-10-07,63.19,15133.139647999998,1693.869995 +2013-10-03,154.78999299999998,,,2013-10-08,62.7,14996.480469,1678.660034 +2013-10-04,155.889999,,,2013-10-09,62.97,15072.580078,1690.5 +2013-10-07,154.559998,,,2013-10-10,64.1,14936.240234,1676.119995 +2013-10-08,152.699997,,,2013-10-11,64.44,14776.530272999998,1655.449951 +2013-10-09,152.800003,,,2013-10-14,64.66,14802.980469,1656.400024 +2013-10-10,156.16000400000001,,,2013-10-15,64.35,15126.070313,1692.560059 +2013-10-11,157.139999,,,2013-10-16,64.84,15237.110352000002,1703.199951 +2013-10-14,157.779999,,,2013-10-17,65.69,15301.259766,1710.140015 +2013-10-15,156.669998,,,2013-10-18,66.08,15168.009766,1698.060059 +2013-10-16,158.850006,,,2013-10-21,66.18,15373.830078,1721.540039 +2013-10-17,159.929993,,,2013-10-22,66.84,15371.650391,1733.1500239999998 +2013-10-18,160.979996,,,2013-10-23,66.19,15399.650391,1744.5 +2013-10-21,160.990005,,,2013-10-24,66.65,15392.200195,1744.660034 +2013-10-22,161.919998,,,2013-10-25,66.46,15467.660156,1754.6700440000002 +2013-10-23,161.149994,,,2013-10-28,66.35,15413.330078,1746.380005 +2013-10-24,161.679993,,,2013-10-29,66.49,15509.209961000002,1752.069946 +2013-10-25,162.389999,,,2013-10-30,66.25,15570.280272999998,1759.77002 +2013-10-28,162.610001,,,2013-10-31,65.88,15568.929688,1762.109985 +2013-10-29,163.520004,,,2013-11-01,65.56,15680.349609,1771.949951 +2013-10-30,162.740005,,,2013-11-04,65.88,15618.759766,1763.310059 +2013-10-31,162.130005,,,2013-11-05,65.3,15545.75,1756.540039 +2013-11-01,162.58999599999999,,,2013-11-06,65.88,15615.549805,1761.640015 +2013-11-04,163.179993,,,2013-11-07,64.84,15639.120116999999,1767.930054 +2013-11-05,162.729996,,,2013-11-08,65.22,15618.219727000002,1762.969971 +2013-11-06,163.520004,,,2013-11-11,65.36,15746.879883000001,1770.4899899999998 +2013-11-07,161.399994,,,2013-11-12,65.14,15593.980469,1747.1500239999998 +2013-11-08,163.570007,,,2013-11-13,65.35,15761.780272999998,1770.609985 +2013-11-11,163.679993,,,2013-11-14,65.64,15783.099609,1771.890015 +2013-11-12,163.309998,,,2013-11-15,66.18,15750.669922,1767.689941 +2013-11-13,164.669998,,,2013-11-18,66.18,15821.629883000001,1782.0 +2013-11-14,165.5,,,2013-11-19,66.01,15876.219727000002,1790.619995 +2013-11-15,166.199997,,,2013-11-20,65.55,15961.700195,1798.180054 +2013-11-18,165.58999599999999,,,2013-11-21,65.96,15976.019531,1791.530029 +2013-11-19,165.279999,,,2013-11-22,66.15,15967.030272999998,1787.869995 +2013-11-20,164.690002,,,2013-11-25,65.95,15900.820313,1781.369995 +2013-11-21,166.03999299999998,,,2013-11-26,65.95,16009.990234,1795.8499760000002 +2013-11-22,166.880005,,,2013-11-27,66.11,16064.769531,1804.7600100000002 +2013-11-25,166.669998,,,2013-11-29,66.24,16072.540038999998,1802.47998 +2013-11-26,166.720001,,,2013-12-02,65.75,16072.799805,1802.75 +2013-11-27,167.169998,,,2013-12-03,65.29,16097.330078,1807.22998 +2013-11-29,167.03999299999998,,,2013-12-04,64.94,16086.410156,1805.810059 +2013-12-02,166.58999599999999,,,2013-12-05,64.57,16008.769531,1800.9000239999998 +2013-12-03,166.070007,,,2013-12-06,65.37,15914.620116999999,1795.1500239999998 +2013-12-04,165.899994,,,2013-12-09,65.3,15889.769531,1792.810059 +2013-12-05,165.179993,,,2013-12-10,65.19,15821.509766,1785.030029 +2013-12-06,167.050003,,,2013-12-11,64.58,16020.200195,1805.089966 +2013-12-09,167.360001,,,2013-12-12,64.11,16025.530272999998,1808.369995 +2013-12-10,166.830002,,,2013-12-13,64.07,15973.129883000001,1802.619995 +2013-12-11,164.96000700000002,,,2013-12-16,64.53,15843.530272999998,1782.219971 +2013-12-12,164.380005,,,2013-12-17,64.25,15739.429688,1775.5 +2013-12-13,164.360001,,,2013-12-18,64.7,15755.360352000002,1775.319946 +2013-12-16,165.399994,,,2013-12-19,64.7,15884.570313,1786.540039 +2013-12-17,164.889999,,,2013-12-20,65.07,15875.259766,1781.0 +2013-12-18,167.639999,,,2013-12-23,65.74,16167.969727000002,1810.6500239999998 +2013-12-19,167.559998,,,2013-12-24,65.87,16179.080078,1809.5999760000002 +2013-12-20,168.380005,,,2013-12-26,66.23,16221.139647999998,1818.319946 +2013-12-23,168.419998,,,2013-12-27,66.57,16294.610352000002,1827.9899899999998 +2013-12-24,168.929993,,,2013-12-30,66.85,16357.549805,1833.319946 +2013-12-26,169.729996,,,2013-12-31,67.1,16479.880859,1842.02002 +2013-12-27,169.699997,,,2014-01-02,65.91,16478.410156,1841.4000239999998 +2013-12-30,169.679993,,,2014-01-03,65.98,16504.289063,1841.069946 +2013-12-31,170.360001,,,2014-01-06,65.9,16576.660156,1848.359985 +2014-01-02,168.880005,,,2014-01-07,66.27,16441.349609,1831.97998 +2014-01-03,168.820007,,,2014-01-08,66.25,16469.990234,1831.369995 +2014-01-06,168.399994,,,2014-01-09,66.2,16425.099609,1826.77002 +2014-01-07,169.419998,,,2014-01-10,66.81,16530.939453,1837.880005 +2014-01-08,169.440002,,,2014-01-13,66.23,16462.740234,1837.4899899999998 +2014-01-09,169.5,,,2014-01-14,66.76,16444.759766,1838.130005 +2014-01-10,169.889999,,,2014-01-15,67.04,16437.050781,1842.369995 +2014-01-13,167.770004,,,2014-01-16,67.01,16257.94043,1819.199951 +2014-01-14,169.580002,,,2014-01-17,66.81,16373.860352000002,1838.880005 +2014-01-15,170.46000700000002,,,2014-01-21,67.13,16481.939453,1848.380005 +2014-01-16,170.229996,,,2014-01-22,67.13,16417.009766,1845.890015 +2014-01-17,169.580002,,,2014-01-23,66.68,16458.560547,1838.699951 +2014-01-21,170.050003,,,2014-01-24,64.85,16414.439453,1843.800049 +2014-01-22,170.16000400000001,,,2014-01-27,64.55,16373.339844,1844.859985 +2014-01-23,168.649994,,,2014-01-28,65.11,16197.349609,1828.459961 +2014-01-24,165.130005,,,2014-01-29,64.38,15879.110352000002,1790.290039 +2014-01-27,164.330002,,,2014-01-30,64.71,15837.879883000001,1781.560059 +2014-01-28,165.33999599999999,,,2014-01-31,63.61,15928.55957,1792.5 +2014-01-29,163.669998,,,2014-02-03,62.31,15738.790038999998,1774.199951 +2014-01-30,165.520004,,,2014-02-04,63.03,15848.610352000002,1794.189941 +2014-01-31,164.449997,,,2014-02-05,63.16,15698.849609,1782.589966 +2014-02-03,160.690002,,,2014-02-06,64.28,15372.799805,1741.890015 +2014-02-04,161.929993,,,2014-02-07,65.12,15445.240234,1755.199951 +2014-02-05,161.649994,,,2014-02-10,64.9,15440.230469,1751.640015 +2014-02-06,163.740005,,,2014-02-11,65.93,15628.530272999998,1773.430054 +2014-02-07,165.919998,,,2014-02-12,66.04,15794.080078,1797.02002 +2014-02-10,166.179993,,,2014-02-13,66.24,15801.790038999998,1799.839966 +2014-02-11,168.020004,,,2014-02-14,66.49,15994.769531,1819.75 +2014-02-12,168.059998,,,2014-02-18,67.06,15963.94043,1819.2600100000002 +2014-02-13,169.050003,,,2014-02-19,66.61,16027.589844,1829.8299559999998 +2014-02-14,169.880005,,,2014-02-20,66.84,16154.389647999998,1838.630005 +2014-02-18,170.100006,,,2014-02-21,66.97,16130.400391,1840.7600100000002 +2014-02-19,169.0,,,2014-02-24,67.55,16040.55957,1828.75 +2014-02-20,170.050003,,,2014-02-25,67.39,16133.230469,1839.780029 +2014-02-21,169.75,,,2014-02-26,67.16,16103.299805,1836.25 +2014-02-24,170.800003,,,2014-02-27,67.39,16207.139647999998,1847.609985 +2014-02-25,170.570007,,,2014-02-28,67.51,16179.660156,1845.119995 +2014-02-26,170.600006,,,2014-03-03,66.08,16198.410156,1845.160034 +2014-02-27,171.470001,,,2014-03-04,67.39,16272.650391,1854.290039 +2014-02-28,171.949997,,,2014-03-05,67.33,16321.709961000002,1859.449951 +2014-03-03,170.690002,,,2014-03-06,68.03,16168.030272999998,1845.72998 +2014-03-04,173.28999299999998,,,2014-03-07,67.66,16395.880859,1873.910034 +2014-03-05,173.320007,,,2014-03-10,67.24,16360.179688,1873.810059 +2014-03-06,173.649994,,,2014-03-11,66.75,16421.890625,1877.030029 +2014-03-07,173.75,,,2014-03-12,66.5,16452.720703,1878.040039 +2014-03-10,173.679993,,,2014-03-13,65.26,16418.679688,1877.1700440000002 +2014-03-11,172.800003,,,2014-03-14,65.12,16351.25,1867.630005 +2014-03-12,172.899994,,,2014-03-17,65.94,16340.080078,1868.199951 +2014-03-13,170.899994,,,2014-03-18,66.35,16108.889647999998,1846.339966 +2014-03-14,170.419998,,,2014-03-19,65.54,16065.669922,1841.130005 +2014-03-17,172.050003,,,2014-03-20,65.29,16247.219727000002,1858.8299559999998 +2014-03-18,173.300003,,,2014-03-21,65.16,16336.19043,1872.25 +2014-03-19,172.240005,,,2014-03-24,65.33,16222.169922,1860.77002 +2014-03-20,173.279999,,,2014-03-25,66.04,16331.049805,1872.0100100000002 +2014-03-21,172.03999299999998,,,2014-03-26,66.03,16302.769531,1866.52002 +2014-03-24,171.199997,,,2014-03-27,66.36,16276.69043,1857.439941 +2014-03-25,171.970001,,,2014-03-28,66.86,16367.879883000001,1865.619995 +2014-03-26,170.770004,,,2014-03-31,67.2,16268.990234,1852.560059 +2014-03-27,170.470001,,,2014-04-01,67.63,16264.230469,1849.040039 +2014-03-28,171.270004,,,2014-04-02,67.76,16323.05957,1857.619995 +2014-03-31,172.630005,,,2014-04-03,67.57,16457.660156,1872.339966 +2014-04-01,173.860001,,,2014-04-04,67.36,16532.609375,1885.52002 +2014-04-02,174.380005,,,2014-04-07,67.04,16573.0,1890.9000239999998 +2014-04-03,174.190002,,,2014-04-08,67.0,16572.550781,1888.77002 +2014-04-04,172.009995,,,2014-04-09,67.86,16412.710938,1865.089966 +2014-04-07,170.16000400000001,,,2014-04-10,66.66,16245.870116999999,1845.040039 +2014-04-08,170.850006,,,2014-04-11,66.26,16256.139647999998,1851.959961 +2014-04-09,172.729996,,,2014-04-14,66.64,16437.179688,1872.180054 +2014-04-10,169.130005,,,2014-04-15,66.36,16170.219727000002,1833.0799559999998 +2014-04-11,167.53999299999998,,,2014-04-16,67.18,16026.75,1815.689941 +2014-04-14,168.91000400000001,,,2014-04-17,67.53,16173.240234,1830.609985 +2014-04-15,170.050003,,,2014-04-21,67.62,16262.55957,1842.97998 +2014-04-16,171.83999599999999,,,2014-04-22,67.9,16424.849609,1862.310059 +2014-04-17,172.080002,,,2014-04-23,67.74,16408.539063,1864.8499760000002 +2014-04-21,172.729996,,,2014-04-24,67.73,16449.25,1871.890015 +2014-04-22,173.440002,,,2014-04-25,67.4,16514.369141,1879.550049 +2014-04-23,173.080002,,,2014-04-28,67.61,16501.650391,1875.390015 +2014-04-24,173.369995,,,2014-04-29,68.05,16501.650391,1878.609985 +2014-04-25,171.970001,,,2014-04-30,68.32,16361.459961000002,1863.4000239999998 +2014-04-28,172.53999299999998,,,2014-05-01,68.51,16448.740234,1869.430054 +2014-04-29,173.360001,,,2014-05-02,68.4,16535.369141,1878.3299559999998 +2014-04-30,173.880005,,,2014-05-05,68.35,16580.839844,1883.949951 +2014-05-01,173.869995,,,2014-05-06,68.23,16558.869141,1883.680054 +2014-05-02,173.630005,,,2014-05-07,68.31,16512.890625,1881.140015 +2014-05-05,173.970001,,,2014-05-08,68.32,16530.550781,1884.660034 +2014-05-06,172.41000400000001,,,2014-05-09,68.22,16401.019531,1867.719971 +2014-05-07,173.449997,,,2014-05-12,68.67,16518.539063,1878.209961 +2014-05-08,173.259995,,,2014-05-13,68.77,16550.970703,1875.630005 +2014-05-09,173.550003,,,2014-05-14,68.64,16583.339844,1878.47998 +2014-05-12,175.229996,,,2014-05-15,68.34,16695.470703,1896.6500239999998 +2014-05-13,175.350006,,,2014-05-16,68.49,16715.439453,1897.449951 +2014-05-14,174.559998,,,2014-05-19,68.35,16613.970703,1888.530029 +2014-05-15,172.949997,,,2014-05-20,67.92,16446.810547,1870.8499760000002 +2014-05-16,173.600006,,,2014-05-21,68.45,16491.310547,1877.859985 +2014-05-19,174.279999,,,2014-05-22,68.54,16511.859375,1885.0799559999998 +2014-05-20,173.149994,,,2014-05-23,68.72,16374.30957,1872.8299559999998 +2014-05-21,174.580002,,,2014-05-27,69.21,16533.060547,1888.030029 +2014-05-22,175.020004,,,2014-05-28,68.98,16543.080078,1892.4899899999998 +2014-05-23,175.759995,,,2014-05-29,69.4,16606.269531,1900.530029 +2014-05-27,176.809998,,,2014-05-30,69.41,16675.5,1911.910034 +2014-05-28,176.639999,,,2014-06-02,69.55,16633.179688,1909.780029 +2014-05-29,177.610001,,,2014-06-03,69.38,16698.740234,1920.030029 +2014-05-30,177.940002,,,2014-06-04,69.36,16717.169922,1923.569946 +2014-06-02,178.08999599999999,,,2014-06-05,69.84,16743.630859,1924.969971 +2014-06-03,178.029999,,,2014-06-06,70.22,16722.339844,1924.2399899999998 +2014-06-04,178.389999,,,2014-06-09,70.15,16737.529297,1927.880005 +2014-06-05,179.570007,,,2014-06-10,70.0,16836.109375,1940.459961 +2014-06-06,180.429993,,,2014-06-11,69.65,16924.279297,1949.439941 +2014-06-09,180.600006,,,2014-06-12,69.67,16943.099609,1951.27002 +2014-06-10,180.559998,,,2014-06-13,69.72,16945.919922,1950.790039 +2014-06-11,179.940002,,,2014-06-16,69.74,16843.880859,1943.890015 +2014-06-12,178.71000700000002,,,2014-06-17,69.69,16734.189453,1930.109985 +2014-06-13,179.270004,,,2014-06-18,70.29,16775.740234,1936.160034 +2014-06-16,179.419998,,,2014-06-19,70.67,16781.009766,1937.780029 +2014-06-17,179.809998,,,2014-06-20,70.55,16808.490234,1941.9899899999998 +2014-06-18,181.199997,,,2014-06-23,70.36,16906.619141,1956.97998 +2014-06-19,181.46000700000002,,,2014-06-24,69.92,16921.460938,1959.47998 +2014-06-20,181.009995,,,2014-06-25,68.22,16947.080078,1962.869995 +2014-06-23,180.990005,,,2014-06-26,68.27,16937.259766,1962.609985 +2014-06-24,179.83999599999999,,,2014-06-27,68.31,16818.130859,1949.97998 +2014-06-25,180.720001,,,2014-06-30,68.37,16867.509766,1959.530029 +2014-06-26,180.53999299999998,,,2014-07-01,68.97,16846.130859,1957.219971 +2014-06-27,180.889999,,,2014-07-02,69.08,16851.839844,1960.959961 +2014-06-30,180.830002,,,2014-07-03,69.22,16826.599609,1960.22998 +2014-07-01,182.070007,,,2014-07-07,68.68,16956.070313,1973.319946 +2014-07-02,182.199997,,,2014-07-08,67.96,16976.240234,1974.619995 +2014-07-03,183.199997,,,2014-07-09,68.18,17068.259766,1985.439941 +2014-07-07,182.479996,,,2014-07-10,67.43,17024.210938,1977.6500239999998 +2014-07-08,181.25,,,2014-07-11,67.47,16906.619141,1963.709961 +2014-07-09,182.100006,,,2014-07-14,67.97,16985.609375,1972.8299559999998 +2014-07-10,181.350006,,,2014-07-15,67.8,16915.070313,1964.680054 +2014-07-11,181.630005,,,2014-07-16,68.22,16943.810547,1967.569946 +2014-07-14,182.509995,,,2014-07-17,67.35,17055.419922,1977.0999760000002 +2014-07-15,182.16000400000001,,,2014-07-18,67.88,17060.679688,1973.280029 +2014-07-16,182.949997,,,2014-07-21,67.63,17138.199219,1981.569946 +2014-07-17,180.800003,,,2014-07-22,67.93,16976.810547,1958.119995 +2014-07-18,182.649994,,,2014-07-23,68.07,17100.179688,1978.219971 +2014-07-21,182.229996,,,2014-07-24,68.23,17051.730469,1973.630005 +2014-07-22,183.149994,,,2014-07-25,67.95,17113.539063,1983.530029 +2014-07-23,183.470001,,,2014-07-28,67.96,17086.630859,1987.0100100000002 +2014-07-24,183.559998,,,2014-07-29,67.82,17083.800781,1987.97998 +2014-07-25,182.669998,,,2014-07-30,67.72,16960.570313,1978.339966 +2014-07-28,182.720001,,,2014-07-31,66.59,16982.589844,1978.910034 +2014-07-29,181.899994,,,2014-08-01,66.13,16912.109375,1969.949951 +2014-07-30,181.940002,,,2014-08-04,66.44,16880.359375,1970.069946 +2014-07-31,178.320007,,,2014-08-05,65.59,16563.300781,1930.6700440000002 +2014-08-01,177.809998,,,2014-08-06,65.43,16493.369141,1925.1500239999998 +2014-08-04,179.080002,,,2014-08-07,64.9,16569.279297,1938.9899899999998 +2014-08-05,177.360001,,,2014-08-08,65.28,16429.470703,1920.209961 +2014-08-06,177.419998,,,2014-08-11,65.53,16443.339844,1920.2399899999998 +2014-08-07,176.479996,,,2014-08-12,65.48,16368.269531,1909.569946 +2014-08-08,178.509995,,,2014-08-13,65.85,16553.929688,1931.589966 +2014-08-11,179.03999299999998,,,2014-08-14,66.2,16569.980469,1936.9200440000002 +2014-08-12,178.75,,,2014-08-15,66.13,16560.539063,1933.75 +2014-08-13,180.0,,,2014-08-18,66.56,16651.800781,1946.719971 +2014-08-14,180.78999299999998,,,2014-08-19,66.72,16713.580078,1955.180054 +2014-08-15,180.800003,,,2014-08-20,66.51,16662.910156,1955.060059 +2014-08-18,182.350006,,,2014-08-21,66.79,16838.740234,1971.7399899999998 +2014-08-19,183.300003,,,2014-08-22,66.47,16919.589844,1981.5999760000002 +2014-08-20,183.759995,,,2014-08-25,66.9,16979.130859,1986.5100100000002 +2014-08-21,184.309998,,,2014-08-26,66.91,17039.490234,1992.369995 +2014-08-22,183.970001,,,2014-08-27,67.04,17001.220703,1988.4000239999998 +2014-08-25,184.850006,,,2014-08-28,66.74,17076.869141,1997.9200440000002 +2014-08-26,185.03999299999998,,,2014-08-29,66.71,17106.699219,2000.02002 +2014-08-27,185.08999599999999,,,2014-09-02,66.84,17122.009766,2000.119995 +2014-08-28,184.800003,,,2014-09-03,67.31,17079.570313,1996.7399899999998 +2014-08-29,185.429993,,,2014-09-04,66.99,17098.449219,2003.369995 +2014-09-02,185.330002,,,2014-09-05,67.0,17067.560547,2002.280029 +2014-09-03,185.220001,,,2014-09-08,66.29,17078.279297,2000.719971 +2014-09-04,184.940002,,,2014-09-09,66.1,17069.580078,1997.6500239999998 +2014-09-05,185.869995,,,2014-09-10,66.48,17137.359375,2007.709961 +2014-09-08,185.330002,,,2014-09-11,66.11,17111.419922,2001.540039 +2014-09-09,184.119995,,,2014-09-12,66.02,17013.869141,1988.439941 +2014-09-10,184.809998,,,2014-09-15,65.88,17068.710938,1995.689941 +2014-09-11,185.020004,,,2014-09-16,66.16,17049.0,1997.449951 +2014-09-12,183.919998,,,2014-09-17,65.69,16987.509766,1985.540039 +2014-09-15,183.78999299999998,,,2014-09-18,66.2,17031.140625,1984.130005 +2014-09-16,185.169998,,,2014-09-19,65.97,17131.970703,1998.97998 +2014-09-17,185.41000400000001,,,2014-09-22,65.68,17156.849609,2001.569946 +2014-09-18,186.350006,,,2014-09-23,65.13,17265.990234,2011.359985 +2014-09-19,185.429993,,,2014-09-24,65.46,17279.740234,2010.4000239999998 +2014-09-22,183.940002,,,2014-09-25,64.5,17172.679688,1994.290039 +2014-09-23,182.899994,,,2014-09-26,64.77,17055.869141,1982.77002 +2014-09-24,184.330002,,,2014-09-29,64.17,17210.060547,1998.300049 +2014-09-25,181.350006,,,2014-09-30,64.12,16945.800781,1965.9899899999998 +2014-09-26,182.940002,,,2014-10-01,63.36,17113.150391,1982.8499760000002 +2014-09-29,182.490005,,,2014-10-02,62.68,17071.220703,1977.800049 +2014-09-30,181.990005,,,2014-10-03,62.68,17042.900391,1972.290039 +2014-10-01,179.58999599999999,,,2014-10-06,63.08,16804.710938,1946.160034 +2014-10-02,179.610001,,,2014-10-07,62.01,16801.050781,1946.1700440000002 +2014-10-03,181.610001,,,2014-10-08,62.99,17009.689453,1967.9000239999998 +2014-10-06,181.330002,,,2014-10-09,61.3,16991.910156,1964.819946 +2014-10-07,178.58999599999999,,,2014-10-10,60.38,16719.390625,1935.0999760000002 +2014-10-08,181.770004,,,2014-10-13,60.3,16994.220703,1968.890015 +2014-10-09,178.020004,,,2014-10-14,60.45,16659.25,1928.209961 +2014-10-10,176.0,,,2014-10-15,60.09,16544.099609,1906.130005 +2014-10-13,173.100006,,,2014-10-16,59.53,16321.070313,1874.7399899999998 +2014-10-14,173.380005,,,2014-10-17,60.64,16315.19043,1877.699951 +2014-10-15,171.979996,,,2014-10-20,61.02,16141.740234,1862.4899899999998 +2014-10-16,172.009995,,,2014-10-21,61.75,16117.240234,1862.7600100000002 +2014-10-17,174.229996,,,2014-10-22,61.3,16380.410156,1886.7600100000002 +2014-10-20,175.830002,,,2014-10-23,61.89,16399.669922,1904.0100100000002 +2014-10-21,179.270004,,,2014-10-24,62.23,16614.810547,1941.280029 +2014-10-22,177.979996,,,2014-10-27,61.88,16461.320313,1927.109985 +2014-10-23,180.169998,,,2014-10-28,62.82,16677.900391,1950.819946 +2014-10-24,181.440002,,,2014-10-29,62.34,16805.410156,1964.5799559999998 +2014-10-27,181.169998,,,2014-10-30,62.79,16817.939453,1961.630005 +2014-10-28,183.330002,,,2014-10-31,63.95,17005.75,1985.050049 +2014-10-29,183.08999599999999,,,2014-11-03,63.4,16974.310547,1982.300049 +2014-10-30,184.240005,,,2014-11-04,63.04,17195.419922,1994.6500239999998 +2014-10-31,186.399994,,,2014-11-05,63.16,17390.519531,2018.050049 +2014-11-03,186.380005,,,2014-11-06,62.82,17366.240234,2017.810059 +2014-11-04,185.850006,,,2014-11-07,62.85,17383.839844,2012.0999760000002 +2014-11-05,186.979996,,,2014-11-10,63.13,17484.529297,2023.569946 +2014-11-06,187.740005,,,2014-11-11,63.51,17554.470703,2031.209961 +2014-11-07,187.83999599999999,,,2014-11-12,62.97,17573.929688,2031.9200440000002 +2014-11-10,188.440002,,,2014-11-13,63.27,17613.740234,2038.2600100000002 +2014-11-11,188.570007,,,2014-11-14,63.36,17614.900391,2039.680054 +2014-11-12,188.490005,,,2014-11-17,63.11,17612.199219,2038.25 +2014-11-13,188.600006,,,2014-11-18,63.8,17652.789063,2039.3299559999998 +2014-11-14,188.669998,,,2014-11-19,63.61,17634.740234,2039.819946 +2014-11-17,188.820007,,,2014-11-20,63.23,17647.75,2041.319946 +2014-11-18,189.820007,,,2014-11-21,63.78,17687.820313,2051.800049 +2014-11-19,189.550003,,,2014-11-24,64.15,17685.730469,2048.719971 +2014-11-20,189.929993,,,2014-11-25,64.26,17719.0,2052.75 +2014-11-21,190.949997,,,2014-11-26,64.51,17810.060547,2063.5 +2014-11-24,191.5,,,2014-11-28,63.99,17817.900391,2069.409912 +2014-11-25,191.300003,,,2014-12-01,63.93,17814.939453,2067.030029 +2014-11-26,191.880005,,,2014-12-02,64.11,17827.75,2072.830078 +2014-11-28,191.399994,,,2014-12-03,64.03,17828.240234,2067.560059 +2014-12-01,190.100006,,,2014-12-04,63.82,17776.800781,2053.439941 +2014-12-02,191.330002,,,2014-12-05,63.96,17879.550781,2066.550049 +2014-12-03,192.100006,,,2014-12-08,63.4,17912.619141,2074.330078 +2014-12-04,191.880005,,,2014-12-09,63.06,17900.099609,2071.919922 +2014-12-05,192.199997,,,2014-12-10,62.26,17958.789063,2075.3701170000004 +2014-12-08,190.830002,,,2014-12-11,62.18,17852.480469,2060.310059 +2014-12-09,190.779999,,,2014-12-12,60.98,17801.199219,2059.820068 +2014-12-10,187.669998,,,2014-12-15,59.97,17533.150391,2026.140015 +2014-12-11,188.570007,,,2014-12-16,60.4,17596.339844,2035.3299559999998 +2014-12-12,185.520004,,,2014-12-17,60.53,17280.830078,2002.3299559999998 +2014-12-15,184.350006,,,2014-12-18,61.61,17180.839844,1989.630005 +2014-12-16,182.78999299999998,,,2014-12-19,61.7,17068.869141,1972.7399899999998 +2014-12-17,185.529999,,,2014-12-22,62.0,17356.869141,2012.890015 +2014-12-18,190.020004,,,2014-12-23,61.8,17778.150391,2061.22998 +2014-12-19,190.889999,,,2014-12-24,62.08,17804.800781,2070.649902 +2014-12-22,191.630005,,,2014-12-26,62.24,17959.439453,2078.540039 +2014-12-23,191.979996,,,2014-12-29,61.79,18024.169922,2082.169922 +2014-12-24,191.96000700000002,,,2014-12-30,61.22,18030.210938,2081.8798829999996 +2014-12-26,192.58999599999999,,,2014-12-31,60.84,18053.710938,2088.77002 +2014-12-29,192.78999299999998,,,2015-01-02,60.58,18038.230469,2090.570068 +2014-12-30,191.869995,,,2015-01-05,59.15,17983.070313,2080.350098 +2014-12-31,189.889999,,,2015-01-06,58.48,17823.070313,2058.899902 +2015-01-02,189.850006,,,2015-01-07,59.13,17832.990234,2058.199951 +2015-01-05,186.389999,,,2015-01-08,59.93,17501.650391,2020.5799559999998 +2015-01-06,184.729996,,,2015-01-09,59.64,17371.640625,2002.609985 +2015-01-07,186.940002,,,2015-01-12,59.5,17584.519531,2025.9000239999998 +2015-01-08,190.279999,,,2015-01-13,59.8,17907.869141,2062.139893 +2015-01-09,188.679993,,,2015-01-14,59.63,17737.369141,2044.810059 +2015-01-12,187.149994,,,2015-01-15,60.01,17640.839844,2028.2600100000002 +2015-01-13,186.690002,,,2015-01-16,60.79,17613.679688,2023.030029 +2015-01-14,185.610001,,,2015-01-20,61.0,17427.089844,2011.27002 +2015-01-15,183.899994,,,2015-01-21,61.48,17320.710938,1992.6700440000002 +2015-01-16,186.369995,,,2015-01-22,61.71,17511.570313,2019.4200440000002 +2015-01-20,186.66000400000001,,,2015-01-23,61.36,17515.230469,2022.550049 +2015-01-21,187.559998,,,2015-01-26,62.2,17554.279297,2032.119995 +2015-01-22,190.429993,,,2015-01-27,62.29,17813.980469,2063.149902 +2015-01-23,189.380005,,,2015-01-28,61.36,17672.599609,2051.820068 +2015-01-26,189.869995,,,2015-01-29,62.2,17678.699219,2057.090088 +2015-01-27,187.330002,,,2015-01-30,61.22,17387.210938,2029.550049 +2015-01-28,184.809998,,,2015-02-02,61.96,17191.369141,2002.160034 +2015-01-29,186.58999599999999,,,2015-02-03,62.95,17416.849609,2021.25 +2015-01-30,184.169998,,,2015-02-04,62.43,17164.949219,1994.9899899999998 +2015-02-02,186.559998,,,2015-02-05,63.29,17361.039063,2020.8499760000002 +2015-02-03,189.25,,,2015-02-06,62.5,17666.400391,2050.030029 +2015-02-04,188.520004,,,2015-02-09,62.2,17673.019531,2041.5100100000002 +2015-02-05,190.5,,,2015-02-10,62.77,17884.880859,2062.52002 +2015-02-06,189.899994,,,2015-02-11,62.43,17824.289063,2055.469971 +2015-02-09,189.100006,,,2015-02-12,63.4,17729.210938,2046.7399899999998 +2015-02-10,191.119995,,,2015-02-13,63.82,17868.759766,2068.590088 +2015-02-11,191.179993,,,2015-02-17,63.97,17862.140625,2068.530029 +2015-02-12,193.070007,,,2015-02-18,64.35,17972.380859,2088.47998 +2015-02-13,193.880005,,,2015-02-19,64.43,18019.349609,2096.98999 +2015-02-17,194.21000700000002,,,2015-02-20,65.03,18047.580078,2100.340088 +2015-02-18,194.16000400000001,,,2015-02-23,64.8,18029.849609,2099.679932 +2015-02-19,193.990005,,,2015-02-24,65.2,17985.769531,2097.449951 +2015-02-20,195.199997,,,2015-02-25,65.25,18140.439453,2110.300049 +2015-02-23,195.139999,,,2015-02-26,65.07,18116.839844,2109.659912 +2015-02-24,195.679993,,,2015-02-27,65.1,18209.189453,2115.47998 +2015-02-25,195.559998,,,2015-03-02,65.2,18224.570313,2113.860107 +2015-02-26,195.309998,,,2015-03-03,64.8,18214.419922,2110.73999 +2015-02-27,194.729996,,,2015-03-04,64.54,18132.699219,2104.5 +2015-03-02,195.929993,,,2015-03-05,64.69,18288.630859,2117.389893 +2015-03-03,195.03999299999998,,,2015-03-06,63.81,18203.369141,2107.780029 +2015-03-04,194.229996,,,2015-03-09,63.91,18096.900391,2098.530029 +2015-03-05,194.470001,,,2015-03-10,62.52,18135.720703,2101.040039 +2015-03-06,191.729996,,,2015-03-11,62.68,17856.779297,2071.26001 +2015-03-09,192.509995,,,2015-03-12,63.46,17995.720703,2079.429932 +2015-03-10,189.25,,,2015-03-13,63.09,17662.939453,2044.160034 +2015-03-11,188.919998,,,2015-03-16,63.8,17635.390625,2040.2399899999998 +2015-03-12,191.350006,,,2015-03-17,63.64,17895.220703,2065.949951 +2015-03-13,190.190002,,,2015-03-18,65.0,17749.310547,2053.399902 +2015-03-16,192.759995,,,2015-03-19,64.24,17977.419922,2081.189941 +2015-03-17,192.119995,,,2015-03-20,65.66,17849.080078,2074.280029 +2015-03-18,194.46000700000002,,,2015-03-23,65.99,18076.189453,2099.5 +2015-03-19,193.520004,,,2015-03-24,65.85,17959.029297,2089.27002 +2015-03-20,194.320007,,,2015-03-25,65.54,18127.650391,2108.100098 +2015-03-23,193.979996,,,2015-03-26,64.97,18116.039063,2104.419922 +2015-03-24,192.809998,,,2015-03-27,65.14,18011.140625,2091.5 +2015-03-25,190.009995,,,2015-03-30,65.18,17718.539063,2061.050049 +2015-03-26,189.559998,,,2015-03-31,64.17,17678.230469,2056.149902 +2015-03-27,190.03999299999998,,,2015-04-01,64.63,17712.660156,2061.02002 +2015-03-30,192.380005,,,2015-04-02,65.19,17976.310547,2086.23999 +2015-03-31,190.71000700000002,,,2015-04-06,65.85,17776.119141,2067.889893 +2015-04-01,189.979996,,,2015-04-07,65.76,17698.179688,2059.689941 +2015-04-02,190.649994,,,2015-04-08,66.04,17763.240234,2066.959961 +2015-04-06,191.91000400000001,,,2015-04-09,66.13,17880.849609,2080.6201170000004 +2015-04-07,191.520004,,,2015-04-10,66.26,17875.419922,2076.330078 +2015-04-08,192.100006,,,2015-04-13,65.84,17902.509766,2081.899902 +2015-04-09,192.96000700000002,,,2015-04-14,66.33,17958.730469,2091.179932 +2015-04-10,193.96000700000002,,,2015-04-15,66.63,18057.650391,2102.060059 +2015-04-13,193.08999599999999,,,2015-04-16,66.81,17977.039063,2092.429932 +2015-04-14,193.399994,,,2015-04-17,65.97,18036.699219,2095.840088 +2015-04-15,194.399994,,,2015-04-20,66.04,18112.609375,2106.6298829999996 +2015-04-16,194.25,,,2015-04-21,66.63,18105.769531,2104.98999 +2015-04-17,192.050003,,,2015-04-22,66.76,17826.300781,2081.179932 +2015-04-20,193.830002,,,2015-04-23,67.01,18034.929688,2100.399902 +2015-04-21,193.53999299999998,,,2015-04-24,67.4,17949.589844,2097.290039 +2015-04-22,194.529999,,,2015-04-27,67.73,18038.269531,2107.959961 +2015-04-23,195.009995,,,2015-04-28,67.81,18058.689453,2112.929932 +2015-04-24,195.449997,,,2015-04-29,67.22,18080.140625,2117.689941 +2015-04-27,194.639999,,,2015-04-30,66.51,18037.970703,2108.919922 +2015-04-28,195.199997,,,2015-05-01,67.25,18110.140625,2114.76001 +2015-04-29,194.479996,,,2015-05-04,67.18,18035.529297,2106.850098 +2015-04-30,192.520004,,,2015-05-05,66.18,17840.519531,2085.51001 +2015-05-01,194.619995,,,2015-05-06,66.35,18024.060547,2108.290039 +2015-05-04,195.190002,,,2015-05-07,66.13,18070.400391,2114.48999 +2015-05-05,192.899994,,,2015-05-08,67.66,17928.199219,2089.459961 +2015-05-06,192.110001,,,2015-05-11,67.07,17841.980469,2080.149902 +2015-05-07,192.880005,,,2015-05-12,67.03,17924.060547,2088.0 +2015-05-08,195.479996,,,2015-05-13,67.53,18191.109375,2116.100098 +2015-05-11,194.520004,,,2015-05-14,68.34,18105.169922,2105.330078 +2015-05-12,193.970001,,,2015-05-15,68.42,18068.230469,2099.1201170000004 +2015-05-13,193.940002,,,2015-05-18,68.19,18060.490234,2098.47998 +2015-05-14,196.050003,,,2015-05-19,67.93,18252.240234,2121.100098 +2015-05-15,196.220001,,,2015-05-20,68.06,18272.560547,2122.72998 +2015-05-18,196.830002,,,2015-05-21,68.42,18298.880859,2129.199951 +2015-05-19,196.740005,,,2015-05-22,67.98,18312.390625,2127.830078 +2015-05-20,196.580002,,,2015-05-26,66.76,18285.400391,2125.850098 +2015-05-21,197.070007,,,2015-05-27,67.41,18285.740234,2130.820068 +2015-05-22,196.630005,,,2015-05-28,67.29,18232.019531,2126.060059 +2015-05-26,194.610001,,,2015-05-29,66.64,18041.539063,2104.199951 +2015-05-27,196.419998,,,2015-06-01,66.46,18162.990234,2123.47998 +2015-05-28,196.199997,,,2015-06-02,66.77,18126.119141,2120.790039 +2015-05-29,194.970001,,,2015-06-03,67.14,18010.679688,2107.389893 +2015-06-01,195.389999,,,2015-06-04,66.42,18040.369141,2111.72998 +2015-06-02,195.199997,,,2015-06-05,65.63,18011.939453,2109.600098 +2015-06-03,195.649994,,,2015-06-08,65.54,18076.269531,2114.070068 +2015-06-04,193.970001,,,2015-06-09,65.18,17905.580078,2095.840088 +2015-06-05,193.690002,,,2015-06-10,66.55,17849.460938,2092.830078 +2015-06-08,192.470001,,,2015-06-11,66.73,17766.550781,2079.280029 +2015-06-09,192.550003,,,2015-06-12,66.2,17764.039063,2080.149902 +2015-06-10,194.880005,,,2015-06-15,65.8,18000.400391,2105.199951 +2015-06-11,195.279999,,,2015-06-16,65.78,18039.369141,2108.860107 +2015-06-12,193.929993,,,2015-06-17,65.63,17898.839844,2094.110107 +2015-06-15,193.029999,,,2015-06-18,66.22,17791.169922,2084.429932 +2015-06-16,194.130005,,,2015-06-19,66.06,17904.480469,2096.290039 +2015-06-17,194.520004,,,2015-06-22,67.31,17935.740234,2100.439941 +2015-06-18,196.470001,,,2015-06-23,67.49,18115.839844,2121.23999 +2015-06-19,194.570007,,,2015-06-24,66.9,18015.949219,2109.98999 +2015-06-22,195.75,,,2015-06-25,65.77,18119.779297,2122.850098 +2015-06-23,195.889999,,,2015-06-26,65.74,18144.070313,2124.199951 +2015-06-24,194.46000700000002,,,2015-06-29,63.72,17966.070313,2108.580078 +2015-06-25,193.889999,,,2015-06-30,63.49,17890.359375,2102.310059 +2015-06-26,193.850006,,,2015-07-01,63.9,17946.679688,2101.48999 +2015-06-29,189.83999599999999,,,2015-07-02,63.98,17596.349609,2057.639893 +2015-06-30,190.360001,,,2015-07-06,62.69,17619.509766,2063.110107 +2015-07-01,191.729996,,,2015-07-07,62.71,17757.910156,2077.419922 +2015-07-02,191.669998,,,2015-07-08,61.25,17730.109375,2076.780029 +2015-07-06,190.929993,,,2015-07-09,62.26,17683.580078,2068.76001 +2015-07-07,192.08999599999999,,,2015-07-10,64.3,17776.910156,2081.340088 +2015-07-08,188.949997,,,2015-07-13,64.54,17515.419922,2046.680054 +2015-07-09,189.380005,,,2015-07-14,65.08,17548.619141,2051.310059 +2015-07-10,191.71000700000002,,,2015-07-15,64.84,17760.410156,2076.6201170000004 +2015-07-13,193.850006,,,2015-07-16,65.4,17977.679688,2099.600098 +2015-07-14,194.71000700000002,,,2015-07-17,65.31,18053.580078,2108.949951 +2015-07-15,194.570007,,,2015-07-20,65.46,18050.169922,2107.399902 +2015-07-16,196.130005,,,2015-07-21,65.27,18120.25,2124.290039 +2015-07-17,196.350006,,,2015-07-22,64.77,18086.449219,2126.639893 +2015-07-20,196.5,,,2015-07-23,64.6,18100.410156,2128.280029 +2015-07-21,195.669998,,,2015-07-24,63.89,17919.289063,2119.209961 +2015-07-22,195.220001,,,2015-07-27,63.42,17851.039063,2114.149902 +2015-07-23,194.130005,,,2015-07-28,64.22,17731.919922,2102.149902 +2015-07-24,192.050003,,,2015-07-29,64.45,17568.529297,2079.649902 +2015-07-27,190.940002,,,2015-07-30,64.4,17440.589844,2067.639893 +2015-07-28,193.300003,,,2015-07-31,64.78,17630.269531,2093.25 +2015-07-29,194.740005,,,2015-08-03,64.61,17751.390625,2108.570068 +2015-07-30,194.759995,,,2015-08-04,64.66,17745.980469,2108.6298829999996 +2015-07-31,194.320007,,,2015-08-05,65.0,17689.859375,2103.840088 +2015-08-03,193.779999,,,2015-08-06,64.73,17598.199219,2098.040039 +2015-08-04,193.350006,,,2015-08-07,64.61,17550.689453,2093.320068 +2015-08-05,194.029999,,,2015-08-10,65.4,17540.470703,2099.840088 +2015-08-06,192.580002,,,2015-08-11,64.4,17419.75,2083.560059 +2015-08-07,192.029999,,,2015-08-12,63.94,17373.380859,2077.570068 +2015-08-10,194.490005,,,2015-08-13,63.9,17615.169922,2104.179932 +2015-08-11,192.669998,,,2015-08-14,64.0,17402.839844,2084.070068 +2015-08-12,192.899994,,,2015-08-17,63.88,17402.509766,2086.050049 +2015-08-13,192.679993,,,2015-08-18,63.4,17408.25,2083.389893 +2015-08-14,193.429993,,,2015-08-19,62.84,17477.400391,2091.540039 +2015-08-17,194.470001,,,2015-08-20,61.32,17545.179688,2102.439941 +2015-08-18,194.0,,,2015-08-21,59.86,17511.339844,2096.919922 +2015-08-19,192.41000400000001,,,2015-08-24,57.85,17348.730469,2079.610107 +2015-08-20,188.350006,,,2015-08-25,58.4,16990.689453,2035.72998 +2015-08-21,182.380005,,,2015-08-26,59.8,16459.75,1970.890015 +2015-08-24,175.190002,,,2015-08-27,60.51,15871.349609,1893.209961 +2015-08-25,172.830002,,,2015-08-28,60.42,15666.44043,1867.609985 +2015-08-26,179.58999599999999,,,2015-08-31,59.97,16285.509766,1940.5100100000002 +2015-08-27,183.970001,,,2015-09-01,57.93,16654.769531,1987.660034 +2015-08-28,184.110001,,,2015-09-02,58.82,16643.009766,1988.869995 +2015-08-31,182.580002,,,2015-09-03,58.94,16528.029297,1972.180054 +2015-09-01,177.190002,,,2015-09-04,57.58,16058.349609,1913.8499760000002 +2015-09-02,180.46000700000002,,,2015-09-08,59.3,16351.379883000001,1948.859985 +2015-09-03,180.679993,,,2015-09-09,59.06,16374.759766,1951.130005 +2015-09-04,177.919998,,,2015-09-10,59.45,16102.379883000001,1921.219971 +2015-09-08,182.399994,,,2015-09-11,59.44,16492.679688,1969.410034 +2015-09-09,179.880005,,,2015-09-14,58.99,16253.570313,1942.040039 +2015-09-10,180.850006,,,2015-09-15,59.39,16330.400391,1952.290039 +2015-09-11,181.71000700000002,,,2015-09-16,60.3,16433.089844,1961.050049 +2015-09-14,180.979996,,,2015-09-17,60.33,16370.959961000002,1953.030029 +2015-09-15,183.300003,,,2015-09-18,58.82,16599.849609,1978.089966 +2015-09-16,184.899994,,,2015-09-21,58.79,16739.949219,1995.310059 +2015-09-17,184.46000700000002,,,2015-09-22,57.39,16674.740234,1990.199951 +2015-09-18,180.570007,,,2015-09-23,57.12,16384.580078,1958.030029 +2015-09-21,181.389999,,,2015-09-24,56.95,16510.189453,1966.969971 +2015-09-22,179.16000400000001,,,2015-09-25,57.43,16330.469727000002,1942.7399899999998 +2015-09-23,178.800003,,,2015-09-28,56.33,16279.889647999998,1938.7600100000002 +2015-09-24,178.199997,,,2015-09-29,56.25,16201.320313,1932.2399899999998 +2015-09-25,178.110001,,,2015-09-30,57.32,16314.669922,1931.339966 +2015-09-28,173.58999599999999,,,2015-10-01,57.5,16001.889647999998,1881.77002 +2015-09-29,173.820007,,,2015-10-02,58.48,16049.129883000001,1884.089966 +2015-09-30,177.139999,,,2015-10-05,59.64,16284.700195,1920.030029 +2015-10-01,177.5,,,2015-10-06,59.71,16272.009766,1923.819946 +2015-10-02,180.059998,,,2015-10-07,60.46,16472.369141,1951.359985 +2015-10-05,183.360001,,,2015-10-08,60.94,16776.429688,1987.050049 +2015-10-06,182.699997,,,2015-10-09,61.05,16790.189453,1979.9200440000002 +2015-10-07,184.240005,,,2015-10-12,60.93,16912.289063,1995.8299559999998 +2015-10-08,185.860001,,,2015-10-13,60.16,17050.75,2013.430054 +2015-10-09,186.0,,,2015-10-14,60.28,17084.490234,2014.890015 +2015-10-12,186.240005,,,2015-10-15,61.32,17131.859375,2017.459961 +2015-10-13,184.979996,,,2015-10-16,61.26,17081.890625,2003.689941 +2015-10-14,184.119995,,,2015-10-19,61.05,16924.75,1994.2399899999998 +2015-10-15,186.869995,,,2015-10-20,60.8,17141.75,2023.859985 +2015-10-16,187.720001,,,2015-10-21,60.77,17215.970703,2033.109985 +2015-10-19,187.770004,,,2015-10-22,61.45,17230.539063,2033.660034 +2015-10-20,187.5,,,2015-10-23,62.06,17217.109375,2030.77002 +2015-10-21,186.429993,,,2015-10-26,61.83,17168.609375,2018.939941 +2015-10-22,189.53999299999998,,,2015-10-27,61.29,17489.160156,2052.51001 +2015-10-23,191.639999,,,2015-10-28,61.71,17646.699219,2075.149902 +2015-10-26,191.259995,,,2015-10-29,61.24,17623.050781,2071.179932 +2015-10-27,190.779999,,,2015-10-30,61.11,17581.429688,2065.889893 +2015-10-28,193.050003,,,2015-11-02,61.69,17779.519531,2090.350098 +2015-10-29,192.990005,,,2015-11-03,61.67,17755.800781,2089.409912 +2015-10-30,192.059998,,,2015-11-04,61.33,17663.539063,2079.360107 +2015-11-02,194.330002,,,2015-11-05,61.22,17828.759766,2104.050049 +2015-11-03,194.869995,,,2015-11-06,60.94,17918.150391,2109.790039 +2015-11-04,194.240005,,,2015-11-09,60.31,17867.580078,2102.310059 +2015-11-05,194.059998,,,2015-11-10,60.27,17863.429688,2099.929932 +2015-11-06,194.009995,,,2015-11-11,60.58,17910.330078,2099.199951 +2015-11-09,192.149994,,,2015-11-12,59.79,17730.480469,2078.580078 +2015-11-10,192.490005,,,2015-11-13,59.29,17758.210938,2081.719971 +2015-11-11,191.860001,,,2015-11-16,60.04,17702.220703,2075.0 +2015-11-12,189.21000700000002,,,2015-11-17,60.2,17448.070313,2045.969971 +2015-11-13,187.08999599999999,,,2015-11-18,60.75,17245.240234,2023.040039 +2015-11-16,189.91000400000001,,,2015-11-19,61.06,17483.009766,2053.189941 +2015-11-17,189.699997,,,2015-11-20,60.92,17489.5,2050.439941 +2015-11-18,192.78999299999998,,,2015-11-23,60.54,17737.160156,2083.580078 +2015-11-19,192.58999599999999,,,2015-11-24,60.55,17732.75,2081.23999 +2015-11-20,193.350006,,,2015-11-25,60.69,17823.810547,2089.169922 +2015-11-23,193.110001,,,2015-11-27,60.7,17792.679688,2086.590088 +2015-11-24,193.350006,,,2015-11-30,60.65,17812.189453,2089.139893 +2015-11-25,193.350006,,,2015-12-01,61.29,17813.390625,2088.8701170000004 +2015-11-27,193.5,,,2015-12-02,60.64,17813.390625,2090.110107 +2015-11-30,192.610001,,,2015-12-03,60.35,17719.919922,2080.409912 +2015-12-01,194.679993,,,2015-12-04,60.84,17888.349609,2102.6298829999996 +2015-12-02,192.58999599999999,,,2015-12-07,60.45,17729.679688,2079.51001 +2015-12-03,189.830002,,,2015-12-08,59.56,17477.669922,2049.6201170000004 +2015-12-04,193.720001,,,2015-12-09,59.29,17847.630859,2091.689941 +2015-12-07,192.380005,,,2015-12-10,59.3,17730.509766,2077.070068 +2015-12-08,191.139999,,,2015-12-11,58.17,17568.0,2063.590088 +2015-12-09,189.669998,,,2015-12-14,58.26,17492.300781,2047.619995 +2015-12-10,190.119995,,,2015-12-15,58.55,17574.75,2052.22998 +2015-12-11,186.46000700000002,,,2015-12-16,59.73,17265.210938,2012.369995 +2015-12-14,187.360001,,,2015-12-17,58.97,17368.5,2021.939941 +2015-12-15,189.350006,,,2015-12-18,58.35,17524.910156,2043.410034 +2015-12-16,192.110001,,,2015-12-21,58.11,17749.089844,2073.070068 +2015-12-17,189.25,,,2015-12-22,58.55,17495.839844,2041.890015 +2015-12-18,184.83999599999999,,,2015-12-23,59.53,17128.550781,2005.550049 +2015-12-21,186.300003,,,2015-12-24,59.43,17251.619141,2021.1500239999998 +2015-12-22,187.96000700000002,,,2015-12-28,59.29,17417.269531,2038.969971 +2015-12-23,190.309998,,,2015-12-29,59.88,17602.609375,2064.290039 +2015-12-24,190.0,,,2015-12-30,59.52,17552.169922,2060.98999 +2015-12-28,189.58999599999999,,,2015-12-31,58.72,17528.269531,2056.5 +2015-12-29,191.639999,,,2016-01-04,57.82,17720.980469,2078.360107 +2015-12-30,190.270004,,,2016-01-05,57.73,17603.869141,2063.360107 +2015-12-31,188.479996,,,2016-01-06,56.78,17425.029297,2043.939941 +2016-01-04,185.639999,,,2016-01-07,55.6,17148.939453,2012.660034 +2016-01-05,186.009995,,,2016-01-08,54.93,17158.660156,2016.709961 +2016-01-06,183.639999,,,2016-01-11,55.16,16906.509766,1990.2600100000002 +2016-01-07,179.28999299999998,,,2016-01-12,55.42,16514.099609,1943.089966 +2016-01-08,177.350006,,,2016-01-13,54.56,16346.450195,1922.030029 +2016-01-11,177.490005,,,2016-01-14,55.26,16398.570313,1923.6700440000002 +2016-01-12,178.880005,,,2016-01-15,53.26,16516.220703,1938.680054 +2016-01-13,174.429993,,,2016-01-19,53.75,16151.410156,1890.280029 +2016-01-14,177.350006,,,2016-01-20,52.53,16379.049805,1921.839966 +2016-01-15,173.520004,,,2016-01-21,52.92,15988.080078,1880.3299559999998 +2016-01-19,173.610001,,,2016-01-22,54.48,16016.019531,1881.3299559999998 +2016-01-20,171.610001,,,2016-01-25,53.75,15766.740234,1859.3299559999998 +2016-01-21,172.5,,,2016-01-26,54.71,15882.679688,1868.9899899999998 +2016-01-22,176.0,,,2016-01-27,54.36,16093.509766,1906.9000239999998 +2016-01-25,173.25,,,2016-01-28,54.52,15885.219727000002,1877.0799559999998 +2016-01-26,175.699997,,,2016-01-29,55.48,16167.230469,1903.630005 +2016-01-27,173.800003,,,2016-02-01,55.42,15944.459961000002,1882.949951 +2016-01-28,174.770004,,,2016-02-02,54.13,16069.639647999998,1893.359985 +2016-01-29,179.100006,,,2016-02-03,54.58,16466.300781,1940.2399899999998 +2016-02-01,179.029999,,,2016-02-04,54.65,16449.179688,1939.380005 +2016-02-02,175.679993,,,2016-02-05,53.81,16153.540038999998,1903.030029 +2016-02-03,176.619995,,,2016-02-08,52.83,16336.660156,1912.530029 +2016-02-04,176.919998,,,2016-02-09,52.2,16416.580078,1915.449951 +2016-02-05,173.66000400000001,,,2016-02-10,52.14,16204.969727000002,1880.050049 +2016-02-08,171.220001,,,2016-02-11,51.38,16027.049805,1853.439941 +2016-02-09,171.139999,,,2016-02-12,52.28,16014.379883000001,1852.209961 +2016-02-10,171.16000400000001,,,2016-02-16,53.34,15914.740234,1851.859985 +2016-02-11,169.08999599999999,,,2016-02-17,54.26,15660.179688,1829.0799559999998 +2016-02-12,172.41000400000001,,,2016-02-18,53.98,15973.839844,1864.780029 +2016-02-16,175.309998,,,2016-02-19,53.92,16196.410156,1895.5799559999998 +2016-02-17,178.220001,,,2016-02-22,54.53,16453.830078,1926.819946 +2016-02-18,177.389999,,,2016-02-23,53.64,16413.429688,1917.8299559999998 +2016-02-19,177.41000400000001,,,2016-02-24,53.45,16391.990234,1917.780029 +2016-02-22,179.970001,,,2016-02-25,54.09,16620.660156,1945.5 +2016-02-23,177.740005,,,2016-02-26,53.95,16431.779297,1921.27002 +2016-02-24,178.53999299999998,,,2016-02-29,53.63,16484.990234,1929.800049 +2016-02-25,180.610001,,,2016-03-01,55.03,16697.289063,1951.699951 +2016-02-26,180.28999299999998,,,2016-03-02,55.41,16639.970703,1948.050049 +2016-02-29,178.83999599999999,,,2016-03-03,55.95,16516.5,1932.22998 +2016-03-01,183.110001,,,2016-03-04,56.36,16865.080078,1978.3499760000002 +2016-03-02,183.899994,,,2016-03-07,56.29,16899.320313,1986.449951 +2016-03-03,184.559998,,,2016-03-08,55.74,16943.900391,1993.4000239999998 +2016-03-04,185.169998,,,2016-03-09,55.95,17006.769531,1999.9899899999998 +2016-03-07,185.350006,,,2016-03-10,55.86,17073.949219,2001.7600100000002 +2016-03-08,183.300003,,,2016-03-11,57.32,16964.099609,1979.2600100000002 +2016-03-09,184.25,,,2016-03-14,57.2,17000.359375,1989.2600100000002 +2016-03-10,184.28999299999998,,,2016-03-15,56.66,16995.130859,1989.569946 +2016-03-11,187.360001,,,2016-03-16,57.16,17213.310547,2022.189941 +2016-03-14,187.139999,,,2016-03-17,57.6,17229.130859,2019.640015 +2016-03-15,186.800003,,,2016-03-18,57.5,17251.529297,2015.930054 +2016-03-16,187.860001,,,2016-03-21,57.41,17325.759766,2027.219971 +2016-03-17,189.100006,,,2016-03-22,57.31,17481.490234,2040.589966 +2016-03-18,188.970001,,,2016-03-23,56.73,17602.300781,2049.580078 +2016-03-21,189.149994,,,2016-03-24,56.35,17623.869141,2051.600098 +2016-03-22,189.009995,,,2016-03-28,56.69,17582.570313,2049.800049 +2016-03-23,187.809998,,,2016-03-29,57.3,17502.589844,2036.709961 +2016-03-24,187.740005,,,2016-03-30,57.73,17515.730469,2035.939941 +2016-03-28,187.83999599999999,,,2016-03-31,57.16,17535.390625,2037.050049 +2016-03-29,189.529999,,,2016-04-01,56.55,17633.109375,2055.01001 +2016-03-30,190.369995,,,2016-04-04,56.43,17716.660156,2063.949951 +2016-03-31,189.990005,,,2016-04-05,55.32,17685.089844,2059.73999 +2016-04-01,191.190002,,,2016-04-06,56.22,17792.75,2072.780029 +2016-04-04,190.610001,,,2016-04-07,55.4,17737.0,2066.1298829999996 +2016-04-05,188.679993,,,2016-04-08,56.46,17603.320313,2045.1700440000002 +2016-04-06,190.729996,,,2016-04-11,56.49,17716.050781,2066.659912 +2016-04-07,188.449997,,,2016-04-12,57.33,17541.960938,2041.910034 +2016-04-08,188.979996,,,2016-04-13,58.24,17576.960938,2047.5999760000002 +2016-04-11,188.46000700000002,,,2016-04-14,58.43,17556.410156,2041.9899899999998 +2016-04-12,190.28999299999998,,,2016-04-15,58.3,17721.25,2061.719971 +2016-04-13,192.220001,,,2016-04-18,58.8,17908.279297,2082.419922 +2016-04-14,192.279999,,,2016-04-19,59.82,17926.429688,2082.780029 +2016-04-15,192.08999599999999,,,2016-04-20,59.87,17897.460938,2080.72998 +2016-04-18,193.350006,,,2016-04-21,59.51,18004.160156,2094.340088 +2016-04-19,193.940002,,,2016-04-22,59.54,18053.599609,2100.800049 +2016-04-20,194.100006,,,2016-04-25,59.24,18096.269531,2102.399902 +2016-04-21,193.08999599999999,,,2016-04-26,59.45,17982.519531,2091.47998 +2016-04-22,193.100006,,,2016-04-27,59.49,18003.75,2091.580078 +2016-04-25,192.75,,,2016-04-28,58.68,17977.240234,2087.790039 +2016-04-26,193.110001,,,2016-04-29,58.43,17990.320313,2091.699951 +2016-04-27,193.440002,,,2016-05-02,58.98,18041.550781,2095.149902 +2016-04-28,191.669998,,,2016-05-03,58.01,17830.759766,2075.810059 +2016-04-29,190.699997,,,2016-05-04,57.34,17773.640625,2065.300049 +2016-05-02,192.190002,,,2016-05-05,57.22,17891.160156,2081.429932 +2016-05-03,190.529999,,,2016-05-06,57.38,17750.910156,2063.3701170000004 +2016-05-04,189.440002,,,2016-05-09,57.26,17651.259766,2051.1201170000004 +2016-05-05,189.429993,,,2016-05-10,58.08,17660.710938,2050.6298829999996 +2016-05-06,190.059998,,,2016-05-11,57.58,17740.630859,2057.139893 +2016-05-09,190.199997,,,2016-05-12,57.56,17705.910156,2058.689941 +2016-05-10,192.580002,,,2016-05-13,56.97,17928.349609,2084.389893 +2016-05-11,190.83999599999999,,,2016-05-16,57.65,17711.119141,2064.459961 +2016-05-12,190.820007,,,2016-05-17,57.23,17720.5,2064.110107 +2016-05-13,189.220001,,,2016-05-18,57.25,17535.320313,2046.609985 +2016-05-16,191.08999599999999,,,2016-05-19,56.84,17710.710938,2066.659912 +2016-05-17,189.350006,,,2016-05-20,57.31,17529.980469,2047.209961 +2016-05-18,189.419998,,,2016-05-23,57.12,17526.619141,2047.630005 +2016-05-19,188.720001,,,2016-05-24,57.95,17435.400391,2040.040039 +2016-05-20,189.880005,,,2016-05-25,58.56,17500.939453,2052.320068 +2016-05-23,189.490005,,,2016-05-26,58.72,17492.929688,2048.040039 +2016-05-24,192.080002,,,2016-05-27,58.66,17706.050781,2076.060059 +2016-05-25,193.429993,,,2016-05-31,58.38,17851.509766,2090.540039 +2016-05-26,193.419998,,,2016-06-01,58.33,17828.289063,2090.100098 +2016-05-27,194.279999,,,2016-06-02,58.33,17873.220703,2099.060059 +2016-05-31,194.100006,,,2016-06-03,58.71,17787.199219,2096.949951 +2016-06-01,194.350006,,,2016-06-06,59.04,17789.669922,2099.330078 +2016-06-02,194.919998,,,2016-06-07,59.47,17838.560547,2105.26001 +2016-06-03,194.360001,,,2016-06-08,59.59,17807.060547,2099.1298829999996 +2016-06-06,195.309998,,,2016-06-09,58.86,17920.330078,2109.409912 +2016-06-07,195.570007,,,2016-06-10,57.15,17938.279297,2112.1298829999996 +2016-06-08,196.25,,,2016-06-13,56.32,18005.050781,2119.1201170000004 +2016-06-09,195.919998,,,2016-06-14,55.42,17985.189453,2115.47998 +2016-06-10,194.130005,,,2016-06-15,55.79,17865.339844,2096.070068 +2016-06-13,192.610001,,,2016-06-16,55.9,17732.480469,2079.060059 +2016-06-14,192.279999,,,2016-06-17,56.46,17674.820313,2075.320068 +2016-06-15,191.940002,,,2016-06-20,57.86,17640.169922,2071.5 +2016-06-16,192.570007,,,2016-06-21,58.33,17733.099609,2077.98999 +2016-06-17,191.940002,,,2016-06-22,57.12,17675.160156,2071.219971 +2016-06-20,192.149994,,,2016-06-23,58.7,17804.869141,2083.25 +2016-06-21,192.690002,,,2016-06-24,53.66,17829.730469,2088.899902 +2016-06-22,192.369995,,,2016-06-27,52.63,17780.830078,2085.449951 +2016-06-23,194.940002,,,2016-06-28,54.01,18011.070313,2113.320068 +2016-06-24,187.929993,,,2016-06-29,55.0,17400.75,2037.410034 +2016-06-27,184.529999,,,2016-06-30,55.82,17140.240234,2000.540039 +2016-06-28,187.860001,,,2016-07-01,55.82,17409.720703,2036.089966 +2016-06-29,191.080002,,,2016-07-05,54.74,17694.679688,2070.77002 +2016-06-30,193.669998,,,2016-07-06,54.64,17929.990234,2098.860107 +2016-07-01,194.080002,,,2016-07-07,54.42,17949.369141,2102.949951 +2016-07-05,192.759995,,,2016-07-08,55.25,17840.619141,2088.550049 +2016-07-06,193.860001,,,2016-07-11,56.06,17918.619141,2099.72998 +2016-07-07,193.71000700000002,,,2016-07-12,56.82,17895.880859,2097.899902 +2016-07-08,196.66000400000001,,,2016-07-13,56.76,18146.740234,2129.899902 +2016-07-11,197.330002,,,2016-07-14,57.25,18226.929688,2137.159912 +2016-07-12,198.720001,,,2016-07-15,56.96,18347.669922,2152.139893 +2016-07-13,198.759995,,,2016-07-18,57.1,18372.119141,2152.429932 +2016-07-14,199.809998,,,2016-07-19,56.65,18506.410156,2163.75 +2016-07-15,199.619995,,,2016-07-20,57.16,18516.550781,2161.73999 +2016-07-18,200.110001,,,2016-07-21,56.93,18533.050781,2166.889893 +2016-07-19,199.820007,,,2016-07-22,57.04,18559.009766,2163.780029 +2016-07-20,200.699997,,,2016-07-25,56.97,18595.029297,2173.02002 +2016-07-21,199.979996,,,2016-07-26,57.21,18517.230469,2165.169922 +2016-07-22,200.889999,,,2016-07-27,57.42,18570.849609,2175.030029 +2016-07-25,200.279999,,,2016-07-28,57.36,18493.060547,2168.47998 +2016-07-26,200.350006,,,2016-07-29,58.04,18473.75,2169.179932 +2016-07-27,200.119995,,,2016-08-01,57.66,18472.169922,2166.580078 +2016-07-28,200.46000700000002,,,2016-08-02,57.37,18456.349609,2170.060059 +2016-07-29,200.78999299999998,,,2016-08-03,57.17,18432.240234,2173.600098 +2016-08-01,200.529999,,,2016-08-04,57.5,18404.509766,2170.840088 +2016-08-02,199.259995,,,2016-08-05,57.76,18313.769531,2157.030029 +2016-08-03,199.940002,,,2016-08-08,57.88,18355.0,2163.790039 +2016-08-04,200.029999,,,2016-08-09,58.34,18352.050781,2164.25 +2016-08-05,201.759995,,,2016-08-10,58.54,18543.529297,2182.8701170000004 +2016-08-08,201.58999599999999,,,2016-08-11,58.96,18529.289063,2180.889893 +2016-08-09,201.679993,,,2016-08-12,58.81,18533.050781,2181.73999 +2016-08-10,201.169998,,,2016-08-15,59.04,18495.660156,2175.48999 +2016-08-11,202.149994,,,2016-08-16,58.95,18613.519531,2185.790039 +2016-08-12,202.0,,,2016-08-17,58.93,18576.470703,2184.050049 +2016-08-15,202.58999599999999,,,2016-08-18,59.23,18636.050781,2190.149902 +2016-08-16,201.509995,,,2016-08-19,58.79,18552.019531,2178.149902 +2016-08-17,201.940002,,,2016-08-22,58.85,18573.939453,2182.219971 +2016-08-18,202.389999,,,2016-08-23,59.1,18597.699219,2187.02002 +2016-08-19,202.119995,,,2016-08-24,58.96,18552.570313,2183.8701170000004 +2016-08-22,202.009995,,,2016-08-25,58.72,18529.419922,2182.639893 +2016-08-23,202.41000400000001,,,2016-08-26,58.37,18547.300781,2186.899902 +2016-08-24,201.360001,,,2016-08-29,58.55,18481.480469,2175.439941 +2016-08-25,201.08999599999999,,,2016-08-30,58.47,18448.410156,2172.469971 +2016-08-26,200.779999,,,2016-08-31,58.35,18395.400391,2169.040039 +2016-08-29,201.850006,,,2016-09-01,58.75,18502.990234,2180.3798829999996 +2016-08-30,201.490005,,,2016-09-02,59.43,18454.300781,2176.1201170000004 +2016-08-31,201.050003,,,2016-09-06,59.83,18400.880859,2170.949951 +2016-09-01,201.03999299999998,,,2016-09-07,59.86,18419.300781,2170.860107 +2016-09-02,201.889999,,,2016-09-08,59.69,18491.960938,2179.97998 +2016-09-06,202.5,,,2016-09-09,58.53,18538.119141,2186.47998 +2016-09-07,202.520004,,,2016-09-12,59.01,18526.140625,2186.159912 +2016-09-08,202.080002,,,2016-09-13,57.82,18479.910156,2181.300049 +2016-09-09,197.119995,,,2016-09-14,57.74,18085.449219,2127.810059 +2016-09-12,199.169998,,,2016-09-15,58.24,18325.070313,2159.040039 +2016-09-13,196.279999,,,2016-09-16,57.49,18066.75,2127.02002 +2016-09-14,196.179993,,,2016-09-19,57.79,18034.769531,2125.77002 +2016-09-15,198.199997,,,2016-09-20,58.14,18212.480469,2147.26001 +2016-09-16,197.449997,,,2016-09-21,59.16,18123.800781,2139.159912 +2016-09-19,197.449997,,,2016-09-22,59.76,18120.169922,2139.1201170000004 +2016-09-20,197.509995,,,2016-09-23,59.26,18129.960938,2139.76001 +2016-09-21,199.66000400000001,,,2016-09-26,58.71,18293.699219,2163.1201170000004 +2016-09-22,200.970001,,,2016-09-27,58.99,18392.460938,2177.179932 +2016-09-23,199.809998,,,2016-09-28,59.41,18261.449219,2164.689941 +2016-09-26,198.110001,,,2016-09-29,58.67,18094.830078,2146.100098 +2016-09-27,199.399994,,,2016-09-30,59.13,18228.300781,2159.929932 +2016-09-28,200.490005,,,2016-10-03,58.97,18339.240234,2171.3701170000004 +2016-09-29,198.630005,,,2016-10-04,58.96,18143.449219,2151.1298829999996 +2016-09-30,200.21000700000002,,,2016-10-05,59.2,18308.150391,2168.27002 +2016-10-03,199.580002,,,2016-10-06,58.88,18253.849609,2161.199951 +2016-10-04,198.610001,,,2016-10-07,58.58,18168.449219,2150.48999 +2016-10-05,199.550003,,,2016-10-10,58.75,18281.029297,2159.72998 +2016-10-06,199.649994,,,2016-10-11,57.92,18268.5,2160.77002 +2016-10-07,199.009995,,,2016-10-12,57.79,18240.490234,2153.73999 +2016-10-10,199.919998,,,2016-10-13,57.57,18329.039063,2163.659912 +2016-10-11,197.440002,,,2016-10-14,57.67,18128.660156,2136.72998 +2016-10-12,197.679993,,,2016-10-17,57.5,18144.199219,2139.179932 +2016-10-13,197.070007,,,2016-10-18,58.07,18098.939453,2132.550049 +2016-10-14,197.110001,,,2016-10-19,58.23,18138.380859,2132.97998 +2016-10-17,196.520004,,,2016-10-20,58.32,18086.400391,2126.5 +2016-10-18,197.720001,,,2016-10-21,58.19,18161.939453,2139.600098 +2016-10-19,198.179993,,,2016-10-24,58.18,18202.619141,2144.290039 +2016-10-20,197.929993,,,2016-10-25,58.14,18162.349609,2141.340088 +2016-10-21,197.91000400000001,,,2016-10-26,57.88,18145.710938,2141.159912 +2016-10-24,198.850006,,,2016-10-27,57.81,18223.029297,2151.330078 +2016-10-25,198.100006,,,2016-10-28,57.79,18169.269531,2143.159912 +2016-10-26,197.75,,,2016-10-31,57.82,18199.330078,2139.429932 +2016-10-27,197.169998,,,2016-11-01,57.57,18169.679688,2133.040039 +2016-10-28,196.570007,,,2016-11-02,57.18,18161.189453,2126.409912 +2016-10-31,196.53999299999998,,,2016-11-03,57.12,18142.419922,2126.149902 +2016-11-01,195.21000700000002,,,2016-11-04,56.57,18037.099609,2111.719971 +2016-11-02,193.96000700000002,,,2016-11-07,57.35,17959.640625,2097.939941 +2016-11-03,193.169998,,,2016-11-08,57.51,17930.669922,2088.659912 +2016-11-04,192.860001,,,2016-11-09,57.56,17888.279297,2085.179932 +2016-11-07,197.139999,,,2016-11-10,57.4,18259.599609,2131.52002 +2016-11-08,197.979996,,,2016-11-11,57.05,18332.740234,2139.560059 +2016-11-09,200.190002,,,2016-11-14,56.74,18589.689453,2163.26001 +2016-11-10,200.600006,,,2016-11-15,56.99,18807.880859,2167.47998 +2016-11-11,200.320007,,,2016-11-16,56.39,18847.660156,2164.449951 +2016-11-14,200.320007,,,2016-11-17,56.82,18868.689453,2164.199951 +2016-11-15,201.869995,,,2016-11-18,56.2,18923.060547,2180.389893 +2016-11-16,201.600006,,,2016-11-21,56.68,18868.140625,2176.939941 +2016-11-17,202.559998,,,2016-11-22,56.82,18903.820313,2187.1201170000004 +2016-11-18,202.110001,,,2016-11-23,56.62,18867.929688,2181.899902 +2016-11-21,203.610001,,,2016-11-25,56.79,18956.689453,2198.179932 +2016-11-22,204.059998,,,2016-11-28,56.49,19023.869141,2202.939941 +2016-11-23,204.240005,,,2016-11-29,56.85,19083.179688,2204.719971 +2016-11-25,205.03999299999998,,,2016-11-30,56.79,19152.140625,2213.350098 +2016-11-28,203.990005,,,2016-12-01,56.57,19097.900391,2201.719971 +2016-11-29,204.309998,,,2016-12-02,56.71,19121.599609,2204.659912 +2016-11-30,203.809998,,,2016-12-05,57.27,19123.580078,2198.810059 +2016-12-01,203.100006,,,2016-12-06,57.66,19191.929688,2191.080078 +2016-12-02,203.179993,,,2016-12-07,58.52,19170.419922,2191.949951 +2016-12-05,204.380005,,,2016-12-08,58.47,19216.240234,2204.709961 +2016-12-06,205.080002,,,2016-12-09,58.72,19251.779297,2212.22998 +2016-12-07,207.820007,,,2016-12-12,58.46,19549.619141,2241.350098 +2016-12-08,208.28999299999998,,,2016-12-13,59.09,19614.810547,2246.189941 +2016-12-09,209.520004,,,2016-12-14,58.22,19756.849609,2259.530029 +2016-12-12,209.300003,,,2016-12-15,58.09,19796.429688,2256.959961 +2016-12-13,210.69999700000002,,,2016-12-16,58.13,19911.210938,2271.719971 +2016-12-14,209.0,,,2016-12-19,58.04,19792.529297,2253.280029 +2016-12-15,209.82000699999998,,,2016-12-20,58.24,19852.240234,2262.030029 +2016-12-16,209.46000700000002,,,2016-12-21,57.66,19843.410156,2258.070068 +2016-12-19,209.88000499999998,,,2016-12-22,57.53,19883.060547,2262.530029 +2016-12-20,210.669998,,,2016-12-23,57.68,19974.619141,2270.76001 +2016-12-21,208.899994,,,2016-12-27,57.61,19941.960938,2265.179932 +2016-12-22,208.53999299999998,,,2016-12-28,57.39,19918.880859,2260.959961 +2016-12-23,208.820007,,,2016-12-29,57.53,19933.810547,2263.790039 +2016-12-27,209.28999299999998,,,2016-12-30,57.73,19945.039063,2268.8798829999996 +2016-12-28,207.580002,,,2017-01-03,58.09,19833.679688,2249.919922 +2016-12-29,207.529999,,,2017-01-04,58.75,19819.779297,2249.26001 +2016-12-30,206.570007,,,2017-01-05,59.25,19762.599609,2238.830078 +2017-01-03,208.330002,,,2017-01-06,59.05,19881.759766,2257.830078 +2017-01-04,209.570007,,,2017-01-09,58.96,19942.160156,2270.75 +2017-01-05,209.41000400000001,,,2017-01-10,58.97,19899.289063,2269.0 +2017-01-06,210.210007,,,2017-01-11,59.28,19963.800781,2276.97998 +2017-01-09,209.46000700000002,,,2017-01-12,59.37,19887.380859,2268.899902 +2017-01-10,209.46000700000002,,,2017-01-13,59.59,19855.529297,2268.899902 +2017-01-11,210.07000699999998,,,2017-01-17,59.37,19954.279297,2275.320068 +2017-01-12,209.619995,,,2017-01-18,59.2,19891.0,2270.439941 +2017-01-13,210.00999500000003,,,2017-01-19,59.05,19885.730469,2274.639893 +2017-01-17,209.380005,,,2017-01-20,59.39,19826.769531,2267.889893 +2017-01-18,209.789993,,,2017-01-23,59.54,19804.720703,2271.889893 +2017-01-19,209.029999,,,2017-01-24,59.69,19732.400391,2263.689941 +2017-01-20,209.74000499999997,,,2017-01-25,60.31,19827.25,2271.310059 +2017-01-23,209.179993,,,2017-01-26,60.07,19799.849609,2265.199951 +2017-01-24,210.55000299999998,,,2017-01-27,59.97,19912.710938,2280.070068 +2017-01-25,212.24000499999997,,,2017-01-30,59.54,20068.509766,2298.3701170000004 +2017-01-26,212.08999599999999,,,2017-01-31,59.63,20100.910156,2296.679932 +2017-01-27,211.919998,,,2017-02-01,59.87,20093.779297,2294.689941 +2017-01-30,210.649994,,,2017-02-02,59.9,19971.130859,2280.899902 +2017-01-31,210.460007,,,2017-02-03,60.14,19864.089844,2278.8701170000004 +2017-02-01,210.57000699999998,,,2017-02-06,59.71,19890.939453,2279.550049 +2017-02-02,210.710007,,,2017-02-07,59.65,19884.910156,2280.850098 +2017-02-03,212.25,,,2017-02-08,59.75,20071.460938,2297.419922 +2017-02-06,211.80000299999998,,,2017-02-09,60.0,20052.419922,2292.560059 +2017-02-07,211.86000099999998,,,2017-02-10,60.14,20090.289063,2293.080078 +2017-02-08,212.07000699999998,,,2017-02-13,60.38,20054.339844,2294.669922 +2017-02-09,213.330002,,,2017-02-14,60.29,20172.400391,2307.8701170000004 +2017-02-10,214.11000099999998,,,2017-02-15,60.52,20269.369141,2316.100098 +2017-02-13,215.27999900000003,,,2017-02-16,60.66,20412.160156,2328.25 +2017-02-14,216.210007,,,2017-02-17,60.5,20504.410156,2337.580078 +2017-02-15,217.32000699999998,,,2017-02-21,60.7,20611.859375,2349.25 +2017-02-16,217.149994,,,2017-02-22,60.7,20619.769531,2347.219971 +2017-02-17,217.520004,,,2017-02-23,60.83,20624.050781,2351.159912 +2017-02-21,218.830002,,,2017-02-24,60.39,20743.0,2365.3798829999996 +2017-02-22,218.61000099999998,,,2017-02-27,60.43,20775.599609,2362.820068 +2017-02-23,218.729996,,,2017-02-28,60.34,20810.320313,2363.810059 +2017-02-24,219.100006,,,2017-03-01,60.97,20821.759766,2367.340088 +2017-02-27,219.36000099999998,,,2017-03-02,60.57,20837.439453,2369.75 +2017-02-28,218.80000299999998,,,2017-03-03,60.93,20812.240234,2363.639893 +2017-03-01,221.830002,,,2017-03-06,60.74,21115.550781,2395.959961 +2017-03-02,220.55000299999998,,,2017-03-07,60.53,21002.970703,2381.919922 +2017-03-03,220.66000400000001,,,2017-03-08,60.31,21005.710938,2383.1201170000004 +2017-03-06,219.940002,,,2017-03-09,60.54,20954.339844,2375.310059 +2017-03-07,219.32000699999998,,,2017-03-10,61.05,20924.759766,2368.389893 +2017-03-08,218.88000499999998,,,2017-03-13,61.37,20855.730469,2362.97998 +2017-03-09,219.05000299999998,,,2017-03-14,60.9,20858.189453,2364.8701170000004 +2017-03-10,219.770004,,,2017-03-15,61.77,20902.980469,2372.600098 +2017-03-13,219.919998,,,2017-03-16,62.07,20881.480469,2373.469971 +2017-03-14,219.17999300000002,,,2017-03-17,62.23,20837.369141,2365.449951 +2017-03-15,221.02999900000003,,,2017-03-20,62.1,20950.099609,2385.26001 +2017-03-16,220.669998,,,2017-03-21,61.82,20934.550781,2381.3798829999996 +2017-03-17,220.38000499999998,,,2017-03-22,61.83,20914.619141,2378.25 +2017-03-20,219.94999700000002,,,2017-03-23,61.97,20905.859375,2373.469971 +2017-03-21,216.270004,,,2017-03-24,62.14,20668.009766,2344.02002 +2017-03-22,216.690002,,,2017-03-27,62.3,20661.300781,2348.449951 +2017-03-23,216.460007,,,2017-03-28,62.6,20656.580078,2345.959961 +2017-03-24,216.27999900000003,,,2017-03-29,62.6,20596.720703,2343.97998 +2017-03-27,216.059998,,,2017-03-30,62.38,20550.980469,2341.590088 +2017-03-28,217.61999500000002,,,2017-03-31,62.29,20701.5,2358.570068 +2017-03-29,217.899994,,,2017-04-03,62.2,20659.320313,2361.1298829999996 +2017-03-30,218.55000299999998,,,2017-04-04,62.18,20728.490234,2368.060059 +2017-03-31,218.05000299999998,,,2017-04-05,61.85,20663.220703,2362.719971 +2017-04-03,217.69999700000002,,,2017-04-06,61.86,20650.210938,2358.840088 +2017-04-04,217.86000099999998,,,2017-04-07,61.82,20689.240234,2360.159912 +2017-04-05,217.22000099999997,,,2017-04-10,61.75,20648.150391,2352.949951 +2017-04-06,217.69999700000002,,,2017-04-11,62.04,20662.949219,2357.48999 +2017-04-07,217.520004,,,2017-04-12,61.99,20656.099609,2355.540039 +2017-04-10,217.67999300000002,,,2017-04-13,61.59,20658.019531,2357.159912 +2017-04-11,217.38999900000002,,,2017-04-17,61.97,20651.300781,2353.780029 +2017-04-12,216.580002,,,2017-04-18,61.69,20591.859375,2344.929932 +2017-04-13,215.11000099999998,,,2017-04-19,61.44,20453.25,2328.949951 +2017-04-17,216.94999700000002,,,2017-04-20,61.93,20636.919922,2349.01001 +2017-04-18,216.330002,,,2017-04-21,61.97,20523.279297,2342.189941 +2017-04-19,215.99000499999997,,,2017-04-24,63.54,20404.490234,2338.169922 +2017-04-20,217.61999500000002,,,2017-04-25,63.99,20578.710938,2355.840088 +2017-04-21,216.960007,,,2017-04-26,63.81,20547.759766,2348.689941 +2017-04-24,219.32000699999998,,,2017-04-27,63.87,20763.890625,2374.149902 +2017-04-25,220.649994,,,2017-04-28,63.8,20996.119141,2388.610107 +2017-04-26,220.55000299999998,,,2017-05-01,64.06,20975.089844,2387.449951 +2017-04-27,220.690002,,,2017-05-02,64.39,20981.330078,2388.77002 +2017-04-28,220.270004,,,2017-05-03,64.26,20940.509766,2384.199951 +2017-05-01,220.649994,,,2017-05-04,64.87,20913.460938,2388.330078 +2017-05-02,220.91000400000001,,,2017-05-05,65.59,20949.890625,2391.169922 +2017-05-03,220.669998,,,2017-05-08,65.1,20957.900391,2388.1298829999996 +2017-05-04,220.809998,,,2017-05-09,64.94,20951.470703,2389.52002 +2017-05-05,221.72000099999997,,,2017-05-10,65.04,21006.939453,2399.290039 +2017-05-08,221.74000499999997,,,2017-05-11,64.88,21012.279297,2399.3798829999996 +2017-05-09,221.52999900000003,,,2017-05-12,65.24,20975.779297,2396.919922 +2017-05-10,221.86000099999998,,,2017-05-15,65.57,20943.109375,2399.6298829999996 +2017-05-11,221.44999700000002,,,2017-05-16,65.99,20919.419922,2394.439941 +2017-05-12,221.13000499999998,,,2017-05-17,65.24,20896.609375,2390.899902 +2017-05-15,222.210007,,,2017-05-18,65.35,20981.939453,2402.320068 +2017-05-16,222.100006,,,2017-05-19,66.11,20979.75,2400.669922 +2017-05-17,218.13000499999998,,,2017-05-22,66.19,20606.929688,2357.030029 +2017-05-18,218.92999300000002,,,2017-05-23,66.2,20663.019531,2365.719971 +2017-05-19,220.419998,,,2017-05-24,66.24,20804.839844,2381.72998 +2017-05-22,221.559998,,,2017-05-25,66.24,20894.830078,2394.02002 +2017-05-23,221.97000099999997,,,2017-05-26,66.05,20937.910156,2398.419922 +2017-05-24,222.52999900000003,,,2017-05-30,65.98,21012.419922,2404.389893 +2017-05-25,223.55000299999998,,,2017-05-31,66.06,21082.949219,2415.070068 +2017-05-26,223.649994,,,2017-06-01,66.49,21080.279297,2415.820068 +2017-05-30,223.41000400000001,,,2017-06-02,67.22,21029.470703,2412.909912 +2017-05-31,223.33999599999999,,,2017-06-05,66.85,21008.650391,2411.800049 +2017-06-01,225.059998,,,2017-06-06,66.66,21144.179688,2430.060059 +2017-06-02,225.88999900000002,,,2017-06-07,66.68,21206.289063,2439.070068 +2017-06-05,225.61999500000002,,,2017-06-08,66.56,21184.039063,2436.100098 +2017-06-06,225.0,,,2017-06-09,66.31,21136.230469,2429.330078 +2017-06-07,225.38999900000002,,,2017-06-12,66.06,21173.689453,2433.139893 +2017-06-08,225.44999700000002,,,2017-06-13,66.57,21182.529297,2433.790039 +2017-06-09,225.270004,,,2017-06-14,66.52,21271.970703,2431.77002 +2017-06-12,225.059998,,,2017-06-15,65.83,21235.669922,2429.389893 +2017-06-13,226.13999900000002,,,2017-06-16,66.39,21328.470703,2440.350098 +2017-06-14,225.92999300000002,,,2017-06-19,66.66,21374.560547,2437.919922 +2017-06-15,225.460007,,,2017-06-20,65.07,21359.900391,2432.459961 +2017-06-16,225.52999900000003,,,2017-06-21,64.99,21384.279297,2433.149902 +2017-06-19,227.41000400000001,,,2017-06-22,64.98,21528.990234,2453.459961 +2017-06-20,225.88999900000002,,,2017-06-23,65.14,21467.140625,2437.030029 +2017-06-21,225.770004,,,2017-06-26,65.25,21410.029297,2435.610107 +2017-06-22,224.710007,,,2017-06-27,65.24,21397.289063,2434.5 +2017-06-23,225.059998,,,2017-06-28,65.81,21394.759766,2438.300049 +2017-06-26,225.13000499999998,,,2017-06-29,65.16,21409.550781,2439.070068 +2017-06-27,223.32000699999998,,,2017-06-30,65.2,21310.660156,2419.3798829999996 +2017-06-28,225.330002,,,2017-07-03,65.12,21454.609375,2440.689941 +2017-06-29,223.38999900000002,,,2017-07-05,65.12,21287.029297,2419.699951 +2017-06-30,223.75,,,2017-07-06,64.83,21349.630859,2423.409912 +2017-07-03,224.27999900000003,,,2017-07-07,64.84,21479.269531,2429.01001 +2017-07-05,224.649994,,,2017-07-10,65.0,21478.169922,2432.540039 +2017-07-06,222.63000499999998,,,2017-07-11,65.15,21320.039063,2409.75 +2017-07-07,224.05000299999998,,,2017-07-12,65.67,21414.339844,2425.179932 +2017-07-10,224.25999500000003,,,2017-07-13,65.86,21408.519531,2427.429932 +2017-07-11,224.08999599999999,,,2017-07-14,66.32,21409.070313,2425.530029 +2017-07-12,225.74000499999997,,,2017-07-17,66.19,21532.140625,2443.25 +2017-07-13,226.169998,,,2017-07-18,66.25,21553.089844,2447.830078 +2017-07-14,227.229996,,,2017-07-19,66.54,21637.740234,2459.27002 +2017-07-17,227.22000099999997,,,2017-07-20,66.81,21629.720703,2459.139893 +2017-07-18,227.36000099999998,,,2017-07-21,66.55,21574.730469,2460.610107 +2017-07-19,228.600006,,,2017-07-24,66.37,21640.75,2473.830078 +2017-07-20,228.580002,,,2017-07-25,66.46,21611.779297,2473.449951 +2017-07-21,228.5,,,2017-07-26,66.87,21580.070313,2472.540039 +2017-07-24,228.25999500000003,,,2017-07-27,66.72,21513.169922,2469.909912 +2017-07-25,228.919998,,,2017-07-28,66.79,21613.429688,2477.1298829999996 +2017-07-26,228.99000499999997,,,2017-07-31,66.93,21711.009766,2477.830078 +2017-07-27,228.789993,,,2017-08-01,67.3,21796.550781,2475.419922 +2017-07-28,228.49000499999997,,,2017-08-02,67.33,21830.310547,2472.100098 +2017-07-31,228.32000699999998,,,2017-08-03,67.37,21891.119141,2470.300049 +2017-08-01,228.88000499999998,,,2017-08-04,67.46,21963.919922,2476.350098 +2017-08-02,229.02999900000003,,,2017-08-07,67.49,22016.240234,2477.570068 +2017-08-03,228.580002,,,2017-08-08,67.13,22026.099609,2472.159912 +2017-08-04,229.00999500000003,,,2017-08-09,67.02,22092.810547,2476.830078 +2017-08-07,229.38999900000002,,,2017-08-10,66.07,22118.419922,2480.909912 +2017-08-08,228.86999500000002,,,2017-08-11,65.95,22085.339844,2474.919922 +2017-08-09,228.809998,,,2017-08-14,66.43,22048.699219,2474.02002 +2017-08-10,225.580002,,,2017-08-15,66.38,21844.009766,2438.209961 +2017-08-11,225.88000499999998,,,2017-08-16,66.76,21858.320313,2441.320068 +2017-08-14,228.16000400000001,,,2017-08-17,66.01,21993.710938,2465.840088 +2017-08-15,228.100006,,,2017-08-18,66.19,21998.990234,2464.610107 +2017-08-16,228.479996,,,2017-08-21,66.17,22024.869141,2468.110107 +2017-08-17,224.97000099999997,,,2017-08-22,66.49,21750.730469,2430.01001 +2017-08-18,224.559998,,,2017-08-23,66.5,21674.509766,2425.550049 +2017-08-21,224.82000699999998,,,2017-08-24,66.35,21703.75,2428.3701170000004 +2017-08-22,227.07000699999998,,,2017-08-25,66.75,21899.890625,2452.51001 +2017-08-23,226.30000299999998,,,2017-08-28,66.75,21812.089844,2444.040039 +2017-08-24,225.83999599999999,,,2017-08-29,66.48,21783.400391,2438.969971 +2017-08-25,226.24000499999997,,,2017-08-30,66.39,21813.669922,2443.050049 +2017-08-28,226.350006,,,2017-08-31,66.9,21808.400391,2444.23999 +2017-08-29,226.580002,,,2017-09-01,66.99,21865.369141,2446.300049 +2017-08-30,227.67999300000002,,,2017-09-05,66.54,21892.429688,2457.590088 +2017-08-31,228.99000499999997,,,2017-09-06,66.95,21948.099609,2471.649902 +2017-09-01,229.47000099999997,,,2017-09-07,67.5,21987.560547,2476.550049 +2017-09-05,227.74000499999997,,,2017-09-08,67.51,21753.310547,2457.850098 +2017-09-06,228.460007,,,2017-09-11,68.04,21807.640625,2465.540039 +2017-09-07,228.460007,,,2017-09-12,68.25,21784.779297,2465.100098 +2017-09-08,228.13999900000002,,,2017-09-13,67.88,21797.789063,2461.429932 +2017-09-11,230.600006,,,2017-09-14,68.0,22057.369141,2488.110107 +2017-09-12,231.38999900000002,,,2017-09-15,68.06,22118.859375,2496.47998 +2017-09-13,231.57000699999998,,,2017-09-18,68.15,22158.179688,2498.3701170000004 +2017-09-14,231.38999900000002,,,2017-09-19,68.47,22203.480469,2495.6201170000004 +2017-09-15,231.83999599999999,,,2017-09-20,68.32,22268.339844,2500.22998 +2017-09-18,232.190002,,,2017-09-21,68.18,22331.349609,2503.8701170000004 +2017-09-19,231.32000699999998,,,2017-09-22,68.39,22370.800781,2506.649902 +2017-09-20,231.460007,,,2017-09-25,68.0,22412.589844,2508.23999 +2017-09-21,230.770004,,,2017-09-26,67.85,22359.230469,2500.600098 +2017-09-22,230.919998,,,2017-09-27,67.9,22349.589844,2502.219971 +2017-09-25,230.399994,,,2017-09-28,68.08,22296.089844,2496.659912 +2017-09-26,230.440002,,,2017-09-29,68.48,22284.320313,2496.840088 +2017-09-27,231.38000499999998,,,2017-10-02,68.42,22340.710938,2507.040039 +2017-09-28,231.69999700000002,,,2017-10-03,68.65,22381.199219,2510.060059 +2017-09-29,232.57000699999998,,,2017-10-04,68.52,22405.089844,2519.360107 +2017-10-02,233.47000099999997,,,2017-10-05,68.48,22557.599609,2529.1201170000004 +2017-10-03,233.979996,,,2017-10-06,68.43,22641.669922,2534.580078 +2017-10-04,234.289993,,,2017-10-09,68.45,22661.640625,2537.73999 +2017-10-05,235.649994,,,2017-10-10,69.1,22775.390625,2552.070068 +2017-10-06,235.47000099999997,,,2017-10-11,69.09,22773.669922,2549.330078 +2017-10-09,235.039993,,,2017-10-12,69.21,22761.070313,2544.72998 +2017-10-10,235.58999599999999,,,2017-10-13,69.57,22830.679688,2550.639893 +2017-10-11,236.020004,,,2017-10-16,69.52,22872.890625,2555.23999 +2017-10-12,235.63999900000002,,,2017-10-17,69.34,22841.009766,2550.929932 +2017-10-13,235.850006,,,2017-10-18,69.54,22871.720703,2553.169922 +2017-10-16,236.270004,,,2017-10-19,69.43,22956.960938,2557.639893 +2017-10-17,236.419998,,,2017-10-20,69.34,22997.439453,2559.360107 +2017-10-18,236.61000099999998,,,2017-10-23,69.19,23157.599609,2561.26001 +2017-10-19,236.69999700000002,,,2017-10-24,69.3,23163.039063,2562.100098 +2017-10-20,237.92999300000002,,,2017-10-25,69.03,23328.630859,2575.209961 +2017-10-23,236.99000499999997,,,2017-10-26,69.02,23273.960938,2564.97998 +2017-10-24,237.38000499999998,,,2017-10-27,69.18,23441.759766,2569.1298829999996 +2017-10-25,236.270004,,,2017-10-30,69.34,23329.460938,2557.149902 +2017-10-26,236.57000699999998,,,2017-10-31,69.63,23400.859375,2560.399902 +2017-10-27,238.479996,,,2017-11-01,69.7,23434.189453,2581.070068 +2017-10-30,237.729996,,,2017-11-02,69.91,23348.740234,2572.830078 +2017-10-31,237.960007,,,2017-11-03,69.8,23377.240234,2575.26001 +2017-11-01,238.33999599999999,,,2017-11-06,69.9,23435.009766,2579.360107 +2017-11-02,238.41000400000001,,,2017-11-07,69.64,23516.259766,2579.850098 +2017-11-03,239.169998,,,2017-11-08,69.87,23539.189453,2587.840088 +2017-11-06,239.5,,,2017-11-09,69.47,23548.419922,2591.1298829999996 +2017-11-07,239.44999700000002,,,2017-11-10,69.28,23557.230469,2590.639893 +2017-11-08,239.80000299999998,,,2017-11-13,68.99,23563.359375,2594.3798829999996 +2017-11-09,238.960007,,,2017-11-14,68.94,23461.939453,2584.6201170000004 +2017-11-10,238.830002,,,2017-11-15,68.61,23422.210938,2582.300049 +2017-11-13,239.059998,,,2017-11-16,69.16,23439.699219,2584.840088 +2017-11-14,238.55000299999998,,,2017-11-17,68.91,23409.470703,2578.8701170000004 +2017-11-15,237.27999900000003,,,2017-11-20,69.06,23271.279297,2564.6201170000004 +2017-11-16,239.30000299999998,,,2017-11-21,69.58,23458.359375,2585.639893 +2017-11-17,238.67999300000002,,,2017-11-22,69.77,23358.240234,2578.850098 +2017-11-20,238.99000499999997,,,2017-11-24,70.34,23430.330078,2582.139893 +2017-11-21,240.559998,,,2017-11-27,69.92,23590.830078,2599.030029 +2017-11-22,240.399994,,,2017-11-28,70.32,23526.179688,2597.080078 +2017-11-24,240.91000400000001,,,2017-11-29,70.04,23557.990234,2602.419922 +2017-11-27,240.83999599999999,,,2017-11-30,70.11,23580.779297,2601.419922 +2017-11-28,243.22000099999997,,,2017-12-01,69.83,23836.710938,2627.040039 +2017-11-29,243.16000400000001,,,2017-12-04,69.58,23940.679688,2626.070068 +2017-11-30,245.24000499999997,,,2017-12-05,69.43,24272.349609,2647.580078 +2017-12-01,244.75,,,2017-12-06,69.29,24231.589844,2642.219971 +2017-12-04,244.5,,,2017-12-07,69.47,24290.050781,2639.439941 +2017-12-05,243.58999599999999,,,2017-12-08,69.84,24180.640625,2629.570068 +2017-12-06,243.57000699999998,,,2017-12-11,70.02,24140.910156,2629.27002 +2017-12-07,244.330002,,,2017-12-12,70.11,24211.480469,2636.97998 +2017-12-08,245.69999700000002,,,2017-12-13,70.38,24329.160156,2651.5 +2017-12-11,246.49000499999997,,,2017-12-14,69.99,24386.029297,2659.98999 +2017-12-12,246.86999500000002,,,2017-12-15,69.97,24504.800781,2664.110107 +2017-12-13,246.75999500000003,,,2017-12-18,70.8,24585.429688,2662.850098 +2017-12-14,245.80000299999998,,,2017-12-19,69.8,24508.660156,2652.01001 +2017-12-15,248.020004,,,2017-12-20,69.68,24651.740234,2675.810059 +2017-12-18,249.36000099999998,,,2017-12-21,69.93,24792.199219,2690.159912 +2017-12-19,248.55000299999998,,,2017-12-22,70.11,24754.75,2681.469971 +2017-12-20,248.38000499999998,,,2017-12-26,70.09,24726.650391,2679.25 +2017-12-21,248.86999500000002,,,2017-12-27,70.22,24782.289063,2684.570068 +2017-12-22,247.63000499999998,,,2017-12-28,70.26,24754.060547,2683.340088 +2017-12-26,247.38000499999998,,,2017-12-29,70.31,24746.210938,2680.5 +2017-12-27,247.58999599999999,,,2018-01-02,70.83,24774.300781,2682.6201170000004 +2017-12-28,248.08999599999999,,,2018-01-03,71.17,24837.509766,2687.540039 +2017-12-29,246.82000699999998,,,2018-01-04,71.95,24719.220703,2673.610107 +2018-01-02,248.88000499999998,,,2018-01-05,72.35,24824.009766,2695.810059 +2018-01-03,250.47000099999997,,,2018-01-08,72.33,24922.679688,2713.060059 +2018-01-04,251.52999900000003,,,2018-01-09,72.41,25075.130859,2723.98999 +2018-01-05,253.30000299999998,,,2018-01-10,72.27,25295.869141,2743.149902 +2018-01-08,253.72000099999997,,,2018-01-11,72.77,25283.0,2747.709961 +2018-01-09,254.11999500000002,,,2018-01-12,73.5,25385.800781,2751.290039 +2018-01-10,253.83999599999999,,,2018-01-16,73.43,25369.130859,2748.22998 +2018-01-11,255.649994,,,2018-01-17,73.81,25574.730469,2767.560059 +2018-01-12,257.369995,,,2018-01-18,73.72,25803.189453,2786.23999 +2018-01-16,256.47000099999997,,,2018-01-19,74.13,25792.859375,2776.419922 +2018-01-17,258.880005,,,2018-01-22,74.51,26115.650391,2802.560059 +2018-01-18,258.480011,,,2018-01-23,74.75,26017.810547,2798.030029 +2018-01-19,259.619995,,,2018-01-24,74.88,26071.720703,2810.300049 +2018-01-22,261.72000099999997,,,2018-01-25,74.59,26214.599609,2832.969971 +2018-01-23,262.290009,,,2018-01-26,75.25,26210.810547,2839.1298829999996 +2018-01-24,262.149994,,,2018-01-29,74.56,26252.119141,2837.540039 +2018-01-25,262.309998,,,2018-01-30,73.94,26392.789063,2839.25 +2018-01-26,265.420013,,,2018-01-31,73.84,26616.710938,2872.8701170000004 +2018-01-29,263.640015,,,2018-02-01,74.05,26439.480469,2853.530029 +2018-01-30,260.790009,,,2018-02-02,72.55,26076.890625,2822.429932 +2018-01-31,260.920013,,,2018-02-05,69.51,26149.390625,2823.810059 +2018-02-01,260.799988,,,2018-02-06,70.88,26186.710938,2821.97998 +2018-02-02,255.27999900000003,,,2018-02-07,70.13,25520.960938,2762.1298829999996 +2018-02-05,244.80000299999998,,,2018-02-08,68.3,24345.75,2648.939941 +2018-02-06,249.11999500000002,,,2018-02-09,68.59,24912.769531,2695.139893 +2018-02-07,247.86999500000002,,,2018-02-12,69.64,24893.349609,2681.659912 +2018-02-08,238.61000099999998,,,2018-02-13,69.43,23860.460938,2581.0 +2018-02-09,242.25,,,2018-02-14,70.66,24190.900391,2619.550049 +2018-02-12,245.61999500000002,,,2018-02-15,71.1,24601.269531,2656.0 +2018-02-13,246.27999900000003,,,2018-02-16,71.42,24640.449219,2662.939941 +2018-02-14,249.649994,,,2018-02-20,70.75,24893.490234,2698.6298829999996 +2018-02-15,252.72000099999997,,,2018-02-21,70.41,25200.369141,2731.199951 +2018-02-16,252.83999599999999,,,2018-02-22,70.78,25219.380859,2732.219971 +2018-02-20,251.36999500000002,,,2018-02-23,71.34,24964.75,2716.26001 +2018-02-21,250.0,,,2018-02-26,72.01,24797.779297,2701.330078 +2018-02-22,250.25999500000003,,,2018-02-27,70.94,24962.480469,2703.959961 +2018-02-23,254.289993,,,2018-02-28,70.27,25309.990234,2747.300049 +2018-02-26,257.299988,,,2018-03-01,69.09,25709.269531,2779.600098 +2018-02-27,254.07000699999998,,,2018-03-02,69.42,25410.029297,2744.280029 +2018-02-28,251.270004,,,2018-03-05,69.79,25029.199219,2713.830078 +2018-03-01,247.97000099999997,,,2018-03-06,70.2,24608.980469,2677.669922 +2018-03-02,249.24000499999997,,,,,24538.060547,2691.25 +2018-03-05,251.99000499999997,,,,,24874.759766,2720.939941 +2018-03-06,252.669998,,,,,24884.119141,2728.1201170000004 diff --git a/investments-dashboard/data/df_hist_prices.csv b/investments-dashboard/data/df_hist_prices.csv new file mode 100644 index 0000000..23e5c71 --- /dev/null +++ b/investments-dashboard/data/df_hist_prices.csv @@ -0,0 +1,6 @@ +date,price +02/28/2018,$251.27 +02/27/2018,$254.07 +02/26/2018,$257.30 +02/23/2018,$254.29 +02/22/2018,$250.26 diff --git a/investments-dashboard/data/df_minimums.csv b/investments-dashboard/data/df_minimums.csv new file mode 100644 index 0000000..3ffe5d7 --- /dev/null +++ b/investments-dashboard/data/df_minimums.csv @@ -0,0 +1,6 @@ +A,B,C +'-,Initial Minimum,Additional Investments +General Account,"""$3,000""",$1 +UGMA/UTMA,"""$3,000""",$1 +IRA,"""$3,000""",$1 +Education savings account,"""$2,000""",$1 diff --git a/investments-dashboard/data/df_price_perf.csv b/investments-dashboard/data/df_price_perf.csv new file mode 100644 index 0000000..0c01d6d --- /dev/null +++ b/investments-dashboard/data/df_price_perf.csv @@ -0,0 +1,4 @@ +label,price,percent +Price as of 02/27/2018,$254.07,None +Change,'-$3.23,'-1.26% +SEC yield,1.67%,B diff --git a/investments-dashboard/data/df_realized.csv b/investments-dashboard/data/df_realized.csv new file mode 100644 index 0000000..87dfd15 --- /dev/null +++ b/investments-dashboard/data/df_realized.csv @@ -0,0 +1,4 @@ +A,B +Realized capital gain/loss,–$0.60 +Realized capital gain/loss as a % of NAV,–0.23% +Fiscal year end,12/31/2018 diff --git a/investments-dashboard/data/df_recent_returns.csv b/investments-dashboard/data/df_recent_returns.csv new file mode 100644 index 0000000..53ab5d3 --- /dev/null +++ b/investments-dashboard/data/df_recent_returns.csv @@ -0,0 +1,4 @@ +A,B,C,D,E +'-,YTD as of 03/05/2018,YTD as of 02/28/2018,Previous Month 02/28/2018,3M Total as of 02/28/2018 +500 Index Fund Inv,2.09%,1.81%,–3.69%,2.93% +S&P 500 Index*,—,1.83%,–3.69%,2.96% diff --git a/investments-dashboard/data/df_unrealized.csv b/investments-dashboard/data/df_unrealized.csv new file mode 100644 index 0000000..678eccf --- /dev/null +++ b/investments-dashboard/data/df_unrealized.csv @@ -0,0 +1,3 @@ +A,B +Unrealized appreciation/depreciation,$107.02 +Unrealized appreciation/depreciation as a % of NAV,41.02% diff --git a/investments-dashboard/demos/callbacks/01_simple_callback.py b/investments-dashboard/demos/callbacks/01_simple_callback.py new file mode 100644 index 0000000..4ed076a --- /dev/null +++ b/investments-dashboard/demos/callbacks/01_simple_callback.py @@ -0,0 +1,93 @@ +from dash import Dash, dcc, html, Input, Output, callback + +BG = '#0f1117' +CARD = '#1a1d27' +BORDER = '#2d3148' +TEXT = '#e2e8f0' +MUTED = '#94a3b8' +ACCENT = '#7c3aed' + +app = Dash(__name__) + +app.layout = html.Div(style={ + 'backgroundColor': BG, + 'padding': '48px', + 'fontFamily': 'Inter, system-ui, sans-serif', + 'minHeight': '100vh', + 'maxWidth': '640px', + 'margin': '0 auto', +}, children=[ + html.H2('Callback Anatomy', style={'color': TEXT, 'marginBottom': '4px'}), + html.P('The output reacts automatically whenever the input changes.', + style={'color': MUTED, 'marginBottom': '40px'}), + + # Input section + html.Div(style={ + 'backgroundColor': CARD, + 'border': f'1px solid {BORDER}', + 'borderRadius': '10px', + 'padding': '20px', + 'marginBottom': '12px', + }, children=[ + html.Div('INPUT', style={ + 'color': MUTED, 'fontSize': '11px', 'fontWeight': '700', + 'letterSpacing': '0.1em', 'marginBottom': '10px', + }), + dcc.Input( + id='my-input', + value='initial value', + type='text', + debounce=False, + style={ + 'backgroundColor': BG, + 'border': f'1px solid {ACCENT}', + 'borderRadius': '6px', + 'color': TEXT, + 'padding': '10px 14px', + 'fontSize': '15px', + 'width': '100%', + 'outline': 'none', + 'boxSizing': 'border-box', + }, + ), + html.P('Try changing this value — the output below updates instantly.', + style={'color': MUTED, 'fontSize': '12px', 'marginTop': '8px', 'marginBottom': 0}), + ]), + + # Arrow indicator + html.Div('↓', style={ + 'color': ACCENT, 'fontSize': '24px', 'textAlign': 'center', + 'margin': '4px 0', 'lineHeight': 1, + }), + + # Output section + html.Div(style={ + 'backgroundColor': CARD, + 'border': f'1px solid {BORDER}', + 'borderRadius': '10px', + 'padding': '20px', + }, children=[ + html.Div('OUTPUT', style={ + 'color': MUTED, 'fontSize': '11px', 'fontWeight': '700', + 'letterSpacing': '0.1em', 'marginBottom': '10px', + }), + html.Div(id='my-output', style={ + 'color': ACCENT, + 'fontSize': '22px', + 'fontWeight': '600', + 'minHeight': '32px', + }), + ]), +]) + + +@callback( + Output('my-output', 'children'), + Input('my-input', 'value'), +) +def update_output(input_value): + return f'Output: {input_value}' + + +if __name__ == '__main__': + app.run(debug=True) diff --git a/investments-dashboard/demos/callbacks/02_gapminder_slider.py b/investments-dashboard/demos/callbacks/02_gapminder_slider.py new file mode 100644 index 0000000..89d2731 --- /dev/null +++ b/investments-dashboard/demos/callbacks/02_gapminder_slider.py @@ -0,0 +1,75 @@ +from dash import Dash, dcc, html, Input, Output, callback +import plotly.express as px +import pandas as pd + +BG = '#0f1117' +CARD = '#1a1d27' +BORDER = '#2d3148' +TEXT = '#e2e8f0' +MUTED = '#94a3b8' +TEMPLATE = 'plotly_dark' + +app = Dash(__name__) + +df = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/gapminderDataFiveYear.csv') + +app.layout = html.Div(style={ + 'backgroundColor': BG, + 'padding': '24px', + 'fontFamily': 'Inter, system-ui, sans-serif', + 'minHeight': '100vh', +}, children=[ + html.H2('GDP vs Life Expectancy', style={'color': TEXT, 'marginBottom': '4px'}), + html.P('Drag the year slider — the chart animates smoothly between years.', + style={'color': MUTED, 'marginBottom': '16px'}), + + dcc.Graph(id='graph-with-slider'), + + html.Div(style={'padding': '8px 40px 0 40px'}, children=[ + html.Div('Year', style={ + 'color': MUTED, 'fontSize': '11px', 'fontWeight': '600', + 'letterSpacing': '0.08em', 'textTransform': 'uppercase', 'marginBottom': '8px', + }), + dcc.Slider( + df['year'].min(), + df['year'].max(), + step=None, + value=df['year'].min(), + marks={ + str(year): { + 'label': str(year), + 'style': {'color': MUTED, 'fontSize': '11px'}, + } + for year in df['year'].unique() + }, + id='year-slider', + ), + ]), +]) + + +@callback( + Output('graph-with-slider', 'figure'), + Input('year-slider', 'value')) +def update_figure(selected_year): + filtered_df = df[df.year == selected_year] + + fig = px.scatter( + filtered_df, + x='gdpPercap', y='lifeExp', + size='pop', color='continent', + hover_name='country', + log_x=True, size_max=55, + template=TEMPLATE, + ) + fig.update_layout( + transition_duration=500, + plot_bgcolor=CARD, + paper_bgcolor=CARD, + margin=dict(l=40, r=40, t=20, b=20), + ) + return fig + + +if __name__ == '__main__': + app.run(debug=True) diff --git a/investments-dashboard/demos/callbacks/03_multiple_inputs.py b/investments-dashboard/demos/callbacks/03_multiple_inputs.py new file mode 100644 index 0000000..2e3c0ad --- /dev/null +++ b/investments-dashboard/demos/callbacks/03_multiple_inputs.py @@ -0,0 +1,121 @@ +from dash import Dash, dcc, html, Input, Output, callback +import plotly.express as px +import pandas as pd + +BG = '#0f1117' +CARD = '#1a1d27' +BORDER = '#2d3148' +TEXT = '#e2e8f0' +MUTED = '#94a3b8' +TEMPLATE = 'plotly_dark' + +app = Dash(__name__) + +df = pd.read_csv('https://plotly.github.io/datasets/country_indicators.csv') + +label_style = { + 'color': MUTED, + 'fontSize': '11px', + 'fontWeight': '600', + 'letterSpacing': '0.08em', + 'textTransform': 'uppercase', + 'marginBottom': '6px', +} + +radio_label_style = {'marginRight': '12px', 'marginTop': '6px', 'color': TEXT, 'fontSize': '13px'} + +app.layout = html.Div(style={ + 'backgroundColor': BG, + 'padding': '24px', + 'fontFamily': 'Inter, system-ui, sans-serif', + 'minHeight': '100vh', +}, children=[ + html.H2('Multiple Inputs → One Output', style={'color': TEXT, 'marginBottom': '4px'}), + html.P('Any of the 5 controls below triggers the callback and updates the chart.', + style={'color': MUTED, 'marginBottom': '20px'}), + + # Controls row + html.Div(style={'display': 'flex', 'gap': '24px', 'marginBottom': '16px'}, children=[ + html.Div(style={'flex': 1}, children=[ + html.Div('X Axis Indicator', style=label_style), + dcc.Dropdown( + df['Indicator Name'].unique(), + 'Fertility rate, total (births per woman)', + id='xaxis-column', + style={'backgroundColor': CARD, 'color': TEXT}, + ), + dcc.RadioItems( + ['Linear', 'Log'], 'Linear', + id='xaxis-type', + inline=True, + labelStyle=radio_label_style, + ), + ]), + html.Div(style={'flex': 1}, children=[ + html.Div('Y Axis Indicator', style=label_style), + dcc.Dropdown( + df['Indicator Name'].unique(), + 'Life expectancy at birth, total (years)', + id='yaxis-column', + style={'backgroundColor': CARD, 'color': TEXT}, + ), + dcc.RadioItems( + ['Linear', 'Log'], 'Linear', + id='yaxis-type', + inline=True, + labelStyle=radio_label_style, + ), + ]), + ]), + + dcc.Graph(id='indicator-graphic'), + + html.Div(style={'padding': '8px 40px 0 40px'}, children=[ + html.Div('Year', style=label_style), + dcc.Slider( + df['Year'].min(), + df['Year'].max(), + step=None, + id='year--slider', + value=df['Year'].max(), + marks={ + str(year): { + 'label': str(year), + 'style': {'color': MUTED, 'fontSize': '11px'}, + } + for year in df['Year'].unique() + }, + ), + ]), +]) + + +@callback( + Output('indicator-graphic', 'figure'), + Input('xaxis-column', 'value'), + Input('yaxis-column', 'value'), + Input('xaxis-type', 'value'), + Input('yaxis-type', 'value'), + Input('year--slider', 'value')) +def update_graph(xaxis_col, yaxis_col, xaxis_type, yaxis_type, year_value): + dff = df[df['Year'] == year_value] + + fig = px.scatter( + x=dff[dff['Indicator Name'] == xaxis_col]['Value'], + y=dff[dff['Indicator Name'] == yaxis_col]['Value'], + hover_name=dff[dff['Indicator Name'] == yaxis_col]['Country Name'], + template=TEMPLATE, + ) + fig.update_layout( + plot_bgcolor=CARD, + paper_bgcolor=CARD, + margin=dict(l=40, b=40, t=20, r=20), + hovermode='closest', + ) + fig.update_xaxes(title=xaxis_col, type='linear' if xaxis_type == 'Linear' else 'log') + fig.update_yaxes(title=yaxis_col, type='linear' if yaxis_type == 'Linear' else 'log') + return fig + + +if __name__ == '__main__': + app.run(debug=True) diff --git a/investments-dashboard/demos/callbacks/04_state_button.py b/investments-dashboard/demos/callbacks/04_state_button.py new file mode 100644 index 0000000..81de034 --- /dev/null +++ b/investments-dashboard/demos/callbacks/04_state_button.py @@ -0,0 +1,118 @@ +from dash import Dash, dcc, html, Input, Output, State, callback + +BG = '#0f1117' +CARD = '#1a1d27' +BORDER = '#2d3148' +TEXT = '#e2e8f0' +MUTED = '#94a3b8' +ACCENT = '#7c3aed' + +app = Dash(__name__) + +input_style = { + 'backgroundColor': CARD, + 'border': f'1px solid {BORDER}', + 'borderRadius': '6px', + 'color': TEXT, + 'padding': '10px 14px', + 'fontSize': '15px', + 'width': '100%', + 'outline': 'none', + 'boxSizing': 'border-box', + 'marginBottom': '12px', +} + +label_style = { + 'color': MUTED, + 'fontSize': '11px', + 'fontWeight': '600', + 'letterSpacing': '0.08em', + 'textTransform': 'uppercase', + 'marginBottom': '6px', + 'display': 'block', +} + +app.layout = html.Div(style={ + 'backgroundColor': BG, + 'padding': '48px', + 'fontFamily': 'Inter, system-ui, sans-serif', + 'minHeight': '100vh', + 'maxWidth': '560px', + 'margin': '0 auto', +}, children=[ + html.H2('State vs Input', style={'color': TEXT, 'marginBottom': '4px'}), + html.P( + 'Typing in the fields does nothing. Only clicking Submit fires the callback.', + style={'color': MUTED, 'marginBottom': '32px'}, + ), + + html.Div(style={ + 'backgroundColor': CARD, + 'border': f'1px solid {BORDER}', + 'borderRadius': '10px', + 'padding': '24px', + 'marginBottom': '16px', + }, children=[ + html.Span('City', style=label_style), + dcc.Input( + id='input-1-state', + type='text', + value='Montréal', + placeholder='Enter a city', + style=input_style, + ), + + html.Span('Country', style=label_style), + dcc.Input( + id='input-2-state', + type='text', + value='Canada', + placeholder='Enter a country', + style=input_style, + ), + + html.Button( + 'Submit', + id='submit-button-state', + n_clicks=0, + style={ + 'backgroundColor': ACCENT, + 'color': '#fff', + 'border': 'none', + 'borderRadius': '6px', + 'padding': '10px 24px', + 'fontSize': '14px', + 'fontWeight': '600', + 'cursor': 'pointer', + 'width': '100%', + 'marginTop': '4px', + }, + ), + ]), + + html.Div(id='output-state', style={ + 'color': TEXT, + 'fontSize': '15px', + 'padding': '16px 20px', + 'backgroundColor': CARD, + 'border': f'1px solid {BORDER}', + 'borderRadius': '10px', + 'minHeight': '56px', + }), +]) + + +@callback( + Output('output-state', 'children'), + Input('submit-button-state', 'n_clicks'), + State('input-1-state', 'value'), + State('input-2-state', 'value'), +) +def update_output(n_clicks, city, country): + if n_clicks == 0: + return html.Span('Waiting for submission…', style={'color': MUTED}) + return f'Submitted {n_clicks} time{"s" if n_clicks != 1 else ""}. City: {city}, Country: {country}.' + + +if __name__ == '__main__': + app.run(debug=True) diff --git a/investments-dashboard/demos/interactive-graphing/01_debug_interactions.py b/investments-dashboard/demos/interactive-graphing/01_debug_interactions.py new file mode 100644 index 0000000..f7f6484 --- /dev/null +++ b/investments-dashboard/demos/interactive-graphing/01_debug_interactions.py @@ -0,0 +1,115 @@ +from dash import Dash, dcc, html, Input, Output, callback +import plotly.express as px +import pandas as pd +import json + +BG = '#0f1117' +CARD = '#1a1d27' +BORDER = '#2d3148' +TEXT = '#e2e8f0' +MUTED = '#94a3b8' +TEMPLATE = 'plotly_dark' + +app = Dash(__name__) + +df = pd.DataFrame({ + "x": [1, 2, 1, 2], + "y": [1, 2, 3, 4], + "customdata": [1, 2, 3, 4], + "fruit": ["apple", "apple", "orange", "orange"] +}) + +fig = px.scatter(df, x="x", y="y", color="fruit", custom_data=["customdata"], + template=TEMPLATE, color_discrete_map={"apple": "#7c3aed", "orange": "#f97316"}) +fig.update_layout( + plot_bgcolor=CARD, + paper_bgcolor=CARD, + clickmode='event+select', + margin=dict(l=40, r=40, t=40, b=40), +) +fig.update_traces(marker_size=20) + +pre_style = { + 'backgroundColor': CARD, + 'border': f'1px solid {BORDER}', + 'color': TEXT, + 'borderRadius': '8px', + 'padding': '12px', + 'overflowX': 'auto', + 'fontSize': '12px', + 'minHeight': '180px', +} + +label_style = { + 'color': MUTED, + 'fontSize': '11px', + 'fontWeight': '600', + 'letterSpacing': '0.08em', + 'textTransform': 'uppercase', + 'marginBottom': '8px', +} + +panel_style = { + 'flex': 1, + 'minWidth': 0, +} + +app.layout = html.Div(style={ + 'backgroundColor': BG, + 'padding': '24px', + 'fontFamily': 'Inter, system-ui, sans-serif', + 'minHeight': '100vh', +}, children=[ + html.H2('Graph Interaction Data', style={'color': TEXT, 'marginBottom': '4px'}), + html.P('Hover, click, select, or zoom the chart to see the interaction data.', + style={'color': MUTED, 'marginBottom': '24px'}), + + dcc.Graph( + id='basic-interactions', + figure=fig, + style={'marginBottom': '24px'}, + ), + + html.Div(style={'display': 'flex', 'gap': '16px'}, children=[ + html.Div(style=panel_style, children=[ + html.Div('Hover Data', style=label_style), + html.Pre(id='hover-data', style=pre_style), + ]), + html.Div(style=panel_style, children=[ + html.Div('Click Data', style=label_style), + html.Pre(id='click-data', style=pre_style), + ]), + html.Div(style=panel_style, children=[ + html.Div('Selection Data', style=label_style), + html.Pre(id='selected-data', style=pre_style), + ]), + html.Div(style=panel_style, children=[ + html.Div('Zoom / Relayout Data', style=label_style), + html.Pre(id='relayout-data', style=pre_style), + ]), + ]), +]) + + +@callback(Output('hover-data', 'children'), Input('basic-interactions', 'hoverData')) +def display_hover(hoverData): + return json.dumps(hoverData, indent=2) + + +@callback(Output('click-data', 'children'), Input('basic-interactions', 'clickData')) +def display_click(clickData): + return json.dumps(clickData, indent=2) + + +@callback(Output('selected-data', 'children'), Input('basic-interactions', 'selectedData')) +def display_selected(selectedData): + return json.dumps(selectedData, indent=2) + + +@callback(Output('relayout-data', 'children'), Input('basic-interactions', 'relayoutData')) +def display_relayout(relayoutData): + return json.dumps(relayoutData, indent=2) + + +if __name__ == '__main__': + app.run(debug=True) diff --git a/investments-dashboard/demos/interactive-graphing/02_hover_timeseries.py b/investments-dashboard/demos/interactive-graphing/02_hover_timeseries.py new file mode 100644 index 0000000..df99904 --- /dev/null +++ b/investments-dashboard/demos/interactive-graphing/02_hover_timeseries.py @@ -0,0 +1,183 @@ +from dash import Dash, html, dcc, Input, Output, callback +import pandas as pd +import plotly.express as px + +BG = '#0f1117' +CARD = '#1a1d27' +BORDER = '#2d3148' +TEXT = '#e2e8f0' +MUTED = '#94a3b8' +TEMPLATE = 'plotly_dark' + +app = Dash(__name__) + +df = pd.read_csv('https://plotly.github.io/datasets/country_indicators.csv') + +dropdown_style = { + 'backgroundColor': CARD, + 'color': TEXT, +} + +label_style = { + 'color': MUTED, + 'fontSize': '11px', + 'fontWeight': '600', + 'letterSpacing': '0.08em', + 'textTransform': 'uppercase', + 'marginBottom': '6px', +} + +radio_style = { + 'color': TEXT, + 'fontSize': '13px', +} + +app.layout = html.Div(style={ + 'backgroundColor': BG, + 'padding': '24px', + 'fontFamily': 'Inter, system-ui, sans-serif', + 'minHeight': '100vh', +}, children=[ + html.H2('World Indicators Explorer', style={'color': TEXT, 'marginBottom': '4px'}), + html.P('Hover over a country in the scatter plot to see its historical trend.', + style={'color': MUTED, 'marginBottom': '20px'}), + + # Controls row + html.Div(style={'display': 'flex', 'gap': '24px', 'marginBottom': '16px'}, children=[ + html.Div(style={'flex': 1}, children=[ + html.Div('X Axis Indicator', style=label_style), + dcc.Dropdown( + df['Indicator Name'].unique(), + 'Fertility rate, total (births per woman)', + id='crossfilter-xaxis-column', + style=dropdown_style, + ), + dcc.RadioItems( + ['Linear', 'Log'], 'Linear', + id='crossfilter-xaxis-type', + inline=True, + style=radio_style, + labelStyle={'marginRight': '12px', 'marginTop': '6px'}, + ), + ]), + html.Div(style={'flex': 1}, children=[ + html.Div('Y Axis Indicator', style=label_style), + dcc.Dropdown( + df['Indicator Name'].unique(), + 'Life expectancy at birth, total (years)', + id='crossfilter-yaxis-column', + style=dropdown_style, + ), + dcc.RadioItems( + ['Linear', 'Log'], 'Linear', + id='crossfilter-yaxis-type', + inline=True, + style=radio_style, + labelStyle={'marginRight': '12px', 'marginTop': '6px'}, + ), + ]), + ]), + + # Charts row + html.Div(style={'display': 'flex', 'gap': '16px'}, children=[ + html.Div(style={'flex': '0 0 55%'}, children=[ + dcc.Graph( + id='crossfilter-indicator-scatter', + hoverData={'points': [{'customdata': 'Japan'}]}, + ), + ]), + html.Div(style={'flex': 1}, children=[ + dcc.Graph(id='x-time-series'), + dcc.Graph(id='y-time-series'), + ]), + ]), + + # Year slider + html.Div(style={'marginTop': '8px', 'paddingRight': '24px', 'width': '55%'}, children=[ + html.Div('Year', style=label_style), + dcc.Slider( + df['Year'].min(), + df['Year'].max(), + step=None, + id='crossfilter-year--slider', + value=df['Year'].max(), + marks={str(year): {'label': str(year), 'style': {'color': MUTED, 'fontSize': '11px'}} + for year in df['Year'].unique()}, + ), + ]), +]) + + +@callback( + Output('crossfilter-indicator-scatter', 'figure'), + Input('crossfilter-xaxis-column', 'value'), + Input('crossfilter-yaxis-column', 'value'), + Input('crossfilter-xaxis-type', 'value'), + Input('crossfilter-yaxis-type', 'value'), + Input('crossfilter-year--slider', 'value')) +def update_scatter(xaxis_col, yaxis_col, xaxis_type, yaxis_type, year): + dff = df[df['Year'] == year] + fig = px.scatter( + x=dff[dff['Indicator Name'] == xaxis_col]['Value'], + y=dff[dff['Indicator Name'] == yaxis_col]['Value'], + hover_name=dff[dff['Indicator Name'] == yaxis_col]['Country Name'], + template=TEMPLATE, + ) + fig.update_traces( + customdata=dff[dff['Indicator Name'] == yaxis_col]['Country Name'], + marker=dict(size=8, opacity=0.8), + ) + fig.update_xaxes(title=xaxis_col, type='linear' if xaxis_type == 'Linear' else 'log') + fig.update_yaxes(title=yaxis_col, type='linear' if yaxis_type == 'Linear' else 'log') + fig.update_layout( + plot_bgcolor=CARD, + paper_bgcolor=CARD, + margin=dict(l=40, b=40, t=20, r=20), + hovermode='closest', + ) + return fig + + +def create_time_series(dff, axis_type, title): + fig = px.scatter(dff, x='Year', y='Value', template=TEMPLATE) + fig.update_traces(mode='lines+markers', marker=dict(size=5), line=dict(color='#7c3aed')) + fig.update_xaxes(showgrid=False) + fig.update_yaxes(type='linear' if axis_type == 'Linear' else 'log') + fig.add_annotation( + x=0, y=0.85, xanchor='left', yanchor='bottom', + xref='paper', yref='paper', showarrow=False, align='left', + text=title, font=dict(size=11, color=MUTED), + ) + fig.update_layout( + height=225, + plot_bgcolor=CARD, + paper_bgcolor=CARD, + margin=dict(l=20, b=30, r=10, t=10), + ) + return fig + + +@callback( + Output('x-time-series', 'figure'), + Input('crossfilter-indicator-scatter', 'hoverData'), + Input('crossfilter-xaxis-column', 'value'), + Input('crossfilter-xaxis-type', 'value')) +def update_x_timeseries(hoverData, xaxis_col, axis_type): + country = hoverData['points'][0]['customdata'] + dff = df[(df['Country Name'] == country) & (df['Indicator Name'] == xaxis_col)] + return create_time_series(dff, axis_type, f'{country}
{xaxis_col}') + + +@callback( + Output('y-time-series', 'figure'), + Input('crossfilter-indicator-scatter', 'hoverData'), + Input('crossfilter-yaxis-column', 'value'), + Input('crossfilter-yaxis-type', 'value')) +def update_y_timeseries(hoverData, yaxis_col, axis_type): + country = hoverData['points'][0]['customdata'] + dff = df[(df['Country Name'] == country) & (df['Indicator Name'] == yaxis_col)] + return create_time_series(dff, axis_type, yaxis_col) + + +if __name__ == '__main__': + app.run(debug=True) diff --git a/investments-dashboard/demos/interactive-graphing/03_crossfilter.py b/investments-dashboard/demos/interactive-graphing/03_crossfilter.py new file mode 100644 index 0000000..70663b9 --- /dev/null +++ b/investments-dashboard/demos/interactive-graphing/03_crossfilter.py @@ -0,0 +1,111 @@ +from dash import Dash, dcc, html, Input, Output, callback +import numpy as np +import pandas as pd +import plotly.express as px + +BG = '#0f1117' +CARD = '#1a1d27' +BORDER = '#2d3148' +TEXT = '#e2e8f0' +MUTED = '#94a3b8' +ACCENT = '#7c3aed' +TEMPLATE = 'plotly_dark' + +app = Dash(__name__) + +np.random.seed(0) +df = pd.DataFrame({"Col " + str(i + 1): np.random.rand(30) for i in range(6)}) + + +def get_figure(df, x_col, y_col, selectedpoints, selectedpoints_local): + if selectedpoints_local and selectedpoints_local.get("range"): + ranges = selectedpoints_local["range"] + selection_bounds = { + "x0": ranges["x"][0], "x1": ranges["x"][1], + "y0": ranges["y"][0], "y1": ranges["y"][1], + } + else: + selection_bounds = { + "x0": np.min(df[x_col]), "x1": np.max(df[x_col]), + "y0": np.min(df[y_col]), "y1": np.max(df[y_col]), + } + + fig = px.scatter(df, x=df[x_col], y=df[y_col], text=df.index, template=TEMPLATE) + fig.update_traces( + selectedpoints=selectedpoints, + customdata=df.index, + mode="markers+text", + marker={"color": ACCENT, "size": 16, "opacity": 0.9}, + unselected={ + "marker": {"opacity": 0.15, "color": MUTED}, + "textfont": {"color": "rgba(0,0,0,0)"}, + }, + selected={ + "marker": {"color": ACCENT, "opacity": 1.0}, + }, + textfont={"size": 9, "color": MUTED}, + ) + fig.update_layout( + plot_bgcolor=CARD, + paper_bgcolor=CARD, + margin={"l": 20, "r": 10, "b": 20, "t": 30}, + dragmode="select", + hovermode=False, + newselection_mode="gradual", + xaxis_title=x_col, + yaxis_title=y_col, + ) + fig.add_shape(dict( + type="rect", + line={"width": 1, "dash": "dot", "color": MUTED}, + **selection_bounds, + )) + return fig + + +app.layout = html.Div(style={ + 'backgroundColor': BG, + 'padding': '24px', + 'fontFamily': 'Inter, system-ui, sans-serif', + 'minHeight': '100vh', +}, children=[ + html.H2('Crossfilter', style={'color': TEXT, 'marginBottom': '4px'}), + html.P('Lasso or box-select points in any chart — the selection filters across all three.', + style={'color': MUTED, 'marginBottom': '24px'}), + + html.Div(style={'display': 'flex', 'gap': '16px'}, children=[ + dcc.Graph(id='g1', config={'displayModeBar': True, 'modeBarButtonsToKeep': ['select2d', 'lasso2d']}, + style={'flex': 1}), + dcc.Graph(id='g2', config={'displayModeBar': True, 'modeBarButtonsToKeep': ['select2d', 'lasso2d']}, + style={'flex': 1}), + dcc.Graph(id='g3', config={'displayModeBar': True, 'modeBarButtonsToKeep': ['select2d', 'lasso2d']}, + style={'flex': 1}), + ]), +]) + + +@callback( + Output('g1', 'figure'), + Output('g2', 'figure'), + Output('g3', 'figure'), + Input('g1', 'selectedData'), + Input('g2', 'selectedData'), + Input('g3', 'selectedData'), +) +def update_charts(sel1, sel2, sel3): + selectedpoints = df.index + for sel in [sel1, sel2, sel3]: + if sel and sel['points']: + selectedpoints = np.intersect1d( + selectedpoints, + [p['customdata'] for p in sel['points']] + ) + return [ + get_figure(df, 'Col 1', 'Col 2', selectedpoints, sel1), + get_figure(df, 'Col 3', 'Col 4', selectedpoints, sel2), + get_figure(df, 'Col 5', 'Col 6', selectedpoints, sel3), + ] + + +if __name__ == '__main__': + app.run(debug=True) diff --git a/investments-dashboard/demos/layout/01_hello_dash.py b/investments-dashboard/demos/layout/01_hello_dash.py new file mode 100644 index 0000000..61f68ae --- /dev/null +++ b/investments-dashboard/demos/layout/01_hello_dash.py @@ -0,0 +1,54 @@ +from dash import Dash, html, dcc +import plotly.express as px +import pandas as pd + +BG = '#0f1117' +CARD = '#1a1d27' +BORDER = '#2d3148' +TEXT = '#e2e8f0' +MUTED = '#94a3b8' +TEMPLATE = 'plotly_dark' + +app = Dash(__name__) + +df = pd.DataFrame({ + "Fruit": ["Apples", "Oranges", "Bananas", "Apples", "Oranges", "Bananas"], + "Amount": [4, 1, 2, 2, 4, 5], + "City": ["SF", "SF", "SF", "Montreal", "Montreal", "Montreal"], +}) + +fig = px.bar(df, x="Fruit", y="Amount", color="City", barmode="group", template=TEMPLATE) +fig.update_layout(plot_bgcolor=CARD, paper_bgcolor=CARD, margin=dict(l=40, r=40, t=40, b=40)) + +app.layout = html.Div(style={ + 'backgroundColor': BG, + 'padding': '32px', + 'fontFamily': 'Inter, system-ui, sans-serif', + 'minHeight': '100vh', +}, children=[ + html.H1('Hello Dash', style={'color': TEXT, 'marginBottom': '4px'}), + + html.Div('Dash: A web application framework for your data.', style={ + 'color': MUTED, + 'fontSize': '15px', + 'marginBottom': '24px', + }), + + dcc.Graph(id='example-graph', figure=fig), + + html.P( + '✏️ Try editing the H1 title above in the code, save the file, and watch the browser update automatically.', + style={ + 'color': MUTED, + 'fontSize': '12px', + 'marginTop': '16px', + 'border': f'1px solid {BORDER}', + 'borderRadius': '6px', + 'padding': '10px 14px', + 'backgroundColor': CARD, + }, + ), +]) + +if __name__ == '__main__': + app.run(debug=True) diff --git a/investments-dashboard/demos/layout/02_styled_layout.py b/investments-dashboard/demos/layout/02_styled_layout.py new file mode 100644 index 0000000..25c3a2e --- /dev/null +++ b/investments-dashboard/demos/layout/02_styled_layout.py @@ -0,0 +1,47 @@ +from dash import Dash, dcc, html +import plotly.express as px +import pandas as pd + +# style dict — the pattern from the docs, upgraded to our palette +colors = { + 'background': '#0f1117', + 'card': '#1a1d27', + 'text': '#e2e8f0', + 'muted': '#94a3b8', + 'accent': '#7c3aed', +} + +app = Dash(__name__) + +df = pd.DataFrame({ + "Fruit": ["Apples", "Oranges", "Bananas", "Apples", "Oranges", "Bananas"], + "Amount": [4, 1, 2, 2, 4, 5], + "City": ["SF", "SF", "SF", "Montreal", "Montreal", "Montreal"], +}) + +fig = px.bar(df, x="Fruit", y="Amount", color="City", barmode="group", template='plotly_dark') +fig.update_layout( + plot_bgcolor=colors['card'], + paper_bgcolor=colors['card'], + font_color=colors['text'], + margin=dict(l=40, r=40, t=40, b=40), +) + +app.layout = html.Div( + style={'backgroundColor': colors['background'], 'padding': '32px', + 'fontFamily': 'Inter, system-ui, sans-serif', 'minHeight': '100vh'}, + children=[ + html.H1( + 'Hello Dash', + style={'textAlign': 'center', 'color': colors['accent']}, + ), + html.Div( + 'Dash: A web application framework for your data.', + style={'textAlign': 'center', 'color': colors['muted'], 'marginBottom': '24px'}, + ), + dcc.Graph(id='example-graph-2', figure=fig), + ], +) + +if __name__ == '__main__': + app.run(debug=True) diff --git a/investments-dashboard/demos/layout/03_core_components.py b/investments-dashboard/demos/layout/03_core_components.py new file mode 100644 index 0000000..b385345 --- /dev/null +++ b/investments-dashboard/demos/layout/03_core_components.py @@ -0,0 +1,109 @@ +from dash import Dash, html, dcc + +BG = '#0f1117' +CARD = '#1a1d27' +BORDER = '#2d3148' +TEXT = '#e2e8f0' +MUTED = '#94a3b8' +ACCENT = '#7c3aed' + +app = Dash(__name__) + +label_style = { + 'color': MUTED, + 'fontSize': '11px', + 'fontWeight': '700', + 'letterSpacing': '0.08em', + 'textTransform': 'uppercase', + 'marginBottom': '8px', + 'marginTop': '20px', + 'display': 'block', +} + +section_style = { + 'backgroundColor': CARD, + 'border': f'1px solid {BORDER}', + 'borderRadius': '10px', + 'padding': '20px 24px', + 'flex': 1, + 'minWidth': 0, +} + +app.layout = html.Div(style={ + 'backgroundColor': BG, + 'padding': '32px', + 'fontFamily': 'Inter, system-ui, sans-serif', + 'minHeight': '100vh', +}, children=[ + html.H2('Core Components', style={'color': TEXT, 'marginBottom': '4px'}), + html.P('Every dcc component is declared entirely through keyword arguments — fully declarative.', + style={'color': MUTED, 'marginBottom': '24px'}), + + html.Div(style={'display': 'flex', 'gap': '16px'}, children=[ + + # Left column + html.Div(style=section_style, children=[ + html.Span('Dropdown', style=label_style), + dcc.Dropdown( + ['New York City', 'Montréal', 'San Francisco'], + 'Montréal', + ), + + html.Span('Multi-Select Dropdown', style=label_style), + dcc.Dropdown( + ['New York City', 'Montréal', 'San Francisco'], + ['Montréal', 'San Francisco'], + multi=True, + ), + + html.Span('Radio Items', style=label_style), + dcc.RadioItems( + ['New York City', 'Montréal', 'San Francisco'], + 'Montréal', + labelStyle={'color': TEXT, 'marginRight': '12px', 'fontSize': '14px'}, + ), + ]), + + # Right column + html.Div(style=section_style, children=[ + html.Span('Checkboxes', style=label_style), + dcc.Checklist( + ['New York City', 'Montréal', 'San Francisco'], + ['Montréal', 'San Francisco'], + labelStyle={'color': TEXT, 'marginRight': '12px', 'fontSize': '14px'}, + ), + + html.Span('Text Input', style=label_style), + dcc.Input( + value='MTL', + type='text', + style={ + 'backgroundColor': BG, + 'border': f'1px solid {BORDER}', + 'borderRadius': '6px', + 'color': TEXT, + 'padding': '8px 12px', + 'fontSize': '14px', + 'outline': 'none', + }, + ), + + html.Span('Slider', style=label_style), + dcc.Slider( + min=0, + max=9, + marks={ + i: { + 'label': f'Label {i}' if i == 1 else str(i), + 'style': {'color': MUTED, 'fontSize': '11px'}, + } + for i in range(1, 6) + }, + value=5, + ), + ]), + ]), +]) + +if __name__ == '__main__': + app.run(debug=True) diff --git a/investments-dashboard/pages/__init__.py b/investments-dashboard/pages/__init__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/investments-dashboard/pages/__init__.py @@ -0,0 +1 @@ + diff --git a/investments-dashboard/pages/dashboard.py b/investments-dashboard/pages/dashboard.py new file mode 100644 index 0000000..3fd279a --- /dev/null +++ b/investments-dashboard/pages/dashboard.py @@ -0,0 +1,293 @@ +import dash_mantine_components as dmc +from dash import dcc, html +from dash_iconify import DashIconify + +from components.charts import create_hypothetical_growth_chart, create_sparkline +from components.tables import create_fund_facts_table +from utils.data_loader import get_fund_metrics, df_fund_facts + +metrics = get_fund_metrics() + +SYMBOLS = ["AAPL", "GOOGL", "MSFT", "AMZN", "TSLA"] +INITIAL_PRICES = {"AAPL": 189.50, "GOOGL": 176.30, "MSFT": 420.15, "AMZN": 185.60, "TSLA": 178.90} + +def create_kpi_card(id_prefix, title, value, trend=None, trend_positive=True, subtitle=None, icon=None): + """Create a KPI card with IDs for callback updates""" + trend_color = "teal" if trend_positive else "red" + + return dmc.Paper( + dmc.Stack([ + dmc.Group([ + dmc.Text(title, size="sm", c="dimmed", fw=500, id=f"{id_prefix}-title"), + DashIconify(icon=icon, width=20, color="gray") if icon else None, + ], justify="space-between"), + dmc.Group([ + dmc.Text(value, size="xl", fw=700, id=f"{id_prefix}-value"), + dmc.Text( + trend if trend else "", + size="sm", + c=trend_color, + fw=500, + id=f"{id_prefix}-trend", + style={"display": "block" if trend else "none"} + ), + ], justify="space-between", mt="xs"), + dmc.Text(subtitle, size="xs", c="dimmed", mt=4, id=f"{id_prefix}-subtitle") if subtitle else None, + ], gap="xs"), + p="md", + radius="md", + withBorder=True, + style={"minWidth": "200px"} + ) + +def create_risk_row(id_prefix, label, value, progress_value, color): + """Create a risk metric row with IDs for dynamic updates""" + return dmc.Group([ + dmc.Text(label, size="sm", w=100), + dmc.Progress(value=progress_value, color=color, size="lg", style={"flex": 1}, id=f"{id_prefix}-bar"), + dmc.Text(value, size="sm", fw=500, w=60, id=f"{id_prefix}-value"), + ], gap="sm") + +layout = dmc.Stack([ + # Page Header + dmc.Group([ + dmc.Stack([ + dmc.Title("Executive Dashboard", order=2), + dmc.Text("Fund performance overview and key metrics", c="dimmed"), + ], gap=4), + dmc.Group([ + dmc.SegmentedControl( + id="dashboard-period", + data=[ + {"value": "1Y", "label": "1Y"}, + {"value": "3Y", "label": "3Y"}, + {"value": "5Y", "label": "5Y"}, + {"value": "10Y", "label": "10Y"}, + {"value": "All", "label": "All"}, + ], + value="1Y", + size="sm", + ), + dmc.Select( + id="dashboard-fund-select", + data=[ + {"value": "500", "label": "500 Index Fund Inv"}, + {"value": "calibre", "label": "Calibre Index Fund"}, + ], + value="500", + w=200, + ), + dmc.Switch( + id="benchmark-toggle", + label="Benchmark", + checked=True, + size="sm", + ), + dmc.NumberInput( + id="investment-amount", + value=10000, + min=1000, + max=1000000, + step=1000, + prefix="$", + thousandSeparator=",", + w=130, + size="sm", + ), + ], gap="sm"), + ], justify="space-between", mb="lg"), + + # KPI Cards Row + dmc.SimpleGrid([ + create_kpi_card( + "kpi-nav", + "Net Asset Value", + f"${metrics['nav']:.2f}", + trend=f"↑ {metrics['ytd_return']:.1f}% YTD", + trend_positive=metrics['ytd_return'] > 0, + icon="tabler:currency-dollar" + ), + create_kpi_card( + "kpi-period", + "1 Year Return", + f"{metrics['1y_return']:.2f}%", + subtitle="vs S&P 500", + icon="tabler:chart-line" + ), + create_kpi_card( + "kpi-expense", + "Expense Ratio", + metrics['expense_ratio'], + trend="↓ 85% lower", + trend_positive=True, + subtitle="vs 0.99% category avg", + icon="tabler:percentage" + ), + create_kpi_card( + "kpi-category", + "Category", + metrics['category'], + subtitle=metrics['asset_class'], + icon="tabler:category" + ), + ], cols={"base": 1, "sm": 2, "lg": 4}, spacing="md"), + + # Main Charts Row + dmc.Grid([ + dmc.GridCol([ + dcc.Store(id="live-streaming", data=True), + dmc.Paper( + dmc.Stack([ + dmc.Group([ + dmc.Group([ + dmc.Text("Live Market Prices", fw=600, size="lg"), + html.Div( + style={ + "width": 8, "height": 8, "borderRadius": "50%", + "backgroundColor": "#40c057", + "animation": "pulse 1.5s ease-in-out infinite", + }, + id="live-indicator", + ), + dmc.Badge("LIVE", color="green", size="sm", variant="light"), + ], gap="xs"), + dmc.Switch( + id="live-toggle", + label="Stream", + checked=True, + size="sm", + ), + ], justify="space-between"), + dmc.Divider(), + dmc.Stack([ + dmc.Group([ + dmc.Text(sym, size="sm", fw=600, w=60), + dmc.Text( + f"${INITIAL_PRICES[sym]:.2f}", + size="sm", fw=700, ff="monospace", + id=f"live-price-{sym}", + ), + dmc.Text( + "+0.00 (0.00%)", + size="xs", c="dimmed", ff="monospace", + id=f"live-change-{sym}", + ), + ], justify="space-between") + for sym in SYMBOLS + ], gap="xs"), + dmc.Divider(), + dmc.Select( + id="sparkline-symbol", + data=[{"value": s, "label": s} for s in SYMBOLS], + value="AAPL", + size="xs", + w=120, + ), + dcc.Graph( + id="sparkline-chart", + figure=create_sparkline([INITIAL_PRICES["AAPL"]], "AAPL"), + config={"displayModeBar": False}, + style={"height": "120px"}, + ), + ], gap="sm"), + p="md", + radius="md", + withBorder=True, + ) + ], span={"base": 12, "md": 7}), + + dmc.GridCol([ + dmc.Paper( + dmc.Stack([ + dcc.Graph( + id="growth-chart", + figure=create_hypothetical_growth_chart(), + config={"displayModeBar": False}, + style={"height": "350px"} + ), + ]), + p="md", + radius="md", + withBorder=True, + ) + ], span={"base": 12, "md": 5}), + ], gutter="md"), + + # Fund Facts and Quick Stats Row + dmc.Grid([ + dmc.GridCol([ + dmc.Paper( + dmc.Stack([ + dmc.Text("Fund Facts", fw=600, size="lg"), + create_fund_facts_table(df_fund_facts), + ], gap="sm"), + p="md", + radius="md", + withBorder=True, + ) + ], span={"base": 12, "md": 4}), + + dmc.GridCol([ + dmc.Paper( + dmc.Stack([ + dmc.Text("Quick Comparison", fw=600, size="lg"), + dmc.SimpleGrid([ + dmc.Paper( + dmc.Stack([ + dmc.Text("1Y RETURN", size="xs", c="dimmed", fw=600), + dmc.Text(f"{metrics['1y_return']:.2f}%", size="lg", fw=600, id="quick-1y"), + dmc.Text("Fund", size="xs", c="dimmed"), + ], gap=4), + p="sm", radius="sm", withBorder=True, + ), + dmc.Paper( + dmc.Stack([ + dmc.Text("3Y RETURN", size="xs", c="dimmed", fw=600), + dmc.Text(f"{metrics['3y_return']:.2f}%", size="lg", fw=600, id="quick-3y"), + dmc.Text("Fund", size="xs", c="dimmed"), + ], gap=4), + p="sm", radius="sm", withBorder=True, + ), + dmc.Paper( + dmc.Stack([ + dmc.Text("5Y RETURN", size="xs", c="dimmed", fw=600), + dmc.Text(f"{metrics['5y_return']:.2f}%", size="lg", fw=600, id="quick-5y"), + dmc.Text("Fund", size="xs", c="dimmed"), + ], gap=4), + p="sm", radius="sm", withBorder=True, + ), + dmc.Paper( + dmc.Stack([ + dmc.Text("MIN INVESTMENT", size="xs", c="dimmed", fw=600), + dmc.Text(metrics['min_investment'].replace('"', ''), size="lg", fw=600, id="quick-min"), + ], gap=4), + p="sm", radius="sm", withBorder=True, + ), + ], cols=2, spacing="sm"), + ], gap="sm"), + p="md", + radius="md", + withBorder=True, + ) + ], span={"base": 12, "md": 4}), + + dmc.GridCol([ + dmc.Paper( + dmc.Stack([ + dmc.Text("Risk Overview", fw=600, size="lg"), + dmc.Stack([ + create_risk_row("risk-volatility", "Volatility", "Medium", 45, "blue"), + create_risk_row("risk-beta", "Beta", "1.00", 100, "green"), + create_risk_row("risk-sharpe", "Sharpe Ratio", "0.85", 70, "teal"), + create_risk_row("risk-alpha", "Alpha", "-0.02", 50, "yellow"), + ], gap="md", mt="sm"), + ], gap="sm"), + p="md", + radius="md", + withBorder=True, + h="100%", + ) + ], span={"base": 12, "md": 4}), + ], gutter="md"), + +], gap="md") diff --git a/investments-dashboard/pages/fees.py b/investments-dashboard/pages/fees.py new file mode 100644 index 0000000..145ef7a --- /dev/null +++ b/investments-dashboard/pages/fees.py @@ -0,0 +1,333 @@ +import dash_mantine_components as dmc +from dash import dcc, html +from dash_iconify import DashIconify +import plotly.graph_objects as go + +from components.charts import create_fee_comparison_chart, create_dividend_timeline, CHART_COLORS, CHART_LAYOUT +from components.tables import create_data_table, create_dividend_table +from utils.data_loader import ( + df_expenses, df_minimums, get_dividend_history, + df_realized, df_unrealized +) + +dividend_data = get_dividend_history() + +def create_fee_waterfall(): + """Create fee breakdown waterfall chart""" + fig = go.Figure(go.Waterfall( + orientation="v", + measure=["absolute", "relative", "relative", "relative", "total"], + x=["Management Fee", "Admin Fee", "12b-1 Fee", "Other", "Total Expense"], + y=[0.10, 0.02, 0.00, 0.02, 0], + connector={"line": {"color": "rgb(63, 63, 63)"}}, + decreasing={"marker": {"color": CHART_COLORS['secondary']}}, + increasing={"marker": {"color": CHART_COLORS['danger']}}, + totals={"marker": {"color": CHART_COLORS['primary']}}, + text=["+0.10%", "+0.02%", "+0.00%", "+0.02%", "0.14%"], + textposition="outside", + )) + + fig.update_layout( + **CHART_LAYOUT, + title={'text': 'Expense Ratio Breakdown', 'x': 0, 'font': {'size': 16, 'weight': 600}}, + yaxis={'title': 'Percentage', 'ticksuffix': '%'}, + showlegend=False, + ) + + return fig + +def create_cost_impact_chart(initial=10000, years=30): + """Show cost impact over time""" + year_range = list(range(1, years + 1)) + + fund_values = [initial * (1.07 - 0.0014) ** y for y in year_range] + avg_values = [initial * (1.07 - 0.0099) ** y for y in year_range] + + fig = go.Figure() + + fig.add_trace(go.Scatter( + x=year_range, + y=avg_values, + name='Category Avg (0.99%)', + line={'color': CHART_COLORS['gray'], 'width': 2}, + )) + + fig.add_trace(go.Scatter( + x=year_range, + y=fund_values, + name='This Fund (0.14%)', + line={'color': CHART_COLORS['primary'], 'width': 2}, + fill='tonexty', + fillcolor='rgba(34, 139, 230, 0.1)', + )) + + fig.update_layout( + **CHART_LAYOUT, + title={'text': 'Long-Term Cost Impact (7% annual return)', 'x': 0, 'font': {'size': 16, 'weight': 600}}, + xaxis={'title': 'Years'}, + yaxis={'title': 'Portfolio Value', 'tickprefix': '$', 'tickformat': ','}, + legend={'orientation': 'h', 'y': -0.15}, + ) + + return fig + +def create_dividend_calendar(): + """Create dividend payment calendar visualization""" + months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'] + dividends = [0, 0, 0.96, 0, 0, 0.96, 0, 0, 1.13, 0, 0, 1.13] + + fig = go.Figure() + + fig.add_trace(go.Bar( + x=months, + y=dividends, + marker_color=[CHART_COLORS['primary'] if d > 0 else CHART_COLORS['gray'] for d in dividends], + text=[f'${d:.2f}' if d > 0 else '' for d in dividends], + textposition='outside', + )) + + fig.update_layout( + **CHART_LAYOUT, + title={'text': 'Dividend Payment Calendar', 'x': 0, 'font': {'size': 16, 'weight': 600}}, + yaxis={'title': 'Dividend per Share', 'tickprefix': '$'}, + xaxis={'title': 'Month'}, + ) + + return fig + +layout = dmc.Stack([ + # Page Header + dmc.Group([ + dmc.Stack([ + dmc.Title("Fees & Distributions", order=2), + dmc.Text("Expense analysis, dividend history, and capital gains", c="dimmed"), + ], gap=4), + dmc.Group([ + ], gap="sm"), + ], justify="space-between", mb="lg"), + + # Fee Calculator Section + dmc.Paper( + dmc.Stack([ + dmc.Text("Fee Impact Calculator", fw=600, size="lg"), + dmc.Text("Adjust investment amount and time horizon to see the impact of fees", size="sm", c="dimmed"), + dmc.Grid([ + dmc.GridCol([ + dmc.Stack([ + dmc.Text("Investment Amount", size="sm", fw=500), + dmc.NumberInput( + id="investment-amount", + value=10000, + min=1000, + max=1000000, + step=1000, + prefix="$", + thousandSeparator=",", + w="100%", + ), + ], gap="xs"), + ], span={"base": 12, "sm": 6, "md": 3}), + dmc.GridCol([ + dmc.Stack([ + dmc.Text("Time Horizon (Years)", size="sm", fw=500), + dmc.Slider( + id="time-horizon", + value=10, + min=1, + max=30, + step=1, + marks=[ + {"value": 1, "label": "1"}, + {"value": 10, "label": "10"}, + {"value": 20, "label": "20"}, + {"value": 30, "label": "30"}, + ], + mt="md", + ), + dmc.Space(h=20), + ], gap="xs"), + ], span={"base": 12, "sm": 6, "md": 5}), + dmc.GridCol([ + dmc.Paper( + dmc.Stack([ + dmc.Stack([ + dmc.Text("Your Savings", size="xs", c="dimmed", tt="uppercase", fw=500), + dmc.Text("$1,913", size="28px", fw=700, c="teal", id="savings-amount"), + dmc.Text("vs category average", size="xs", c="dimmed"), + ], gap=2, align="center"), + dmc.Divider(), + dmc.Group([ + dmc.Stack([ + dmc.Text("This Fund", size="xs", c="dimmed"), + dmc.Text("$19,672", size="lg", fw=600, c="teal", id="final-value-fund"), + ], gap=2, align="center"), + dmc.Divider(orientation="vertical", h=40), + dmc.Stack([ + dmc.Text("Category Avg", size="xs", c="dimmed"), + dmc.Text("$17,759", size="lg", fw=600, c="gray", id="final-value-avg"), + ], gap=2, align="center"), + ], justify="center", gap="xl"), + ], gap="sm"), + p="md", + radius="md", + bg="var(--mantine-color-gray-0)", + style={"border": "1px dashed var(--mantine-color-gray-4)"}, + ), + ], span={"base": 12, "md": 4}), + ], gutter="md", align="center"), + ], gap="md"), + p="md", + radius="md", + withBorder=True, + ), + + # Fee Highlight Cards + dmc.SimpleGrid([ + dmc.Paper( + dmc.Stack([ + dmc.Text("Expense Ratio", size="sm", c="dimmed"), + dmc.Group([ + dmc.Text("0.14%", size="xl", fw=700, c="green"), + dmc.Badge("85% below avg", color="green", size="sm"), + ], gap="sm"), + dmc.Text("Category average: 0.99%", size="xs", c="dimmed"), + ], gap=4), + p="md", + radius="md", + withBorder=True, + ), + dmc.Paper( + dmc.Stack([ + dmc.Text("Distribution Yield", size="sm", c="dimmed"), + dmc.Text("1.77%", size="xl", fw=700), + dmc.Text("Annual yield based on distributions", size="xs", c="dimmed"), + ], gap=4), + p="md", + radius="md", + withBorder=True, + ), + dmc.Paper( + dmc.Stack([ + dmc.Text("SEC Yield", size="sm", c="dimmed"), + dmc.Text("1.77%", size="xl", fw=700), + dmc.Text("30-day SEC yield", size="xs", c="dimmed"), + ], gap=4), + p="md", + radius="md", + withBorder=True, + ), + dmc.Paper( + dmc.Stack([ + dmc.Text("Annual Fee", size="sm", c="dimmed"), + dmc.Text("$14", size="xl", fw=700, c="green"), + dmc.Text("Per $10,000 invested", size="xs", c="dimmed"), + ], gap=4), + p="md", + radius="md", + withBorder=True, + ), + ], cols={"base": 2, "md": 4}, spacing="md"), + + # Fee Charts Row + dmc.Grid([ + dmc.GridCol([ + dmc.Paper( + dcc.Graph( + id="fee-comparison-chart", + figure=create_fee_comparison_chart(), + config={"displayModeBar": False}, + style={"height": "350px"} + ), + p="md", + radius="md", + withBorder=True, + ) + ], span={"base": 12, "md": 6}), + + dmc.GridCol([ + dmc.Paper( + dcc.Graph( + figure=create_fee_waterfall(), + config={"displayModeBar": False}, + style={"height": "350px"} + ), + p="md", + radius="md", + withBorder=True, + ) + ], span={"base": 12, "md": 6}), + ], gutter="md"), + + # Long-term Cost Impact + dmc.Paper( + dcc.Graph( + id="cost-impact-chart", + figure=create_cost_impact_chart(), + config={"displayModeBar": False}, + style={"height": "350px"} + ), + p="md", + radius="md", + withBorder=True, + ), + + # Distributions Section + dmc.Title("Distributions", order=3, mt="lg"), + + dmc.Grid([ + dmc.GridCol([ + dmc.Paper( + dcc.Graph( + figure=create_dividend_calendar(), + config={"displayModeBar": False}, + style={"height": "300px"} + ), + p="md", + radius="md", + withBorder=True, + ) + ], span={"base": 12, "md": 6}), + + dmc.GridCol([ + dmc.Paper( + dmc.Stack([ + dmc.Text("Recent Distributions", fw=600, size="lg"), + create_data_table(dividend_data.head(5)), + ], gap="sm"), + p="md", + radius="md", + withBorder=True, + ) + ], span={"base": 12, "md": 6}), + ], gutter="md"), + + # Capital Gains Section + dmc.Title("Capital Gains", order=3, mt="lg"), + + dmc.Grid([ + dmc.GridCol([ + dmc.Paper( + dmc.Stack([ + dmc.Text("Realized Gains", fw=600, size="lg"), + create_data_table(df_realized), + ], gap="sm"), + p="md", + radius="md", + withBorder=True, + ) + ], span={"base": 12, "md": 6}), + + dmc.GridCol([ + dmc.Paper( + dmc.Stack([ + dmc.Text("Unrealized Appreciation", fw=600, size="lg"), + create_data_table(df_unrealized), + ], gap="sm"), + p="md", + radius="md", + withBorder=True, + ) + ], span={"base": 12, "md": 6}), + ], gutter="md"), + +], gap="md") diff --git a/investments-dashboard/pages/performance.py b/investments-dashboard/pages/performance.py new file mode 100644 index 0000000..28ccb3c --- /dev/null +++ b/investments-dashboard/pages/performance.py @@ -0,0 +1,364 @@ +import dash_mantine_components as dmc +from dash import dcc, html +from dash_iconify import DashIconify +import plotly.graph_objects as go + +from components.charts import create_performance_line_chart, CHART_COLORS, CHART_LAYOUT +from utils.data_loader import ( + get_time_series_data, get_returns_data, + df_current_prices, df_avg_returns, df_after_tax, df_recent_returns +) + +ts_data = get_time_series_data() +returns_data = get_returns_data() + +def create_returns_table(df): + """Create properly formatted returns table from raw CSV data""" + data = df.values.tolist() + + if len(data) < 2: + return dmc.Text("No data available", c="dimmed") + + headers = [str(h).replace("'-", "").strip() or "Fund" for h in data[0]] + rows_data = data[1:] + + header = dmc.TableThead( + dmc.TableTr([ + dmc.TableTh(col, style={'fontWeight': 600, 'fontSize': '13px'}) for col in headers + ]) + ) + + rows = [] + for row in rows_data: + cells = [] + for i, val in enumerate(row): + val_str = str(val).replace("'-", "—").strip() + style = {'fontSize': '13px'} + + if '%' in val_str and val_str not in ['—', '']: + try: + num = float(val_str.replace('%', '')) + style['color'] = '#40c057' if num > 0 else '#fa5252' if num < 0 else None + style['fontWeight'] = 500 + except: + pass + + if i == 0: + style['fontWeight'] = 500 + + cells.append(dmc.TableTd(val_str if val_str else "—", style=style)) + rows.append(dmc.TableTr(cells)) + + body = dmc.TableTbody(rows) + + return dmc.ScrollArea( + dmc.Table( + [header, body], + striped=True, + highlightOnHover=True, + withTableBorder=True, + withColumnBorders=False, + verticalSpacing="xs", + ), + type="auto" + ) + +def create_drawdown_chart(df): + """Calculate and plot drawdown""" + prices = df['Calibre Index Fund'].values + peak = prices[0] + drawdowns = [] + + for price in prices: + if price > peak: + peak = price + drawdown = (price - peak) / peak * 100 + drawdowns.append(drawdown) + + fig = go.Figure() + fig.add_trace(go.Scatter( + x=df['Date'], + y=drawdowns, + fill='tozeroy', + line={'color': CHART_COLORS['danger'], 'width': 1}, + fillcolor='rgba(250, 82, 82, 0.2)', + name='Drawdown', + )) + + fig.update_layout( + **CHART_LAYOUT, + title={'text': 'Drawdown Analysis', 'x': 0, 'font': {'size': 16, 'weight': 600}}, + yaxis={'showgrid': True, 'gridcolor': 'rgba(0,0,0,0.05)', 'ticksuffix': '%'}, + showlegend=False, + ) + return fig + +initial_total_return = ((ts_data['Calibre Index Fund'].iloc[-1] - ts_data['Calibre Index Fund'].iloc[0]) / ts_data['Calibre Index Fund'].iloc[0] * 100) + +layout = dmc.Stack([ + # Page Header + dmc.Stack([ + dmc.Group([ + dmc.Stack([ + dmc.Title("Price Performance", order=2), + dmc.Text("Historical prices, returns analysis, and benchmark comparison", c="dimmed"), + ], gap=4), + ], justify="space-between"), + + # Filter Row + dmc.Paper( + dmc.Group([ + dmc.Group([ + dmc.Text("Period", size="xs", fw=500, c="dimmed"), + dmc.SegmentedControl( + id="performance-period", + data=["1M", "3M", "6M", "1Y", "3Y", "5Y", "All"], + value="All", + size="xs", + ), + ], gap=6), + dmc.Divider(orientation="vertical", style={"alignSelf": "stretch"}), + dmc.Group([ + dmc.Text("Benchmarks", size="xs", fw=500, c="dimmed"), + dmc.MultiSelect( + id="benchmark-selector", + data=[ + {"value": "calibre", "label": "Calibre Index Fund"}, + {"value": "msci", "label": "MSCI EAFE Index"}, + {"value": "sp500", "label": "S&P 500"}, + ], + value=["calibre", "msci", "sp500"], + w=220, + clearable=True, + size="xs", + ), + ], gap=6), + dmc.Divider(orientation="vertical", style={"alignSelf": "stretch"}), + dmc.Group([ + dmc.Text("Display", size="xs", fw=500, c="dimmed"), + dmc.Switch( + id="normalize-toggle", + label="Normalize", + checked=True, + size="xs", + ), + dmc.Switch( + id="log-scale-toggle", + label="Log Scale", + checked=False, + size="xs", + ), + ], gap=8), + dmc.Divider(orientation="vertical", style={"alignSelf": "stretch"}), + dmc.Group([ + dmc.Text("Overlay", size="xs", fw=500, c="dimmed"), + dmc.Select( + id="ma-selector", + data=[ + {"value": "none", "label": "No MA"}, + {"value": "20", "label": "20-day"}, + {"value": "50", "label": "50-day"}, + {"value": "200", "label": "200-day"}, + ], + value="none", + w=100, + size="xs", + ), + ], gap=6), + ], gap="md", align="center"), + p="sm", + radius="md", + withBorder=True, + ), + ], gap="sm", mb="md"), + + # 1. Stats Cards Row (TOP) + dmc.SimpleGrid([ + dmc.Paper( + dmc.Stack([ + dmc.Text("Period High", size="sm", c="dimmed"), + dmc.Text( + f"${ts_data['Calibre Index Fund'].max():.2f}", + size="xl", fw=700, c="green", + id="period-high-value" + ), + dmc.Text( + ts_data.loc[ts_data['Calibre Index Fund'].idxmax(), 'Date'].strftime('%Y-%m-%d'), + size="xs", c="dimmed", + id="period-high-date" + ), + ], gap=4), + p="md", + radius="md", + withBorder=True, + ), + dmc.Paper( + dmc.Stack([ + dmc.Text("Period Low", size="sm", c="dimmed"), + dmc.Text( + f"${ts_data['Calibre Index Fund'].min():.2f}", + size="xl", fw=700, c="red", + id="period-low-value" + ), + dmc.Text( + ts_data.loc[ts_data['Calibre Index Fund'].idxmin(), 'Date'].strftime('%Y-%m-%d'), + size="xs", c="dimmed", + id="period-low-date" + ), + ], gap=4), + p="md", + radius="md", + withBorder=True, + ), + dmc.Paper( + dmc.Stack([ + dmc.Text("Current Price", size="sm", c="dimmed"), + dmc.Text( + f"${ts_data['Calibre Index Fund'].iloc[-1]:.2f}", + size="xl", fw=700, + id="current-price-value" + ), + dmc.Text("Latest available", size="xs", c="dimmed"), + ], gap=4), + p="md", + radius="md", + withBorder=True, + ), + dmc.Paper( + dmc.Stack([ + dmc.Text("Total Return", size="sm", c="dimmed"), + dmc.Text( + f"{initial_total_return:.1f}%", + size="xl", fw=700, + c="green" if initial_total_return > 0 else "red", + id="total-return-value" + ), + dmc.Text("For selected period", size="xs", c="dimmed"), + ], gap=4), + p="md", + radius="md", + withBorder=True, + ), + ], cols={"base": 2, "md": 4}, spacing="md"), + + # 2. Performance Metrics Row (SECOND) + dmc.SimpleGrid([ + dmc.Paper( + dmc.Stack([ + dmc.Text("Volatility (Ann.)", size="sm", c="dimmed"), + dmc.Text("0.0%", size="xl", fw=700, id="perf-volatility"), + dmc.Text("Std deviation of returns", size="xs", c="dimmed"), + ], gap=4), + p="md", + radius="md", + withBorder=True, + ), + dmc.Paper( + dmc.Stack([ + dmc.Text("Max Drawdown", size="sm", c="dimmed"), + dmc.Text("0.0%", size="xl", fw=700, c="red", id="perf-max-drawdown"), + dmc.Text("Worst peak-to-trough", size="xs", c="dimmed"), + ], gap=4), + p="md", + radius="md", + withBorder=True, + ), + dmc.Paper( + dmc.Stack([ + dmc.Text("Sharpe Ratio", size="sm", c="dimmed"), + dmc.Text("0.00", size="xl", fw=700, id="perf-sharpe"), + dmc.Text("Risk-adjusted return", size="xs", c="dimmed"), + ], gap=4), + p="md", + radius="md", + withBorder=True, + ), + dmc.Paper( + dmc.Stack([ + dmc.Text("Best / Worst Day", size="sm", c="dimmed"), + dmc.Group([ + dmc.Text("+0.0%", size="lg", fw=700, c="green", id="perf-best-day"), + dmc.Text("/", size="lg", c="dimmed"), + dmc.Text("-0.0%", size="lg", fw=700, c="red", id="perf-worst-day"), + ], gap=4), + dmc.Text("Single-day extremes", size="xs", c="dimmed"), + ], gap=4), + p="md", + radius="md", + withBorder=True, + ), + ], cols={"base": 2, "md": 4}, spacing="md"), + + # 3. Returns Tables and Analysis Charts Row (THIRD) + dmc.Grid([ + dmc.GridCol([ + dmc.Paper( + dmc.Stack([ + dmc.Tabs([ + dmc.TabsList([ + dmc.TabsTab("Average Returns", value="avg"), + dmc.TabsTab("After Tax", value="tax"), + dmc.TabsTab("Recent Returns", value="recent"), + ]), + dmc.TabsPanel(create_returns_table(df_avg_returns), value="avg", pt="md"), + dmc.TabsPanel(create_returns_table(df_after_tax), value="tax", pt="md"), + dmc.TabsPanel(create_returns_table(df_recent_returns), value="recent", pt="md"), + ], value="avg"), + ], gap="sm"), + p="md", + radius="md", + withBorder=True, + ) + ], span={"base": 12, "md": 6}), + + dmc.GridCol([ + dmc.Paper( + dmc.Stack([ + dmc.Tabs([ + dmc.TabsList([ + dmc.TabsTab("Drawdown", value="drawdown"), + dmc.TabsTab("Rolling Returns", value="rolling"), + ]), + dmc.TabsPanel( + dcc.Graph( + id="drawdown-chart", + figure=create_drawdown_chart(ts_data), + config={"displayModeBar": False}, + style={"height": "300px"} + ), + value="drawdown", pt="md" + ), + dmc.TabsPanel( + dcc.Graph( + id="rolling-returns-chart", + figure=go.Figure(), + config={"displayModeBar": False}, + style={"height": "300px"} + ), + value="rolling", pt="md" + ), + ], value="drawdown", id="analysis-tabs"), + ], gap="sm"), + p="md", + radius="md", + withBorder=True, + ) + ], span={"base": 12, "md": 6}), + ], gutter="md"), + + # 4. Main Performance Chart (BOTTOM) + dmc.Paper( + dmc.Stack([ + dcc.Graph( + id="performance-chart", + figure=create_performance_line_chart(ts_data), + config={"displayModeBar": False}, + style={"height": "400px"} + ), + ]), + p="md", + radius="md", + withBorder=True, + ), + +], gap="md") diff --git a/investments-dashboard/pages/portfolio.py b/investments-dashboard/pages/portfolio.py new file mode 100644 index 0000000..557f38e --- /dev/null +++ b/investments-dashboard/pages/portfolio.py @@ -0,0 +1,414 @@ +import dash_mantine_components as dmc +from dash_iconify import DashIconify +from dash import dcc, html +import plotly.graph_objects as go +import plotly.express as px + +from components.charts import create_sector_donut_chart, CHART_COLORS, CHART_LAYOUT +from components.tables import create_data_table +from utils.data_loader import get_sector_allocation, df_equity_char, df_equity_diver + +sector_data = get_sector_allocation() + +def create_style_box(): + """Create 3x3 investment style box""" + fig = go.Figure() + + labels = [ + ['Large Value', 'Large Blend', 'Large Growth'], + ['Mid Value', 'Mid Blend', 'Mid Growth'], + ['Small Value', 'Small Blend', 'Small Growth'] + ] + + for i in range(3): + for j in range(3): + color = '#228be6' if (i == 0 and j == 1) else '#f1f3f5' + opacity = 1 if (i == 0 and j == 1) else 0.5 + + fig.add_shape( + type="rect", + x0=j, x1=j+1, y0=2-i, y1=3-i, + fillcolor=color, + opacity=opacity, + line={'color': '#dee2e6', 'width': 1}, + ) + + fig.add_annotation( + x=j+0.5, y=2.5-i, + text=labels[i][j], + showarrow=False, + font={'size': 10, 'color': '#fff' if (i == 0 and j == 1) else '#495057'}, + ) + + fig.update_layout( + **CHART_LAYOUT, + title={'text': 'Investment Style', 'x': 0, 'font': {'size': 16, 'weight': 600}}, + xaxis={'visible': False, 'range': [-0.1, 3.1]}, + yaxis={'visible': False, 'range': [-0.1, 3.1]}, + height=300, + ) + + return fig + +def create_sector_comparison_bar(): + """Create horizontal bar chart comparing fund vs benchmark sectors""" + fig = go.Figure() + + fig.add_trace(go.Bar( + y=sector_data['Sector'], + x=sector_data['Fund'], + name='Fund', + orientation='h', + marker_color=CHART_COLORS['primary'], + )) + + fig.add_trace(go.Bar( + y=sector_data['Sector'], + x=sector_data['Benchmark'], + name='Benchmark', + orientation='h', + marker_color=CHART_COLORS['gray'], + )) + + fig.update_layout( + **CHART_LAYOUT, + title={'text': 'Sector Allocation vs Benchmark', 'x': 0, 'font': {'size': 16, 'weight': 600}}, + barmode='group', + bargap=0.3, + legend={'orientation': 'h', 'y': -0.15}, + xaxis={'title': 'Allocation %', 'ticksuffix': '%'}, + yaxis={'title': ''}, + height=450, + ) + + return fig + +def create_risk_return_scatter(): + """Create risk/return scatter plot""" + funds = ['500 Index Fund', 'MSCI EAFE', 'Growth Fund', 'Value Fund', 'Bond Fund'] + returns = [16.94, 14.2, 19.5, 12.3, 5.2] + risk = [15.2, 18.5, 22.1, 14.8, 6.3] + sizes = [100, 80, 60, 70, 50] + + fig = go.Figure() + + fig.add_trace(go.Scatter( + x=risk, + y=returns, + mode='markers+text', + marker={'size': sizes, 'color': px.colors.qualitative.Set2[:5], 'opacity': 0.7}, + text=funds, + textposition='top center', + hovertemplate='%{text}
Risk: %{x:.1f}%
Return: %{y:.1f}%' + )) + + fig.update_layout( + **CHART_LAYOUT, + title={'text': 'Risk vs Return', 'x': 0, 'font': {'size': 16, 'weight': 600}}, + xaxis={'title': 'Risk (Std Dev %)', 'showgrid': True, 'gridcolor': 'rgba(0,0,0,0.05)'}, + yaxis={'title': 'Return %', 'showgrid': True, 'gridcolor': 'rgba(0,0,0,0.05)'}, + height=350, + ) + + return fig + +def create_donut_with_click(): + """Create donut chart configured for click events""" + colors = px.colors.qualitative.Set3[:len(sector_data)] + + fig = go.Figure(go.Pie( + labels=sector_data['Sector'], + values=sector_data['Fund'], + hole=0.6, + marker={'colors': colors}, + textinfo='percent', + textposition='outside', + hovertemplate='%{label}
%{value:.1f}%' + )) + + fig.update_layout( + **CHART_LAYOUT, + title={'text': 'Sector Allocation (Click to highlight)', 'x': 0, 'font': {'size': 16, 'weight': 600}}, + showlegend=True, + legend={'orientation': 'v', 'x': 1.05, 'y': 0.5}, + annotations=[{ + 'text': 'Sectors', + 'x': 0.5, 'y': 0.5, + 'font': {'size': 14, 'weight': 600}, + 'showarrow': False + }] + ) + + return fig + +# Allocation View Content +allocation_view = html.Div([ + dmc.Grid([ + dmc.GridCol([ + dmc.Paper( + dmc.Stack([ + dcc.Graph( + id="sector-donut", + figure=create_donut_with_click(), + config={"displayModeBar": False}, + style={"height": "400px"} + ), + dmc.Text("Click on a sector to see details", size="sm", c="dimmed", ta="center", id="sector-detail-text"), + ]), + p="md", + radius="md", + withBorder=True, + ) + ], span={"base": 12, "md": 6}), + + dmc.GridCol([ + dmc.Stack([ + dmc.Paper( + dcc.Graph( + figure=create_style_box(), + config={"displayModeBar": False}, + ), + p="md", + radius="md", + withBorder=True, + ), + dmc.Paper( + dmc.Stack([ + dmc.Text("Portfolio Style Summary", fw=600), + dmc.Group([ + dmc.Badge("Large Cap", color="blue", size="lg"), + dmc.Badge("Blend", color="gray", size="lg"), + dmc.Badge("Domestic", color="green", size="lg"), + ]), + dmc.Text( + "This fund tracks the S&P 500 Index, providing broad exposure to large-cap U.S. equities across value, blend, and growth styles.", + size="sm", c="dimmed", mt="xs" + ), + ], gap="sm"), + p="md", + radius="md", + withBorder=True, + ), + ], gap="md"), + ], span={"base": 12, "md": 6}), + ], gutter="md"), + + dmc.Paper( + dcc.Graph( + id="sector-bar-chart", + figure=create_sector_comparison_bar(), + config={"displayModeBar": False}, + ), + p="md", + radius="md", + withBorder=True, + mt="md", + ), +], id="allocation-view") + +# Characteristics View Content +characteristics_view = html.Div([ + dmc.Grid([ + dmc.GridCol([ + dmc.Paper( + dmc.Stack([ + dmc.Text("Equity Characteristics", fw=600, size="lg"), + create_data_table(df_equity_char), + ], gap="sm"), + p="md", + radius="md", + withBorder=True, + ) + ], span={"base": 12, "md": 6}), + + dmc.GridCol([ + dmc.Paper( + dmc.Stack([ + dmc.Text("Sector Diversification", fw=600, size="lg"), + create_data_table(df_equity_diver), + ], gap="sm"), + p="md", + radius="md", + withBorder=True, + ) + ], span={"base": 12, "md": 6}), + ], gutter="md"), + + dmc.Paper( + dmc.Stack([ + dmc.Text("Key Metrics Comparison", fw=600, size="lg"), + dmc.SimpleGrid([ + dmc.Paper( + dmc.Stack([ + dmc.Text("P/E Ratio", size="sm", c="dimmed"), + dmc.Text("21.4", size="xl", fw=700), + dmc.Text("vs 22.1 benchmark", size="xs", c="dimmed"), + ], gap=4), + p="md", radius="sm", withBorder=True, + ), + dmc.Paper( + dmc.Stack([ + dmc.Text("P/B Ratio", size="sm", c="dimmed"), + dmc.Text("3.2", size="xl", fw=700), + dmc.Text("vs 3.4 benchmark", size="xs", c="dimmed"), + ], gap=4), + p="md", radius="sm", withBorder=True, + ), + dmc.Paper( + dmc.Stack([ + dmc.Text("Dividend Yield", size="sm", c="dimmed"), + dmc.Text("1.8%", size="xl", fw=700), + dmc.Text("vs 1.7% benchmark", size="xs", c="dimmed"), + ], gap=4), + p="md", radius="sm", withBorder=True, + ), + dmc.Paper( + dmc.Stack([ + dmc.Text("Earnings Growth", size="sm", c="dimmed"), + dmc.Text("12.5%", size="xl", fw=700), + dmc.Text("5-year average", size="xs", c="dimmed"), + ], gap=4), + p="md", radius="sm", withBorder=True, + ), + ], cols={"base": 2, "md": 4}, spacing="md"), + ], gap="sm"), + p="md", + radius="md", + withBorder=True, + mt="md", + ), +], id="characteristics-view", style={"display": "none"}) + +# Risk Analysis View Content +risk_view = html.Div([ + dmc.Grid([ + dmc.GridCol([ + dmc.Paper( + dcc.Graph( + figure=create_risk_return_scatter(), + config={"displayModeBar": False}, + style={"height": "400px"} + ), + p="md", + radius="md", + withBorder=True, + ) + ], span={"base": 12, "md": 6}), + + dmc.GridCol([ + dmc.Paper( + dmc.Stack([ + dmc.Text("Risk Metrics", fw=600, size="lg"), + dmc.Stack([ + dmc.Group([ + dmc.Text("Standard Deviation", size="sm", w=150), + dmc.Progress(value=65, color="blue", size="lg", style={"flex": 1}), + dmc.Text("15.2%", size="sm", fw=500, w=60), + ], gap="sm"), + dmc.Group([ + dmc.Text("Beta", size="sm", w=150), + dmc.Progress(value=100, color="green", size="lg", style={"flex": 1}), + dmc.Text("1.00", size="sm", fw=500, w=60), + ], gap="sm"), + dmc.Group([ + dmc.Text("Sharpe Ratio", size="sm", w=150), + dmc.Progress(value=70, color="teal", size="lg", style={"flex": 1}), + dmc.Text("0.85", size="sm", fw=500, w=60), + ], gap="sm"), + dmc.Group([ + dmc.Text("Sortino Ratio", size="sm", w=150), + dmc.Progress(value=75, color="cyan", size="lg", style={"flex": 1}), + dmc.Text("1.12", size="sm", fw=500, w=60), + ], gap="sm"), + dmc.Group([ + dmc.Text("Max Drawdown", size="sm", w=150), + dmc.Progress(value=35, color="red", size="lg", style={"flex": 1}), + dmc.Text("-33.8%", size="sm", fw=500, w=60), + ], gap="sm"), + dmc.Group([ + dmc.Text("Tracking Error", size="sm", w=150), + dmc.Progress(value=10, color="gray", size="lg", style={"flex": 1}), + dmc.Text("0.04%", size="sm", fw=500, w=60), + ], gap="sm"), + ], gap="md", mt="md"), + ], gap="sm"), + p="md", + radius="md", + withBorder=True, + h="100%", + ) + ], span={"base": 12, "md": 6}), + ], gutter="md"), + + dmc.Paper( + dmc.Stack([ + dmc.Text("Risk Analysis Summary", fw=600, size="lg"), + dmc.Alert( + "This fund closely tracks its benchmark (S&P 500) with minimal tracking error. The risk profile is consistent with broad market exposure.", + title="Low Tracking Error", + color="blue", + ), + dmc.SimpleGrid([ + dmc.Paper( + dmc.Stack([ + dmc.Text("Upside Capture", size="sm", c="dimmed"), + dmc.Text("99.8%", size="xl", fw=700, c="green"), + ], gap=4), + p="md", radius="sm", withBorder=True, + ), + dmc.Paper( + dmc.Stack([ + dmc.Text("Downside Capture", size="sm", c="dimmed"), + dmc.Text("100.2%", size="xl", fw=700, c="red"), + ], gap=4), + p="md", radius="sm", withBorder=True, + ), + dmc.Paper( + dmc.Stack([ + dmc.Text("Information Ratio", size="sm", c="dimmed"), + dmc.Text("-0.12", size="xl", fw=700), + ], gap=4), + p="md", radius="sm", withBorder=True, + ), + dmc.Paper( + dmc.Stack([ + dmc.Text("R-Squared", size="sm", c="dimmed"), + dmc.Text("99.9%", size="xl", fw=700, c="green"), + ], gap=4), + p="md", radius="sm", withBorder=True, + ), + ], cols={"base": 2, "md": 4}, spacing="md"), + ], gap="md"), + p="md", + radius="md", + withBorder=True, + mt="md", + ), +], id="risk-view", style={"display": "none"}) + +layout = dmc.Stack([ + # Page Header + dmc.Group([ + dmc.Stack([ + dmc.Title("Portfolio Analysis", order=2), + dmc.Text("Asset allocation, sector breakdown, and portfolio characteristics", c="dimmed"), + ], gap=4), + dmc.Group([ + dmc.SegmentedControl( + id="portfolio-view", + data=[ + {"value": "allocation", "label": "Allocation"}, + {"value": "characteristics", "label": "Characteristics"}, + {"value": "risk", "label": "Risk Analysis"}, + ], + value="allocation", + ), + ], gap="sm"), + ], justify="space-between", mb="lg"), + + # View Containers + allocation_view, + characteristics_view, + risk_view, + +], gap="md") diff --git a/investments-dashboard/requirements.txt b/investments-dashboard/requirements.txt new file mode 100644 index 0000000..634cddf --- /dev/null +++ b/investments-dashboard/requirements.txt @@ -0,0 +1,10 @@ +dash[fastapi]==4.2.0 +dash-mantine-components>=0.14.0 +dash-iconify>=0.1.2 +pandas>=2.0.0 +plotly>=5.18.0 +uvicorn[standard] +reportlab>=4.0.0 +kaleido==0.2.1 +PyPDF2>=3.0.0 +Pillow>=10.0.0 diff --git a/investments-dashboard/scripts/dash-callbacks-intro.md b/investments-dashboard/scripts/dash-callbacks-intro.md new file mode 100644 index 0000000..a6e7bca --- /dev/null +++ b/investments-dashboard/scripts/dash-callbacks-intro.md @@ -0,0 +1,102 @@ +# Video Script: Basic Dash Callbacks — Dash Fundamentals Chapter 2 +**Target length:** Under 5 minutes +**Format:** Screen recording with voiceover, code running live +**Narration word count:** ~510 words (~4 min at 130 wpm + visual pauses) + +--- + +## Beat 1 — Hook `[0:00–0:20]` + +**[VISUAL]** Open on the gapminder scatter plot with the year slider. Drag the slider — the chart animates smoothly through decades of data. + +**[NARRATION]** +> "In the last chapter, we built a Dash layout. It looked great — but it didn't do anything. This is what happens when you add callbacks. One slider, one chart, fully connected. Let me show you how it works." + +--- + +## Beat 2 — The Why: Reactive Programming `[0:20–0:55]` + +**[VISUAL]** Stay on the gapminder app, or cut to a simple spreadsheet visual. + +**[NARRATION]** +> "The mental model here is a spreadsheet. When you change a cell, every cell that depends on it updates automatically. You don't call a function — the dependency is declared, and the system handles the rest. +> +> Dash works exactly the same way. You declare: when this input changes, call this function and put the result in that output. Dash handles the wiring. This is reactive programming — and it's the entire foundation of how Dash apps become interactive." + +--- + +## Beat 3 — Anatomy of a Callback `[0:55–2:10]` + +**[VISUAL]** Open the simple text input example in the editor. Highlight each section as you talk through it. + +**[NARRATION]** +> "Let's start with the simplest possible example. A text box and a div — typing in the box updates the div. +> +> The layout is what you already know: a `dcc.Input` with an `id`, and an empty `html.Div` with an `id`. No value set on the div — we'll let the callback populate it. +> +> Now the callback. The `@callback` decorator is where the wiring happens. `Output` is what you want to update — the `children` property of `my-output`. `Input` is what triggers it — the `value` property of `my-input`. +> +> The function underneath receives the current value of the input and returns whatever should go in the output. That's it. +> +> A few things worth noting: the `id` in the decorator must match exactly the `id` in your layout. And the decorator has to sit directly above the function — no blank lines between them." + +**[VISUAL]** Run the app, type in the text box, show the div updating live. + +--- + +## Beat 4 — Real Demo: Slider → Graph `[2:10–3:05]` + +**[VISUAL]** Open the gapminder `app.py`. Highlight the `@callback` and then the function body. + +**[NARRATION]** +> "Now let's look at a real example. The `dcc.Slider` has an `id` of `year-slider`, and its `value` property is the input. The `dcc.Graph` is the output — specifically its `figure` property. +> +> Whenever the slider moves, Dash calls `update_figure` with the selected year. The function filters the dataframe down to that year, builds a new Plotly scatter plot, and returns it. Dash puts it in the graph. +> +> Notice `fig.update_layout(transition_duration=500)` — that's what gives the smooth animation between years. One line." + +--- + +## Beat 5 — Multiple Inputs `[3:05–3:30]` + +**[VISUAL]** Show the multi-input example's `@callback` decorator — 5 inputs listed. + +**[NARRATION]** +> "You're not limited to one input. This example drives a chart from two dropdowns, two radio buttons, and a slider — five inputs, one output. +> +> The pattern is the same: just list more `Input` items in the decorator. The callback receives them as positional arguments, in the same order. Any one of them changing triggers the function." + +--- + +## Beat 6 — State `[3:30–4:15]` + +**[VISUAL]** Open the State / button example. Show both the `Input` and `State` lines in the decorator. + +**[NARRATION]** +> "Now let's talk about `State`. Sometimes you want to read a value without that value triggering the callback. Classic example: a form with a Submit button. +> +> Here, the two text inputs are `State` — Dash reads their values, but typing in them does nothing. The `html.Button` is the `Input` — clicking it fires the callback. Dash passes all the `State` values into the function automatically. +> +> The rule is simple: `Input` triggers, `State` reads. Everything else about the function is the same." + +--- + +## Beat 7 — Summary + CTA `[4:15–4:30]` + +**[VISUAL]** Quick cut back to the gapminder app with the slider moving. + +**[NARRATION]** +> "Callbacks are the engine of every Dash app. Declare your inputs and outputs, write a Python function, and Dash handles the rest. One input or five, one output or many — the pattern doesn't change. +> +> Chapter 3 goes deeper: clicking on charts to drive other charts. Interactive graphing. Link's in the description." + +--- + +## Production Notes +- Beat 1: actually drag the slider on camera — the animation is the hook +- Beat 3: slow down here — this is the first time the viewer sees a decorator. Hover over `Output` then `Input` as you name them +- Beat 3 live demo: type something in the text box slowly, pause so the viewer sees the div react +- Beat 4: pause after showing `transition_duration=500` — it's a satisfying "one line does this" moment +- Beat 5: you don't need to run this app — just show the decorator in the editor. The point is the pattern, not the demo +- Beat 6: live demo here is useful — type in the text boxes, show nothing happens, then click Submit, show it fires +- Outro card: link to [Dash Fundamentals Part 3: Interactive Graphing](https://dash.plotly.com/docs/interactive-graphing) diff --git a/investments-dashboard/scripts/dash-interactive-graphing-intro.md b/investments-dashboard/scripts/dash-interactive-graphing-intro.md new file mode 100644 index 0000000..6cb3006 --- /dev/null +++ b/investments-dashboard/scripts/dash-interactive-graphing-intro.md @@ -0,0 +1,90 @@ +# Video Script: Interactive Visualizations — Dash Fundamentals Chapter 3 +**Target length:** Under 5 minutes +**Format:** Screen recording with voiceover, code running live +**Narration word count:** ~490 words (~3:45–4:00 at 130 wpm + visual pauses) + +--- + +## Beat 1 — Hook `[0:00–0:20]` + +**[VISUAL]** World indicators app running — scatter plot on the left, two time series on the right. Slowly move the mouse over different country dots. The time series update in real time with each hover. + +**[NARRATION]** +> "In the last chapter, callbacks reacted to controls — dropdowns, sliders, buttons. This chapter goes further. Here, the chart itself is the input. Hover over a country, and the graphs on the right update instantly. Let me show you how this works." + +--- + +## Beat 2 — The Why: Charts as Inputs `[0:20–0:50]` + +**[VISUAL]** Stay on the world indicators app, or briefly show a traditional BI tool for contrast. + +**[NARRATION]** +> "Most charting tools are one-way: data goes in, chart comes out. Dash flips this. Every interaction a user has with a chart — hovering over a point, clicking it, drawing a selection box, zooming — all of that is data you can feed into a callback. +> +> This is how you build crossfiltered dashboards and linked charts. Not with a specialized tool — just callbacks." + +--- + +## Beat 3 — The 4 Interactive Properties `[0:50–1:40]` + +**[VISUAL]** Show the debug app running. Hover over points, click points, use the lasso tool, zoom — watch the JSON panels update on screen. + +**[NARRATION]** +> "The `dcc.Graph` component has four properties that update through user interaction: `hoverData`, `clickData`, `selectedData`, and `relayoutData`. +> +> This debug app prints them live so you can see exactly what you're working with. Hover over a point — `hoverData` gets the coordinates, the point index, and any custom data you attached. Click — same thing in `clickData`. Draw a selection — `selectedData` gives you every point inside the box. Zoom or pan — `relayoutData` captures the new axis ranges. +> +> Any of these can be an `Input` in a callback." + +--- + +## Beat 4 — Hover → Time Series `[1:40–3:05]` + +**[VISUAL]** Open the world indicators `app.py`. Highlight the scatter callback first, then the `update_x_timeseries` callback. + +**[NARRATION]** +> "Let's look at the hover example. The scatter plot on the left has `id='crossfilter-indicator-scatter'`. The two time series have their own IDs. +> +> The key line is here — `hoverData` of the scatter is an `Input`. Whenever the mouse moves to a new point, this callback fires. +> +> Now, how does the callback know which country was hovered? That's what `customdata` is for. When building the scatter, we attach the country name to each point with `fig.update_traces(customdata=...)`. Then inside the callback, we pull it out with `hoverData['points'][0]['customdata']`. +> +> From there it's just pandas filtering and returning a new figure — the same pattern as Chapter 2, just with hover as the trigger instead of a slider." + +**[VISUAL]** Show the `create_time_series` helper function briefly. + +> "The `create_time_series` function is a reusable helper — the kind of thing you build once and call from multiple callbacks. Clean Python." + +--- + +## Beat 5 — Crossfilter Pattern `[3:05–3:45]` + +**[VISUAL]** Switch to the 3-chart crossfilter app running. Use the lasso tool to select a cluster of points in one chart. Show the other two charts dim the unselected points and update the dashed selection rectangle. + +**[NARRATION]** +> "Here's the crossfilter pattern. Three scatter plots, each with `selectedData` as an input to a shared callback. Select a region in any chart, and all three update — the selected points stay highlighted, everything else fades. +> +> The callback takes the intersection of all three selections and rerenders all three figures. The charts are both inputs and outputs at the same time. +> +> You don't need a BI tool for this. It's a Python function." + +--- + +## Beat 6 — Summary + CTA `[3:45–4:00]` + +**[VISUAL]** Quick cut back to the hover → time series demo. + +**[NARRATION]** +> "Dash charts expose hover, click, selection, and zoom as callback inputs. Same decorator, same Python function — you just use the chart as the trigger instead of a control. +> +> Chapter 4 covers something that comes up quickly in real apps: sharing data between callbacks without running the same query twice. Link's in the description." + +--- + +## Production Notes +- Beat 1: move the mouse slowly and deliberately over 3–4 countries — let the time series settle between moves so the update is clear +- Beat 3: use the debug app for this beat — it's the best way to show what `hoverData` actually contains; pause on the hover JSON so viewers can read it +- Beat 4: hover over the `customdata` line in the code and also the `hoverData['points'][0]['customdata']` extraction — this is the non-obvious part +- Beat 5: start the crossfilter demo with no selection (all bright), then lasso select — the visual contrast of highlighted vs dimmed is the whole story +- Beat 5: don't walk through the crossfilter code — the running demo is enough; the docs page has the full code for reference +- Outro card: link to [Dash Fundamentals Part 4: Sharing Data Between Callbacks](https://dash.plotly.com/docs/sharing-data-between-callbacks) diff --git a/investments-dashboard/scripts/dash-layout-intro.md b/investments-dashboard/scripts/dash-layout-intro.md new file mode 100644 index 0000000..2ab130e --- /dev/null +++ b/investments-dashboard/scripts/dash-layout-intro.md @@ -0,0 +1,108 @@ +# Video Script: Dash Layout — Dash Fundamentals Chapter 1 +**Target length:** Under 5 minutes +**Format:** Screen recording with voiceover, code running live +**Narration word count:** ~515 words (~4 min at 130 wpm + visual pauses) + +--- + +## Beat 1 — Hook `[0:00–0:20]` + +**[VISUAL]** Open on the finished bar chart app already running at `localhost:8050` — fruits grouped by city, interactive, polished. + +**[NARRATION]** +> "This is a Dash app. Interactive, browser-based, deployable anywhere — and we just built it in about 20 lines of Python. No JavaScript. No HTML files. No CSS from scratch. Let me show you how." + +--- + +## Beat 2 — The Why `[0:20–0:55]` + +**[VISUAL]** Briefly show a terminal with pandas output, or a static matplotlib plot — the kind of thing you'd share as a screenshot. + +**[NARRATION]** +> "If you work with data in Python, you've probably hit this wall. You've got a great analysis — a dataframe, a Plotly chart — but getting it in front of someone else means emailing a screenshot or sending a CSV and hoping they run the same environment. +> +> Building a proper web app means learning a frontend framework, and suddenly you're context-switching between Python and JavaScript. +> +> Dash is the bridge. You stay in Python, and Dash handles the web layer." + +--- + +## Beat 3 — Your First App `[0:55–2:00]` + +**[VISUAL]** Open `app.py` in the editor — the bar chart example. Highlight each section as you mention it. + +**[NARRATION]** +> "Let's look at what we're actually writing. Three things happen here. +> +> First, we create data — just a standard pandas DataFrame. +> +> Then we create a Plotly figure with `px.bar`. Standard Plotly Express. +> +> And then comes the Dash part: `app.layout`. This is where you describe what your app looks like — a tree of Python component objects. +> +> `html.Div` is a wrapper. `html.H1` is a heading. `dcc.Graph` takes our Plotly figure and renders it as an interactive chart in the browser. +> +> Run it with `python app.py`, open localhost:8050, and there it is." + +**[VISUAL]** Terminal running, browser opens to the app. + +> "Notice `debug=True` — that turns on hot reload. Change the title, save the file — your browser updates instantly. No restart needed." + +--- + +## Beat 4 — Styling with HTML Components `[2:00–2:50]` + +**[VISUAL]** Switch to the dark-mode styled app. Show the `style={}` dict in the editor. + +**[NARRATION]** +> "Now let's customize it. Every `dash.html` component maps to an HTML tag, and you control it entirely through Python keyword arguments. +> +> The `style` property works like inline HTML styles — except it's a Python dictionary. Keys are camelCase: `textAlign` instead of `text-align`, `backgroundColor` instead of `background-color`. And `class` becomes `className`. +> +> That's it. Every HTML attribute you know works the same way, just in Python syntax." + +--- + +## Beat 5 — Core Components `[2:50–3:40]` + +**[VISUAL]** Show the components showcase app — dropdowns, sliders, radio items, checkboxes all visible. + +**[NARRATION]** +> "Beyond HTML wrappers, Dash gives you `dash.dcc` — the Dash Core Components. Dropdowns, sliders, radio buttons, text inputs, graphs — all ready to go. +> +> These aren't plain HTML. They're React components under the hood, which is why they're interactive out of the box. +> +> Everything is declarative. Every option is a keyword argument. And if you ever want to know what's available, just run `help(dcc.Dropdown)` in your Python console — it lists every parameter with a description." + +--- + +## Beat 6 — Reusable Components `[3:40–4:10]` + +**[VISUAL]** Show the `generate_table()` function from the table example. + +**[NARRATION]** +> "Here's something that doesn't get talked about enough. Because your layout is Python, you can write functions that generate UI. +> +> This function takes a pandas DataFrame and returns a fully-formed HTML table component — no template language, no Jinja, no string interpolation. Just Python. +> +> That's the real unlock here: you can compose, loop, and abstract your UI the same way you write any other Python code." + +--- + +## Beat 7 — Summary + CTA `[4:10–4:30]` + +**[VISUAL]** Quick cut back to the running bar chart app. + +**[NARRATION]** +> "So: a Dash layout is a tree of Python components. `dash.html` gives you HTML tags. `dash.dcc` gives you interactive components. And because it's all Python, you can compose it like any other code. +> +> This is chapter one. The app looks good — but it doesn't do anything yet. In part two, we wire up callbacks to make it actually interactive. Link's in the description." + +--- + +## Production Notes +- Keep a brisk pace through code — don't read every line, just call out what matters +- For Beat 3, hover or highlight `app.layout`, `html.Div`, `dcc.Graph` as each is mentioned +- Hot reload demo in Beat 3: actually make a live edit on screen — change `'Hello Dash'` to something, save, show the browser update +- Beat 5: interact with the dropdowns and slider briefly to show they work before the narration +- Outro card: link to [Dash Fundamentals Part 2: Basic Callbacks](https://dash.plotly.com/docs/basic-callbacks) diff --git a/investments-dashboard/utils/__init__.py b/investments-dashboard/utils/__init__.py new file mode 100644 index 0000000..dab3080 --- /dev/null +++ b/investments-dashboard/utils/__init__.py @@ -0,0 +1 @@ +from .data_loader import * diff --git a/investments-dashboard/utils/data_loader.py b/investments-dashboard/utils/data_loader.py new file mode 100644 index 0000000..b09a915 --- /dev/null +++ b/investments-dashboard/utils/data_loader.py @@ -0,0 +1,135 @@ +import pandas as pd +import pathlib + +PATH = pathlib.Path(__file__).parent.parent +DATA_PATH = PATH.joinpath("data").resolve() + +def load_csv(filename): + return pd.read_csv(DATA_PATH.joinpath(filename)) + +# Fund data +df_fund_facts = load_csv("df_fund_facts.csv") +df_price_perf = load_csv("df_price_perf.csv") + +# Price data +df_current_prices = load_csv("df_current_prices.csv") +df_hist_prices = load_csv("df_hist_prices.csv") +df_graph = load_csv("df_graph.csv") + +# Returns data +df_avg_returns = load_csv("df_avg_returns.csv") +df_after_tax = load_csv("df_after_tax.csv") +df_recent_returns = load_csv("df_recent_returns.csv") + +# Portfolio data +df_equity_char = load_csv("df_equity_char.csv") +df_equity_diver = load_csv("df_equity_diver.csv") + +# Fees data +df_expenses = load_csv("df_expenses.csv") +df_minimums = load_csv("df_minimums.csv") + +# Distribution data +df_dividend = load_csv("df_dividend.csv") +df_realized = load_csv("df_realized.csv") +df_unrealized = load_csv("df_unrealized.csv") + +def get_time_series_data(): + """Process df_graph for time series charts""" + df = df_graph.copy() + df['Date'] = pd.to_datetime(df['Date']) + return df + +def get_sector_allocation(): + """Process sector diversification data for charts""" + df = df_equity_diver.copy() + df.columns = ['Sector', 'Fund', 'Benchmark'] + df = df.iloc[1:] # Skip header row + df['Fund'] = df['Fund'].str.replace('%', '').astype(float) + df['Benchmark'] = df['Benchmark'].apply(lambda x: 0 if x == '—' else float(str(x).replace('%', ''))) + return df + +def get_returns_data(): + """Process average returns for comparison charts""" + df = df_avg_returns.copy() + df.columns = ['Entity', '1Y', '3Y', '5Y', '10Y', 'Since_Inception'] + df = df.iloc[1:] # Skip header + for col in ['1Y', '3Y', '5Y', '10Y']: + df[col] = df[col].str.replace('%', '').astype(float) + return df + +def get_dividend_history(): + """Process dividend data""" + df = df_dividend.copy() + df.columns = ['Type', 'Amount', 'Record_Date', 'Reinvest_Date', + 'Payable_Date', 'Reinvest_Price', 'Dist_Yield', 'SEC_Yield'] + df = df.iloc[1:] # Skip header + return df + +def get_fund_metrics(): + """Extract key fund metrics for KPI cards""" + facts = dict(zip(df_fund_facts['label'], df_fund_facts['value'])) + + ts = get_time_series_data() + latest_price = ts['Calibre Index Fund'].iloc[-1] + first_price = ts['Calibre Index Fund'].iloc[0] + ytd_return = ((latest_price - first_price) / first_price) * 100 + + returns = get_returns_data() + fund_returns = returns[returns['Entity'].str.contains('500 Index Fund', na=False)].iloc[0] + + return { + 'nav': latest_price, + 'ytd_return': ytd_return, + 'expense_ratio': facts.get('Expense ratio as of 04/27/2017', '0.14%'), + 'category': facts.get('Category', 'Large Blend'), + 'asset_class': facts.get('Asset Class', 'Domestic Stock'), + 'min_investment': facts.get('Minimum investment', '$3,000'), + '1y_return': fund_returns['1Y'], + '3y_return': fund_returns['3Y'], + '5y_return': fund_returns['5Y'], + } + +def calculate_risk_metrics(fund_id, period="1Y"): + """Calculate risk metrics (volatility, beta, sharpe, alpha) for a fund and period""" + ts = get_time_series_data() + + fund_col = 'Calibre Index Fund' + benchmark_col = '"S&P 500 Index, y"' + + period_days = {"1Y": 252, "3Y": 756, "5Y": 1260, "10Y": 2520, "All": len(ts)} + lookback = min(period_days.get(period, 252), len(ts) - 1) + + data = ts[fund_col].iloc[-lookback:] + benchmark = ts[benchmark_col].iloc[-lookback:] + + returns = data.pct_change().dropna() + bench_returns = benchmark.pct_change().dropna() + + volatility = returns.std() * (252 ** 0.5) * 100 + + covariance = returns.cov(bench_returns) + bench_variance = bench_returns.var() + beta = covariance / bench_variance if bench_variance > 0 else 1.0 + + excess_return = returns.mean() * 252 - 0.02 + sharpe = excess_return / (returns.std() * (252 ** 0.5)) if returns.std() > 0 else 0 + + alpha = (returns.mean() * 252) - (0.02 + beta * (bench_returns.mean() * 252 - 0.02)) + + volatility_pct = min(max(volatility / 40 * 100, 10), 100) + beta_pct = min(max(beta * 50, 10), 100) + sharpe_pct = min(max((sharpe + 1) / 3 * 100, 10), 100) + alpha_pct = min(max((alpha * 100 + 5) / 10 * 100, 10), 100) + + return { + 'volatility': volatility, + 'volatility_level': "Low" if volatility < 10 else "Medium" if volatility < 20 else "High", + 'volatility_pct': volatility_pct, + 'beta': beta, + 'beta_pct': beta_pct, + 'sharpe': sharpe, + 'sharpe_pct': sharpe_pct, + 'alpha': alpha * 100, + 'alpha_pct': alpha_pct, + } diff --git a/investments-dashboard/utils/pdf_export.py b/investments-dashboard/utils/pdf_export.py new file mode 100644 index 0000000..58373c0 --- /dev/null +++ b/investments-dashboard/utils/pdf_export.py @@ -0,0 +1,85 @@ +import copy +import io +from datetime import datetime + +import plotly.io as pio +from PIL import Image as PILImage, ImageDraw +from reportlab.lib import colors +from reportlab.lib.pagesizes import A4, landscape, portrait +from reportlab.lib.units import inch +from reportlab.lib.utils import ImageReader +from reportlab.pdfgen import canvas +from PyPDF2 import PdfWriter, PdfReader + + +def figure_to_image_bytes(figure, width=1000, height=600): + try: + fig = copy.deepcopy(figure) + if isinstance(fig, dict): + fig.setdefault('layout', {}) + fig['layout']['paper_bgcolor'] = 'white' + fig['layout']['plot_bgcolor'] = 'white' + return pio.to_image(fig, format="png", width=width, height=height) + except Exception as e: + img = PILImage.new("RGB", (width, height), color=(220, 220, 220)) + draw = ImageDraw.Draw(img) + draw.text((width // 2 - 100, height // 2), f"Render failed: {e}", fill="black") + buf = io.BytesIO() + img.save(buf, format="PNG") + return buf.getvalue() + + +def create_pdf_report(figures, titles=None, report_title="Financial Report"): + if titles is None: + titles = [f"Chart {i + 1}" for i in range(len(figures))] + + portrait_w, portrait_h = portrait(A4) + landscape_w, landscape_h = landscape(A4) + + out = io.BytesIO() + writer = PdfWriter() + + # Title page + p_buf = io.BytesIO() + cp = canvas.Canvas(p_buf, pagesize=portrait(A4)) + cp.setFillColor(colors.HexColor("#2563eb")) + cp.rect(0, portrait_h - 2 * inch, portrait_w, 2 * inch, fill=1, stroke=0) + cp.setFillColor(colors.white) + cp.setFont("Helvetica-Bold", 28) + cp.drawCentredString(portrait_w / 2, portrait_h - 1.2 * inch, report_title) + cp.setFont("Helvetica", 14) + cp.drawCentredString( + portrait_w / 2, + portrait_h - 1.8 * inch, + f"Generated on {datetime.now().strftime('%B %d, %Y')}", + ) + cp.setFillColor(colors.HexColor("#666666")) + cp.setFont("Helvetica", 10) + cp.drawCentredString(portrait_w / 2, 0.5 * inch, "Confidential — not for redistribution") + cp.save() + p_buf.seek(0) + writer.add_page(PdfReader(p_buf).pages[0]) + + # One landscape page per figure + for figure, chart_title in zip(figures, titles): + fig_img = figure_to_image_bytes(figure) + l_buf = io.BytesIO() + cl = canvas.Canvas(l_buf, pagesize=landscape(A4)) + cl.setFillColor(colors.HexColor("#2563eb")) + cl.setFont("Helvetica-Bold", 20) + cl.drawString(1 * inch, landscape_h - 0.8 * inch, chart_title) + img_reader = ImageReader(io.BytesIO(fig_img)) + chart_w, chart_h = 10 * inch, 6 * inch + x = (landscape_w - chart_w) / 2 + y = (landscape_h - chart_h) / 2 - 0.5 * inch + cl.drawImage(img_reader, x, y, width=chart_w, height=chart_h) + cl.setFillColor(colors.HexColor("#666666")) + cl.setFont("Helvetica", 8) + cl.drawCentredString(landscape_w / 2, 0.5 * inch, "CONFIDENTIAL") + cl.save() + l_buf.seek(0) + writer.add_page(PdfReader(l_buf).pages[0]) + + writer.write(out) + out.seek(0) + return out.getvalue() diff --git a/medical-imaging-demo/.gitignore b/medical-imaging-demo/.gitignore new file mode 100644 index 0000000..b9c0379 --- /dev/null +++ b/medical-imaging-demo/.gitignore @@ -0,0 +1,7 @@ + +# Dolt database files (added by bd init) +.dolt/ +*.db + +# AgentOps session artifacts +.agents/ diff --git a/medical-imaging-demo/Procfile b/medical-imaging-demo/Procfile new file mode 100644 index 0000000..673048e --- /dev/null +++ b/medical-imaging-demo/Procfile @@ -0,0 +1 @@ +web: uvicorn app:server --host 0.0.0.0 --port 8000 diff --git a/medical-imaging-demo/README.md b/medical-imaging-demo/README.md new file mode 100644 index 0000000..ad12595 --- /dev/null +++ b/medical-imaging-demo/README.md @@ -0,0 +1,69 @@ +# VitalSight — Clinical Intelligence Platform + +A Plotly Dash demonstration of clinical data visualization, built to mirror the architecture of `dash-financial-report-v2`. + +> **IMPORTANT:** All patient data is **synthetic and de-identified**. X-ray images are algorithmically generated grayscale placeholders. This application is for demonstration purposes only and is not intended for clinical use. + +## Features + +- **Clinical Dashboard** — Census KPIs + live ICU vitals streaming via WebSocket (mirrors the financial app's live stock feed) +- **Patient Vitals** — Multi-vital time-series with normal-range bands, moving averages, and period selectors +- **Cohort Explorer** — Crossfilter linked-brushing across 3 biomarker scatter plots (port of the crossfilter demo) +- **Imaging Workstation** — Interactive X-ray annotation (draw rectangles, lines, circles), window/level controls, AI-assist suggested findings, and radiology report PDF export + +## Setup + +```bash +python -m venv venv +source venv/bin/activate +pip install -r requirements.txt + +# Generate synthetic data and X-ray images +python scripts/generate_data.py +python scripts/generate_xrays.py + +# Run the app +python app.py +# or for production +uvicorn app:server --host 0.0.0.0 --port 8000 +``` + +App runs at http://localhost:8050 (debug) or http://localhost:8000 (uvicorn). + +## Project Structure + +``` +medical-demo-app/ +├── app.py Main entry point +├── pages/ One layout module per page +│ ├── dashboard.py +│ ├── vitals.py +│ ├── cohort.py +│ └── imaging.py +├── callbacks/ One callback module per page +│ ├── dashboard.py Includes live vitals WebSocket +│ ├── vitals.py +│ ├── cohort.py +│ ├── imaging.py +│ └── export_all.py PDF export +├── components/ Reusable Plotly/Mantine components +│ ├── charts.py +│ ├── kpi_cards.py +│ ├── tables.py +│ └── imaging.py +├── utils/ +│ ├── data_loader.py +│ └── pdf_export.py +├── data/ Generated CSVs (run generate_data.py) +├── assets/ +│ ├── styles.css +│ └── xrays/ Generated X-ray PNGs (run generate_xrays.py) +└── scripts/ + ├── generate_data.py + └── generate_xrays.py +``` + +## Attribution + +X-ray image generation is inspired by the NIH ChestX-ray14 dataset structure (CC0 Public Domain). +NIH Clinical Center: https://nihcc.app.box.com/v/ChestXray-NIHCC diff --git a/medical-imaging-demo/app.py b/medical-imaging-demo/app.py new file mode 100644 index 0000000..e1ade1f --- /dev/null +++ b/medical-imaging-demo/app.py @@ -0,0 +1,209 @@ +import dash +from dash import html, dcc, Input, Output, callback, ctx +import dash_mantine_components as dmc +from dash_iconify import DashIconify + +from pages import cohort, imaging +from callbacks import ( + cohort as cohort_callbacks, + imaging as imaging_callbacks, + export_all as export_all_callbacks, +) + +app = dash.Dash( + __name__, + backend="fastapi", + suppress_callback_exceptions=True, + external_stylesheets=dmc.styles.ALL, + title="Medical Imaging Demo", +) +server = app.server + + +# ── Header ───────────────────────────────────────────────────────────────────── +# (label, href, nav_id, leftSection) +NAV_LINKS = [ + ("Imaging Workstation", "/imaging", "nav-imaging", + DashIconify(icon="tabler:x-ray", width=15)), + ("Cohort Explorer", "/cohort", "nav-cohort", None), +] + +_NAV_BTN_STYLES = { + "root": { + "paddingLeft": 14, "paddingRight": 18, + "fontWeight": 500, "height": 34, + "fontSize": "13px", + }, +} + + + +def create_header(): + brand = dmc.Group([ + html.Img(src="/assets/DE-logo.png", height=36, + style={"opacity": "0.92"}), + html.Div(style={ + "width": "1px", "height": "20px", + "backgroundColor": "#d1d5db", + "flexShrink": 0, + }), + dmc.Title("Medical Imaging Demo", order=3, + style={"color": "#1e2433", "letterSpacing": "-0.5px", + "fontSize": "16px", "fontWeight": 600}), + ], gap=10, wrap="nowrap", align="center") + + nav_center = dmc.Group([ + dcc.Link( + dmc.Button( + label, + id=nav_id, + leftSection=left, + variant="subtle", + color="navy", + size="sm", + radius="md", + styles=_NAV_BTN_STYLES, + ), + href=href, + style={"textDecoration": "none"}, + ) + for label, href, nav_id, left in NAV_LINKS + ], gap=4, wrap="nowrap") + + actions = dmc.Group([ + html.Div( + dmc.Group([ + DashIconify(icon="tabler:building-hospital", width=12, + color="#6b7280"), + dmc.Text("General Hospital", size="xs", fw=500, + style={"color": "#6b7280", "letterSpacing": "0.01em"}), + html.Div(style={ + "width": "3px", "height": "3px", + "borderRadius": "50%", + "backgroundColor": "#c2c6cc", + "flexShrink": 0, + }), + dmc.Text("325 beds", size="xs", + style={"color": "#6b7280"}), + html.Div(style={ + "width": "3px", "height": "3px", + "borderRadius": "50%", + "backgroundColor": "#c2c6cc", + "flexShrink": 0, + }), + dmc.Text("ICU 25", size="xs", fw=600, + style={"color": "#1e3a8a"}), + ], gap=6, wrap="nowrap"), + style={ + "display": "flex", "alignItems": "center", + "padding": "4px 12px", + "borderRadius": "20px", + "backgroundColor": "#eef0f2", + "border": "1px solid #e1e3e7", + }, + ), + dmc.Tooltip( + label="Hide toolbar", withArrow=True, + children=dmc.ActionIcon( + DashIconify(icon="tabler:layout-navbar-collapse", width=18), + id="header-collapse-btn", variant="subtle", color="navy", + size="lg", + ), + ), + ], gap="sm", wrap="nowrap", justify="flex-end") + + # Three-column grid: brand | nav (centered) | actions + return html.Div( + [brand, nav_center, actions], + style={ + "display": "grid", + "gridTemplateColumns": "1fr auto 1fr", + "alignItems": "center", + "height": "100%", + "padding": "0 24px", + "backgroundColor": "#fcfcfb", + "borderBottom": "1px solid #e1e3e7", + }, + ) + + +# Floating button (overlays the page) to restore the header once collapsed. +_EXPAND_STYLE = {"position": "fixed", "top": "10px", "right": "14px", + "zIndex": 3000, "display": "none"} + + +# ── App layout ───────────────────────────────────────────────────────────────── +app.layout = dmc.MantineProvider( + id="mantine-provider", + forceColorScheme="light", + theme={ + "primaryColor": "cyan", + # Register the imaging "navy" ramp app-wide so the shared header's + # navy-colored controls resolve (cohort accents stay on cyan). + "colors": {"navy": imaging.NAVY_RAMP}, + "fontFamily": "Inter, -apple-system, BlinkMacSystemFont, sans-serif", + }, + children=[ + dcc.Location(id="url", refresh=False), + dcc.Download(id="download-pdf-all"), + html.Div(id="pdf-status-all", style={"display": "none"}), + dmc.AppShell( + [ + dmc.AppShellHeader(create_header()), + dmc.AppShellMain( + html.Div(id="page-content", style={"width": "100%"}), + ), + ], + id="app-shell", + header={"height": 64}, + padding=0, + ), + dmc.Tooltip( + label="Show toolbar", withArrow=True, + children=dmc.ActionIcon( + DashIconify(icon="tabler:layout-navbar-expand", width=18), + id="header-expand-btn", variant="filled", color="navy", + size="lg", style=_EXPAND_STYLE, + ), + ), + ] +) + + +# ── Routing ──────────────────────────────────────────────────────────────────── +@callback( + Output("page-content", "children"), + Input("url", "pathname"), +) +def display_page(pathname): + # Imaging Workstation is the landing page ("/" and "/imaging"). + if pathname == "/cohort": + return cohort.layout + return imaging.layout + + +@callback( + [Output(nav_id, "variant") for _, _, nav_id, _ in NAV_LINKS], + Input("url", "pathname"), +) +def update_nav_active(pathname): + hrefs = [href for _, href, _, _ in NAV_LINKS] + active = pathname if pathname in hrefs else "/imaging" + return ["filled" if active == h else "subtle" for h in hrefs] + + +@callback( + Output("app-shell", "header"), + Output("header-expand-btn", "style"), + Input("header-collapse-btn", "n_clicks"), + Input("header-expand-btn", "n_clicks"), + prevent_initial_call=True, +) +def toggle_header(_collapse, _expand): + collapsed = ctx.triggered_id == "header-collapse-btn" + return ({"height": 64, "collapsed": collapsed}, + {**_EXPAND_STYLE, "display": "flex" if collapsed else "none"}) + + +if __name__ == "__main__": + app.run(debug=True, port=8051) diff --git a/medical-imaging-demo/assets/DE-logo.png b/medical-imaging-demo/assets/DE-logo.png new file mode 100644 index 0000000..a037590 Binary files /dev/null and b/medical-imaging-demo/assets/DE-logo.png differ diff --git a/medical-imaging-demo/assets/logo.svg b/medical-imaging-demo/assets/logo.svg new file mode 100644 index 0000000..1992a54 --- /dev/null +++ b/medical-imaging-demo/assets/logo.svg @@ -0,0 +1,9 @@ + + + + + + diff --git a/medical-imaging-demo/assets/styles.css b/medical-imaging-demo/assets/styles.css new file mode 100644 index 0000000..84b5927 --- /dev/null +++ b/medical-imaging-demo/assets/styles.css @@ -0,0 +1,86 @@ +/* VitalSight — Clinical Intelligence Platform */ + +body { + font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; +} + +/* Light app shell header (cool off-white) */ +.mantine-AppShell-header { + background-color: #fcfcfb !important; + border-bottom: 1px solid #e1e3e7 !important; +} + +/* Nav button states on light header */ +.mantine-AppShell-header .mantine-Button-root[data-variant="subtle"] { + color: #6b7280; +} +.mantine-AppShell-header .mantine-Button-root[data-variant="subtle"]:hover { + background-color: #eef0f2; + color: #1e2433; +} +.mantine-AppShell-header .mantine-Button-root[data-variant="filled"] { + color: #1e3a8a; + background-color: rgba(30, 58, 138, 0.1); +} + +/* Scrollbars */ +::-webkit-scrollbar { width: 7px; height: 7px; } +::-webkit-scrollbar-track { background: rgba(0,0,0,0.04); border-radius: 4px; } +::-webkit-scrollbar-thumb { background: rgba(0,0,0,0.18); border-radius: 4px; } +::-webkit-scrollbar-thumb:hover { background: rgba(0,0,0,0.28); } + +/* Modebar */ +.js-plotly-plot .plotly .modebar { top: 4px !important; right: 4px !important; } +.js-plotly-plot .plotly .modebar-btn { font-size: 13px !important; } + +/* Table */ +.mantine-Table-table { font-size: 0.85rem; } +.mantine-Table-th { background-color: rgba(0,0,0,0.02); } + +/* NavLink active */ +.mantine-NavLink-root[data-active="true"] { font-weight: 600; } + +/* Paper hover */ +.mantine-Paper-root { transition: box-shadow 0.18s ease; } +.mantine-Paper-root:hover { box-shadow: 0 2px 10px rgba(0,0,0,0.07); } + +/* Pulse animation for live indicator */ +@keyframes pulse { + 0%, 100% { opacity: 1; transform: scale(1); } + 50% { opacity: 0.35; transform: scale(0.85); } +} + +/* Fade-in for KPI cards */ +@keyframes fadeInUp { + from { opacity: 0; transform: translateY(8px); } + to { opacity: 1; transform: translateY(0); } +} + +/* Imaging study cards */ +.study-card:hover { border-color: #1e3a8a !important; } + +/* Print styles */ +@media print { + .mantine-AppShell-header, + .mantine-AppShell-navbar, + .mantine-Button-root, + .mantine-Select-root, + .mantine-MultiSelect-root { display: none !important; } + .mantine-Paper-root { + break-inside: avoid; + box-shadow: none !important; + border: 1px solid #e2e8f0 !important; + } +} + +/* Responsive */ +@media (max-width: 768px) { + .mantine-AppShell-navbar { display: none; } + .mantine-Container-root { padding: 0.5rem; } +} + +/* Progress bar background */ +.mantine-Progress-root { background-color: rgba(0,0,0,0.05); } + +/* Badge */ +.mantine-Badge-root { text-transform: none; } diff --git a/medical-imaging-demo/assets/xrays/xray_01.png b/medical-imaging-demo/assets/xrays/xray_01.png new file mode 100644 index 0000000..219e225 Binary files /dev/null and b/medical-imaging-demo/assets/xrays/xray_01.png differ diff --git a/medical-imaging-demo/assets/xrays/xray_02.png b/medical-imaging-demo/assets/xrays/xray_02.png new file mode 100644 index 0000000..3e27cb5 Binary files /dev/null and b/medical-imaging-demo/assets/xrays/xray_02.png differ diff --git a/medical-imaging-demo/assets/xrays/xray_03.png b/medical-imaging-demo/assets/xrays/xray_03.png new file mode 100644 index 0000000..6b428d9 Binary files /dev/null and b/medical-imaging-demo/assets/xrays/xray_03.png differ diff --git a/medical-imaging-demo/assets/xrays/xray_04.png b/medical-imaging-demo/assets/xrays/xray_04.png new file mode 100644 index 0000000..56406b6 Binary files /dev/null and b/medical-imaging-demo/assets/xrays/xray_04.png differ diff --git a/medical-imaging-demo/assets/xrays/xray_05.png b/medical-imaging-demo/assets/xrays/xray_05.png new file mode 100644 index 0000000..a4a7f9d Binary files /dev/null and b/medical-imaging-demo/assets/xrays/xray_05.png differ diff --git a/medical-imaging-demo/assets/xrays/xray_06.png b/medical-imaging-demo/assets/xrays/xray_06.png new file mode 100644 index 0000000..b10d0fb Binary files /dev/null and b/medical-imaging-demo/assets/xrays/xray_06.png differ diff --git a/medical-imaging-demo/assets/xrays/xray_07.png b/medical-imaging-demo/assets/xrays/xray_07.png new file mode 100644 index 0000000..5e173eb Binary files /dev/null and b/medical-imaging-demo/assets/xrays/xray_07.png differ diff --git a/medical-imaging-demo/assets/xrays/xray_08.png b/medical-imaging-demo/assets/xrays/xray_08.png new file mode 100644 index 0000000..5988131 Binary files /dev/null and b/medical-imaging-demo/assets/xrays/xray_08.png differ diff --git a/medical-imaging-demo/callbacks/__init__.py b/medical-imaging-demo/callbacks/__init__.py new file mode 100644 index 0000000..ab79d22 --- /dev/null +++ b/medical-imaging-demo/callbacks/__init__.py @@ -0,0 +1,3 @@ +from . import cohort +from . import imaging +from . import export_all diff --git a/medical-imaging-demo/callbacks/cohort.py b/medical-imaging-demo/callbacks/cohort.py new file mode 100644 index 0000000..6aeea74 --- /dev/null +++ b/medical-imaging-demo/callbacks/cohort.py @@ -0,0 +1,95 @@ +import numpy as np +from dash import callback, Input, Output, html, no_update +import dash_mantine_components as dmc + +from components.charts import create_crossfilter_scatter, create_vitals_chart +from components.tables import create_patient_table +from utils.data_loader import get_cohort, get_vitals + +df = get_cohort() +N = len(df) + + +@callback( + Output("cf-scatter1", "figure"), + Output("cf-scatter2", "figure"), + Output("cf-scatter3", "figure"), + Output("cf-summary-grid", "children"), + Output("cf-patient-table", "children"), + Input("cf-scatter1", "selectedData"), + Input("cf-scatter2", "selectedData"), + Input("cf-scatter3", "selectedData"), +) +def update_crossfilter(sel1, sel2, sel3): + selected = df.index.tolist() + for sel in [sel1, sel2, sel3]: + if sel and sel.get("points"): + pts = np.array([ + p["customdata"] if "customdata" in p else p["pointIndex"] + for p in sel["points"] + ]) + selected = list(np.intersect1d(selected, pts)) + + fig1 = create_crossfilter_scatter(df, "age", "bmi", selected) + fig2 = create_crossfilter_scatter(df, "systolic_bp","ldl", selected) + fig3 = create_crossfilter_scatter(df, "hba1c", "egfr", selected) + + sub = df.iloc[selected] if selected else df.iloc[[]] + n = len(sub) + + # Summary cards + def _metric(label, val): + return dmc.Paper( + dmc.Stack([ + dmc.Text(label, size="xs", c="dimmed"), + dmc.Text(str(val), size="lg", fw=700), + ], gap=2), + p="sm", radius="sm", withBorder=True, + ) + + cards = [ + _metric("Selected", n), + _metric("Avg Age", f"{sub['age'].mean():.0f}" if n else "—"), + _metric("Avg BMI", f"{sub['bmi'].mean():.1f}" if n else "—"), + _metric("Avg SysBP", f"{sub['systolic_bp'].mean():.0f}" if n else "—"), + _metric("Avg HbA1c", f"{sub['hba1c'].mean():.1f}" if n else "—"), + _metric("High Risk", f"{(sub['risk_level']=='High').sum()}" if n else "—"), + ] + + # Patient table (capped at 50 for display) + if n == 0: + table = dmc.Text("No patients match current selection.", size="sm", c="dimmed", ta="center") + else: + table = create_patient_table( + sub.head(50), + cols=["patient_id","age","gender","bmi","systolic_bp", + "hba1c","egfr","diagnosis","risk_level"], + ) + + return fig1, fig2, fig3, cards, table + + +@callback( + Output("crossfilter-view", "style"), + Output("overview-view", "style"), + Input("cohort-view", "value"), +) +def switch_cohort_view(view): + show, hide = {}, {"display": "none"} + return [show if v == view else hide for v in ("crossfilter", "overview")] + + +@callback( + Output("cohort-vitals-trend-chart", "figure"), + Input("cohort-vitals-patient", "value"), + Input("cohort-vitals-period", "value"), + Input("cohort-vitals-select", "value"), + Input("cohort-vitals-ref-toggle", "checked"), + Input("cohort-vitals-ma", "value"), +) +def update_cohort_vitals(patient_id, period, vitals, show_ref, ma): + vitals = vitals or ["HR", "SpO2"] + df = get_vitals(patient_id, period) + if df.empty: + return {} + return create_vitals_chart(df, vitals, show_reference=show_ref, ma_days=ma or "none") diff --git a/medical-imaging-demo/callbacks/dashboard.py b/medical-imaging-demo/callbacks/dashboard.py new file mode 100644 index 0000000..2386a8a --- /dev/null +++ b/medical-imaging-demo/callbacks/dashboard.py @@ -0,0 +1,106 @@ +import asyncio +import random + +from dash import callback, ctx, Input, Output, set_props + +from components.charts import create_admissions_chart, create_ecg_sparkline +from utils.data_loader import get_admissions_data + +# ── ICU patient state ───────────────────────────────────────────────────────── +ICU_BASE = { + "PT1001": {"hr": 72.0, "spo2": 98.5, "sbp": 118.0, "dbp": 76.0, "rr": 14.0}, + "PT1002": {"hr": 92.0, "spo2": 96.8, "sbp": 148.0, "dbp": 90.0, "rr": 18.0}, + "PT1003": {"hr": 88.0, "spo2": 93.5, "sbp": 108.0, "dbp": 68.0, "rr": 21.0}, + "PT1004": {"hr": 78.0, "spo2": 99.1, "sbp": 168.0, "dbp": 97.0, "rr": 16.0}, + "PT1005": {"hr": 66.0, "spo2": 98.9, "sbp": 125.0, "dbp": 80.0, "rr": 13.0}, +} +PIDS = list(ICU_BASE.keys()) + + +def _hr_color(hr): + return "#22c55e" if 60 <= hr <= 100 else "#f59e0b" if 50 <= hr <= 120 else "#ef4444" + +def _spo2_color(s): + return "#22c55e" if s >= 95 else "#f59e0b" if s >= 90 else "#ef4444" + +def _bp_color(sbp): + return "#22c55e" if sbp <= 140 else "#f59e0b" if sbp <= 160 else "#ef4444" + + +# ── Toggle streaming ────────────────────────────────────────────────────────── +@callback( + Output("live-streaming", "data"), + Input("icu-live-toggle", "checked"), +) +def toggle_streaming(checked): + return checked + + +# ── Admissions chart update ─────────────────────────────────────────────────── +@callback( + Output("admissions-chart", "figure"), + Input("dashboard-dept", "value"), + Input("dashboard-period", "value"), +) +def update_admissions(dept, period): + df = get_admissions_data(department=dept, period=period) + return create_admissions_chart(df, department=dept) + + +# ── Persistent WebSocket: stream ICU vitals ─────────────────────────────────── +@callback(persistent=True) +async def stream_patient_vitals(): + ws = ctx.websocket + + vitals = {pid: dict(v) for pid, v in ICU_BASE.items()} + history = {pid: [vitals[pid]["hr"]] for pid in PIDS} + + while not ws.is_shutdown: + streaming = await ws.get_prop("live-streaming", "data") + + if streaming: + for pid in PIDS: + v = vitals[pid] + base = ICU_BASE[pid] + + # Mean-reverting Ornstein–Uhlenbeck drift + v["hr"] = max(40, min(200, round(v["hr"] + 0.15*(base["hr"] -v["hr"]) + random.gauss(0, 1.2), 1))) + v["spo2"]= max(85, min(100, round(v["spo2"]+ 0.20*(base["spo2"]-v["spo2"])+ random.gauss(0, 0.25), 1))) + v["sbp"] = max(70, min(220, round(v["sbp"] + 0.10*(base["sbp"]-v["sbp"]) + random.gauss(0, 2.0), 1))) + v["dbp"] = max(40, min(130, round(v["dbp"] + 0.10*(base["dbp"]-v["dbp"]) + random.gauss(0, 1.5), 1))) + v["rr"] = max(8, min(40, round(v["rr"] + 0.15*(base["rr"] -v["rr"]) + random.gauss(0, 0.4), 1))) + + history[pid].append(v["hr"]) + if len(history[pid]) > 40: + history[pid] = history[pid][-40:] + + set_props(f"live-hr-{pid}", { + "children": f"{v['hr']:.0f}", + "style": {"fontFamily": "monospace", "fontWeight": 700, + "color": _hr_color(v["hr"])}, + }) + set_props(f"live-spo2-{pid}", { + "children": f"{v['spo2']:.1f}%", + "style": {"fontFamily": "monospace", "fontWeight": 700, + "color": _spo2_color(v["spo2"])}, + }) + set_props(f"live-bp-{pid}", { + "children": f"{int(v['sbp'])}/{int(v['dbp'])}", + "style": {"fontFamily": "monospace", "fontWeight": 700, + "color": _bp_color(v["sbp"])}, + }) + set_props(f"live-rr-{pid}", { + "children": f"{v['rr']:.0f}", + "style": {"fontFamily": "monospace", "fontWeight": 700, + "color": "#94a3b8"}, + }) + + # ECG sparkline for selected patient + selected = await ws.get_prop("ecg-patient-select", "value") + if selected and selected in history and len(history[selected]) > 1: + fig = create_ecg_sparkline(history[selected], selected) + set_props("ecg-sparkline-chart", {"figure": fig}) + + await asyncio.sleep(1) + else: + await asyncio.sleep(0.5) diff --git a/medical-imaging-demo/callbacks/export_all.py b/medical-imaging-demo/callbacks/export_all.py new file mode 100644 index 0000000..fb0b64a --- /dev/null +++ b/medical-imaging-demo/callbacks/export_all.py @@ -0,0 +1,33 @@ +from datetime import datetime + +from dash import callback, Input, Output, State, dcc + +from utils.pdf_export import create_radiology_report +from utils.data_loader import get_study, get_patient +from components.imaging import annotation_to_finding_dict + + +@callback( + Output("download-radiology-pdf", "data"), + Input("export-radiology-btn", "n_clicks"), + State("xray-graph", "figure"), + State("xray-annotations", "data"), + State("current-study-id", "data"), + prevent_initial_call=True, +) +def export_radiology_report(n_clicks, xray_figure, annotations, study_id): + if not n_clicks: + return None + + study = get_study(study_id) if study_id else {} + patient = get_patient(study.get("patient_id", "")) if study else {} + findings = [annotation_to_finding_dict(a) for a in (annotations or [])] + + pdf_bytes = create_radiology_report( + xray_figure = xray_figure, + findings = findings, + patient_info = patient, + study_info = study, + ) + fname = f"radiology_report_{study_id}_{datetime.now().strftime('%Y%m%d_%H%M%S')}.pdf" + return dcc.send_bytes(pdf_bytes, fname) diff --git a/medical-imaging-demo/callbacks/imaging.py b/medical-imaging-demo/callbacks/imaging.py new file mode 100644 index 0000000..dfb0410 --- /dev/null +++ b/medical-imaging-demo/callbacks/imaging.py @@ -0,0 +1,192 @@ +from dash import callback, ctx, Input, Output, State, ALL, no_update, Patch + +from components.imaging import (load_xray_b64, create_xray_figure, + get_ai_shapes, XRAY_DIR, _make_shape, + newshape_for, severity_color) +from components.tables import create_findings_table +from utils.data_loader import get_studies, get_study +from pages.imaging import (_patient_banner_content, _image_overlays, + _status_bar, _pending_tag, + BG_INSET, BORDER, ACCENT, + CARD_ACTIVE_BG, CARD_ACTIVE_SHADOW) + +df_studies = get_studies() +STUDY_IDS = df_studies["study_id"].tolist() + + +# ── Select study via thumbnail buttons ──────────────────────────────────────── +@callback( + Output("current-study-id", "data"), + Input({"type": "study-thumb", "index": ALL}, "n_clicks"), + prevent_initial_call=True, +) +def select_study(n_clicks_list): + if not ctx.triggered_id or not any(n_clicks_list): + return no_update + # Don't clear annotations — update_xray loads this study's saved set. + return ctx.triggered_id["index"] + + +# ── Highlight the active study card ─────────────────────────────────────────── +_INACTIVE_STYLE = { + "width": "100%", "padding": "10px 12px", + "backgroundColor": BG_INSET, + "border": f"1px solid {BORDER}", + "borderRadius": "8px", "textAlign": "left", + "transition": "border-color 0.15s ease, background-color 0.15s ease", +} +_ACTIVE_STYLE = { + **_INACTIVE_STYLE, + "backgroundColor": CARD_ACTIVE_BG, + "border": f"1px solid {ACCENT}", + "boxShadow": CARD_ACTIVE_SHADOW, +} + +@callback( + Output({"type": "study-thumb", "index": ALL}, "style"), + Input("current-study-id", "data"), + State({"type": "study-thumb", "index": ALL}, "id"), +) +def highlight_active_study(active_id, ids): + return [_ACTIVE_STYLE if i["index"] == active_id else _INACTIVE_STYLE + for i in ids] + + +# ── Main imaging callback ───────────────────────────────────────────────────── +@callback( + Output("xray-graph", "figure"), + Output("xray-annotations", "data"), + Output("annotations-store", "data"), + Output("findings-table-container","children"), + Output("findings-count", "children"), + Input("xray-graph", "relayoutData"), + Input("current-study-id", "data"), + Input("window-slider", "value"), + Input("level-slider", "value"), + Input("invert-toggle", "checked"), + Input("reset-annotations-btn", "n_clicks"), + Input("draw-mode-select", "value"), + State("xray-annotations", "data"), + State("annotations-store", "data"), + State("finding-label-select", "value"), + State("severity-select", "value"), + State("annotation-note", "value"), + prevent_initial_call=True, +) +def update_xray(relayout, study_id, window, level, invert, + reset_clicks, draw_mode, + stored, by_study, label, severity, note): + triggered = ctx.triggered_id + stored = stored or [] + by_study = dict(by_study or {}) + study = get_study(study_id) if study_id else {} + key = study_id or "" + + drawing_event = False + + if triggered == "reset-annotations-btn": + stored = [] + + elif triggered == "current-study-id": + # Switched study — load this study's saved annotations (persisted), + # do NOT clear. New studies start empty. + stored = list(by_study.get(key, [])) + + elif triggered == "xray-graph" and relayout: + if "shapes" in relayout: + drawing_event = True + raw_shapes = relayout["shapes"] + n_raw = len(raw_shapes) + n_stored = len(stored) + if n_raw > n_stored: + new_raw = raw_shapes[-1] + sev = severity or "Medium" + color = severity_color(sev) + width = 3 if sev == "High" else 2 + stored = stored + [{ + **new_raw, + "line": {"color": color, "width": width}, + "_label": label or "Unspecified", + "_severity": sev, + "_note": note or "", + }] + elif n_raw < n_stored: + stored = stored[:n_raw] + elif n_raw == n_stored and n_raw > 0: + updated = [] + for raw, old in zip(raw_shapes, stored): + updated.append({**raw, + "_label": old.get("_label", "Unspecified"), + "_severity": old.get("_severity", "Medium"), + "_note": old.get("_note", "")}) + stored = updated + else: + # Pan/zoom relayout — nothing to update + return (no_update,) * 5 + + # Persist this study's annotations into the keyed store + by_study[key] = stored + findings_table = create_findings_table(stored) + count = str(len(stored)) + + if drawing_event: + # Shape already rendered on canvas; skip figure rebuild to avoid flicker + return no_update, stored, by_study, findings_table, count + + img_path = XRAY_DIR / study.get("image_file", "xray_01.png") + img_b64 = load_xray_b64(img_path, + window=float(window or 220), + level =float(level or 128), + invert=bool(invert)) + fig = create_xray_figure(img_b64, shapes=stored) + fig.update_layout(dragmode=draw_mode or "drawrect", + newshape=newshape_for(severity)) + + return fig, stored, by_study, findings_table, count + + +# ── Live annotation styling: severity drives the pen colour ─────────────────── +@callback( + Output("xray-graph", "figure", allow_duplicate=True), + Output("pending-annotation", "children"), + Input("severity-select", "value"), + Input("finding-label-select","value"), + Input("annotation-note", "value"), + prevent_initial_call=True, +) +def update_pen_style(severity, finding, note): + """Update the next-shape style + pending badge as the user changes controls. + + Uses a Patch so the X-ray image is not reloaded on every keystroke. + """ + patch = Patch() + patch["layout"]["newshape"] = newshape_for(severity) + return patch, _pending_tag(finding, severity, note) + + +# ── Patient banner follows the selected study ───────────────────────────────── +@callback( + Output("patient-banner", "children"), + Input("current-study-id", "data"), +) +def update_patient_banner(study_id): + if not study_id: + return no_update + return _patient_banner_content(get_study(study_id)) + + +# ── Image chrome: DICOM corner overlays + status bar ────────────────────────── +@callback( + Output("image-overlays", "children"), + Output("image-status-bar", "children"), + Input("current-study-id", "data"), + Input("window-slider", "value"), + Input("level-slider", "value"), + Input("invert-toggle", "checked"), + Input("draw-mode-select", "value"), +) +def update_image_chrome(study_id, window, level, invert, draw_mode): + study = get_study(study_id) if study_id else {} + overlays = _image_overlays(study, window, level, invert) + status = _status_bar(draw_mode, window, level, invert) + return overlays, status diff --git a/medical-imaging-demo/callbacks/vitals.py b/medical-imaging-demo/callbacks/vitals.py new file mode 100644 index 0000000..992d0a2 --- /dev/null +++ b/medical-imaging-demo/callbacks/vitals.py @@ -0,0 +1,74 @@ +from dash import callback, Input, Output +import dash_mantine_components as dmc + +from components.charts import (create_vitals_chart, create_vitals_variability, + VITAL_RANGES) +from utils.data_loader import get_vitals + +UNITS = {"HR": "bpm", "SpO2": "%", "Temp": "°C", + "SysBP": "mmHg", "DiaBP": "mmHg", "RR": "/min"} + + +@callback( + Output("vitals-trend-chart", "figure"), + Output("vitals-var-chart", "figure"), + Output("stat-current-hr", "children"), + Output("stat-high-hr", "children"), + Output("stat-low-hr", "children"), + Output("stat-current-spo2", "children"), + Output("stat-abnormal", "children"), + Output("vitals-summary-grid","children"), + Input("vitals-patient-select","value"), + Input("vitals-period", "value"), + Input("vitals-select", "value"), + Input("vitals-ref-toggle", "checked"), + Input("vitals-ma-select", "value"), +) +def update_vitals(patient_id, period, vitals, show_ref, ma): + vitals = vitals or ["HR", "SpO2"] + df = get_vitals(patient_id, period) + + if df.empty: + empty = dmc.Text("No data", c="dimmed") + return empty, empty, "—", "—", "—", "—", "—", [] + + trend_fig = create_vitals_chart(df, vitals, show_reference=show_ref, ma_days=ma or "none") + var_fig = create_vitals_variability(df, vitals) + + # Stat cards + hr_cur = f"{df['HR'].iloc[-1]:.0f} bpm" if "HR" in df.columns else "—" + hr_hi = f"{df['HR'].max():.0f}" if "HR" in df.columns else "—" + hr_lo = f"{df['HR'].min():.0f}" if "HR" in df.columns else "—" + spo_cur = f"{df['SpO2'].iloc[-1]:.1f}%" if "SpO2" in df.columns else "—" + + # Count readings outside reference range + abnormal = 0 + for v in vitals: + if v in df.columns and v in VITAL_RANGES: + lo, hi = VITAL_RANGES[v] + abnormal += int(((df[v] < lo) | (df[v] > hi)).sum()) + abn_str = str(abnormal) + + # Summary grid: one mini-card per vital + cards = [] + for v in vitals: + if v not in df.columns: + continue + col = df[v] + lo_r, hi_r = VITAL_RANGES.get(v, (None, None)) + current_val = col.iloc[-1] + in_range = (lo_r is None or lo_r <= current_val <= hi_r) + badge_color = "teal" if in_range else "red" + cards.append(dmc.Paper( + dmc.Stack([ + dmc.Group([ + dmc.Text(v, size="xs", fw=600), + dmc.Badge("OK" if in_range else "!", color=badge_color, size="xs"), + ], justify="space-between"), + dmc.Text(f"{current_val:.1f} {UNITS.get(v,'')}", size="sm", fw=700), + dmc.Text(f"↓{col.min():.1f} ↑{col.max():.1f}", size="xs", c="dimmed"), + ], gap=2), + p="xs", radius="sm", withBorder=True, + )) + + return trend_fig, var_fig, hr_cur, hr_hi, hr_lo, spo_cur, abn_str, cards diff --git a/medical-imaging-demo/components/__init__.py b/medical-imaging-demo/components/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/medical-imaging-demo/components/charts.py b/medical-imaging-demo/components/charts.py new file mode 100644 index 0000000..eab4fff --- /dev/null +++ b/medical-imaging-demo/components/charts.py @@ -0,0 +1,287 @@ +import plotly.graph_objects as go +import plotly.express as px +import pandas as pd +import numpy as np + +COLORS = { + "primary": "#0d9488", # teal + "secondary": "#2563eb", # blue + "danger": "#ef4444", + "warning": "#f59e0b", + "success": "#22c55e", + "gray": "#94a3b8", + "purple": "#8b5cf6", +} + +NAVY = "#1e3a8a" # deep navy accent (matches app theme highlight) + +VITAL_COLORS = { + "HR": "#ef4444", + "SpO2": "#2563eb", + "Temp": "#f59e0b", + "SysBP": "#8b5cf6", + "DiaBP": "#a78bfa", + "RR": "#22c55e", +} + +VITAL_RANGES = { + "HR": (60, 100), + "SpO2": (95, 100), + "Temp": (36.1, 37.8), + "SysBP": (90, 130), + "DiaBP": (60, 90), + "RR": (12, 20), +} + +BASE_LAYOUT = { + "paper_bgcolor": "rgba(0,0,0,0)", + "plot_bgcolor": "rgba(0,0,0,0)", + "font": {"family": "Inter, sans-serif"}, + "margin": {"l": 48, "r": 24, "t": 48, "b": 40}, + "hovermode": "x unified", + "hoverlabel": { + "bgcolor": "white", + "bordercolor": "#e2e8f0", + "font": {"family": "Inter, sans-serif", "size": 12}, + }, +} + + +# ── Admissions area chart ───────────────────────────────────────────────────── +def create_admissions_chart(df: pd.DataFrame, department: str = "All") -> go.Figure: + df = df.copy() + df["date"] = pd.to_datetime(df["date"]) + + if department == "All": + agg = df.groupby("date")["admissions"].sum().reset_index() + fig = go.Figure(go.Scatter( + x=agg["date"], y=agg["admissions"], + fill="tozeroy", + line={"color": COLORS["primary"], "width": 2}, + fillcolor="rgba(13,148,136,0.15)", + name="Total Admissions", + hovertemplate="%{y} admissions", + )) + else: + sub = df[df["department"] == department] + fig = go.Figure(go.Scatter( + x=sub["date"], y=sub["admissions"], + fill="tozeroy", + line={"color": COLORS["secondary"], "width": 2}, + fillcolor="rgba(37,99,235,0.12)", + name=department, + hovertemplate="%{y} admissions", + )) + + fig.update_layout( + **BASE_LAYOUT, + title={"text": "Daily Admissions", "x": 0, "font": {"size": 15, "weight": 600}}, + xaxis={"showgrid": False}, + yaxis={"showgrid": True, "gridcolor": "rgba(0,0,0,0.05)", "title": "Patients"}, + showlegend=False, + ) + return fig + + +# ── Vitals time-series with reference bands ─────────────────────────────────── +def create_vitals_chart(df: pd.DataFrame, vitals: list, + show_reference: bool = True, + ma_days: str = "none") -> go.Figure: + fig = go.Figure() + df = df.copy() + df["timestamp"] = pd.to_datetime(df["timestamp"]) + + ma_window = {"20": 20, "50": 50, "none": None}.get(ma_days) + + for v in vitals: + if v not in df.columns: + continue + color = VITAL_COLORS.get(v, COLORS["primary"]) + series = df[v] + if ma_window: + series = series.rolling(ma_window, min_periods=1).mean() + + fig.add_trace(go.Scatter( + x=df["timestamp"], y=series, + name=v, line={"color": color, "width": 1.8}, + hovertemplate=f"{v}: %{{y}}", + )) + + if show_reference and v in VITAL_RANGES: + lo, hi = VITAL_RANGES[v] + fig.add_hrect(y0=lo, y1=hi, fillcolor=color, + opacity=0.06, layer="below", line_width=0) + + fig.update_layout( + **{**BASE_LAYOUT, "margin": {"l": 48, "r": 24, "t": 16, "b": 40}}, + legend={"orientation": "h", "y": -0.18}, + xaxis={ + "showgrid": True, "gridcolor": "rgba(0,0,0,0.04)", + "rangeslider": {"visible": False}, + }, + yaxis={"showgrid": True, "gridcolor": "rgba(0,0,0,0.04)"}, + ) + return fig + + +# ── Vitals variability (box plot per vital) ─────────────────────────────────── +def create_vitals_variability(df: pd.DataFrame, vitals: list) -> go.Figure: + fig = go.Figure() + for v in vitals: + if v not in df.columns: + continue + fig.add_trace(go.Box( + y=df[v], name=v, + marker_color=VITAL_COLORS.get(v, COLORS["primary"]), + boxmean="sd", + )) + fig.update_layout( + **BASE_LAYOUT, + title={"text": "Vital Sign Distribution", "x": 0, + "font": {"size": 15, "weight": 600}}, + yaxis={"showgrid": True, "gridcolor": "rgba(0,0,0,0.04)"}, + showlegend=False, + ) + return fig + + +# ── ECG-style HR sparkline ──────────────────────────────────────────────────── +def create_ecg_sparkline(hr_history: list, patient_id: str = "") -> go.Figure: + fig = go.Figure(go.Scatter( + y=hr_history, + mode="lines", + line={"color": COLORS["success"], "width": 2}, + hovertemplate="%{y} bpm", + )) + fig.update_layout( + paper_bgcolor="rgba(0,0,0,0)", + plot_bgcolor="rgba(0,0,0,0)", + font={"family": "Inter, sans-serif"}, + margin={"l": 0, "r": 0, "t": 12, "b": 0}, + xaxis={"visible": False}, + yaxis={"visible": False, "range": [35, 165]}, + showlegend=False, + title={"text": patient_id, "x": 0, "font": {"size": 12, "weight": 600}}, + ) + return fig + + +# ── Diagnosis donut (cohort demographics) ───────────────────────────────────── +def create_diagnosis_donut(df: pd.DataFrame) -> go.Figure: + counts = df["diagnosis"].value_counts().reset_index() + counts.columns = ["diagnosis", "count"] + fig = go.Figure(go.Pie( + labels=counts["diagnosis"], + values=counts["count"], + hole=0.58, + textinfo="percent", + textposition="outside", + marker={"colors": px.colors.qualitative.Pastel[:len(counts)]}, + hovertemplate="%{label}
%{value} patients (%{percent})", + )) + fig.update_layout( + **BASE_LAYOUT, + title={"text": "Diagnosis Distribution", "x": 0, + "font": {"size": 15, "weight": 600}}, + legend={"orientation": "v", "x": 1.02, "y": 0.5}, + annotations=[{"text": "Cohort", "x": 0.5, "y": 0.5, + "font": {"size": 13, "weight": 600}, "showarrow": False}], + ) + return fig + + +# ── Age-sex bar chart (cohort demographics) ─────────────────────────────────── +def create_age_sex_chart(df: pd.DataFrame) -> go.Figure: + bins = [20, 30, 40, 50, 60, 70, 80, 90] + labels = ["20-29","30-39","40-49","50-59","60-69","70-79","80+"] + df = df.copy() + df["age_group"] = pd.cut(df["age"], bins=bins, labels=labels, right=False) + grp = df.groupby(["age_group", "gender"], observed=True).size().reset_index(name="count") + fig = go.Figure() + for gender, color in [("M", COLORS["secondary"]), ("F", COLORS["primary"])]: + sub = grp[grp["gender"] == gender] + fig.add_trace(go.Bar( + x=sub["age_group"].astype(str), y=sub["count"], + name="Male" if gender == "M" else "Female", + marker_color=color, + )) + fig.update_layout( + **BASE_LAYOUT, + title={"text": "Age & Sex Distribution", "x": 0, + "font": {"size": 15, "weight": 600}}, + barmode="group", + xaxis={"title": "Age Group"}, + yaxis={"title": "Patients", "showgrid": True, "gridcolor": "rgba(0,0,0,0.04)"}, + legend={"orientation": "h", "y": -0.18}, + ) + return fig + + +# ── Risk stratification bar chart ───────────────────────────────────────────── +def create_risk_strat_chart(df: pd.DataFrame) -> go.Figure: + risk_diag = df.groupby(["diagnosis", "risk_level"]).size().reset_index(name="count") + color_map = {"High": COLORS["danger"], "Medium": COLORS["warning"], "Low": COLORS["success"]} + fig = go.Figure() + for level in ["High", "Medium", "Low"]: + sub = risk_diag[risk_diag["risk_level"] == level] + fig.add_trace(go.Bar( + x=sub["diagnosis"], y=sub["count"], + name=level, marker_color=color_map[level], + )) + fig.update_layout( + **BASE_LAYOUT, + title={"text": "Risk Stratification by Diagnosis", "x": 0, + "font": {"size": 15, "weight": 600}}, + barmode="stack", + xaxis={"tickangle": -30}, + yaxis={"title": "Patients"}, + legend={"orientation": "h", "y": -0.22}, + ) + return fig + + +# ── Crossfilter scatter ─────────────────────────────────────────────────────── +SCATTER_LIGHT = { + "paper_bgcolor": "rgba(0,0,0,0)", + "plot_bgcolor": "rgba(0,0,0,0)", + "font": {"family": "Inter, sans-serif", "color": "#1e2433"}, + "margin": {"l": 40, "r": 16, "t": 40, "b": 36}, + "hovermode": False, + "newselection_mode": "gradual", +} + +def create_crossfilter_scatter(df: pd.DataFrame, x_col: str, y_col: str, + selected_ids=None) -> go.Figure: + all_ids = df.index.tolist() + if selected_ids is None: + selected_ids = all_ids + + risk_colors = {"High": "#ef4444", "Medium": "#f59e0b", "Low": "#22c55e"} + marker_colors = [risk_colors.get(r, "#94a3b8") for r in df["risk_level"]] + + fig = px.scatter(df, x=x_col, y=y_col, template="plotly_white") + fig.update_traces( + selectedpoints=selected_ids, + customdata=df.index, + mode="markers", + marker={ + "color": marker_colors, + "size": 8, + "opacity": 0.9, + "line": {"width": 0.6, "color": "#ffffff"}, + }, + unselected={"marker": {"opacity": 0.15, "color": "#cbd5e1"}}, + selected={"marker": {"opacity": 1.0, "size": 9}}, + ) + grid = {"showgrid": True, "gridcolor": "rgba(0,0,0,0.06)", + "zeroline": False, "linecolor": "rgba(0,0,0,0.12)"} + fig.update_layout( + **SCATTER_LIGHT, + dragmode="select", + activeselection={"fillcolor": "rgba(30,58,138,0.08)"}, + xaxis={**grid, "title": x_col}, + yaxis={**grid, "title": y_col}, + title={"text": f"{x_col} vs {y_col}", + "font": {"size": 13, "color": NAVY, "weight": 600}}, + ) + return fig diff --git a/medical-imaging-demo/components/imaging.py b/medical-imaging-demo/components/imaging.py new file mode 100644 index 0000000..c393d23 --- /dev/null +++ b/medical-imaging-demo/components/imaging.py @@ -0,0 +1,172 @@ +"""X-ray figure builder and annotation helpers.""" +import base64 +import io +import pathlib + +import numpy as np +import plotly.graph_objects as go +from PIL import Image, ImageEnhance, ImageOps + +XRAY_DIR = pathlib.Path(__file__).parent.parent / "assets" / "xrays" + +# Approximate bounding boxes (in 512×512 space) for each finding type +FINDING_AI_BOXES = { + "Cardiomegaly": {"x0": 155, "y0": 192, "x1": 345, "y1": 368, "color": "#f59e0b"}, + "Pleural Effusion":{"x0": 308, "y0": 295, "x1": 460, "y1": 425, "color": "#3b82f6"}, + "Pneumothorax": {"x0": 18, "y0": 40, "x1": 178, "y1": 260, "color": "#ef4444"}, + "Nodule": {"x0": 345, "y0": 135, "x1": 400, "y1": 195, "color": "#8b5cf6"}, + "Mass": {"x0": 315, "y0": 155, "x1": 430, "y1": 285, "color": "#8b5cf6"}, + "Atelectasis": {"x0": 155, "y0": 295, "x1": 380, "y1": 340, "color": "#f97316"}, + "Pneumonia": {"x0": 310, "y0": 258, "x1": 460, "y1": 360, "color": "#eab308"}, + "Consolidation": {"x0": 300, "y0": 250, "x1": 465, "y1": 370, "color": "#eab308"}, + "Infiltration": {"x0": 145, "y0": 230, "x1": 310, "y1": 340, "color": "#eab308"}, + "Cardiomegaly": {"x0": 155, "y0": 192, "x1": 345, "y1": 368, "color": "#f59e0b"}, +} + +IMG_W = IMG_H = 512 + +# Severity → annotation colour (Low=green, Medium=amber, High=red) +# Darkened one step for legibility on the light cream theme. +SEVERITY_COLORS = {"Low": "#16a34a", "Medium": "#d97706", "High": "#dc2626"} + + +def severity_color(severity: str) -> str: + """Hex colour for a severity level, defaulting to Medium amber.""" + return SEVERITY_COLORS.get(severity or "Medium", SEVERITY_COLORS["Medium"]) + + +def newshape_for(severity: str) -> dict: + """Plotly `newshape` style for the next-drawn shape, keyed by severity. + + High findings draw with a thicker line so urgency reads at a glance. + """ + color = severity_color(severity) + width = 3 if severity == "High" else 2 + return { + "line": {"color": color, "width": width}, + "fillcolor": f"rgba({_hex_to_rgb(color)},0.08)", + } + + +def load_xray_b64(image_path: pathlib.Path, + window: float = 255, + level: float = 128, + invert: bool = False) -> str: + """Load grayscale X-ray PNG, apply window/level, return data-URI.""" + try: + img = Image.open(image_path).convert("L").resize((IMG_W, IMG_H), Image.LANCZOS) + except Exception: + img = Image.new("L", (IMG_W, IMG_H), 60) + + arr = np.array(img, dtype=np.float32) + lo = max(0.0, level - window / 2) + hi = min(255.0, level + window / 2) + if hi > lo: + arr = (arr - lo) / (hi - lo) * 255.0 + arr = np.clip(arr, 0, 255).astype(np.uint8) + img = Image.fromarray(arr, mode="L") + + if invert: + img = ImageOps.invert(img) + + buf = io.BytesIO() + img.save(buf, format="PNG") + b64 = base64.b64encode(buf.getvalue()).decode() + return f"data:image/png;base64,{b64}" + + +def create_xray_figure(img_b64: str, shapes: list = None) -> go.Figure: + """Build a Plotly figure that shows an X-ray with drawing tools.""" + fig = go.Figure() + + fig.add_layout_image( + source=img_b64, + xref="x", yref="y", + x=0, y=IMG_H, + xanchor="left", yanchor="top", + sizex=IMG_W, sizey=IMG_H, + sizing="stretch", + layer="below", + ) + + fig.update_layout( + xaxis=dict(range=[0, IMG_W], showgrid=False, zeroline=False, + showticklabels=False, fixedrange=False), + yaxis=dict(range=[0, IMG_H], showgrid=False, zeroline=False, + showticklabels=False, scaleanchor="x", fixedrange=False), + plot_bgcolor="#e7e9ec", + paper_bgcolor="#eef0f2", + margin=dict(l=0, r=0, t=0, b=0), + dragmode="drawrect", + newshape=dict( + line={"color": "#1e3a8a", "width": 2}, + fillcolor="rgba(30,58,138,0.08)", + ), + modebar=dict( + bgcolor="#eef0f2", + color="#6b7280", + activecolor="#1e3a8a", + ), + ) + + if shapes: + fig.layout.shapes = [_make_shape(s) for s in shapes] + + return fig + + +def _make_shape(s: dict) -> dict: + """Convert stored annotation dict to Plotly layout shape dict.""" + line = s.get("line") if isinstance(s.get("line"), dict) else {} + color = line.get("color", "#1e3a8a") + width = line.get("width", 2) + return { + "type": s.get("type", "rect"), + "x0": s.get("x0", 0), + "y0": s.get("y0", 0), + "x1": s.get("x1", 10), + "y1": s.get("y1", 10), + "line": {"color": color, "width": width}, + "fillcolor": f"rgba({_hex_to_rgb(color)},0.09)", + } + + +def _hex_to_rgb(hex_color: str) -> str: + h = hex_color.lstrip("#") + if len(h) == 6: + r, g, b = int(h[0:2],16), int(h[2:4],16), int(h[4:6],16) + return f"{r},{g},{b}" + return "30,58,138" + + +def get_ai_shapes(finding_labels_str: str) -> list: + """Return a list of stored annotation dicts from finding-label string.""" + shapes = [] + for f in finding_labels_str.split("|"): + f = f.strip() + box = FINDING_AI_BOXES.get(f) + if box: + shapes.append({ + "type": "rect", + "x0": box["x0"], "y0": IMG_H - box["y1"], + "x1": box["x1"], "y1": IMG_H - box["y0"], + "line": {"color": box["color"], "width": 2}, + "fillcolor": "rgba(0,0,0,0)", + "_label": f, + "_severity": "Medium", + "_note": "AI suggested", + }) + return shapes + + +def annotation_to_finding_dict(ann: dict) -> dict: + """Convert stored annotation to finding dict for PDF export.""" + x0, y0 = ann.get("x0", 0), ann.get("y0", 0) + x1, y1 = ann.get("x1", 0), ann.get("y1", 0) + return { + "label": ann.get("_label", "Unspecified"), + "location": f"({int(x0)},{int(y0)})→({int(x1)},{int(y1)})", + "shape_type": ann.get("type", "rect"), + "severity": ann.get("_severity", "—"), + "note": ann.get("_note", ""), + } diff --git a/medical-imaging-demo/components/kpi_cards.py b/medical-imaging-demo/components/kpi_cards.py new file mode 100644 index 0000000..57ef2a5 --- /dev/null +++ b/medical-imaging-demo/components/kpi_cards.py @@ -0,0 +1,61 @@ +import dash_mantine_components as dmc +from dash_iconify import DashIconify + + +def create_kpi_card(id_prefix, title, value, trend=None, + trend_positive=True, subtitle=None, icon=None, + alert_color=None): + """Clinical KPI card, optionally coloured for alert state.""" + trend_color = "teal" if trend_positive else "red" + border_color = {"red": "#ef4444", "yellow": "#f59e0b", "green": "#22c55e"}.get(alert_color) + style = {"minWidth": "200px"} + if border_color: + style["borderLeft"] = f"4px solid {border_color}" + + return dmc.Paper( + dmc.Stack([ + dmc.Group([ + dmc.Text(title, size="sm", c="dimmed", fw=500, id=f"{id_prefix}-title"), + DashIconify(icon=icon, width=20, color="gray") if icon else None, + ], justify="space-between"), + dmc.Group([ + dmc.Text(value, size="xl", fw=700, id=f"{id_prefix}-value"), + dmc.Text( + trend or "", + size="sm", + c=trend_color, + fw=500, + id=f"{id_prefix}-trend", + style={"display": "block" if trend else "none"}, + ), + ], justify="space-between", mt="xs"), + dmc.Text(subtitle, size="xs", c="dimmed", mt=4, + id=f"{id_prefix}-subtitle") if subtitle else None, + ], gap="xs"), + p="md", + radius="md", + withBorder=True, + style=style, + ) + + +def create_stat_card(label, value, description=None, value_color=None): + return dmc.Paper( + dmc.Stack([ + dmc.Text(label, size="xs", c="dimmed", tt="uppercase", fw=600), + dmc.Text(value, size="lg", fw=600, c=value_color or "default"), + dmc.Text(description, size="xs", c="dimmed") if description else None, + ], gap=4), + p="sm", + radius="sm", + withBorder=True, + ) + + +def create_risk_row(id_prefix, label, value, progress_value, color): + return dmc.Group([ + dmc.Text(label, size="sm", w=120), + dmc.Progress(value=progress_value, color=color, size="lg", + style={"flex": 1}, id=f"{id_prefix}-bar"), + dmc.Text(value, size="sm", fw=500, w=55, id=f"{id_prefix}-value"), + ], gap="sm") diff --git a/medical-imaging-demo/components/tables.py b/medical-imaging-demo/components/tables.py new file mode 100644 index 0000000..311f44f --- /dev/null +++ b/medical-imaging-demo/components/tables.py @@ -0,0 +1,110 @@ +import dash_mantine_components as dmc +import pandas as pd + + +def create_data_table(df: pd.DataFrame, title: str = None, + striped: bool = True, highlight_flags: bool = False): + """Generic Mantine table from a DataFrame.""" + cols = df.columns.tolist() + header = dmc.TableThead( + dmc.TableTr([dmc.TableTh(c, style={"fontWeight": 600}) for c in cols]) + ) + rows = [] + for _, row in df.iterrows(): + cells = [] + for col, val in zip(cols, row): + style = {} + val_str = str(val) if not pd.isna(val) else "—" + if highlight_flags and col == "flag": + color = {"H": "#ef4444", "L": "#3b82f6"}.get(val_str, "#22c55e") + style["color"] = color + style["fontWeight"] = 600 + cells.append(dmc.TableTd(val_str, style=style)) + rows.append(dmc.TableTr(cells)) + body = dmc.TableTbody(rows) + table = dmc.Table( + [header, body], + striped=striped, + highlightOnHover=True, + withTableBorder=True, + withColumnBorders=True, + ) + if title: + return dmc.Stack([ + dmc.Text(title, fw=600, size="lg"), + dmc.ScrollArea(table, type="auto"), + ], gap="sm") + return dmc.ScrollArea(table, type="auto") + + +def create_findings_table(annotations: list): + """Build a findings table from a list of annotation dicts.""" + if not annotations: + return dmc.Text("No annotations yet. Draw on the X-ray to add findings.", + size="sm", c="dimmed", ta="center", py="md") + + headers = ["#", "Finding", "Severity", "Location (px)", "Size (px²)", "Note"] + header = dmc.TableThead( + dmc.TableTr([dmc.TableTh(h, style={"fontWeight": 600, "fontSize": "12px"}) + for h in headers]) + ) + + sev_color = {"High": "#ef4444", "Medium": "#f59e0b", "Low": "#22c55e"} + rows = [] + for i, ann in enumerate(annotations, 1): + x0 = ann.get("x0", 0) + y0 = ann.get("y0", 0) + x1 = ann.get("x1", 0) + y1 = ann.get("y1", 0) + area = abs((x1 - x0) * (y1 - y0)) + sev = ann.get("_severity", "—") + rows.append(dmc.TableTr([ + dmc.TableTd(str(i), style={"fontSize": "12px"}), + dmc.TableTd(ann.get("_label", "Unspecified"), + style={"fontWeight": 500, "fontSize": "12px"}), + dmc.TableTd( + dmc.Badge(sev, color={"High":"red","Medium":"yellow","Low":"teal"}.get(sev,"gray"), + size="sm"), + ), + dmc.TableTd(f"({int(x0)},{int(y0)})→({int(x1)},{int(y1)})", + style={"fontFamily": "monospace", "fontSize": "11px"}), + dmc.TableTd(f"{int(area):,}", style={"fontSize": "12px"}), + dmc.TableTd(ann.get("_note", ""), style={"fontSize": "12px"}), + ])) + + return dmc.ScrollArea( + dmc.Table([header, dmc.TableTbody(rows)], + striped=True, highlightOnHover=True, + withTableBorder=True, withColumnBorders=False, + verticalSpacing="xs"), + type="auto", + ) + + +def create_patient_table(df: pd.DataFrame, cols=None): + """Patient roster table with coloured risk badges.""" + if cols is None: + cols = ["patient_id", "name", "age", "gender", "diagnosis", "ward", "risk_score"] + df = df[cols].copy() + header = dmc.TableThead( + dmc.TableTr([dmc.TableTh(c.replace("_"," ").title(), + style={"fontWeight": 600, "fontSize": "12px"}) + for c in cols]) + ) + rows = [] + for _, row in df.iterrows(): + cells = [] + for col in cols: + val = row[col] + if col == "risk_score": + color = "red" if val > 70 else "yellow" if val > 40 else "teal" + cells.append(dmc.TableTd( + dmc.Badge(f"{val:.0f}", color=color, size="sm"))) + else: + cells.append(dmc.TableTd(str(val), style={"fontSize": "12px"})) + rows.append(dmc.TableTr(cells)) + return dmc.ScrollArea( + dmc.Table([header, dmc.TableTbody(rows)], + striped=True, highlightOnHover=True, withTableBorder=True), + type="auto", h=280, + ) diff --git a/medical-imaging-demo/data/admissions.csv b/medical-imaging-demo/data/admissions.csv new file mode 100644 index 0000000..bfaba6c --- /dev/null +++ b/medical-imaging-demo/data/admissions.csv @@ -0,0 +1,211 @@ +date,department,admissions +2026-05-17,Cardiology,6 +2026-05-17,Pulmonology,5 +2026-05-17,Neurology,6 +2026-05-17,General Medicine,16 +2026-05-17,Surgery,8 +2026-05-17,Nephrology,4 +2026-05-17,Oncology,2 +2026-05-18,Cardiology,11 +2026-05-18,Pulmonology,6 +2026-05-18,Neurology,7 +2026-05-18,General Medicine,20 +2026-05-18,Surgery,11 +2026-05-18,Nephrology,3 +2026-05-18,Oncology,2 +2026-05-19,Cardiology,12 +2026-05-19,Pulmonology,3 +2026-05-19,Neurology,0 +2026-05-19,General Medicine,22 +2026-05-19,Surgery,8 +2026-05-19,Nephrology,5 +2026-05-19,Oncology,4 +2026-05-20,Cardiology,14 +2026-05-20,Pulmonology,7 +2026-05-20,Neurology,5 +2026-05-20,General Medicine,18 +2026-05-20,Surgery,11 +2026-05-20,Nephrology,6 +2026-05-20,Oncology,6 +2026-05-21,Cardiology,9 +2026-05-21,Pulmonology,12 +2026-05-21,Neurology,5 +2026-05-21,General Medicine,19 +2026-05-21,Surgery,10 +2026-05-21,Nephrology,3 +2026-05-21,Oncology,3 +2026-05-22,Cardiology,14 +2026-05-22,Pulmonology,10 +2026-05-22,Neurology,6 +2026-05-22,General Medicine,22 +2026-05-22,Surgery,10 +2026-05-22,Nephrology,4 +2026-05-22,Oncology,2 +2026-05-23,Cardiology,7 +2026-05-23,Pulmonology,4 +2026-05-23,Neurology,7 +2026-05-23,General Medicine,16 +2026-05-23,Surgery,10 +2026-05-23,Nephrology,4 +2026-05-23,Oncology,1 +2026-05-24,Cardiology,10 +2026-05-24,Pulmonology,8 +2026-05-24,Neurology,5 +2026-05-24,General Medicine,12 +2026-05-24,Surgery,4 +2026-05-24,Nephrology,5 +2026-05-24,Oncology,2 +2026-05-25,Cardiology,12 +2026-05-25,Pulmonology,6 +2026-05-25,Neurology,6 +2026-05-25,General Medicine,17 +2026-05-25,Surgery,10 +2026-05-25,Nephrology,6 +2026-05-25,Oncology,5 +2026-05-26,Cardiology,9 +2026-05-26,Pulmonology,8 +2026-05-26,Neurology,4 +2026-05-26,General Medicine,23 +2026-05-26,Surgery,11 +2026-05-26,Nephrology,5 +2026-05-26,Oncology,8 +2026-05-27,Cardiology,10 +2026-05-27,Pulmonology,7 +2026-05-27,Neurology,7 +2026-05-27,General Medicine,24 +2026-05-27,Surgery,12 +2026-05-27,Nephrology,6 +2026-05-27,Oncology,2 +2026-05-28,Cardiology,10 +2026-05-28,Pulmonology,9 +2026-05-28,Neurology,3 +2026-05-28,General Medicine,20 +2026-05-28,Surgery,11 +2026-05-28,Nephrology,2 +2026-05-28,Oncology,5 +2026-05-29,Cardiology,13 +2026-05-29,Pulmonology,7 +2026-05-29,Neurology,5 +2026-05-29,General Medicine,16 +2026-05-29,Surgery,9 +2026-05-29,Nephrology,1 +2026-05-29,Oncology,2 +2026-05-30,Cardiology,8 +2026-05-30,Pulmonology,3 +2026-05-30,Neurology,2 +2026-05-30,General Medicine,12 +2026-05-30,Surgery,9 +2026-05-30,Nephrology,3 +2026-05-30,Oncology,5 +2026-05-31,Cardiology,8 +2026-05-31,Pulmonology,5 +2026-05-31,Neurology,3 +2026-05-31,General Medicine,9 +2026-05-31,Surgery,8 +2026-05-31,Nephrology,3 +2026-05-31,Oncology,3 +2026-06-01,Cardiology,7 +2026-06-01,Pulmonology,7 +2026-06-01,Neurology,5 +2026-06-01,General Medicine,20 +2026-06-01,Surgery,9 +2026-06-01,Nephrology,4 +2026-06-01,Oncology,5 +2026-06-02,Cardiology,14 +2026-06-02,Pulmonology,7 +2026-06-02,Neurology,3 +2026-06-02,General Medicine,17 +2026-06-02,Surgery,10 +2026-06-02,Nephrology,7 +2026-06-02,Oncology,0 +2026-06-03,Cardiology,9 +2026-06-03,Pulmonology,7 +2026-06-03,Neurology,1 +2026-06-03,General Medicine,19 +2026-06-03,Surgery,10 +2026-06-03,Nephrology,5 +2026-06-03,Oncology,3 +2026-06-04,Cardiology,11 +2026-06-04,Pulmonology,5 +2026-06-04,Neurology,2 +2026-06-04,General Medicine,19 +2026-06-04,Surgery,10 +2026-06-04,Nephrology,5 +2026-06-04,Oncology,6 +2026-06-05,Cardiology,12 +2026-06-05,Pulmonology,9 +2026-06-05,Neurology,6 +2026-06-05,General Medicine,23 +2026-06-05,Surgery,9 +2026-06-05,Nephrology,6 +2026-06-05,Oncology,4 +2026-06-06,Cardiology,10 +2026-06-06,Pulmonology,6 +2026-06-06,Neurology,4 +2026-06-06,General Medicine,15 +2026-06-06,Surgery,8 +2026-06-06,Nephrology,5 +2026-06-06,Oncology,5 +2026-06-07,Cardiology,9 +2026-06-07,Pulmonology,3 +2026-06-07,Neurology,4 +2026-06-07,General Medicine,14 +2026-06-07,Surgery,6 +2026-06-07,Nephrology,3 +2026-06-07,Oncology,1 +2026-06-08,Cardiology,7 +2026-06-08,Pulmonology,10 +2026-06-08,Neurology,5 +2026-06-08,General Medicine,16 +2026-06-08,Surgery,10 +2026-06-08,Nephrology,6 +2026-06-08,Oncology,3 +2026-06-09,Cardiology,9 +2026-06-09,Pulmonology,5 +2026-06-09,Neurology,10 +2026-06-09,General Medicine,17 +2026-06-09,Surgery,6 +2026-06-09,Nephrology,4 +2026-06-09,Oncology,5 +2026-06-10,Cardiology,15 +2026-06-10,Pulmonology,7 +2026-06-10,Neurology,5 +2026-06-10,General Medicine,17 +2026-06-10,Surgery,12 +2026-06-10,Nephrology,4 +2026-06-10,Oncology,3 +2026-06-11,Cardiology,12 +2026-06-11,Pulmonology,8 +2026-06-11,Neurology,5 +2026-06-11,General Medicine,22 +2026-06-11,Surgery,6 +2026-06-11,Nephrology,5 +2026-06-11,Oncology,4 +2026-06-12,Cardiology,11 +2026-06-12,Pulmonology,9 +2026-06-12,Neurology,7 +2026-06-12,General Medicine,22 +2026-06-12,Surgery,9 +2026-06-12,Nephrology,4 +2026-06-12,Oncology,5 +2026-06-13,Cardiology,8 +2026-06-13,Pulmonology,2 +2026-06-13,Neurology,6 +2026-06-13,General Medicine,11 +2026-06-13,Surgery,8 +2026-06-13,Nephrology,8 +2026-06-13,Oncology,4 +2026-06-14,Cardiology,7 +2026-06-14,Pulmonology,5 +2026-06-14,Neurology,5 +2026-06-14,General Medicine,14 +2026-06-14,Surgery,9 +2026-06-14,Nephrology,6 +2026-06-14,Oncology,5 +2026-06-15,Cardiology,9 +2026-06-15,Pulmonology,8 +2026-06-15,Neurology,6 +2026-06-15,General Medicine,23 +2026-06-15,Surgery,10 +2026-06-15,Nephrology,3 +2026-06-15,Oncology,4 diff --git a/medical-imaging-demo/data/cohort.csv b/medical-imaging-demo/data/cohort.csv new file mode 100644 index 0000000..51b12e7 --- /dev/null +++ b/medical-imaging-demo/data/cohort.csv @@ -0,0 +1,201 @@ +patient_id,age,gender,bmi,systolic_bp,ldl,hba1c,egfr,diagnosis,risk_level +CO2001,46,F,25.9,167.0,161.8,8.3,87.7,CAD,High +CO2002,46,M,24.0,146.0,114.1,6.9,67.9,CKD,Low +CO2003,32,M,20.3,189.0,112.1,8.3,55.8,Asthma,High +CO2004,52,M,30.2,167.0,81.4,6.0,73.5,CKD,Medium +CO2005,76,F,33.3,105.0,56.4,6.8,72.2,Heart Failure,Low +CO2006,26,M,29.4,115.0,141.2,6.1,65.8,Asthma,Low +CO2007,59,M,16.0,149.0,122.4,10.4,72.2,Type 2 Diabetes,Medium +CO2008,50,F,31.2,133.0,71.1,6.3,21.1,CKD,Medium +CO2009,32,M,29.7,142.0,89.7,5.6,42.6,CKD,Medium +CO2010,49,M,32.0,93.0,54.6,5.9,53.5,Heart Failure,Low +CO2011,68,M,31.8,151.0,154.2,9.2,72.9,CKD,Medium +CO2012,57,F,26.9,131.0,119.0,8.3,78.6,Type 2 Diabetes,Medium +CO2013,55,F,16.0,134.0,124.1,7.3,43.1,Type 2 Diabetes,Medium +CO2014,50,M,29.5,115.0,166.2,4.5,85.6,Heart Failure,Low +CO2015,84,F,20.7,114.0,148.7,6.1,48.0,Hypertension,Low +CO2016,23,M,24.2,132.0,40.0,7.1,5.0,Obesity,Medium +CO2017,24,M,34.5,201.0,81.8,7.6,78.5,Hyperlipidemia,Medium +CO2018,36,M,16.0,110.0,132.6,7.1,61.4,Atrial Fibrillation,Low +CO2019,76,F,24.4,120.0,113.0,7.8,77.0,Hyperlipidemia,Low +CO2020,59,F,20.8,120.0,139.9,5.8,67.6,Hyperlipidemia,Low +CO2021,25,F,33.9,108.0,192.7,8.7,15.6,CAD,High +CO2022,52,F,28.6,126.0,162.8,5.0,69.6,Hyperlipidemia,Low +CO2023,84,M,42.4,125.0,150.1,4.5,25.2,Type 2 Diabetes,Medium +CO2024,82,M,25.7,110.0,95.4,6.4,86.7,Hyperlipidemia,Low +CO2025,22,F,25.6,124.0,102.0,7.3,38.6,Asthma,Medium +CO2026,46,M,26.2,160.0,147.0,7.0,31.8,Atrial Fibrillation,Medium +CO2027,48,F,30.0,103.0,171.0,7.6,62.8,Type 2 Diabetes,Low +CO2028,37,F,29.0,133.0,50.5,7.4,98.1,CKD,Low +CO2029,36,F,34.9,145.0,72.1,7.3,85.4,COPD,Low +CO2030,63,F,30.2,182.0,144.1,8.0,102.9,Hyperlipidemia,Medium +CO2031,81,F,33.4,124.0,70.2,6.6,42.8,COPD,Medium +CO2032,30,M,20.0,171.0,126.7,7.5,65.5,Heart Failure,Medium +CO2033,80,M,28.1,122.0,119.7,9.9,49.3,Heart Failure,Medium +CO2034,34,F,33.2,136.0,112.0,8.8,51.7,CAD,Medium +CO2035,61,F,25.5,144.0,81.3,8.4,38.1,Atrial Fibrillation,High +CO2036,51,M,26.7,117.0,143.2,5.3,111.1,Asthma,Low +CO2037,74,M,27.6,107.0,93.4,5.2,98.2,CKD,Low +CO2038,53,F,26.3,124.0,107.1,6.0,70.7,CKD,Low +CO2039,26,F,28.0,108.0,139.5,6.9,50.2,CKD,Low +CO2040,50,F,20.5,128.0,103.8,6.0,84.3,Asthma,Low +CO2041,59,M,28.6,138.0,70.8,8.3,51.1,Heart Failure,Medium +CO2042,20,F,17.1,135.0,95.8,7.6,45.3,Atrial Fibrillation,Low +CO2043,35,M,24.5,166.0,133.0,4.5,33.4,Atrial Fibrillation,High +CO2044,52,F,25.7,147.0,91.0,6.3,60.0,Type 2 Diabetes,Low +CO2045,62,M,33.4,106.0,124.9,6.5,18.9,Atrial Fibrillation,Medium +CO2046,48,F,39.7,138.0,156.9,6.6,65.7,CAD,Low +CO2047,45,F,34.5,161.0,52.5,6.1,127.1,Obesity,Medium +CO2048,53,F,30.3,148.0,153.1,9.5,59.4,Obesity,Medium +CO2049,71,M,19.8,145.0,60.7,4.5,73.6,COPD,Low +CO2050,50,M,28.6,131.0,118.0,6.8,70.3,Hypertension,Low +CO2051,33,F,26.5,92.0,141.4,7.6,120.3,Hypertension,Low +CO2052,76,F,23.4,80.0,118.8,5.5,47.6,Heart Failure,Low +CO2053,55,M,25.9,91.0,126.8,4.5,60.5,CKD,Low +CO2054,60,M,24.8,115.0,169.0,6.5,47.9,Obesity,Low +CO2055,67,M,31.3,204.0,113.6,8.6,94.2,Type 2 Diabetes,High +CO2056,80,F,23.5,126.0,161.9,7.0,31.9,CKD,Medium +CO2057,36,F,21.1,132.0,58.8,4.6,96.2,Hypertension,Low +CO2058,72,F,20.8,153.0,83.0,4.5,67.9,CKD,Low +CO2059,58,M,26.9,124.0,138.2,8.8,60.8,Asthma,Medium +CO2060,50,F,16.0,140.0,40.0,7.1,47.9,COPD,Low +CO2061,36,M,29.4,135.0,64.8,8.0,75.3,CAD,Medium +CO2062,50,M,28.2,107.0,87.7,6.8,100.1,CKD,Low +CO2063,54,F,30.6,104.0,132.6,6.9,111.6,Hyperlipidemia,Low +CO2064,23,M,34.1,120.0,96.5,6.8,53.1,Atrial Fibrillation,Low +CO2065,42,F,38.8,155.0,95.0,4.5,67.0,Hyperlipidemia,Low +CO2066,52,M,22.1,165.0,134.2,7.1,71.6,Obesity,Medium +CO2067,28,M,19.9,149.0,139.3,6.7,64.6,CAD,Low +CO2068,74,F,28.2,134.0,134.2,7.4,65.1,Type 2 Diabetes,Low +CO2069,65,M,28.3,99.0,92.8,6.9,48.9,Type 2 Diabetes,Low +CO2070,60,F,29.3,133.0,143.4,8.2,86.0,Atrial Fibrillation,Medium +CO2071,34,M,16.0,156.0,108.7,5.0,79.3,Asthma,Low +CO2072,55,M,27.3,80.0,144.6,8.2,77.6,Type 2 Diabetes,Medium +CO2073,32,F,21.0,123.0,119.5,7.6,79.8,Hyperlipidemia,Low +CO2074,58,F,32.7,99.0,105.7,7.7,60.5,CAD,Low +CO2075,28,F,26.8,94.0,74.9,6.0,55.5,COPD,Low +CO2076,46,F,26.6,121.0,106.2,6.1,68.5,Hypertension,Low +CO2077,83,F,22.6,152.0,45.0,6.5,70.4,CAD,Low +CO2078,23,M,30.4,125.0,84.4,8.1,89.2,Obesity,Medium +CO2079,77,F,31.9,119.0,157.6,7.4,69.5,COPD,Low +CO2080,71,M,21.7,146.0,95.9,7.4,114.3,CKD,Low +CO2081,36,M,24.9,139.0,164.4,8.8,69.1,Obesity,Medium +CO2082,45,M,17.9,138.0,61.6,5.2,75.9,Type 2 Diabetes,Low +CO2083,55,M,34.2,127.0,82.3,6.7,93.7,Heart Failure,Low +CO2084,48,F,27.0,150.0,89.7,8.0,70.6,Type 2 Diabetes,Low +CO2085,70,M,31.6,130.0,130.6,7.9,81.0,Obesity,Low +CO2086,74,F,22.1,147.0,98.0,6.7,57.5,Hyperlipidemia,Low +CO2087,30,M,23.1,132.0,129.1,5.6,38.1,Hypertension,Medium +CO2088,50,F,16.0,144.0,103.5,6.5,59.8,Hyperlipidemia,Low +CO2089,38,F,29.4,148.0,152.4,7.6,33.5,Heart Failure,Medium +CO2090,75,M,28.1,109.0,97.4,8.1,81.1,Heart Failure,Medium +CO2091,26,F,26.1,90.0,181.4,6.0,57.5,Asthma,Low +CO2092,40,F,25.5,135.0,87.3,6.2,64.3,CKD,Low +CO2093,84,F,30.4,133.0,79.0,8.1,76.8,COPD,Medium +CO2094,75,F,27.8,162.0,103.6,4.9,57.2,Type 2 Diabetes,Medium +CO2095,42,M,36.2,123.0,40.0,5.4,31.0,Heart Failure,Medium +CO2096,31,M,33.2,150.0,181.9,4.9,22.3,COPD,Medium +CO2097,76,F,38.3,143.0,161.8,10.8,65.1,Hypertension,High +CO2098,45,M,24.6,176.0,187.4,6.8,118.8,Asthma,Medium +CO2099,54,M,36.9,80.0,113.9,6.4,90.9,Type 2 Diabetes,Low +CO2100,74,F,25.4,140.0,109.2,4.5,69.2,CKD,Low +CO2101,74,F,33.5,139.0,150.7,4.8,83.2,Type 2 Diabetes,Low +CO2102,44,F,24.3,99.0,169.7,5.3,80.7,COPD,Low +CO2103,64,F,29.5,117.0,162.1,6.2,23.4,Hyperlipidemia,Medium +CO2104,62,F,30.9,102.0,99.3,9.2,110.2,Obesity,Medium +CO2105,50,F,38.4,132.0,149.1,4.5,29.0,Hypertension,Medium +CO2106,51,F,23.8,117.0,142.6,5.3,110.0,CKD,Low +CO2107,43,M,35.4,154.0,105.0,5.6,88.3,COPD,Low +CO2108,22,M,31.5,178.0,83.8,8.0,70.3,CKD,High +CO2109,53,F,34.3,114.0,68.6,6.1,95.8,Hypertension,Low +CO2110,42,F,38.9,159.0,106.7,8.2,40.0,COPD,High +CO2111,42,F,31.1,122.0,152.4,8.5,49.0,Obesity,Medium +CO2112,75,F,25.0,148.0,149.6,5.7,31.2,CKD,Medium +CO2113,57,F,31.5,108.0,87.9,8.1,79.7,Hyperlipidemia,Medium +CO2114,56,F,29.8,190.0,117.5,6.9,88.5,Asthma,Medium +CO2115,21,M,28.2,92.0,148.9,5.4,69.7,Heart Failure,Low +CO2116,26,M,30.1,157.0,79.2,5.4,92.5,CKD,Low +CO2117,68,M,25.3,143.0,141.9,8.2,89.8,Hyperlipidemia,Medium +CO2118,40,M,35.1,124.0,139.9,7.7,90.9,Hyperlipidemia,Low +CO2119,56,M,28.2,127.0,146.8,5.1,44.0,CKD,Medium +CO2120,63,F,37.1,147.0,67.8,5.9,100.7,Hypertension,Low +CO2121,79,M,28.9,122.0,79.9,7.3,80.0,Type 2 Diabetes,Low +CO2122,25,F,28.1,184.0,146.3,6.4,46.8,Heart Failure,Medium +CO2123,28,M,22.2,108.0,69.0,8.4,64.0,Hypertension,Medium +CO2124,64,F,27.5,130.0,155.2,5.9,98.0,Hypertension,Low +CO2125,75,M,16.0,120.0,49.6,4.5,98.6,Hypertension,Low +CO2126,38,F,17.2,136.0,65.6,5.4,85.8,Hyperlipidemia,Low +CO2127,74,M,29.0,124.0,161.7,5.1,37.1,Heart Failure,Medium +CO2128,62,M,27.2,130.0,82.4,6.4,103.5,Atrial Fibrillation,Low +CO2129,37,F,25.6,178.0,55.9,6.1,72.5,Obesity,Medium +CO2130,53,M,27.1,141.0,85.6,5.9,93.3,CKD,Low +CO2131,22,F,30.5,145.0,99.0,6.7,54.7,Heart Failure,Low +CO2132,38,F,36.4,146.0,133.1,6.5,51.7,Heart Failure,Low +CO2133,35,F,38.1,161.0,68.8,8.7,34.4,Heart Failure,High +CO2134,43,F,25.5,137.0,93.5,4.5,24.6,Hypertension,Medium +CO2135,80,M,16.6,143.0,89.2,4.5,101.8,Obesity,Low +CO2136,69,F,23.0,80.0,128.0,8.5,27.8,Hypertension,High +CO2137,55,F,33.0,85.0,117.4,7.8,50.3,Heart Failure,Low +CO2138,43,F,24.3,136.0,116.1,4.9,70.0,COPD,Low +CO2139,29,F,29.4,125.0,171.4,8.0,58.9,Hyperlipidemia,Low +CO2140,72,F,25.9,118.0,113.3,8.4,59.8,Type 2 Diabetes,Medium +CO2141,47,M,22.1,143.0,97.7,8.2,114.7,COPD,Medium +CO2142,58,F,24.5,106.0,113.0,8.6,55.3,CKD,Medium +CO2143,63,M,33.4,144.0,139.9,7.4,45.9,Hyperlipidemia,Low +CO2144,63,F,29.4,132.0,174.8,4.9,59.1,CKD,Low +CO2145,28,F,31.2,155.0,176.9,4.5,46.9,Hyperlipidemia,Low +CO2146,62,M,21.1,139.0,115.4,7.1,62.3,Asthma,Low +CO2147,74,F,29.3,94.0,114.0,4.5,113.2,Hypertension,Low +CO2148,40,F,24.7,135.0,142.9,8.9,69.6,Atrial Fibrillation,Medium +CO2149,62,F,26.0,150.0,158.3,9.5,42.0,Hypertension,High +CO2150,69,M,36.5,120.0,178.2,5.4,105.2,CAD,Medium +CO2151,78,F,29.2,145.0,52.6,7.1,39.6,Type 2 Diabetes,Medium +CO2152,32,M,28.2,126.0,120.6,7.7,85.4,Heart Failure,Low +CO2153,33,F,34.6,115.0,71.4,6.4,29.0,Atrial Fibrillation,Medium +CO2154,44,F,33.9,122.0,226.6,8.8,67.2,Hyperlipidemia,Medium +CO2155,24,F,34.8,173.0,102.5,6.5,88.1,Heart Failure,Medium +CO2156,40,F,37.4,112.0,132.6,8.5,68.3,COPD,Medium +CO2157,36,M,16.0,144.0,49.9,5.0,46.1,CAD,Low +CO2158,82,F,34.2,130.0,175.7,8.2,58.8,Heart Failure,Medium +CO2159,42,M,27.5,125.0,139.8,5.9,75.7,Hyperlipidemia,Low +CO2160,46,M,22.0,110.0,134.5,4.5,63.4,Obesity,Low +CO2161,58,F,22.9,150.0,172.1,4.7,106.5,Hypertension,Low +CO2162,54,F,26.0,136.0,52.1,6.7,81.7,Atrial Fibrillation,Low +CO2163,57,M,23.5,179.0,87.9,5.7,62.8,Type 2 Diabetes,Medium +CO2164,23,M,27.4,126.0,61.4,5.8,79.3,Heart Failure,Low +CO2165,31,M,18.9,92.0,127.8,8.8,130.0,Obesity,Medium +CO2166,84,M,25.0,110.0,149.5,8.2,88.7,COPD,Medium +CO2167,74,F,28.8,122.0,144.3,8.1,63.0,CAD,Medium +CO2168,50,M,33.6,132.0,53.1,7.4,86.2,Asthma,Low +CO2169,27,F,16.0,126.0,40.8,6.6,68.1,Heart Failure,Low +CO2170,49,F,23.2,147.0,115.1,7.4,68.2,Obesity,Low +CO2171,25,F,31.8,118.0,112.9,5.5,50.0,CKD,Low +CO2172,34,M,39.2,143.0,148.9,7.0,55.0,Obesity,Low +CO2173,82,F,21.5,91.0,163.0,6.7,45.5,COPD,Low +CO2174,21,M,30.8,154.0,124.3,5.5,114.5,Heart Failure,Low +CO2175,34,M,25.7,101.0,98.7,9.1,73.7,COPD,Medium +CO2176,62,F,23.9,145.0,135.3,8.9,97.6,Obesity,Medium +CO2177,44,F,22.3,136.0,138.4,4.5,88.5,Hypertension,Low +CO2178,32,M,27.9,106.0,40.0,6.4,63.4,Heart Failure,Low +CO2179,33,M,28.8,139.0,84.7,4.5,62.8,COPD,Low +CO2180,34,F,26.1,119.0,109.4,8.9,88.2,Type 2 Diabetes,Medium +CO2181,70,M,25.1,109.0,140.4,4.5,42.7,CKD,Medium +CO2182,53,M,25.0,132.0,100.9,7.9,72.6,Heart Failure,Low +CO2183,66,F,19.0,110.0,181.2,5.1,87.0,Heart Failure,Low +CO2184,75,F,27.3,146.0,107.0,7.7,103.4,Type 2 Diabetes,Low +CO2185,28,M,34.7,177.0,120.6,5.6,70.8,Asthma,Medium +CO2186,38,F,30.9,126.0,128.5,6.5,46.7,Obesity,Low +CO2187,82,F,21.4,153.0,115.1,7.2,63.4,Obesity,Low +CO2188,31,M,26.0,127.0,150.3,7.7,71.3,Hyperlipidemia,Low +CO2189,35,F,33.9,151.0,89.2,7.2,91.1,CAD,Low +CO2190,31,M,30.0,116.0,114.9,6.2,108.1,Heart Failure,Low +CO2191,37,M,33.6,112.0,105.7,10.2,54.5,Heart Failure,Medium +CO2192,53,M,23.3,80.0,154.7,4.8,70.3,Obesity,Low +CO2193,65,M,40.6,123.0,126.9,6.9,82.0,CKD,Low +CO2194,73,F,35.3,149.0,94.7,5.9,77.3,Hypertension,Low +CO2195,20,M,41.7,123.0,74.9,6.3,53.7,Heart Failure,Low +CO2196,55,M,28.1,145.0,106.8,7.7,64.2,Obesity,Low +CO2197,82,F,38.9,138.0,106.9,5.4,30.5,Asthma,Medium +CO2198,70,M,38.4,141.0,88.6,6.6,38.4,Obesity,Medium +CO2199,81,F,21.2,134.0,163.7,6.7,122.1,Hypertension,Low +CO2200,52,F,41.7,183.0,80.8,6.3,27.2,CKD,High diff --git a/medical-imaging-demo/data/labs.csv b/medical-imaging-demo/data/labs.csv new file mode 100644 index 0000000..c9a9491 --- /dev/null +++ b/medical-imaging-demo/data/labs.csv @@ -0,0 +1,201 @@ +patient_id,date,test,value,unit,reference_low,reference_high,flag +PT1001,2026-06-15,WBC,11.298,10³/µL,4.5,11.0,H +PT1001,2026-06-15,Hemoglobin,14.334,g/dL,12.0,17.5,N +PT1001,2026-06-15,Platelets,222.4,10³/µL,150.0,400.0,N +PT1001,2026-06-15,Sodium,140.412,mEq/L,136.0,145.0,N +PT1001,2026-06-15,Potassium,3.957,mEq/L,3.5,5.0,N +PT1001,2026-06-15,Creatinine,1.149,mg/dL,0.7,1.3,N +PT1001,2026-06-15,BUN,12.525,mg/dL,7.0,25.0,N +PT1001,2026-06-15,Glucose,96.633,mg/dL,70.0,100.0,N +PT1001,2026-06-15,Lactate,1.473,mmol/L,0.5,2.0,N +PT1001,2026-06-15,Troponin,0.028,ng/mL,0.0,0.04,N +PT1002,2026-06-15,WBC,9.094,10³/µL,4.5,11.0,N +PT1002,2026-06-15,Hemoglobin,16.156,g/dL,12.0,17.5,N +PT1002,2026-06-15,Platelets,251.797,10³/µL,150.0,400.0,N +PT1002,2026-06-15,Sodium,137.859,mEq/L,136.0,145.0,N +PT1002,2026-06-15,Potassium,4.036,mEq/L,3.5,5.0,N +PT1002,2026-06-15,Creatinine,1.167,mg/dL,0.7,1.3,N +PT1002,2026-06-15,BUN,6.461,mg/dL,7.0,25.0,L +PT1002,2026-06-15,Glucose,67.004,mg/dL,70.0,100.0,L +PT1002,2026-06-15,Lactate,1.351,mmol/L,0.5,2.0,N +PT1002,2026-06-15,Troponin,0.03,ng/mL,0.0,0.04,N +PT1003,2026-06-15,WBC,9.661,10³/µL,4.5,11.0,N +PT1003,2026-06-15,Hemoglobin,13.181,g/dL,12.0,17.5,N +PT1003,2026-06-15,Platelets,186.533,10³/µL,150.0,400.0,N +PT1003,2026-06-15,Sodium,138.647,mEq/L,136.0,145.0,N +PT1003,2026-06-15,Potassium,4.073,mEq/L,3.5,5.0,N +PT1003,2026-06-15,Creatinine,0.94,mg/dL,0.7,1.3,N +PT1003,2026-06-15,BUN,16.654,mg/dL,7.0,25.0,N +PT1003,2026-06-15,Glucose,97.651,mg/dL,70.0,100.0,N +PT1003,2026-06-15,Lactate,1.223,mmol/L,0.5,2.0,N +PT1003,2026-06-15,Troponin,0.031,ng/mL,0.0,0.04,N +PT1004,2026-06-15,WBC,9.027,10³/µL,4.5,11.0,N +PT1004,2026-06-15,Hemoglobin,13.578,g/dL,12.0,17.5,N +PT1004,2026-06-15,Platelets,323.232,10³/µL,150.0,400.0,N +PT1004,2026-06-15,Sodium,142.051,mEq/L,136.0,145.0,N +PT1004,2026-06-15,Potassium,4.25,mEq/L,3.5,5.0,N +PT1004,2026-06-15,Creatinine,1.031,mg/dL,0.7,1.3,N +PT1004,2026-06-15,BUN,15.688,mg/dL,7.0,25.0,N +PT1004,2026-06-15,Glucose,75.172,mg/dL,70.0,100.0,N +PT1004,2026-06-15,Lactate,2.315,mmol/L,0.5,2.0,H +PT1004,2026-06-15,Troponin,0.033,ng/mL,0.0,0.04,N +PT1005,2026-06-15,WBC,8.778,10³/µL,4.5,11.0,N +PT1005,2026-06-15,Hemoglobin,14.081,g/dL,12.0,17.5,N +PT1005,2026-06-15,Platelets,268.115,10³/µL,150.0,400.0,N +PT1005,2026-06-15,Sodium,137.337,mEq/L,136.0,145.0,N +PT1005,2026-06-15,Potassium,4.461,mEq/L,3.5,5.0,N +PT1005,2026-06-15,Creatinine,1.061,mg/dL,0.7,1.3,N +PT1005,2026-06-15,BUN,14.885,mg/dL,7.0,25.0,N +PT1005,2026-06-15,Glucose,85.269,mg/dL,70.0,100.0,N +PT1005,2026-06-15,Lactate,1.116,mmol/L,0.5,2.0,N +PT1005,2026-06-15,Troponin,0.014,ng/mL,0.0,0.04,N +PT1006,2026-06-15,WBC,6.236,10³/µL,4.5,11.0,N +PT1006,2026-06-15,Hemoglobin,13.066,g/dL,12.0,17.5,N +PT1006,2026-06-15,Platelets,222.357,10³/µL,150.0,400.0,N +PT1006,2026-06-15,Sodium,138.812,mEq/L,136.0,145.0,N +PT1006,2026-06-15,Potassium,4.74,mEq/L,3.5,5.0,N +PT1006,2026-06-15,Creatinine,0.889,mg/dL,0.7,1.3,N +PT1006,2026-06-15,BUN,5.016,mg/dL,7.0,25.0,L +PT1006,2026-06-15,Glucose,87.625,mg/dL,70.0,100.0,N +PT1006,2026-06-15,Lactate,1.531,mmol/L,0.5,2.0,N +PT1006,2026-06-15,Troponin,0.032,ng/mL,0.0,0.04,N +PT1007,2026-06-15,WBC,8.074,10³/µL,4.5,11.0,N +PT1007,2026-06-15,Hemoglobin,12.869,g/dL,12.0,17.5,N +PT1007,2026-06-15,Platelets,215.08,10³/µL,150.0,400.0,N +PT1007,2026-06-15,Sodium,142.12,mEq/L,136.0,145.0,N +PT1007,2026-06-15,Potassium,4.907,mEq/L,3.5,5.0,N +PT1007,2026-06-15,Creatinine,0.794,mg/dL,0.7,1.3,N +PT1007,2026-06-15,BUN,17.144,mg/dL,7.0,25.0,N +PT1007,2026-06-15,Glucose,80.006,mg/dL,70.0,100.0,N +PT1007,2026-06-15,Lactate,0.879,mmol/L,0.5,2.0,N +PT1007,2026-06-15,Troponin,0.02,ng/mL,0.0,0.04,N +PT1008,2026-06-15,WBC,7.489,10³/µL,4.5,11.0,N +PT1008,2026-06-15,Hemoglobin,11.409,g/dL,12.0,17.5,L +PT1008,2026-06-15,Platelets,290.119,10³/µL,150.0,400.0,N +PT1008,2026-06-15,Sodium,141.386,mEq/L,136.0,145.0,N +PT1008,2026-06-15,Potassium,4.586,mEq/L,3.5,5.0,N +PT1008,2026-06-15,Creatinine,0.897,mg/dL,0.7,1.3,N +PT1008,2026-06-15,BUN,7.426,mg/dL,7.0,25.0,N +PT1008,2026-06-15,Glucose,81.208,mg/dL,70.0,100.0,N +PT1008,2026-06-15,Lactate,1.568,mmol/L,0.5,2.0,N +PT1008,2026-06-15,Troponin,0.019,ng/mL,0.0,0.04,N +PT1009,2026-06-15,WBC,9.406,10³/µL,4.5,11.0,N +PT1009,2026-06-15,Hemoglobin,12.604,g/dL,12.0,17.5,N +PT1009,2026-06-15,Platelets,335.907,10³/µL,150.0,400.0,N +PT1009,2026-06-15,Sodium,141.172,mEq/L,136.0,145.0,N +PT1009,2026-06-15,Potassium,4.09,mEq/L,3.5,5.0,N +PT1009,2026-06-15,Creatinine,1.193,mg/dL,0.7,1.3,N +PT1009,2026-06-15,BUN,17.296,mg/dL,7.0,25.0,N +PT1009,2026-06-15,Glucose,76.142,mg/dL,70.0,100.0,N +PT1009,2026-06-15,Lactate,1.692,mmol/L,0.5,2.0,N +PT1009,2026-06-15,Troponin,0.017,ng/mL,0.0,0.04,N +PT1010,2026-06-15,WBC,7.822,10³/µL,4.5,11.0,N +PT1010,2026-06-15,Hemoglobin,13.326,g/dL,12.0,17.5,N +PT1010,2026-06-15,Platelets,271.124,10³/µL,150.0,400.0,N +PT1010,2026-06-15,Sodium,137.946,mEq/L,136.0,145.0,N +PT1010,2026-06-15,Potassium,4.173,mEq/L,3.5,5.0,N +PT1010,2026-06-15,Creatinine,1.006,mg/dL,0.7,1.3,N +PT1010,2026-06-15,BUN,19.271,mg/dL,7.0,25.0,N +PT1010,2026-06-15,Glucose,72.341,mg/dL,70.0,100.0,N +PT1010,2026-06-15,Lactate,1.701,mmol/L,0.5,2.0,N +PT1010,2026-06-15,Troponin,0.032,ng/mL,0.0,0.04,N +PT1011,2026-06-15,WBC,7.381,10³/µL,4.5,11.0,N +PT1011,2026-06-15,Hemoglobin,14.963,g/dL,12.0,17.5,N +PT1011,2026-06-15,Platelets,297.989,10³/µL,150.0,400.0,N +PT1011,2026-06-15,Sodium,140.725,mEq/L,136.0,145.0,N +PT1011,2026-06-15,Potassium,4.522,mEq/L,3.5,5.0,N +PT1011,2026-06-15,Creatinine,0.93,mg/dL,0.7,1.3,N +PT1011,2026-06-15,BUN,11.895,mg/dL,7.0,25.0,N +PT1011,2026-06-15,Glucose,88.854,mg/dL,70.0,100.0,N +PT1011,2026-06-15,Lactate,0.563,mmol/L,0.5,2.0,N +PT1011,2026-06-15,Troponin,0.027,ng/mL,0.0,0.04,N +PT1012,2026-06-15,WBC,9.159,10³/µL,4.5,11.0,N +PT1012,2026-06-15,Hemoglobin,13.459,g/dL,12.0,17.5,N +PT1012,2026-06-15,Platelets,381.657,10³/µL,150.0,400.0,N +PT1012,2026-06-15,Sodium,139.552,mEq/L,136.0,145.0,N +PT1012,2026-06-15,Potassium,4.053,mEq/L,3.5,5.0,N +PT1012,2026-06-15,Creatinine,0.882,mg/dL,0.7,1.3,N +PT1012,2026-06-15,BUN,18.42,mg/dL,7.0,25.0,N +PT1012,2026-06-15,Glucose,81.478,mg/dL,70.0,100.0,N +PT1012,2026-06-15,Lactate,0.603,mmol/L,0.5,2.0,N +PT1012,2026-06-15,Troponin,0.024,ng/mL,0.0,0.04,N +PT1013,2026-06-15,WBC,7.182,10³/µL,4.5,11.0,N +PT1013,2026-06-15,Hemoglobin,16.542,g/dL,12.0,17.5,N +PT1013,2026-06-15,Platelets,298.158,10³/µL,150.0,400.0,N +PT1013,2026-06-15,Sodium,141.219,mEq/L,136.0,145.0,N +PT1013,2026-06-15,Potassium,4.707,mEq/L,3.5,5.0,N +PT1013,2026-06-15,Creatinine,1.029,mg/dL,0.7,1.3,N +PT1013,2026-06-15,BUN,20.224,mg/dL,7.0,25.0,N +PT1013,2026-06-15,Glucose,79.151,mg/dL,70.0,100.0,N +PT1013,2026-06-15,Lactate,1.991,mmol/L,0.5,2.0,N +PT1013,2026-06-15,Troponin,0.023,ng/mL,0.0,0.04,N +PT1014,2026-06-15,WBC,5.407,10³/µL,4.5,11.0,N +PT1014,2026-06-15,Hemoglobin,14.977,g/dL,12.0,17.5,N +PT1014,2026-06-15,Platelets,289.0,10³/µL,150.0,400.0,N +PT1014,2026-06-15,Sodium,140.837,mEq/L,136.0,145.0,N +PT1014,2026-06-15,Potassium,3.215,mEq/L,3.5,5.0,L +PT1014,2026-06-15,Creatinine,0.901,mg/dL,0.7,1.3,N +PT1014,2026-06-15,BUN,8.533,mg/dL,7.0,25.0,N +PT1014,2026-06-15,Glucose,72.685,mg/dL,70.0,100.0,N +PT1014,2026-06-15,Lactate,1.325,mmol/L,0.5,2.0,N +PT1014,2026-06-15,Troponin,0.013,ng/mL,0.0,0.04,N +PT1015,2026-06-15,WBC,7.041,10³/µL,4.5,11.0,N +PT1015,2026-06-15,Hemoglobin,13.273,g/dL,12.0,17.5,N +PT1015,2026-06-15,Platelets,378.448,10³/µL,150.0,400.0,N +PT1015,2026-06-15,Sodium,140.608,mEq/L,136.0,145.0,N +PT1015,2026-06-15,Potassium,3.565,mEq/L,3.5,5.0,N +PT1015,2026-06-15,Creatinine,1.116,mg/dL,0.7,1.3,N +PT1015,2026-06-15,BUN,14.15,mg/dL,7.0,25.0,N +PT1015,2026-06-15,Glucose,95.743,mg/dL,70.0,100.0,N +PT1015,2026-06-15,Lactate,1.246,mmol/L,0.5,2.0,N +PT1015,2026-06-15,Troponin,0.012,ng/mL,0.0,0.04,N +PT1016,2026-06-15,WBC,6.693,10³/µL,4.5,11.0,N +PT1016,2026-06-15,Hemoglobin,14.086,g/dL,12.0,17.5,N +PT1016,2026-06-15,Platelets,311.732,10³/µL,150.0,400.0,N +PT1016,2026-06-15,Sodium,138.38,mEq/L,136.0,145.0,N +PT1016,2026-06-15,Potassium,4.81,mEq/L,3.5,5.0,N +PT1016,2026-06-15,Creatinine,1.066,mg/dL,0.7,1.3,N +PT1016,2026-06-15,BUN,17.212,mg/dL,7.0,25.0,N +PT1016,2026-06-15,Glucose,85.657,mg/dL,70.0,100.0,N +PT1016,2026-06-15,Lactate,1.241,mmol/L,0.5,2.0,N +PT1016,2026-06-15,Troponin,0.005,ng/mL,0.0,0.04,N +PT1017,2026-06-15,WBC,8.32,10³/µL,4.5,11.0,N +PT1017,2026-06-15,Hemoglobin,17.927,g/dL,12.0,17.5,H +PT1017,2026-06-15,Platelets,326.887,10³/µL,150.0,400.0,N +PT1017,2026-06-15,Sodium,141.684,mEq/L,136.0,145.0,N +PT1017,2026-06-15,Potassium,3.559,mEq/L,3.5,5.0,N +PT1017,2026-06-15,Creatinine,1.196,mg/dL,0.7,1.3,N +PT1017,2026-06-15,BUN,20.334,mg/dL,7.0,25.0,N +PT1017,2026-06-15,Glucose,95.507,mg/dL,70.0,100.0,N +PT1017,2026-06-15,Lactate,0.843,mmol/L,0.5,2.0,N +PT1017,2026-06-15,Troponin,0.015,ng/mL,0.0,0.04,N +PT1018,2026-06-15,WBC,4.853,10³/µL,4.5,11.0,N +PT1018,2026-06-15,Hemoglobin,12.159,g/dL,12.0,17.5,N +PT1018,2026-06-15,Platelets,231.731,10³/µL,150.0,400.0,N +PT1018,2026-06-15,Sodium,141.763,mEq/L,136.0,145.0,N +PT1018,2026-06-15,Potassium,4.063,mEq/L,3.5,5.0,N +PT1018,2026-06-15,Creatinine,0.88,mg/dL,0.7,1.3,N +PT1018,2026-06-15,BUN,17.833,mg/dL,7.0,25.0,N +PT1018,2026-06-15,Glucose,55.821,mg/dL,70.0,100.0,L +PT1018,2026-06-15,Lactate,1.006,mmol/L,0.5,2.0,N +PT1018,2026-06-15,Troponin,0.024,ng/mL,0.0,0.04,N +PT1019,2026-06-15,WBC,6.963,10³/µL,4.5,11.0,N +PT1019,2026-06-15,Hemoglobin,16.894,g/dL,12.0,17.5,N +PT1019,2026-06-15,Platelets,225.403,10³/µL,150.0,400.0,N +PT1019,2026-06-15,Sodium,138.901,mEq/L,136.0,145.0,N +PT1019,2026-06-15,Potassium,3.806,mEq/L,3.5,5.0,N +PT1019,2026-06-15,Creatinine,0.864,mg/dL,0.7,1.3,N +PT1019,2026-06-15,BUN,17.496,mg/dL,7.0,25.0,N +PT1019,2026-06-15,Glucose,92.273,mg/dL,70.0,100.0,N +PT1019,2026-06-15,Lactate,2.22,mmol/L,0.5,2.0,H +PT1019,2026-06-15,Troponin,0.027,ng/mL,0.0,0.04,N +PT1020,2026-06-15,WBC,5.453,10³/µL,4.5,11.0,N +PT1020,2026-06-15,Hemoglobin,16.799,g/dL,12.0,17.5,N +PT1020,2026-06-15,Platelets,311.535,10³/µL,150.0,400.0,N +PT1020,2026-06-15,Sodium,140.577,mEq/L,136.0,145.0,N +PT1020,2026-06-15,Potassium,4.73,mEq/L,3.5,5.0,N +PT1020,2026-06-15,Creatinine,1.426,mg/dL,0.7,1.3,H +PT1020,2026-06-15,BUN,14.979,mg/dL,7.0,25.0,N +PT1020,2026-06-15,Glucose,77.503,mg/dL,70.0,100.0,N +PT1020,2026-06-15,Lactate,1.847,mmol/L,0.5,2.0,N +PT1020,2026-06-15,Troponin,0.052,ng/mL,0.0,0.04,H diff --git a/medical-imaging-demo/data/patients.csv b/medical-imaging-demo/data/patients.csv new file mode 100644 index 0000000..888ce80 --- /dev/null +++ b/medical-imaging-demo/data/patients.csv @@ -0,0 +1,61 @@ +patient_id,name,age,gender,diagnosis,ward,department,admitted_date,los_days,risk_score,sepsis_risk,fall_risk,readmit_risk,deterioration_risk,is_icu +PT1001,Mark White,82,M,Trauma,ICU,Pulmonology,2026-06-03,7,41.6,7.3,47.3,11.1,36.9,True +PT1002,Robert Jones,72,M,Acute MI,MICU,Cardiology,2026-06-07,2,12.5,4.9,17.3,52.1,13.3,True +PT1003,Matthew Nelson,61,M,Cellulitis,CCU,Pulmonology,2026-06-15,5,32.5,6.9,8.2,33.6,21.8,True +PT1004,Daniel Allen,83,F,Acute MI,ICU,Neurology,2026-06-12,8,55.2,15.0,28.8,73.9,14.1,True +PT1005,Charles Hall,49,F,Pulmonary Embolism,MICU,Surgery,2026-06-14,9,34.7,7.7,16.5,14.2,43.2,True +PT1006,Nancy Wilson,73,M,Atrial Fibrillation,MICU,Cardiology,2026-06-10,4,51.9,11.3,33.3,44.5,29.2,True +PT1007,Jessica Harris,80,F,Cellulitis,Step-Down,Neurology,2026-06-04,12,6.9,3.2,14.6,54.3,2.0,False +PT1008,Anthony Allen,30,M,COPD Exacerbation,ED Obs,Neurology,2026-06-03,4,26.9,20.5,44.1,9.6,24.6,False +PT1009,Charles Hall,43,F,Atrial Fibrillation,ICU,Nephrology,2026-06-06,13,40.6,22.7,60.2,24.5,24.2,True +PT1010,Robert Thompson,46,F,Respiratory Failure,Step-Down,Nephrology,2026-06-10,3,17.8,4.3,32.0,43.7,11.7,False +PT1011,Jessica Jackson,36,F,Sepsis,General Med,Pulmonology,2026-06-07,6,25.1,13.2,2.4,31.6,30.6,False +PT1012,Betty Walker,83,M,Respiratory Failure,Step-Down,Cardiology,2026-06-12,5,4.1,21.5,66.6,23.8,25.6,False +PT1013,Karen Moore,40,F,Pneumonia,ED Obs,Surgery,2026-06-13,4,25.4,32.5,18.1,43.5,14.1,False +PT1014,Barbara Scott,55,M,GI Bleed,Step-Down,Oncology,2026-06-04,10,34.1,21.5,15.7,23.4,9.6,False +PT1015,Sandra Lewis,34,M,COPD Exacerbation,ED Obs,Cardiology,2026-06-04,12,43.5,36.4,22.3,19.5,11.5,False +PT1016,Betty Anderson,38,M,Stroke,General Med,Oncology,2026-06-14,13,32.2,1.9,15.9,58.2,4.0,False +PT1017,Sarah Baker,79,F,Diabetic Ketoacidosis,Step-Down,Surgery,2026-06-15,9,28.4,5.9,3.0,21.6,12.0,False +PT1018,Robert Harris,78,M,Diabetic Ketoacidosis,General Med,Pulmonology,2026-06-08,6,67.1,0.8,15.8,11.5,1.9,False +PT1019,Daniel King,54,F,Pneumonia,ICU,Pulmonology,2026-06-15,1,55.3,6.6,15.7,43.5,9.5,True +PT1020,James Martin,53,F,Diabetic Ketoacidosis,CCU,Oncology,2026-06-08,7,15.8,10.7,11.7,39.3,1.0,True +PT1021,Jennifer Smith,51,M,Pulmonary Embolism,Step-Down,Neurology,2026-06-01,5,14.4,1.5,53.8,60.3,30.0,False +PT1022,Charles Young,42,M,Sepsis,General Med,General Medicine,2026-06-10,13,32.0,5.5,13.4,37.5,14.2,False +PT1023,Betty Jackson,80,F,COPD Exacerbation,General Med,Oncology,2026-06-03,7,56.2,1.8,21.8,41.9,21.1,False +PT1024,Charles Moore,62,M,Stroke,General Med,General Medicine,2026-06-10,2,45.9,24.6,32.7,53.7,0.7,False +PT1025,Patricia Young,41,M,Diabetic Ketoacidosis,ED Obs,Oncology,2026-06-01,10,22.0,38.2,32.9,67.0,16.9,False +PT1026,Mary Anderson,56,M,UTI,ED Obs,Nephrology,2026-06-12,13,35.8,20.1,38.3,5.9,9.0,False +PT1027,Susan Walker,72,M,COPD Exacerbation,Step-Down,Nephrology,2026-06-06,3,4.9,11.2,22.8,32.2,33.1,False +PT1028,Nancy White,50,F,Acute MI,MICU,Surgery,2026-06-15,4,31.4,1.7,19.4,12.8,34.3,True +PT1029,Margaret Scott,30,F,COPD Exacerbation,MICU,Surgery,2026-06-14,8,25.5,6.4,3.4,22.5,8.6,True +PT1030,Anthony Young,75,F,GI Bleed,ICU,Oncology,2026-06-04,6,11.5,18.2,17.1,28.2,22.7,True +PT1031,Charles Thompson,22,F,COPD Exacerbation,General Med,Oncology,2026-06-02,2,2.6,13.0,32.7,15.8,24.7,False +PT1032,Charles Smith,29,F,COPD Exacerbation,General Med,Nephrology,2026-06-08,14,14.0,22.0,40.0,12.8,1.9,False +PT1033,Mary Walker,65,M,Heart Failure,General Med,Pulmonology,2026-06-06,12,41.5,35.7,7.7,5.2,8.2,False +PT1034,Jennifer Green,61,F,Diabetic Ketoacidosis,ED Obs,Surgery,2026-06-09,5,9.1,23.8,25.3,8.7,20.0,False +PT1035,Karen Young,83,M,Cellulitis,ICU,Neurology,2026-06-02,9,19.4,39.2,25.4,3.4,3.8,True +PT1036,Christopher Martin,46,F,GI Bleed,General Med,General Medicine,2026-06-15,11,37.4,19.5,39.6,6.9,3.3,False +PT1037,Thomas Brown,46,M,Sepsis,Step-Down,Cardiology,2026-06-13,10,16.4,21.8,26.9,16.3,20.7,False +PT1038,Joseph Martin,89,F,Hypertensive Crisis,ICU,Pulmonology,2026-06-05,13,33.2,14.2,19.3,22.3,11.6,True +PT1039,Karen Scott,82,M,Pulmonary Embolism,General Med,Neurology,2026-06-02,2,40.7,4.7,39.7,29.9,47.3,False +PT1040,Betty Thompson,58,F,Cellulitis,General Med,General Medicine,2026-06-05,13,52.6,3.7,8.6,27.2,18.1,False +PT1041,William Thomas,79,M,COPD Exacerbation,MICU,Oncology,2026-06-07,10,36.8,5.9,39.0,21.8,42.5,True +PT1042,Margaret White,58,M,Stroke,Step-Down,General Medicine,2026-06-04,4,38.6,3.1,7.7,19.8,23.4,False +PT1043,Mark Taylor,53,F,Respiratory Failure,General Med,Nephrology,2026-06-04,6,7.3,10.3,44.2,63.9,5.5,False +PT1044,Karen Jackson,36,M,Atrial Fibrillation,ED Obs,Nephrology,2026-06-07,1,36.7,3.3,23.7,15.0,30.0,False +PT1045,Elizabeth Wright,67,F,Respiratory Failure,MICU,Nephrology,2026-06-06,12,35.8,14.6,20.6,27.3,14.8,True +PT1046,Michael Wilson,29,F,Sepsis,ED Obs,General Medicine,2026-06-14,4,39.2,22.2,64.2,6.9,20.4,False +PT1047,Joseph Smith,28,F,Pneumonia,ICU,Nephrology,2026-06-05,10,59.8,9.7,69.1,14.8,3.3,True +PT1048,Elizabeth Jackson,23,M,Acute MI,MICU,Surgery,2026-06-06,13,17.9,7.4,19.3,40.0,37.4,True +PT1049,Elizabeth Nelson,22,M,Heart Failure,General Med,Neurology,2026-06-12,1,58.1,1.4,23.8,58.7,21.7,False +PT1050,Sarah King,64,F,Sepsis,Step-Down,Cardiology,2026-06-02,13,9.6,35.5,7.8,34.5,10.0,False +PT1051,Christopher Harris,90,M,Pulmonary Embolism,General Med,Nephrology,2026-06-12,2,44.6,17.8,32.4,48.9,7.4,False +PT1052,Thomas Martin,56,F,Stroke,General Med,Pulmonology,2026-06-11,3,45.8,20.2,35.1,71.2,32.0,False +PT1053,Joseph Wright,57,M,COPD Exacerbation,ICU,Oncology,2026-06-04,5,8.9,21.1,35.0,33.2,6.6,True +PT1054,Elizabeth King,66,F,Respiratory Failure,General Med,Neurology,2026-06-13,7,18.8,20.6,19.2,27.9,28.6,False +PT1055,Elizabeth Johnson,54,M,Acute MI,CCU,Cardiology,2026-06-06,5,7.7,42.8,66.1,44.4,42.9,True +PT1056,Patricia Thomas,70,F,Sepsis,Step-Down,General Medicine,2026-06-05,12,8.4,21.0,19.0,34.9,4.4,False +PT1057,Jessica Anderson,38,F,Diabetic Ketoacidosis,General Med,General Medicine,2026-06-03,14,18.1,27.8,22.1,48.3,6.1,False +PT1058,Daniel Scott,89,F,Trauma,Step-Down,Nephrology,2026-06-03,6,36.3,11.2,28.7,15.5,14.9,False +PT1059,Mark Lewis,24,M,GI Bleed,General Med,Nephrology,2026-06-09,13,33.6,36.6,22.7,13.0,17.2,False +PT1060,Charles Miller,37,F,Pneumonia,Step-Down,General Medicine,2026-06-04,7,26.8,5.8,47.1,51.5,4.8,False diff --git a/medical-imaging-demo/data/studies.csv b/medical-imaging-demo/data/studies.csv new file mode 100644 index 0000000..9dd92e8 --- /dev/null +++ b/medical-imaging-demo/data/studies.csv @@ -0,0 +1,9 @@ +study_id,patient_id,patient_name,age,gender,view_position,finding_labels,study_date,accession,image_file,referrer +ST0001,PT1001,Mark White,45,M,PA,No Finding,2026-06-15,ACC515886,xray_01.png,Dr. Smith +ST0002,PT1002,Robert Jones,67,F,PA,Cardiomegaly,2026-06-15,ACC382218,xray_02.png,Dr. Baker +ST0003,PT1003,Matthew Nelson,72,M,AP,Pleural Effusion|Cardiomegaly,2026-06-15,ACC381137,xray_03.png,Dr. Williams +ST0004,PT1004,Daniel Allen,58,F,PA,Pneumonia|Consolidation,2026-06-15,ACC526207,xray_04.png,Dr. Baker +ST0005,PT1005,Charles Hall,81,M,AP,Atelectasis,2026-06-15,ACC802856,xray_05.png,Dr. King +ST0006,PT1006,Nancy Wilson,63,F,PA,Nodule,2026-06-15,ACC224291,xray_06.png,Dr. King +ST0007,PT1007,Jessica Harris,34,M,AP,Pneumothorax,2026-06-15,ACC124300,xray_07.png,Dr. Wilson +ST0008,PT1008,Anthony Allen,69,F,PA,Mass,2026-06-15,ACC206818,xray_08.png,Dr. Harris diff --git a/medical-imaging-demo/data/vitals.csv b/medical-imaging-demo/data/vitals.csv new file mode 100644 index 0000000..c6a7082 --- /dev/null +++ b/medical-imaging-demo/data/vitals.csv @@ -0,0 +1,2305 @@ +patient_id,timestamp,HR,SpO2,Temp,SysBP,DiaBP,RR +PT1001,2026-06-14 00:00:00,70.7,98.9,37.4,119.6,76.7,13.5 +PT1001,2026-06-14 00:15:00,70.2,98.6,37.1,120.6,74.6,13.2 +PT1001,2026-06-14 00:30:00,72.8,98.5,37.2,119.7,75.7,12.7 +PT1001,2026-06-14 00:45:00,74.3,98.4,37.0,121.7,76.1,12.4 +PT1001,2026-06-14 01:00:00,73.8,98.4,36.4,122.1,77.0,12.6 +PT1001,2026-06-14 01:15:00,73.7,98.0,37.1,121.5,76.8,13.0 +PT1001,2026-06-14 01:30:00,74.0,98.2,37.1,124.0,76.7,13.1 +PT1001,2026-06-14 01:45:00,73.3,98.0,37.5,119.4,75.0,12.4 +PT1001,2026-06-14 02:00:00,73.5,98.0,37.2,118.0,75.1,12.0 +PT1001,2026-06-14 02:15:00,73.8,97.8,36.9,116.2,76.5,12.0 +PT1001,2026-06-14 02:30:00,73.4,97.5,37.8,116.1,77.8,12.0 +PT1001,2026-06-14 02:45:00,73.9,97.6,36.5,114.3,77.4,11.7 +PT1001,2026-06-14 03:00:00,75.0,97.4,37.0,112.7,77.7,11.9 +PT1001,2026-06-14 03:15:00,75.0,97.6,36.7,112.0,78.2,11.2 +PT1001,2026-06-14 03:30:00,75.7,97.3,36.9,112.5,78.0,11.1 +PT1001,2026-06-14 03:45:00,76.8,97.8,36.7,113.1,78.4,10.8 +PT1001,2026-06-14 04:00:00,76.7,97.5,36.8,109.6,79.7,11.1 +PT1001,2026-06-14 04:15:00,77.0,97.8,37.5,110.0,77.9,11.0 +PT1001,2026-06-14 04:30:00,77.3,97.9,37.2,110.6,76.6,10.8 +PT1001,2026-06-14 04:45:00,78.2,98.2,36.8,108.9,77.2,11.3 +PT1001,2026-06-14 05:00:00,80.0,98.6,37.3,114.2,77.6,11.4 +PT1001,2026-06-14 05:15:00,80.9,98.9,36.8,115.7,77.4,11.8 +PT1001,2026-06-14 05:30:00,80.9,99.3,37.2,113.2,76.4,12.1 +PT1001,2026-06-14 05:45:00,79.8,99.2,37.6,110.9,77.9,12.0 +PT1001,2026-06-14 06:00:00,79.8,99.1,37.9,110.3,77.5,12.1 +PT1001,2026-06-14 06:15:00,79.4,99.0,37.2,110.4,79.1,11.5 +PT1001,2026-06-14 06:30:00,78.4,99.2,37.2,109.4,75.7,11.6 +PT1001,2026-06-14 06:45:00,77.6,99.0,36.8,106.8,76.8,12.0 +PT1001,2026-06-14 07:00:00,77.0,99.0,37.2,111.3,77.7,11.6 +PT1001,2026-06-14 07:15:00,75.3,99.2,36.9,114.7,80.2,11.9 +PT1001,2026-06-14 07:30:00,73.7,98.8,37.4,109.1,81.2,11.9 +PT1001,2026-06-14 07:45:00,75.4,98.8,37.3,109.3,80.5,11.7 +PT1001,2026-06-14 08:00:00,75.2,98.7,37.1,109.3,81.9,11.5 +PT1001,2026-06-14 08:15:00,75.5,99.0,37.4,108.8,80.8,11.3 +PT1001,2026-06-14 08:30:00,77.9,98.7,37.3,106.6,80.5,11.3 +PT1001,2026-06-14 08:45:00,76.8,98.4,37.2,106.9,80.1,11.7 +PT1001,2026-06-14 09:00:00,77.4,98.4,36.7,111.6,78.9,11.9 +PT1001,2026-06-14 09:15:00,76.1,98.3,37.2,114.9,79.3,11.7 +PT1001,2026-06-14 09:30:00,76.1,98.1,37.8,112.1,81.4,11.8 +PT1001,2026-06-14 09:45:00,77.2,98.3,36.8,111.2,79.8,11.7 +PT1001,2026-06-14 10:00:00,78.0,98.7,37.0,110.7,81.2,11.4 +PT1001,2026-06-14 10:15:00,77.0,98.2,37.3,110.6,81.4,11.8 +PT1001,2026-06-14 10:30:00,77.9,97.9,37.6,111.5,83.8,12.0 +PT1001,2026-06-14 10:45:00,80.3,97.8,36.9,110.2,82.6,11.4 +PT1001,2026-06-14 11:00:00,81.7,97.3,36.9,108.1,82.4,11.0 +PT1001,2026-06-14 11:15:00,81.1,97.2,37.4,106.6,81.2,11.4 +PT1001,2026-06-14 11:30:00,79.4,96.6,36.6,108.7,79.4,11.5 +PT1001,2026-06-14 11:45:00,80.9,97.2,37.3,109.1,79.2,11.4 +PT1001,2026-06-14 12:00:00,81.5,97.5,36.8,107.9,79.8,11.1 +PT1001,2026-06-14 12:15:00,81.4,97.2,36.9,110.2,78.5,11.3 +PT1001,2026-06-14 12:30:00,81.7,97.1,37.2,107.7,79.2,11.2 +PT1001,2026-06-14 12:45:00,81.1,96.8,37.1,109.9,80.3,11.0 +PT1001,2026-06-14 13:00:00,82.4,96.7,37.4,109.2,80.7,10.8 +PT1001,2026-06-14 13:15:00,82.1,96.5,37.6,110.5,78.9,11.6 +PT1001,2026-06-14 13:30:00,82.7,96.6,36.8,111.2,78.2,11.7 +PT1001,2026-06-14 13:45:00,83.2,96.8,37.5,110.5,77.3,11.2 +PT1001,2026-06-14 14:00:00,82.5,96.8,37.0,111.1,77.7,11.5 +PT1001,2026-06-14 14:15:00,81.1,96.5,37.5,109.9,76.3,11.4 +PT1001,2026-06-14 14:30:00,80.6,96.4,37.3,109.9,75.7,11.4 +PT1001,2026-06-14 14:45:00,81.6,96.7,36.9,114.0,76.6,12.3 +PT1001,2026-06-14 15:00:00,84.1,96.6,37.1,113.4,76.4,12.2 +PT1001,2026-06-14 15:15:00,83.3,96.8,37.0,112.3,77.4,12.8 +PT1001,2026-06-14 15:30:00,84.2,96.9,36.6,116.8,76.6,13.1 +PT1001,2026-06-14 15:45:00,83.6,97.0,37.1,119.6,74.8,13.4 +PT1001,2026-06-14 16:00:00,81.7,97.1,36.8,123.0,73.1,13.4 +PT1001,2026-06-14 16:15:00,81.1,97.4,37.0,122.5,75.2,13.8 +PT1001,2026-06-14 16:30:00,80.4,97.2,36.9,120.6,75.7,13.8 +PT1001,2026-06-14 16:45:00,78.5,97.3,36.3,119.7,75.4,13.9 +PT1001,2026-06-14 17:00:00,76.7,97.8,37.8,118.7,71.6,13.3 +PT1001,2026-06-14 17:15:00,75.8,98.1,36.4,118.9,70.9,13.7 +PT1001,2026-06-14 17:30:00,74.1,98.0,37.1,116.2,70.0,14.0 +PT1001,2026-06-14 17:45:00,75.6,98.1,37.5,118.2,70.0,13.8 +PT1001,2026-06-14 18:00:00,74.8,98.2,37.4,119.8,71.2,13.3 +PT1001,2026-06-14 18:15:00,73.6,98.4,37.3,120.8,72.4,12.8 +PT1001,2026-06-14 18:30:00,74.9,98.4,36.6,119.2,73.8,12.9 +PT1001,2026-06-14 18:45:00,73.8,98.3,37.2,122.2,75.8,13.4 +PT1001,2026-06-14 19:00:00,74.9,98.0,37.2,122.2,76.5,13.0 +PT1001,2026-06-14 19:15:00,76.9,98.1,37.0,124.1,72.8,13.6 +PT1001,2026-06-14 19:30:00,75.9,98.1,36.9,121.1,74.4,13.5 +PT1001,2026-06-14 19:45:00,75.7,98.4,36.8,121.3,72.3,13.6 +PT1001,2026-06-14 20:00:00,73.1,98.7,37.5,122.3,72.2,13.5 +PT1001,2026-06-14 20:15:00,76.8,98.9,36.4,120.2,71.9,13.7 +PT1001,2026-06-14 20:30:00,77.2,99.0,37.6,122.9,73.8,13.7 +PT1001,2026-06-14 20:45:00,79.6,99.0,36.8,123.7,71.1,13.1 +PT1001,2026-06-14 21:00:00,79.0,98.7,37.0,123.6,70.5,13.6 +PT1001,2026-06-14 21:15:00,76.3,98.7,36.8,123.6,69.2,13.6 +PT1001,2026-06-14 21:30:00,76.6,99.4,37.0,120.0,68.4,13.3 +PT1001,2026-06-14 21:45:00,77.8,99.5,36.8,121.7,68.5,12.8 +PT1001,2026-06-14 22:00:00,78.7,99.6,36.9,124.2,68.9,12.3 +PT1001,2026-06-14 22:15:00,79.3,99.7,37.0,125.9,67.3,11.8 +PT1001,2026-06-14 22:30:00,81.0,99.5,37.6,126.8,68.0,12.2 +PT1001,2026-06-14 22:45:00,82.9,99.4,37.0,122.6,67.0,12.2 +PT1001,2026-06-14 23:00:00,85.2,99.4,36.5,123.9,67.3,12.0 +PT1001,2026-06-14 23:15:00,85.0,100.0,37.3,121.4,64.6,12.8 +PT1001,2026-06-14 23:30:00,85.2,100.0,37.7,119.8,64.4,13.2 +PT1001,2026-06-14 23:45:00,83.7,100.0,36.7,120.5,64.7,13.2 +PT1001,2026-06-15 00:00:00,84.8,99.8,37.1,118.4,66.0,13.5 +PT1001,2026-06-15 00:15:00,86.0,100.0,37.2,121.0,65.2,13.9 +PT1001,2026-06-15 00:30:00,88.0,100.0,37.2,120.3,64.3,14.0 +PT1001,2026-06-15 00:45:00,88.5,100.0,36.8,121.6,64.0,13.6 +PT1001,2026-06-15 01:00:00,89.6,100.0,36.9,117.9,65.6,14.4 +PT1001,2026-06-15 01:15:00,89.9,99.9,37.4,119.2,63.9,14.4 +PT1001,2026-06-15 01:30:00,91.3,100.0,37.0,118.5,61.5,14.1 +PT1001,2026-06-15 01:45:00,90.4,100.0,37.0,117.8,61.7,14.5 +PT1001,2026-06-15 02:00:00,88.6,99.8,37.5,119.0,62.7,14.7 +PT1001,2026-06-15 02:15:00,88.3,100.0,36.9,120.6,59.0,15.4 +PT1001,2026-06-15 02:30:00,87.0,100.0,37.3,117.1,57.9,16.1 +PT1001,2026-06-15 02:45:00,87.9,99.8,37.4,114.1,59.0,16.4 +PT1001,2026-06-15 03:00:00,88.1,99.6,37.0,118.9,59.7,16.4 +PT1001,2026-06-15 03:15:00,88.2,99.8,37.1,119.3,61.0,16.4 +PT1001,2026-06-15 03:30:00,88.9,100.0,37.1,119.0,59.9,16.6 +PT1001,2026-06-15 03:45:00,88.1,99.8,36.9,119.8,60.7,16.4 +PT1001,2026-06-15 04:00:00,87.0,99.9,36.4,118.2,64.0,16.2 +PT1001,2026-06-15 04:15:00,86.9,99.8,37.0,120.4,64.5,15.9 +PT1001,2026-06-15 04:30:00,87.3,99.3,37.2,123.1,63.2,16.5 +PT1001,2026-06-15 04:45:00,87.9,99.6,37.2,124.2,64.2,16.4 +PT1001,2026-06-15 05:00:00,87.1,99.5,37.1,128.2,63.0,16.5 +PT1001,2026-06-15 05:15:00,86.7,99.6,36.8,129.3,61.6,16.5 +PT1001,2026-06-15 05:30:00,87.6,99.6,37.4,129.5,62.6,16.4 +PT1001,2026-06-15 05:45:00,86.4,100.0,37.0,128.4,60.1,16.3 +PT1001,2026-06-15 06:00:00,85.9,100.0,36.8,130.6,59.8,16.0 +PT1001,2026-06-15 06:15:00,85.2,99.5,37.3,129.2,61.7,15.7 +PT1001,2026-06-15 06:30:00,83.7,100.0,37.2,132.8,62.6,16.5 +PT1001,2026-06-15 06:45:00,84.6,100.0,37.0,133.2,60.2,16.8 +PT1001,2026-06-15 07:00:00,84.0,100.0,36.9,134.3,60.4,17.0 +PT1001,2026-06-15 07:15:00,83.9,100.0,37.4,137.9,63.6,17.2 +PT1001,2026-06-15 07:30:00,86.2,99.8,36.8,139.1,64.8,17.8 +PT1001,2026-06-15 07:45:00,85.0,99.8,37.1,139.9,66.5,18.0 +PT1001,2026-06-15 08:00:00,85.5,99.9,37.2,143.4,66.7,17.8 +PT1001,2026-06-15 08:15:00,85.6,99.5,37.4,143.3,66.6,17.6 +PT1001,2026-06-15 08:30:00,84.6,99.6,36.7,143.0,66.7,17.8 +PT1001,2026-06-15 08:45:00,84.8,100.0,37.2,139.9,66.6,18.2 +PT1001,2026-06-15 09:00:00,85.6,99.4,37.1,141.1,65.5,18.4 +PT1001,2026-06-15 09:15:00,88.2,99.5,37.3,140.9,63.2,18.4 +PT1001,2026-06-15 09:30:00,88.1,99.4,37.5,139.8,64.0,18.7 +PT1001,2026-06-15 09:45:00,86.8,99.5,37.2,139.5,63.9,18.9 +PT1001,2026-06-15 10:00:00,87.3,99.3,37.2,138.0,66.1,18.8 +PT1001,2026-06-15 10:15:00,88.5,99.4,37.0,139.1,67.5,17.9 +PT1001,2026-06-15 10:30:00,89.0,99.7,37.4,139.2,66.2,17.6 +PT1001,2026-06-15 10:45:00,88.7,99.7,36.9,140.5,61.9,18.4 +PT1001,2026-06-15 11:00:00,88.9,99.3,37.4,139.6,63.7,17.6 +PT1001,2026-06-15 11:15:00,88.5,99.4,37.0,140.9,64.4,17.3 +PT1001,2026-06-15 11:30:00,86.6,99.5,37.0,144.3,61.6,17.0 +PT1001,2026-06-15 11:45:00,86.8,99.7,37.3,144.0,61.2,17.4 +PT1001,2026-06-15 12:00:00,87.3,99.7,37.3,146.0,60.2,17.1 +PT1001,2026-06-15 12:15:00,85.3,99.8,37.1,145.4,58.1,16.7 +PT1001,2026-06-15 12:30:00,86.5,99.6,36.9,147.8,58.2,17.3 +PT1001,2026-06-15 12:45:00,86.3,99.7,37.8,147.4,59.6,16.4 +PT1001,2026-06-15 13:00:00,87.3,99.6,37.4,146.3,58.3,16.6 +PT1001,2026-06-15 13:15:00,87.0,99.9,37.3,144.5,56.7,17.4 +PT1001,2026-06-15 13:30:00,88.6,99.7,37.3,142.7,56.1,17.0 +PT1001,2026-06-15 13:45:00,87.6,99.4,37.1,143.0,54.2,16.3 +PT1001,2026-06-15 14:00:00,85.5,99.6,37.1,140.2,50.8,16.2 +PT1001,2026-06-15 14:15:00,86.0,99.6,36.7,138.0,51.9,16.6 +PT1001,2026-06-15 14:30:00,85.7,99.5,37.3,138.5,51.6,16.6 +PT1001,2026-06-15 14:45:00,84.3,99.7,37.0,140.8,54.1,15.7 +PT1001,2026-06-15 15:00:00,81.9,99.1,37.2,141.1,53.5,15.8 +PT1001,2026-06-15 15:15:00,83.3,99.1,36.4,146.9,53.9,16.6 +PT1001,2026-06-15 15:30:00,84.9,99.1,37.3,143.0,54.6,16.4 +PT1001,2026-06-15 15:45:00,86.0,98.7,37.0,145.0,54.6,17.0 +PT1001,2026-06-15 16:00:00,85.4,98.7,36.7,145.2,53.6,16.8 +PT1001,2026-06-15 16:15:00,84.8,98.9,36.7,145.0,55.1,16.7 +PT1001,2026-06-15 16:30:00,85.5,98.7,37.1,144.5,56.9,16.2 +PT1001,2026-06-15 16:45:00,85.4,98.9,37.2,146.2,57.3,16.1 +PT1001,2026-06-15 17:00:00,86.9,98.9,36.7,145.7,57.9,16.1 +PT1001,2026-06-15 17:15:00,87.1,98.5,37.2,146.4,56.7,16.1 +PT1001,2026-06-15 17:30:00,90.0,98.7,37.2,149.2,59.5,16.3 +PT1001,2026-06-15 17:45:00,88.6,98.7,37.1,147.7,58.9,17.1 +PT1001,2026-06-15 18:00:00,87.5,99.0,37.7,149.6,60.4,16.3 +PT1001,2026-06-15 18:15:00,86.7,99.2,36.7,154.7,63.7,15.9 +PT1001,2026-06-15 18:30:00,88.4,99.2,37.3,153.7,64.6,15.8 +PT1001,2026-06-15 18:45:00,88.4,99.4,37.3,151.9,66.7,16.1 +PT1001,2026-06-15 19:00:00,86.9,99.8,37.2,151.8,67.8,16.0 +PT1001,2026-06-15 19:15:00,87.2,99.1,36.8,153.0,70.8,16.2 +PT1001,2026-06-15 19:30:00,87.9,99.4,37.0,154.0,70.7,16.1 +PT1001,2026-06-15 19:45:00,88.7,99.0,36.7,153.3,73.1,16.7 +PT1001,2026-06-15 20:00:00,87.2,99.0,37.0,155.1,70.3,16.7 +PT1001,2026-06-15 20:15:00,88.8,98.5,37.3,155.3,69.7,17.3 +PT1001,2026-06-15 20:30:00,88.0,98.8,37.4,154.5,71.2,17.2 +PT1001,2026-06-15 20:45:00,88.4,99.6,37.1,154.4,71.8,17.0 +PT1001,2026-06-15 21:00:00,85.1,99.7,36.9,157.1,72.4,16.5 +PT1001,2026-06-15 21:15:00,82.1,99.9,37.5,155.1,72.4,16.4 +PT1001,2026-06-15 21:30:00,82.2,100.0,37.7,156.1,74.4,16.3 +PT1001,2026-06-15 21:45:00,79.7,100.0,37.3,154.4,73.7,16.6 +PT1001,2026-06-15 22:00:00,80.4,99.6,37.3,157.3,72.3,16.3 +PT1001,2026-06-15 22:15:00,80.0,99.7,36.9,153.0,72.7,16.3 +PT1001,2026-06-15 22:30:00,77.5,99.7,37.6,152.9,72.2,15.6 +PT1001,2026-06-15 22:45:00,76.7,99.6,37.1,148.1,74.6,15.4 +PT1001,2026-06-15 23:00:00,78.0,99.4,37.6,150.0,71.5,15.6 +PT1001,2026-06-15 23:15:00,77.3,99.7,36.8,153.7,71.1,15.5 +PT1001,2026-06-15 23:30:00,76.7,99.5,37.2,151.9,72.9,15.2 +PT1001,2026-06-15 23:45:00,76.7,99.9,37.5,150.9,73.5,15.5 +PT1001,2026-06-16 00:00:00,76.0,99.7,37.1,148.8,76.8,16.1 +PT1001,2026-06-16 00:15:00,78.3,99.7,37.2,150.2,76.8,16.2 +PT1001,2026-06-16 00:30:00,77.8,99.9,36.8,151.7,78.4,16.3 +PT1001,2026-06-16 00:45:00,79.8,99.9,37.4,152.4,79.3,16.5 +PT1001,2026-06-16 01:00:00,81.1,99.8,37.0,155.6,78.9,16.6 +PT1001,2026-06-16 01:15:00,80.2,100.0,37.0,161.9,78.4,17.1 +PT1001,2026-06-16 01:30:00,80.2,100.0,37.3,159.7,76.4,17.1 +PT1001,2026-06-16 01:45:00,80.7,100.0,36.9,159.8,77.6,15.9 +PT1001,2026-06-16 02:00:00,80.5,100.0,37.0,162.8,76.2,16.5 +PT1001,2026-06-16 02:15:00,80.3,100.0,37.0,162.4,77.9,16.3 +PT1001,2026-06-16 02:30:00,81.5,99.8,37.5,162.9,75.4,17.1 +PT1001,2026-06-16 02:45:00,84.8,100.0,37.6,160.6,76.4,16.7 +PT1001,2026-06-16 03:00:00,83.4,99.7,36.7,157.4,75.7,16.4 +PT1001,2026-06-16 03:15:00,85.7,99.8,36.9,158.2,78.1,16.5 +PT1001,2026-06-16 03:30:00,83.6,99.6,37.4,161.2,76.2,16.7 +PT1001,2026-06-16 03:45:00,83.9,99.7,36.8,162.5,76.7,17.3 +PT1001,2026-06-16 04:00:00,84.1,99.3,37.6,158.4,76.6,17.5 +PT1001,2026-06-16 04:15:00,87.0,99.6,37.1,159.8,76.9,16.9 +PT1001,2026-06-16 04:30:00,88.5,99.8,37.2,157.3,77.8,17.1 +PT1001,2026-06-16 04:45:00,88.3,100.0,37.0,158.7,76.8,17.3 +PT1001,2026-06-16 05:00:00,86.5,99.8,37.0,155.5,78.3,17.4 +PT1001,2026-06-16 05:15:00,88.1,99.8,36.9,152.7,77.6,18.1 +PT1001,2026-06-16 05:30:00,88.4,100.0,36.8,153.9,81.3,17.6 +PT1001,2026-06-16 05:45:00,86.9,99.9,37.1,156.1,79.8,18.1 +PT1001,2026-06-16 06:00:00,85.5,99.5,37.5,153.0,78.8,18.0 +PT1001,2026-06-16 06:15:00,86.4,99.3,37.0,153.8,81.2,18.8 +PT1001,2026-06-16 06:30:00,87.4,99.6,37.0,150.8,80.5,19.6 +PT1001,2026-06-16 06:45:00,83.9,99.6,37.4,153.0,80.5,19.9 +PT1001,2026-06-16 07:00:00,83.4,99.4,37.1,153.4,80.7,20.0 +PT1001,2026-06-16 07:15:00,82.4,99.6,37.1,154.6,78.7,19.8 +PT1001,2026-06-16 07:30:00,81.7,99.8,36.5,154.4,79.0,19.6 +PT1001,2026-06-16 07:45:00,79.2,99.9,37.2,155.0,79.7,19.7 +PT1001,2026-06-16 08:00:00,80.3,100.0,37.2,157.0,79.9,19.6 +PT1001,2026-06-16 08:15:00,79.3,99.9,36.7,157.4,80.2,19.5 +PT1001,2026-06-16 08:30:00,80.0,100.0,36.8,160.7,80.8,19.5 +PT1001,2026-06-16 08:45:00,81.8,100.0,37.3,161.1,80.4,19.4 +PT1001,2026-06-16 09:00:00,80.5,100.0,36.5,163.9,79.9,19.1 +PT1001,2026-06-16 09:15:00,79.0,100.0,37.0,164.5,80.7,18.3 +PT1001,2026-06-16 09:30:00,80.6,100.0,37.2,162.0,80.5,18.0 +PT1001,2026-06-16 09:45:00,80.5,100.0,36.7,159.5,79.8,18.4 +PT1001,2026-06-16 10:00:00,79.3,100.0,37.3,160.1,79.1,18.3 +PT1001,2026-06-16 10:15:00,80.3,99.7,36.8,160.8,81.3,18.3 +PT1001,2026-06-16 10:30:00,78.9,99.7,36.8,162.9,81.3,18.4 +PT1001,2026-06-16 10:45:00,80.0,99.4,37.2,161.9,82.2,17.5 +PT1001,2026-06-16 11:00:00,78.7,99.4,37.7,161.2,85.4,17.4 +PT1001,2026-06-16 11:15:00,79.4,99.2,36.9,161.9,84.9,17.5 +PT1001,2026-06-16 11:30:00,81.4,99.4,37.4,161.9,87.5,17.5 +PT1001,2026-06-16 11:45:00,81.4,99.5,36.9,161.8,87.7,17.6 +PT1001,2026-06-16 12:00:00,80.9,99.4,37.4,162.2,87.6,18.1 +PT1001,2026-06-16 12:15:00,80.6,99.8,36.9,166.0,84.6,18.4 +PT1001,2026-06-16 12:30:00,81.5,100.0,37.1,164.2,81.8,18.8 +PT1001,2026-06-16 12:45:00,79.5,100.0,36.9,165.5,82.8,19.3 +PT1001,2026-06-16 13:00:00,79.6,99.7,36.9,164.2,83.4,18.6 +PT1001,2026-06-16 13:15:00,78.4,99.7,37.5,165.4,84.5,19.0 +PT1001,2026-06-16 13:30:00,79.1,100.0,37.0,165.6,84.2,19.3 +PT1001,2026-06-16 13:45:00,81.3,100.0,37.3,167.1,84.4,19.1 +PT1001,2026-06-16 14:00:00,79.9,100.0,37.3,166.8,84.9,18.8 +PT1001,2026-06-16 14:15:00,79.3,100.0,37.6,168.3,83.9,18.3 +PT1001,2026-06-16 14:30:00,79.1,100.0,37.1,169.3,82.0,18.5 +PT1001,2026-06-16 14:45:00,78.3,99.7,36.7,170.5,83.7,18.6 +PT1001,2026-06-16 15:00:00,77.0,99.6,36.6,173.6,83.3,18.4 +PT1001,2026-06-16 15:15:00,76.1,99.3,37.6,171.6,83.5,18.2 +PT1001,2026-06-16 15:30:00,77.4,99.1,36.4,169.8,85.6,18.9 +PT1001,2026-06-16 15:45:00,77.5,99.1,36.5,171.1,88.5,18.7 +PT1001,2026-06-16 16:00:00,78.2,99.4,37.4,170.5,87.4,18.5 +PT1001,2026-06-16 16:15:00,77.6,99.5,37.0,170.5,87.3,18.8 +PT1001,2026-06-16 16:30:00,77.1,99.7,37.4,168.5,86.0,18.3 +PT1001,2026-06-16 16:45:00,76.9,99.3,37.0,170.2,85.2,17.9 +PT1001,2026-06-16 17:00:00,78.6,99.2,37.5,171.4,86.3,18.1 +PT1001,2026-06-16 17:15:00,77.8,99.0,37.1,169.3,86.1,17.7 +PT1001,2026-06-16 17:30:00,77.8,99.2,36.8,169.8,85.4,17.9 +PT1001,2026-06-16 17:45:00,77.8,99.3,37.4,170.1,86.1,17.6 +PT1001,2026-06-16 18:00:00,79.9,98.9,37.7,167.7,86.1,17.5 +PT1001,2026-06-16 18:15:00,80.1,99.2,36.9,163.6,87.3,17.3 +PT1001,2026-06-16 18:30:00,79.8,98.9,37.4,164.5,87.6,17.4 +PT1001,2026-06-16 18:45:00,81.6,98.8,37.2,165.4,88.1,17.5 +PT1001,2026-06-16 19:00:00,83.4,98.7,37.1,162.4,87.0,17.8 +PT1001,2026-06-16 19:15:00,82.8,98.4,37.0,162.8,88.0,17.9 +PT1001,2026-06-16 19:30:00,82.9,98.4,37.0,163.2,86.2,18.0 +PT1001,2026-06-16 19:45:00,84.1,98.5,37.5,164.9,85.8,17.9 +PT1001,2026-06-16 20:00:00,84.6,98.3,37.7,166.7,85.0,18.0 +PT1001,2026-06-16 20:15:00,82.8,98.2,36.6,167.5,86.1,17.5 +PT1001,2026-06-16 20:30:00,84.1,98.1,37.1,165.9,88.4,17.5 +PT1001,2026-06-16 20:45:00,83.8,97.8,37.1,167.3,89.0,17.6 +PT1001,2026-06-16 21:00:00,83.4,98.0,37.2,167.0,88.9,17.8 +PT1001,2026-06-16 21:15:00,85.3,97.6,37.0,167.6,87.9,17.4 +PT1001,2026-06-16 21:30:00,85.3,97.6,36.8,164.6,87.1,17.5 +PT1001,2026-06-16 21:45:00,83.9,97.0,37.0,163.3,85.4,17.2 +PT1001,2026-06-16 22:00:00,83.1,96.7,37.0,159.0,85.8,17.5 +PT1001,2026-06-16 22:15:00,82.7,96.8,36.6,162.2,83.5,17.3 +PT1001,2026-06-16 22:30:00,83.1,96.7,37.3,162.6,83.7,17.7 +PT1001,2026-06-16 22:45:00,84.1,96.5,37.2,165.0,82.6,17.4 +PT1001,2026-06-16 23:00:00,84.4,96.2,37.5,164.6,84.8,16.8 +PT1001,2026-06-16 23:15:00,84.0,95.6,37.1,161.9,83.4,16.6 +PT1001,2026-06-16 23:30:00,80.7,95.7,37.4,159.8,85.5,16.5 +PT1001,2026-06-16 23:45:00,82.0,96.0,37.3,158.6,84.6,16.4 +PT1002,2026-06-14 00:00:00,91.4,96.8,37.1,148.5,88.6,17.6 +PT1002,2026-06-14 00:15:00,91.4,96.9,36.8,149.9,87.0,17.3 +PT1002,2026-06-14 00:30:00,93.1,96.8,37.6,149.9,87.1,17.0 +PT1002,2026-06-14 00:45:00,93.5,96.9,36.9,147.7,85.3,16.9 +PT1002,2026-06-14 01:00:00,92.3,96.8,36.8,147.3,85.6,16.7 +PT1002,2026-06-14 01:15:00,91.1,97.1,37.1,144.8,86.1,16.9 +PT1002,2026-06-14 01:30:00,93.2,97.2,37.3,148.5,85.1,16.6 +PT1002,2026-06-14 01:45:00,92.9,97.6,37.1,149.1,83.6,15.9 +PT1002,2026-06-14 02:00:00,92.8,97.7,36.7,151.6,85.2,15.7 +PT1002,2026-06-14 02:15:00,91.3,97.5,37.2,150.8,85.6,15.4 +PT1002,2026-06-14 02:30:00,91.7,97.5,37.2,148.6,86.3,16.2 +PT1002,2026-06-14 02:45:00,88.2,97.8,36.6,147.2,89.7,16.3 +PT1002,2026-06-14 03:00:00,85.7,98.2,37.1,149.4,93.1,16.3 +PT1002,2026-06-14 03:15:00,85.3,98.0,36.6,148.6,93.4,15.9 +PT1002,2026-06-14 03:30:00,85.5,97.8,37.3,142.1,94.2,15.5 +PT1002,2026-06-14 03:45:00,86.3,97.9,37.3,147.1,94.0,15.4 +PT1002,2026-06-14 04:00:00,86.3,98.2,36.8,144.6,92.1,15.7 +PT1002,2026-06-14 04:15:00,87.1,98.3,36.8,143.2,92.7,15.2 +PT1002,2026-06-14 04:30:00,86.8,98.3,37.6,142.6,93.3,15.3 +PT1002,2026-06-14 04:45:00,86.7,98.6,37.0,144.4,96.8,15.3 +PT1002,2026-06-14 05:00:00,88.2,98.6,37.2,147.0,97.9,14.4 +PT1002,2026-06-14 05:15:00,88.6,98.7,37.2,146.7,95.5,14.8 +PT1002,2026-06-14 05:30:00,90.0,98.3,37.0,147.7,95.1,14.9 +PT1002,2026-06-14 05:45:00,90.6,98.2,37.1,145.6,95.2,14.8 +PT1002,2026-06-14 06:00:00,86.8,98.4,37.3,145.0,93.2,15.1 +PT1002,2026-06-14 06:15:00,86.4,98.1,37.0,145.4,93.4,15.5 +PT1002,2026-06-14 06:30:00,87.9,98.0,37.1,142.7,91.7,15.5 +PT1002,2026-06-14 06:45:00,88.3,97.9,37.1,144.6,91.3,14.7 +PT1002,2026-06-14 07:00:00,85.9,98.0,37.4,146.7,89.8,15.3 +PT1002,2026-06-14 07:15:00,87.4,98.0,37.1,144.7,91.0,15.0 +PT1002,2026-06-14 07:30:00,87.2,98.3,36.9,146.2,90.9,14.2 +PT1002,2026-06-14 07:45:00,88.1,98.4,36.8,143.2,88.2,14.3 +PT1002,2026-06-14 08:00:00,87.0,98.5,37.1,145.6,87.1,14.3 +PT1002,2026-06-14 08:15:00,86.8,98.5,37.6,147.1,86.0,13.7 +PT1002,2026-06-14 08:30:00,88.1,98.2,37.2,147.4,87.6,14.0 +PT1002,2026-06-14 08:45:00,87.9,98.7,37.1,147.8,86.8,14.3 +PT1002,2026-06-14 09:00:00,88.4,98.7,37.5,148.8,85.3,13.7 +PT1002,2026-06-14 09:15:00,88.7,98.9,36.9,145.3,86.9,13.5 +PT1002,2026-06-14 09:30:00,88.6,98.6,37.6,145.3,86.7,14.0 +PT1002,2026-06-14 09:45:00,90.4,98.1,36.9,143.4,83.3,13.5 +PT1002,2026-06-14 10:00:00,90.9,97.9,36.8,142.4,83.6,12.8 +PT1002,2026-06-14 10:15:00,90.3,97.9,36.9,142.6,85.8,13.2 +PT1002,2026-06-14 10:30:00,90.0,97.8,37.4,141.6,86.2,12.4 +PT1002,2026-06-14 10:45:00,92.1,97.7,37.0,141.0,86.5,12.8 +PT1002,2026-06-14 11:00:00,93.2,97.8,36.7,145.7,86.0,12.0 +PT1002,2026-06-14 11:15:00,93.2,98.1,36.8,144.4,85.6,12.3 +PT1002,2026-06-14 11:30:00,92.5,97.8,37.1,146.8,87.9,11.7 +PT1002,2026-06-14 11:45:00,94.1,97.9,37.2,145.8,85.6,12.1 +PT1002,2026-06-14 12:00:00,92.4,98.2,37.6,142.6,85.3,12.0 +PT1002,2026-06-14 12:15:00,92.1,98.1,36.9,139.9,84.3,11.7 +PT1002,2026-06-14 12:30:00,92.1,97.5,37.0,136.8,84.2,11.7 +PT1002,2026-06-14 12:45:00,92.0,97.4,36.9,136.8,84.8,11.9 +PT1002,2026-06-14 13:00:00,93.1,97.4,36.8,139.3,87.0,11.3 +PT1002,2026-06-14 13:15:00,94.1,97.0,37.1,142.1,86.4,11.6 +PT1002,2026-06-14 13:30:00,92.4,97.3,36.3,147.6,85.7,11.4 +PT1002,2026-06-14 13:45:00,94.0,97.5,37.3,144.1,82.6,10.7 +PT1002,2026-06-14 14:00:00,94.9,97.2,37.4,145.1,82.8,10.5 +PT1002,2026-06-14 14:15:00,93.4,97.5,37.0,143.7,85.5,10.1 +PT1002,2026-06-14 14:30:00,93.5,97.5,37.1,144.7,83.6,10.1 +PT1002,2026-06-14 14:45:00,92.9,97.6,37.0,142.0,83.1,9.8 +PT1002,2026-06-14 15:00:00,94.6,98.0,37.1,144.5,82.4,10.2 +PT1002,2026-06-14 15:15:00,94.6,98.0,37.0,148.0,84.4,10.5 +PT1002,2026-06-14 15:30:00,94.7,98.1,37.2,147.0,85.8,10.1 +PT1002,2026-06-14 15:45:00,91.9,98.0,36.9,151.1,87.4,10.7 +PT1002,2026-06-14 16:00:00,92.0,98.3,36.8,152.4,88.2,11.4 +PT1002,2026-06-14 16:15:00,91.8,97.8,37.3,150.2,89.8,11.0 +PT1002,2026-06-14 16:30:00,93.8,97.8,36.9,151.3,90.9,10.5 +PT1002,2026-06-14 16:45:00,92.6,97.6,36.8,152.7,90.0,10.5 +PT1002,2026-06-14 17:00:00,94.1,97.5,37.0,155.7,90.1,9.9 +PT1002,2026-06-14 17:15:00,92.8,97.6,36.9,155.2,90.3,9.8 +PT1002,2026-06-14 17:30:00,91.6,97.8,36.9,154.9,89.8,9.7 +PT1002,2026-06-14 17:45:00,91.2,97.9,37.0,152.8,88.5,10.2 +PT1002,2026-06-14 18:00:00,90.6,97.6,36.6,154.5,86.9,10.2 +PT1002,2026-06-14 18:15:00,91.6,97.8,36.9,155.5,84.6,10.6 +PT1002,2026-06-14 18:30:00,90.2,97.7,37.7,154.7,83.9,11.1 +PT1002,2026-06-14 18:45:00,88.5,97.6,37.4,155.0,83.3,11.2 +PT1002,2026-06-14 19:00:00,89.4,97.7,37.0,158.3,80.9,11.8 +PT1002,2026-06-14 19:15:00,90.4,97.5,37.4,156.5,81.9,11.1 +PT1002,2026-06-14 19:30:00,91.9,97.5,37.2,156.7,80.6,11.3 +PT1002,2026-06-14 19:45:00,90.8,97.4,37.3,156.4,80.1,10.8 +PT1002,2026-06-14 20:00:00,90.5,97.4,37.5,155.3,80.8,10.9 +PT1002,2026-06-14 20:15:00,91.1,97.3,37.0,153.8,82.1,10.8 +PT1002,2026-06-14 20:30:00,90.9,97.2,36.9,153.5,85.0,10.3 +PT1002,2026-06-14 20:45:00,92.6,97.1,37.3,152.6,86.5,9.8 +PT1002,2026-06-14 21:00:00,92.6,97.3,36.9,153.5,85.6,10.2 +PT1002,2026-06-14 21:15:00,93.1,97.6,37.0,156.2,85.2,10.4 +PT1002,2026-06-14 21:30:00,96.1,97.8,37.2,156.4,85.6,10.5 +PT1002,2026-06-14 21:45:00,95.8,97.6,36.9,156.1,83.9,10.8 +PT1002,2026-06-14 22:00:00,94.5,97.6,37.0,155.8,84.3,10.6 +PT1002,2026-06-14 22:15:00,95.3,97.8,37.2,157.0,84.4,10.7 +PT1002,2026-06-14 22:30:00,94.5,98.2,37.3,159.7,85.5,10.5 +PT1002,2026-06-14 22:45:00,95.7,97.8,37.5,163.1,82.9,10.8 +PT1002,2026-06-14 23:00:00,95.5,97.8,36.9,164.4,85.7,10.7 +PT1002,2026-06-14 23:15:00,95.0,97.4,37.4,166.2,84.9,10.6 +PT1002,2026-06-14 23:30:00,94.5,97.6,37.1,164.1,86.4,10.7 +PT1002,2026-06-14 23:45:00,94.7,97.3,36.9,164.3,86.2,10.2 +PT1002,2026-06-15 00:00:00,94.5,97.1,36.4,159.5,87.8,10.2 +PT1002,2026-06-15 00:15:00,97.1,97.4,37.2,158.8,86.5,10.3 +PT1002,2026-06-15 00:30:00,97.7,97.2,36.9,161.0,85.8,10.6 +PT1002,2026-06-15 00:45:00,100.8,97.4,37.3,166.8,87.0,10.4 +PT1002,2026-06-15 01:00:00,101.9,97.5,36.8,168.0,88.2,10.0 +PT1002,2026-06-15 01:15:00,100.9,97.5,37.2,167.6,86.7,10.3 +PT1002,2026-06-15 01:30:00,101.0,97.4,36.9,166.8,85.5,10.7 +PT1002,2026-06-15 01:45:00,101.2,97.8,37.2,166.2,86.9,10.9 +PT1002,2026-06-15 02:00:00,101.7,97.8,36.9,166.2,86.1,10.9 +PT1002,2026-06-15 02:15:00,102.9,97.4,37.4,167.2,86.6,11.0 +PT1002,2026-06-15 02:30:00,102.5,97.4,36.7,163.8,86.0,11.3 +PT1002,2026-06-15 02:45:00,102.6,97.3,37.2,163.5,85.0,10.8 +PT1002,2026-06-15 03:00:00,102.5,97.4,37.5,165.1,86.9,10.9 +PT1002,2026-06-15 03:15:00,101.3,97.7,36.8,166.0,87.2,11.1 +PT1002,2026-06-15 03:30:00,99.8,98.1,36.7,165.7,87.0,10.6 +PT1002,2026-06-15 03:45:00,99.6,98.0,37.0,165.7,87.1,11.6 +PT1002,2026-06-15 04:00:00,101.5,98.4,37.2,167.2,86.7,11.1 +PT1002,2026-06-15 04:15:00,102.7,98.8,36.9,165.3,86.4,10.7 +PT1002,2026-06-15 04:30:00,103.4,98.6,37.2,163.7,87.6,10.9 +PT1002,2026-06-15 04:45:00,102.6,99.0,36.4,163.7,91.1,11.0 +PT1002,2026-06-15 05:00:00,99.7,99.1,37.6,166.3,90.0,11.8 +PT1002,2026-06-15 05:15:00,99.9,99.2,37.2,168.1,92.8,12.1 +PT1002,2026-06-15 05:30:00,100.7,99.3,37.2,169.9,90.4,12.2 +PT1002,2026-06-15 05:45:00,100.5,99.5,37.6,173.8,90.6,12.5 +PT1002,2026-06-15 06:00:00,100.7,99.3,37.2,175.0,87.3,11.5 +PT1002,2026-06-15 06:15:00,97.8,98.9,37.4,174.3,86.3,11.5 +PT1002,2026-06-15 06:30:00,98.1,98.7,36.6,177.0,84.1,11.6 +PT1002,2026-06-15 06:45:00,98.4,98.6,36.9,179.1,85.2,11.3 +PT1002,2026-06-15 07:00:00,97.9,99.1,36.6,182.4,83.7,11.7 +PT1002,2026-06-15 07:15:00,97.4,98.9,37.1,184.5,81.8,11.8 +PT1002,2026-06-15 07:30:00,97.1,99.3,36.6,188.0,81.6,11.7 +PT1002,2026-06-15 07:45:00,97.1,99.7,37.0,187.8,82.7,11.1 +PT1002,2026-06-15 08:00:00,97.6,99.8,37.4,189.4,81.8,10.4 +PT1002,2026-06-15 08:15:00,96.5,99.9,36.9,190.3,79.3,10.9 +PT1002,2026-06-15 08:30:00,96.5,99.8,37.8,193.6,81.3,10.1 +PT1002,2026-06-15 08:45:00,95.7,100.0,37.0,193.1,80.8,10.0 +PT1002,2026-06-15 09:00:00,98.7,100.0,37.6,192.4,80.9,9.6 +PT1002,2026-06-15 09:15:00,96.9,99.8,37.6,194.3,81.0,9.9 +PT1002,2026-06-15 09:30:00,98.1,99.8,37.1,198.5,80.0,9.8 +PT1002,2026-06-15 09:45:00,97.9,99.5,37.7,195.3,80.7,9.6 +PT1002,2026-06-15 10:00:00,97.8,99.5,36.9,197.5,81.3,9.5 +PT1002,2026-06-15 10:15:00,102.2,99.5,37.7,199.7,79.7,9.3 +PT1002,2026-06-15 10:30:00,103.8,99.6,36.8,198.9,79.4,9.0 +PT1002,2026-06-15 10:45:00,104.8,99.8,37.0,200.4,78.9,9.1 +PT1002,2026-06-15 11:00:00,103.9,100.0,37.1,200.6,79.6,9.4 +PT1002,2026-06-15 11:15:00,104.1,99.7,37.1,198.8,78.2,9.7 +PT1002,2026-06-15 11:30:00,103.0,99.8,37.3,199.9,77.2,9.7 +PT1002,2026-06-15 11:45:00,101.9,100.0,37.2,200.5,75.7,9.8 +PT1002,2026-06-15 12:00:00,101.1,99.8,36.9,198.5,75.0,9.8 +PT1002,2026-06-15 12:15:00,99.3,99.6,37.4,197.7,76.2,10.0 +PT1002,2026-06-15 12:30:00,98.4,99.7,37.0,192.8,76.9,10.2 +PT1002,2026-06-15 12:45:00,98.7,99.3,37.0,191.2,78.0,10.4 +PT1002,2026-06-15 13:00:00,99.6,99.3,36.7,190.2,77.7,10.3 +PT1002,2026-06-15 13:15:00,101.1,99.1,37.3,188.6,75.4,9.2 +PT1002,2026-06-15 13:30:00,102.0,99.4,37.0,188.3,75.0,9.0 +PT1002,2026-06-15 13:45:00,103.3,99.4,36.5,189.0,74.3,9.5 +PT1002,2026-06-15 14:00:00,101.8,99.5,37.4,192.5,74.0,9.2 +PT1002,2026-06-15 14:15:00,102.1,99.8,37.0,189.9,75.8,8.6 +PT1002,2026-06-15 14:30:00,102.6,99.8,37.5,192.1,73.0,8.6 +PT1002,2026-06-15 14:45:00,102.6,99.5,36.8,194.1,72.1,8.3 +PT1002,2026-06-15 15:00:00,102.3,99.5,36.8,191.5,70.5,8.0 +PT1002,2026-06-15 15:15:00,102.3,99.6,37.2,192.0,70.8,8.7 +PT1002,2026-06-15 15:30:00,103.2,99.5,36.7,193.9,70.1,8.9 +PT1002,2026-06-15 15:45:00,103.3,99.2,37.7,195.7,71.4,8.7 +PT1002,2026-06-15 16:00:00,102.9,98.8,36.7,194.2,69.9,8.8 +PT1002,2026-06-15 16:15:00,102.2,98.9,37.0,194.5,69.8,8.9 +PT1002,2026-06-15 16:30:00,100.2,98.8,36.9,195.4,69.6,9.0 +PT1002,2026-06-15 16:45:00,101.4,98.1,37.0,195.7,71.7,9.6 +PT1002,2026-06-15 17:00:00,99.8,98.5,36.7,195.6,71.4,9.3 +PT1002,2026-06-15 17:15:00,100.4,98.6,36.7,196.0,70.3,8.8 +PT1002,2026-06-15 17:30:00,99.7,98.4,37.4,192.6,71.2,8.3 +PT1002,2026-06-15 17:45:00,100.1,98.4,37.0,195.9,69.3,8.7 +PT1002,2026-06-15 18:00:00,103.2,98.3,36.9,194.8,70.0,8.6 +PT1002,2026-06-15 18:15:00,101.9,98.7,37.4,192.5,70.3,9.0 +PT1002,2026-06-15 18:30:00,101.2,98.6,37.1,191.7,68.0,9.2 +PT1002,2026-06-15 18:45:00,102.8,98.4,36.4,193.9,69.7,9.2 +PT1002,2026-06-15 19:00:00,102.2,98.9,37.0,194.5,70.8,9.2 +PT1002,2026-06-15 19:15:00,99.9,99.0,37.0,196.6,69.3,9.1 +PT1002,2026-06-15 19:30:00,100.4,98.9,37.2,198.5,69.4,8.1 +PT1002,2026-06-15 19:45:00,101.5,98.6,37.4,199.3,72.2,8.2 +PT1002,2026-06-15 20:00:00,100.9,98.6,36.6,198.9,71.6,8.1 +PT1002,2026-06-15 20:15:00,100.5,98.9,37.1,197.0,70.0,8.1 +PT1002,2026-06-15 20:30:00,100.9,98.9,37.1,197.1,69.5,8.0 +PT1002,2026-06-15 20:45:00,101.7,99.0,37.5,193.6,69.9,8.0 +PT1002,2026-06-15 21:00:00,102.1,99.2,37.4,193.7,69.8,8.6 +PT1002,2026-06-15 21:15:00,102.2,99.1,37.3,190.2,70.3,8.5 +PT1002,2026-06-15 21:30:00,103.1,99.4,36.9,190.9,68.7,8.0 +PT1002,2026-06-15 21:45:00,104.7,99.9,37.4,190.4,66.5,8.0 +PT1002,2026-06-15 22:00:00,103.9,100.0,37.3,190.8,67.6,8.7 +PT1002,2026-06-15 22:15:00,104.0,100.0,37.2,191.5,66.4,9.0 +PT1002,2026-06-15 22:30:00,103.6,99.9,36.8,190.9,65.6,8.9 +PT1002,2026-06-15 22:45:00,104.0,99.9,37.5,191.6,65.5,8.8 +PT1002,2026-06-15 23:00:00,104.0,100.0,36.9,189.6,66.4,8.5 +PT1002,2026-06-15 23:15:00,103.5,99.9,37.2,188.6,68.2,8.5 +PT1002,2026-06-15 23:30:00,102.9,100.0,37.2,189.4,67.7,8.0 +PT1002,2026-06-15 23:45:00,103.5,99.7,36.9,188.8,68.5,8.0 +PT1002,2026-06-16 00:00:00,103.9,100.0,37.0,193.1,71.5,8.1 +PT1002,2026-06-16 00:15:00,104.9,99.8,37.2,191.6,71.0,8.0 +PT1002,2026-06-16 00:30:00,104.2,99.9,37.5,194.8,71.2,8.6 +PT1002,2026-06-16 00:45:00,104.8,99.8,37.2,196.9,70.8,8.6 +PT1002,2026-06-16 01:00:00,104.7,99.6,36.6,193.8,72.3,8.8 +PT1002,2026-06-16 01:15:00,103.8,99.6,37.3,194.7,70.0,8.8 +PT1002,2026-06-16 01:30:00,103.3,99.6,36.8,193.7,71.3,8.5 +PT1002,2026-06-16 01:45:00,103.3,99.3,36.7,189.5,73.0,8.1 +PT1002,2026-06-16 02:00:00,102.2,99.0,37.3,189.2,71.3,8.3 +PT1002,2026-06-16 02:15:00,100.7,98.9,37.4,188.2,71.1,8.7 +PT1002,2026-06-16 02:30:00,103.6,98.3,37.6,186.3,73.8,8.0 +PT1002,2026-06-16 02:45:00,103.7,98.3,37.1,183.8,73.1,8.7 +PT1002,2026-06-16 03:00:00,103.1,98.4,37.1,183.4,73.6,8.4 +PT1002,2026-06-16 03:15:00,102.3,98.0,37.4,184.4,71.8,8.3 +PT1002,2026-06-16 03:30:00,100.5,98.1,37.1,183.8,70.3,9.1 +PT1002,2026-06-16 03:45:00,99.7,97.9,37.1,185.5,69.4,9.4 +PT1002,2026-06-16 04:00:00,101.0,97.6,37.0,183.7,69.0,9.3 +PT1002,2026-06-16 04:15:00,104.2,98.2,36.8,184.3,69.6,9.2 +PT1002,2026-06-16 04:30:00,103.9,98.3,37.0,186.9,71.1,8.6 +PT1002,2026-06-16 04:45:00,102.1,98.6,37.9,186.1,71.0,8.8 +PT1002,2026-06-16 05:00:00,102.3,98.6,37.6,183.6,73.2,8.7 +PT1002,2026-06-16 05:15:00,103.6,98.4,37.1,180.8,73.6,8.5 +PT1002,2026-06-16 05:30:00,104.8,98.0,36.7,181.4,74.8,8.8 +PT1002,2026-06-16 05:45:00,105.2,98.3,36.9,182.1,74.6,9.3 +PT1002,2026-06-16 06:00:00,103.3,98.2,37.4,183.1,76.2,9.5 +PT1002,2026-06-16 06:15:00,104.5,98.2,37.2,182.8,78.1,9.0 +PT1002,2026-06-16 06:30:00,103.6,98.4,36.8,182.8,78.1,9.7 +PT1002,2026-06-16 06:45:00,103.8,98.4,36.7,183.9,81.0,9.5 +PT1002,2026-06-16 07:00:00,102.8,98.3,37.6,184.0,81.2,10.2 +PT1002,2026-06-16 07:15:00,104.3,98.9,37.3,185.6,82.8,10.5 +PT1002,2026-06-16 07:30:00,104.7,98.8,37.1,183.1,82.6,10.7 +PT1002,2026-06-16 07:45:00,103.4,98.8,37.3,182.7,82.6,10.9 +PT1002,2026-06-16 08:00:00,102.7,99.0,37.4,185.0,83.0,11.2 +PT1002,2026-06-16 08:15:00,101.3,99.3,36.5,183.4,82.0,11.3 +PT1002,2026-06-16 08:30:00,101.5,99.5,37.2,180.1,83.6,11.0 +PT1002,2026-06-16 08:45:00,100.8,99.6,37.0,182.1,84.6,11.0 +PT1002,2026-06-16 09:00:00,100.7,99.8,37.1,183.5,85.4,10.5 +PT1002,2026-06-16 09:15:00,99.9,99.9,36.5,182.0,86.1,10.4 +PT1002,2026-06-16 09:30:00,100.9,99.9,37.0,184.5,83.6,10.2 +PT1002,2026-06-16 09:45:00,101.2,99.5,37.1,185.6,86.5,10.4 +PT1002,2026-06-16 10:00:00,99.5,99.3,37.3,185.5,85.7,10.8 +PT1002,2026-06-16 10:15:00,102.7,99.1,37.3,185.6,83.6,10.0 +PT1002,2026-06-16 10:30:00,103.3,98.9,37.0,185.8,82.7,9.8 +PT1002,2026-06-16 10:45:00,102.1,98.7,37.0,184.4,83.3,8.6 +PT1002,2026-06-16 11:00:00,100.8,98.4,36.8,183.3,83.3,8.6 +PT1002,2026-06-16 11:15:00,101.6,98.2,36.9,181.9,83.7,8.7 +PT1002,2026-06-16 11:30:00,98.0,97.9,37.0,182.2,84.7,8.7 +PT1002,2026-06-16 11:45:00,100.7,97.8,37.3,183.4,82.7,8.2 +PT1002,2026-06-16 12:00:00,101.9,97.7,37.1,179.7,82.5,8.3 +PT1002,2026-06-16 12:15:00,101.2,97.7,37.1,178.2,80.8,8.6 +PT1002,2026-06-16 12:30:00,101.0,97.6,37.3,177.9,81.0,9.3 +PT1002,2026-06-16 12:45:00,100.1,97.4,37.2,176.2,80.7,9.0 +PT1002,2026-06-16 13:00:00,96.9,97.5,36.9,176.8,82.6,9.3 +PT1002,2026-06-16 13:15:00,97.8,97.5,37.1,172.9,82.9,9.1 +PT1002,2026-06-16 13:30:00,99.8,97.5,36.8,170.9,84.3,9.2 +PT1002,2026-06-16 13:45:00,97.8,97.3,36.7,172.6,83.9,9.2 +PT1002,2026-06-16 14:00:00,98.8,96.8,37.3,171.3,84.5,8.8 +PT1002,2026-06-16 14:15:00,97.7,96.5,37.4,173.8,84.7,9.0 +PT1002,2026-06-16 14:30:00,94.6,96.6,37.0,172.3,83.8,9.2 +PT1002,2026-06-16 14:45:00,95.3,96.6,36.9,172.6,83.1,8.8 +PT1002,2026-06-16 15:00:00,95.1,97.1,37.0,175.6,82.1,8.8 +PT1002,2026-06-16 15:15:00,95.3,97.1,37.0,176.6,77.7,8.9 +PT1002,2026-06-16 15:30:00,94.4,97.3,36.8,179.6,78.8,8.7 +PT1002,2026-06-16 15:45:00,90.8,97.4,36.7,180.7,78.6,9.1 +PT1002,2026-06-16 16:00:00,90.6,97.3,37.0,180.5,80.4,9.0 +PT1002,2026-06-16 16:15:00,89.5,97.6,37.2,177.7,79.5,9.7 +PT1002,2026-06-16 16:30:00,89.5,97.6,37.2,175.8,79.4,9.6 +PT1002,2026-06-16 16:45:00,87.7,97.7,37.2,177.8,79.1,9.8 +PT1002,2026-06-16 17:00:00,87.0,97.5,37.5,176.0,79.6,9.8 +PT1002,2026-06-16 17:15:00,87.9,97.7,37.1,176.5,78.1,10.0 +PT1002,2026-06-16 17:30:00,86.6,98.0,36.9,178.7,76.4,9.7 +PT1002,2026-06-16 17:45:00,87.3,98.1,37.2,178.8,76.8,9.2 +PT1002,2026-06-16 18:00:00,87.3,97.9,36.6,175.7,76.8,9.3 +PT1002,2026-06-16 18:15:00,87.3,97.9,37.2,174.6,77.4,9.3 +PT1002,2026-06-16 18:30:00,88.0,98.1,36.9,176.6,77.9,9.1 +PT1002,2026-06-16 18:45:00,86.7,98.1,36.9,179.3,77.4,9.3 +PT1002,2026-06-16 19:00:00,87.0,98.4,37.3,180.7,75.0,9.5 +PT1002,2026-06-16 19:15:00,87.2,98.6,37.4,179.0,75.1,9.9 +PT1002,2026-06-16 19:30:00,87.9,98.3,37.1,176.9,75.3,10.0 +PT1002,2026-06-16 19:45:00,86.9,98.4,37.0,177.1,75.7,10.2 +PT1002,2026-06-16 20:00:00,86.4,98.7,36.9,175.6,75.0,10.7 +PT1002,2026-06-16 20:15:00,86.3,98.6,37.2,172.0,74.8,10.3 +PT1002,2026-06-16 20:30:00,87.6,98.0,37.5,171.2,75.5,9.5 +PT1002,2026-06-16 20:45:00,88.1,98.3,37.7,170.1,74.9,9.4 +PT1002,2026-06-16 21:00:00,89.7,98.3,37.2,170.6,75.8,10.4 +PT1002,2026-06-16 21:15:00,89.8,98.2,36.7,171.1,74.9,10.5 +PT1002,2026-06-16 21:30:00,89.5,98.4,37.4,171.8,74.2,10.5 +PT1002,2026-06-16 21:45:00,88.0,98.1,37.4,170.0,74.2,9.9 +PT1002,2026-06-16 22:00:00,87.0,98.1,37.4,168.8,74.1,9.3 +PT1002,2026-06-16 22:15:00,85.8,97.9,37.2,173.6,75.0,9.7 +PT1002,2026-06-16 22:30:00,85.3,97.5,36.6,173.0,73.5,9.3 +PT1002,2026-06-16 22:45:00,85.5,97.9,36.2,174.1,73.3,9.3 +PT1002,2026-06-16 23:00:00,85.0,97.6,37.1,174.3,72.9,8.9 +PT1002,2026-06-16 23:15:00,85.2,97.9,36.8,175.7,73.3,8.5 +PT1002,2026-06-16 23:30:00,85.9,97.9,37.5,176.2,74.7,8.0 +PT1002,2026-06-16 23:45:00,87.1,97.4,37.3,180.9,75.2,8.0 +PT1003,2026-06-14 00:00:00,86.8,93.6,37.3,106.4,71.0,21.0 +PT1003,2026-06-14 00:15:00,85.9,93.8,37.7,106.4,68.9,20.9 +PT1003,2026-06-14 00:30:00,86.9,93.7,36.5,102.6,67.7,20.4 +PT1003,2026-06-14 00:45:00,87.9,93.8,36.7,106.2,66.2,20.4 +PT1003,2026-06-14 01:00:00,87.2,93.7,37.4,105.5,66.2,20.8 +PT1003,2026-06-14 01:15:00,86.2,93.7,37.3,107.1,67.8,20.5 +PT1003,2026-06-14 01:30:00,86.7,93.4,37.0,108.7,68.0,19.8 +PT1003,2026-06-14 01:45:00,86.7,93.3,37.0,111.1,69.9,19.6 +PT1003,2026-06-14 02:00:00,86.6,93.2,37.1,110.0,64.4,20.3 +PT1003,2026-06-14 02:15:00,86.3,93.3,36.5,109.8,63.7,19.9 +PT1003,2026-06-14 02:30:00,84.7,93.0,36.3,111.1,64.8,19.6 +PT1003,2026-06-14 02:45:00,84.8,92.9,36.8,110.2,66.2,19.6 +PT1003,2026-06-14 03:00:00,83.3,92.9,36.7,108.4,66.1,20.1 +PT1003,2026-06-14 03:15:00,83.5,93.1,37.2,108.2,67.2,19.9 +PT1003,2026-06-14 03:30:00,84.0,93.0,37.4,112.2,68.1,20.5 +PT1003,2026-06-14 03:45:00,84.4,93.3,36.8,112.6,67.0,20.5 +PT1003,2026-06-14 04:00:00,81.9,93.1,37.4,112.7,68.6,20.1 +PT1003,2026-06-14 04:15:00,80.5,92.9,37.2,115.6,68.6,20.1 +PT1003,2026-06-14 04:30:00,79.1,92.8,37.6,115.6,70.5,19.4 +PT1003,2026-06-14 04:45:00,79.0,92.5,36.9,113.0,70.9,18.8 +PT1003,2026-06-14 05:00:00,78.7,92.8,36.6,115.1,69.9,18.8 +PT1003,2026-06-14 05:15:00,76.3,92.5,36.7,117.3,71.1,18.9 +PT1003,2026-06-14 05:30:00,75.5,92.3,37.2,117.0,70.8,18.5 +PT1003,2026-06-14 05:45:00,75.9,92.1,37.2,117.6,72.5,19.1 +PT1003,2026-06-14 06:00:00,76.5,92.1,37.0,119.7,70.8,19.5 +PT1003,2026-06-14 06:15:00,78.3,92.2,37.2,119.5,70.5,19.7 +PT1003,2026-06-14 06:30:00,77.9,92.2,37.3,121.3,68.4,20.0 +PT1003,2026-06-14 06:45:00,79.4,92.1,37.2,121.3,68.8,20.2 +PT1003,2026-06-14 07:00:00,77.9,92.1,37.4,125.3,69.7,20.9 +PT1003,2026-06-14 07:15:00,79.6,92.2,37.3,126.4,70.1,20.9 +PT1003,2026-06-14 07:30:00,79.0,92.7,37.0,124.5,71.3,21.5 +PT1003,2026-06-14 07:45:00,77.7,93.0,37.6,124.9,72.5,21.4 +PT1003,2026-06-14 08:00:00,75.2,93.1,37.0,127.6,72.7,21.5 +PT1003,2026-06-14 08:15:00,75.3,92.7,36.9,126.2,71.5,21.8 +PT1003,2026-06-14 08:30:00,74.8,92.6,37.3,124.7,71.9,22.0 +PT1003,2026-06-14 08:45:00,75.6,92.7,36.8,124.0,71.3,21.6 +PT1003,2026-06-14 09:00:00,75.9,92.6,37.3,127.0,71.2,22.2 +PT1003,2026-06-14 09:15:00,75.0,92.6,36.8,123.6,71.5,21.9 +PT1003,2026-06-14 09:30:00,76.9,92.8,37.0,125.6,72.7,21.4 +PT1003,2026-06-14 09:45:00,76.6,92.4,37.9,124.5,71.9,21.5 +PT1003,2026-06-14 10:00:00,76.6,92.4,37.7,124.0,73.0,21.1 +PT1003,2026-06-14 10:15:00,76.5,92.3,37.5,125.9,71.6,21.3 +PT1003,2026-06-14 10:30:00,76.3,92.9,37.6,127.2,72.6,21.9 +PT1003,2026-06-14 10:45:00,76.6,93.1,37.1,130.0,70.9,21.2 +PT1003,2026-06-14 11:00:00,74.6,93.0,36.8,130.7,70.5,21.1 +PT1003,2026-06-14 11:15:00,75.6,92.7,37.1,126.4,70.2,21.5 +PT1003,2026-06-14 11:30:00,74.3,92.7,37.2,127.3,70.3,21.4 +PT1003,2026-06-14 11:45:00,72.3,92.5,37.2,124.7,72.3,21.7 +PT1003,2026-06-14 12:00:00,70.6,92.7,37.3,127.5,73.2,21.7 +PT1003,2026-06-14 12:15:00,71.0,93.0,37.0,129.3,72.8,21.4 +PT1003,2026-06-14 12:30:00,71.7,92.9,37.1,127.8,72.8,21.9 +PT1003,2026-06-14 12:45:00,71.5,93.0,37.2,128.0,69.9,22.1 +PT1003,2026-06-14 13:00:00,71.6,93.2,36.9,130.4,71.1,21.8 +PT1003,2026-06-14 13:15:00,73.0,92.8,37.2,130.1,71.8,21.1 +PT1003,2026-06-14 13:30:00,74.2,92.4,37.1,133.4,70.3,21.3 +PT1003,2026-06-14 13:45:00,74.4,92.1,36.7,135.9,70.8,22.0 +PT1003,2026-06-14 14:00:00,74.2,92.1,37.7,136.0,71.8,21.9 +PT1003,2026-06-14 14:15:00,74.4,91.4,36.8,136.2,73.7,21.5 +PT1003,2026-06-14 14:30:00,73.4,91.2,36.4,135.3,75.0,22.1 +PT1003,2026-06-14 14:45:00,73.0,91.2,36.3,135.7,77.9,21.3 +PT1003,2026-06-14 15:00:00,75.6,91.4,36.9,134.5,78.1,21.4 +PT1003,2026-06-14 15:15:00,75.8,91.5,36.7,138.5,79.6,22.1 +PT1003,2026-06-14 15:30:00,75.5,91.6,37.0,134.7,81.4,22.4 +PT1003,2026-06-14 15:45:00,75.3,91.9,37.3,133.1,83.3,22.3 +PT1003,2026-06-14 16:00:00,75.5,92.5,36.8,131.3,82.4,21.7 +PT1003,2026-06-14 16:15:00,76.4,92.9,37.4,133.0,82.4,21.3 +PT1003,2026-06-14 16:30:00,75.3,92.6,37.7,132.4,79.4,20.8 +PT1003,2026-06-14 16:45:00,73.5,92.3,36.5,132.5,79.6,20.7 +PT1003,2026-06-14 17:00:00,74.6,92.2,37.5,135.0,78.6,21.1 +PT1003,2026-06-14 17:15:00,74.1,92.4,37.3,132.3,79.0,21.6 +PT1003,2026-06-14 17:30:00,77.0,92.6,36.6,131.6,83.2,22.2 +PT1003,2026-06-14 17:45:00,76.2,92.3,36.6,132.9,84.1,22.4 +PT1003,2026-06-14 18:00:00,75.4,92.3,36.6,129.2,82.8,23.0 +PT1003,2026-06-14 18:15:00,77.3,92.5,36.9,128.6,81.8,23.3 +PT1003,2026-06-14 18:30:00,76.4,92.5,37.2,124.4,79.7,23.2 +PT1003,2026-06-14 18:45:00,75.5,92.5,37.2,121.2,81.0,23.3 +PT1003,2026-06-14 19:00:00,76.2,92.5,37.1,120.2,82.7,23.3 +PT1003,2026-06-14 19:15:00,76.2,92.5,36.8,119.8,83.4,23.0 +PT1003,2026-06-14 19:30:00,76.9,92.5,37.3,121.8,84.0,22.7 +PT1003,2026-06-14 19:45:00,78.4,92.6,36.9,123.1,83.8,23.1 +PT1003,2026-06-14 20:00:00,78.9,93.3,37.1,124.2,83.1,23.0 +PT1003,2026-06-14 20:15:00,80.0,93.3,37.1,122.9,82.2,23.0 +PT1003,2026-06-14 20:30:00,80.5,93.5,37.1,128.3,80.0,23.3 +PT1003,2026-06-14 20:45:00,78.4,93.8,37.0,129.2,81.2,22.6 +PT1003,2026-06-14 21:00:00,77.1,94.4,37.2,131.5,80.1,22.0 +PT1003,2026-06-14 21:15:00,78.5,93.9,37.0,129.6,78.5,22.4 +PT1003,2026-06-14 21:30:00,78.1,94.0,37.5,127.9,76.3,22.9 +PT1003,2026-06-14 21:45:00,78.4,94.0,37.1,130.4,76.6,22.7 +PT1003,2026-06-14 22:00:00,80.1,94.0,37.3,129.0,76.8,23.0 +PT1003,2026-06-14 22:15:00,80.8,93.8,37.3,130.6,76.8,22.7 +PT1003,2026-06-14 22:30:00,80.3,93.4,36.8,128.6,76.5,22.9 +PT1003,2026-06-14 22:45:00,80.1,93.1,37.4,130.5,79.1,23.6 +PT1003,2026-06-14 23:00:00,81.1,92.6,36.3,130.9,78.4,23.9 +PT1003,2026-06-14 23:15:00,81.4,92.6,36.8,133.1,80.7,23.6 +PT1003,2026-06-14 23:30:00,81.7,93.0,37.2,133.3,78.8,23.3 +PT1003,2026-06-14 23:45:00,82.0,92.8,36.8,132.0,77.3,23.8 +PT1003,2026-06-15 00:00:00,81.5,92.7,36.7,128.8,76.0,24.3 +PT1003,2026-06-15 00:15:00,80.4,92.4,37.1,128.6,78.8,24.2 +PT1003,2026-06-15 00:30:00,79.5,92.4,37.5,131.1,79.1,25.1 +PT1003,2026-06-15 00:45:00,79.4,92.4,37.7,134.3,79.3,25.6 +PT1003,2026-06-15 01:00:00,79.2,92.5,36.7,136.3,80.4,25.9 +PT1003,2026-06-15 01:15:00,78.2,92.3,37.3,138.7,78.6,26.5 +PT1003,2026-06-15 01:30:00,79.7,92.1,37.2,138.9,79.0,26.6 +PT1003,2026-06-15 01:45:00,79.4,92.1,37.4,140.9,77.3,27.3 +PT1003,2026-06-15 02:00:00,78.3,92.2,37.1,142.7,75.4,27.3 +PT1003,2026-06-15 02:15:00,77.5,92.3,37.3,141.5,77.5,27.0 +PT1003,2026-06-15 02:30:00,75.6,92.2,36.9,141.6,77.2,26.9 +PT1003,2026-06-15 02:45:00,76.6,92.5,36.8,141.4,75.5,27.6 +PT1003,2026-06-15 03:00:00,74.9,92.0,37.3,141.6,75.2,28.0 +PT1003,2026-06-15 03:15:00,75.3,91.9,37.0,143.8,78.0,28.4 +PT1003,2026-06-15 03:30:00,76.3,91.8,37.1,141.6,76.7,28.3 +PT1003,2026-06-15 03:45:00,78.8,91.6,36.9,144.2,76.2,27.5 +PT1003,2026-06-15 04:00:00,80.3,91.7,36.8,145.1,78.2,27.0 +PT1003,2026-06-15 04:15:00,77.6,92.0,36.6,146.2,79.3,26.6 +PT1003,2026-06-15 04:30:00,76.1,91.7,37.2,149.3,80.8,26.4 +PT1003,2026-06-15 04:45:00,75.3,91.8,37.3,147.0,81.9,26.0 +PT1003,2026-06-15 05:00:00,74.9,91.6,37.3,150.2,82.2,25.9 +PT1003,2026-06-15 05:15:00,73.3,91.9,37.0,150.0,83.1,25.3 +PT1003,2026-06-15 05:30:00,73.4,92.2,37.5,151.3,82.5,25.4 +PT1003,2026-06-15 05:45:00,73.2,92.1,37.1,147.5,82.0,24.7 +PT1003,2026-06-15 06:00:00,74.5,91.6,36.9,150.0,81.6,24.7 +PT1003,2026-06-15 06:15:00,72.5,91.4,37.1,154.2,79.9,24.1 +PT1003,2026-06-15 06:30:00,72.5,91.3,37.2,154.2,80.9,23.8 +PT1003,2026-06-15 06:45:00,73.8,91.1,37.1,149.6,81.9,24.9 +PT1003,2026-06-15 07:00:00,74.1,91.0,37.4,152.8,81.8,24.8 +PT1003,2026-06-15 07:15:00,73.6,90.7,37.7,154.5,80.9,24.4 +PT1003,2026-06-15 07:30:00,73.5,90.9,37.2,154.6,79.5,24.7 +PT1003,2026-06-15 07:45:00,72.7,91.0,37.2,153.6,77.9,24.2 +PT1003,2026-06-15 08:00:00,72.3,91.4,36.7,153.5,76.7,24.2 +PT1003,2026-06-15 08:15:00,72.3,91.5,37.3,153.9,78.7,25.3 +PT1003,2026-06-15 08:30:00,73.8,92.1,37.4,151.9,78.9,25.1 +PT1003,2026-06-15 08:45:00,74.2,91.9,36.9,151.9,80.4,24.6 +PT1003,2026-06-15 09:00:00,73.1,92.0,36.8,154.4,77.4,24.6 +PT1003,2026-06-15 09:15:00,74.4,92.0,37.7,154.6,77.4,25.1 +PT1003,2026-06-15 09:30:00,73.1,91.7,37.4,155.3,76.2,25.4 +PT1003,2026-06-15 09:45:00,72.6,91.6,36.4,154.7,76.3,25.6 +PT1003,2026-06-15 10:00:00,71.5,91.5,36.7,153.1,72.1,24.8 +PT1003,2026-06-15 10:15:00,71.4,91.4,37.1,151.9,73.2,25.1 +PT1003,2026-06-15 10:30:00,71.6,91.2,37.3,150.4,70.7,25.0 +PT1003,2026-06-15 10:45:00,73.3,91.1,37.0,151.4,66.4,24.8 +PT1003,2026-06-15 11:00:00,75.2,91.2,37.6,152.4,67.1,24.9 +PT1003,2026-06-15 11:15:00,72.5,91.3,36.9,154.6,64.2,25.2 +PT1003,2026-06-15 11:30:00,72.7,91.1,37.2,156.5,63.8,25.5 +PT1003,2026-06-15 11:45:00,71.8,91.2,37.4,155.2,63.9,25.4 +PT1003,2026-06-15 12:00:00,72.6,91.2,36.9,153.8,62.0,25.5 +PT1003,2026-06-15 12:15:00,70.4,90.9,37.0,157.1,61.0,25.9 +PT1003,2026-06-15 12:30:00,72.0,91.2,36.9,155.4,58.0,25.1 +PT1003,2026-06-15 12:45:00,74.3,91.1,37.1,155.7,60.0,25.2 +PT1003,2026-06-15 13:00:00,75.1,91.2,37.4,155.5,58.9,25.2 +PT1003,2026-06-15 13:15:00,77.3,91.3,37.3,157.0,59.3,25.2 +PT1003,2026-06-15 13:30:00,78.8,91.1,37.4,154.1,58.5,25.3 +PT1003,2026-06-15 13:45:00,77.7,90.5,36.9,153.1,58.2,24.8 +PT1003,2026-06-15 14:00:00,78.8,90.5,37.0,153.8,57.7,24.5 +PT1003,2026-06-15 14:15:00,79.4,90.1,37.3,157.1,58.5,24.3 +PT1003,2026-06-15 14:30:00,80.9,90.1,37.1,156.7,60.8,25.1 +PT1003,2026-06-15 14:45:00,79.6,90.0,37.2,158.7,59.2,25.0 +PT1003,2026-06-15 15:00:00,78.5,90.3,36.8,160.1,62.2,25.4 +PT1003,2026-06-15 15:15:00,79.2,90.5,36.8,162.2,61.1,25.0 +PT1003,2026-06-15 15:30:00,81.2,90.7,36.8,160.6,61.3,25.0 +PT1003,2026-06-15 15:45:00,81.2,90.8,36.8,164.4,60.3,24.3 +PT1003,2026-06-15 16:00:00,80.2,90.7,37.1,162.3,61.5,23.8 +PT1003,2026-06-15 16:15:00,82.6,90.8,37.3,163.2,64.3,24.3 +PT1003,2026-06-15 16:30:00,82.3,90.8,37.2,163.1,63.7,24.4 +PT1003,2026-06-15 16:45:00,80.8,91.2,37.4,163.9,63.3,24.5 +PT1003,2026-06-15 17:00:00,79.1,91.2,36.7,161.5,67.3,24.6 +PT1003,2026-06-15 17:15:00,83.5,91.1,37.2,161.1,67.1,24.2 +PT1003,2026-06-15 17:30:00,80.8,91.4,37.0,158.9,66.5,24.5 +PT1003,2026-06-15 17:45:00,80.7,91.2,37.2,163.1,67.3,24.1 +PT1003,2026-06-15 18:00:00,79.3,91.6,37.0,163.5,65.8,24.4 +PT1003,2026-06-15 18:15:00,77.8,91.7,37.1,164.2,67.5,24.4 +PT1003,2026-06-15 18:30:00,78.1,92.1,37.2,163.5,68.2,24.6 +PT1003,2026-06-15 18:45:00,77.7,92.1,36.8,163.4,71.1,24.4 +PT1003,2026-06-15 19:00:00,77.7,92.1,37.1,163.7,70.5,24.5 +PT1003,2026-06-15 19:15:00,78.9,92.2,36.8,163.9,71.2,24.8 +PT1003,2026-06-15 19:30:00,77.4,92.6,37.0,165.4,70.9,24.8 +PT1003,2026-06-15 19:45:00,77.7,92.4,36.8,167.0,71.2,24.9 +PT1003,2026-06-15 20:00:00,78.4,92.1,37.2,165.7,71.3,25.9 +PT1003,2026-06-15 20:15:00,75.4,92.0,37.1,167.0,69.6,26.3 +PT1003,2026-06-15 20:30:00,76.6,91.9,37.1,165.7,70.5,26.3 +PT1003,2026-06-15 20:45:00,78.6,92.0,37.5,161.8,71.7,26.5 +PT1003,2026-06-15 21:00:00,77.5,92.1,37.0,162.0,70.2,26.9 +PT1003,2026-06-15 21:15:00,78.9,91.9,36.9,159.1,69.9,27.0 +PT1003,2026-06-15 21:30:00,75.3,92.0,37.0,159.8,70.9,26.9 +PT1003,2026-06-15 21:45:00,77.1,91.6,37.2,159.3,71.1,27.1 +PT1003,2026-06-15 22:00:00,76.0,91.9,37.2,159.3,68.6,27.2 +PT1003,2026-06-15 22:15:00,78.4,92.1,36.9,156.4,66.4,27.7 +PT1003,2026-06-15 22:30:00,76.6,92.3,37.5,155.4,67.8,27.3 +PT1003,2026-06-15 22:45:00,77.7,92.1,36.9,152.1,71.3,27.2 +PT1003,2026-06-15 23:00:00,79.5,92.4,36.7,154.5,71.2,28.0 +PT1003,2026-06-15 23:15:00,78.8,92.5,37.0,156.8,72.1,28.0 +PT1003,2026-06-15 23:30:00,80.3,92.7,36.9,155.1,70.8,27.7 +PT1003,2026-06-15 23:45:00,81.6,92.8,36.6,156.2,71.1,27.8 +PT1003,2026-06-16 00:00:00,82.5,92.7,37.3,156.1,70.4,27.9 +PT1003,2026-06-16 00:15:00,81.4,92.7,36.8,155.2,72.4,27.5 +PT1003,2026-06-16 00:30:00,81.0,92.5,37.4,154.8,71.6,27.5 +PT1003,2026-06-16 00:45:00,81.1,92.5,37.3,152.6,71.4,27.3 +PT1003,2026-06-16 01:00:00,80.2,92.3,37.2,153.3,74.3,27.2 +PT1003,2026-06-16 01:15:00,81.4,92.5,36.9,154.3,74.2,27.2 +PT1003,2026-06-16 01:30:00,82.0,92.6,37.4,155.7,73.5,27.5 +PT1003,2026-06-16 01:45:00,80.6,92.5,37.1,158.1,72.5,27.8 +PT1003,2026-06-16 02:00:00,81.0,92.5,37.5,159.6,70.9,27.4 +PT1003,2026-06-16 02:15:00,83.6,92.5,37.5,163.0,69.8,27.2 +PT1003,2026-06-16 02:30:00,84.5,92.9,37.5,164.0,68.3,27.3 +PT1003,2026-06-16 02:45:00,84.4,92.9,37.1,164.9,67.4,27.4 +PT1003,2026-06-16 03:00:00,83.8,93.1,37.0,166.2,66.9,27.4 +PT1003,2026-06-16 03:15:00,83.1,92.7,37.2,165.2,66.0,27.4 +PT1003,2026-06-16 03:30:00,82.1,92.8,37.3,163.3,65.8,27.2 +PT1003,2026-06-16 03:45:00,82.3,92.8,36.9,162.1,65.3,27.9 +PT1003,2026-06-16 04:00:00,82.9,92.7,37.3,163.0,66.5,27.8 +PT1003,2026-06-16 04:15:00,86.3,92.9,37.2,166.2,67.3,27.4 +PT1003,2026-06-16 04:30:00,85.9,92.7,37.9,166.1,67.0,27.0 +PT1003,2026-06-16 04:45:00,86.8,92.8,37.3,166.2,68.8,27.8 +PT1003,2026-06-16 05:00:00,87.0,93.2,37.0,166.5,69.5,28.2 +PT1003,2026-06-16 05:15:00,84.5,93.1,37.0,168.1,70.5,28.7 +PT1003,2026-06-16 05:30:00,86.4,93.1,36.8,169.3,71.9,28.2 +PT1003,2026-06-16 05:45:00,85.2,93.4,36.7,168.7,74.9,28.2 +PT1003,2026-06-16 06:00:00,84.4,93.4,37.4,169.7,73.5,28.4 +PT1003,2026-06-16 06:15:00,83.6,93.9,37.5,168.6,72.0,27.8 +PT1003,2026-06-16 06:30:00,83.7,93.8,36.5,165.7,71.4,28.8 +PT1003,2026-06-16 06:45:00,83.0,94.2,37.2,168.2,70.5,28.8 +PT1003,2026-06-16 07:00:00,83.1,94.7,36.5,168.9,72.2,28.9 +PT1003,2026-06-16 07:15:00,81.7,94.4,37.1,168.4,75.3,29.1 +PT1003,2026-06-16 07:30:00,83.3,94.1,37.4,167.4,74.4,29.2 +PT1003,2026-06-16 07:45:00,83.8,94.2,37.3,166.7,74.9,28.9 +PT1003,2026-06-16 08:00:00,83.3,93.9,37.3,166.7,72.0,29.5 +PT1003,2026-06-16 08:15:00,83.7,93.5,36.6,165.3,72.1,29.4 +PT1003,2026-06-16 08:30:00,82.1,93.4,36.9,162.8,74.1,29.6 +PT1003,2026-06-16 08:45:00,83.6,93.7,36.9,163.4,74.1,29.5 +PT1003,2026-06-16 09:00:00,82.0,94.0,37.0,162.3,74.1,29.1 +PT1003,2026-06-16 09:15:00,85.4,93.9,37.5,165.2,74.1,29.4 +PT1003,2026-06-16 09:30:00,85.8,93.8,36.7,164.8,73.8,30.1 +PT1003,2026-06-16 09:45:00,83.7,93.3,36.9,163.1,74.9,30.4 +PT1003,2026-06-16 10:00:00,83.6,93.1,37.0,161.0,75.7,30.8 +PT1003,2026-06-16 10:15:00,85.6,93.3,37.8,164.2,75.3,31.4 +PT1003,2026-06-16 10:30:00,85.1,93.3,36.9,162.3,73.6,31.0 +PT1003,2026-06-16 10:45:00,85.5,93.1,37.1,162.8,74.0,30.8 +PT1003,2026-06-16 11:00:00,84.9,93.0,36.8,161.2,74.1,30.6 +PT1003,2026-06-16 11:15:00,85.6,93.2,37.2,163.4,72.6,30.4 +PT1003,2026-06-16 11:30:00,85.0,93.3,37.3,164.4,73.3,30.9 +PT1003,2026-06-16 11:45:00,85.2,93.3,37.2,164.1,71.7,30.2 +PT1003,2026-06-16 12:00:00,86.7,93.2,37.4,167.3,71.4,29.5 +PT1003,2026-06-16 12:15:00,86.1,93.4,37.2,164.8,72.0,29.1 +PT1003,2026-06-16 12:30:00,87.1,93.6,37.4,164.9,70.0,29.4 +PT1003,2026-06-16 12:45:00,85.8,93.3,37.2,167.0,69.7,29.1 +PT1003,2026-06-16 13:00:00,85.1,93.4,36.4,166.2,69.2,29.5 +PT1003,2026-06-16 13:15:00,85.7,93.6,36.9,165.0,70.6,29.1 +PT1003,2026-06-16 13:30:00,84.8,93.9,37.3,161.5,73.0,29.0 +PT1003,2026-06-16 13:45:00,85.5,93.9,36.9,160.3,74.9,28.8 +PT1003,2026-06-16 14:00:00,86.5,93.9,37.2,163.0,74.8,28.6 +PT1003,2026-06-16 14:15:00,86.0,93.8,36.8,164.7,77.6,28.5 +PT1003,2026-06-16 14:30:00,85.8,93.9,36.8,165.2,79.3,28.7 +PT1003,2026-06-16 14:45:00,85.2,93.5,36.9,167.5,76.4,28.2 +PT1003,2026-06-16 15:00:00,85.9,93.4,36.7,166.7,75.8,28.3 +PT1003,2026-06-16 15:15:00,84.8,93.8,37.1,167.5,77.0,28.3 +PT1003,2026-06-16 15:30:00,85.4,94.0,36.4,169.2,76.8,28.7 +PT1003,2026-06-16 15:45:00,86.5,93.9,37.2,170.3,75.8,28.2 +PT1003,2026-06-16 16:00:00,84.7,93.8,37.0,168.7,75.6,28.5 +PT1003,2026-06-16 16:15:00,85.1,94.0,37.1,167.5,74.7,29.0 +PT1003,2026-06-16 16:30:00,85.7,94.1,36.5,165.1,73.5,29.2 +PT1003,2026-06-16 16:45:00,85.4,93.9,37.1,167.3,74.0,29.6 +PT1003,2026-06-16 17:00:00,85.3,93.8,36.8,166.3,78.1,30.0 +PT1003,2026-06-16 17:15:00,88.5,93.7,36.9,167.0,79.5,29.4 +PT1003,2026-06-16 17:30:00,90.5,93.7,37.6,169.0,78.8,29.3 +PT1003,2026-06-16 17:45:00,91.0,93.6,37.3,167.6,77.9,29.8 +PT1003,2026-06-16 18:00:00,89.6,93.6,37.4,167.5,78.4,29.6 +PT1003,2026-06-16 18:15:00,89.6,93.7,37.6,165.9,77.3,30.6 +PT1003,2026-06-16 18:30:00,89.5,94.1,37.3,168.3,76.3,30.3 +PT1003,2026-06-16 18:45:00,89.8,94.0,36.7,169.8,74.2,30.4 +PT1003,2026-06-16 19:00:00,88.3,93.8,37.2,170.5,73.2,29.9 +PT1003,2026-06-16 19:15:00,90.1,93.9,37.3,174.1,75.3,29.7 +PT1003,2026-06-16 19:30:00,90.0,94.2,37.2,173.9,74.1,30.3 +PT1003,2026-06-16 19:45:00,89.2,94.1,37.2,172.6,72.6,30.1 +PT1003,2026-06-16 20:00:00,89.3,94.0,37.1,175.5,69.6,30.2 +PT1003,2026-06-16 20:15:00,88.1,94.1,37.7,175.1,71.4,30.5 +PT1003,2026-06-16 20:30:00,87.5,94.4,37.3,172.8,71.3,30.4 +PT1003,2026-06-16 20:45:00,88.2,94.2,37.1,174.1,70.7,30.0 +PT1003,2026-06-16 21:00:00,86.4,94.4,37.6,174.0,70.7,30.0 +PT1003,2026-06-16 21:15:00,88.3,94.7,37.2,173.8,69.0,30.0 +PT1003,2026-06-16 21:30:00,89.2,94.8,37.3,171.8,68.2,29.7 +PT1003,2026-06-16 21:45:00,89.9,95.0,37.1,172.4,65.1,29.0 +PT1003,2026-06-16 22:00:00,90.0,95.3,37.1,172.5,63.6,29.3 +PT1003,2026-06-16 22:15:00,89.5,94.9,37.3,172.7,64.0,28.9 +PT1003,2026-06-16 22:30:00,90.3,94.9,36.9,172.7,65.4,29.1 +PT1003,2026-06-16 22:45:00,90.1,95.0,37.5,168.6,64.0,29.3 +PT1003,2026-06-16 23:00:00,91.3,95.2,36.5,168.9,62.5,29.2 +PT1003,2026-06-16 23:15:00,92.8,95.0,36.7,167.8,64.0,28.6 +PT1003,2026-06-16 23:30:00,93.1,95.1,37.3,167.7,64.0,29.1 +PT1003,2026-06-16 23:45:00,93.7,95.3,37.5,167.1,67.2,28.2 +PT1004,2026-06-14 00:00:00,79.1,99.2,37.1,168.2,96.8,16.4 +PT1004,2026-06-14 00:15:00,78.2,99.4,36.8,171.3,93.9,17.4 +PT1004,2026-06-14 00:30:00,77.1,99.1,36.9,171.3,92.0,16.9 +PT1004,2026-06-14 00:45:00,77.2,99.1,37.0,173.8,93.8,17.3 +PT1004,2026-06-14 01:00:00,75.0,98.7,36.7,175.8,95.0,17.1 +PT1004,2026-06-14 01:15:00,73.8,98.7,37.0,176.2,96.6,16.9 +PT1004,2026-06-14 01:30:00,75.1,98.2,37.3,176.8,96.1,17.2 +PT1004,2026-06-14 01:45:00,74.3,98.1,37.5,172.2,97.2,17.3 +PT1004,2026-06-14 02:00:00,73.9,98.3,36.9,170.1,93.2,17.2 +PT1004,2026-06-14 02:15:00,72.6,98.5,37.1,172.5,93.3,17.2 +PT1004,2026-06-14 02:30:00,71.9,98.7,37.3,169.4,91.7,16.9 +PT1004,2026-06-14 02:45:00,71.5,99.0,37.0,171.0,90.5,17.1 +PT1004,2026-06-14 03:00:00,72.1,99.2,37.2,173.3,90.8,17.8 +PT1004,2026-06-14 03:15:00,72.3,99.1,37.2,172.0,91.5,17.8 +PT1004,2026-06-14 03:30:00,72.9,99.2,37.0,176.0,90.7,18.0 +PT1004,2026-06-14 03:45:00,70.0,99.2,37.2,174.2,90.6,18.0 +PT1004,2026-06-14 04:00:00,69.4,99.1,37.1,175.6,89.4,17.2 +PT1004,2026-06-14 04:15:00,70.7,99.2,37.0,175.9,91.2,17.7 +PT1004,2026-06-14 04:30:00,71.1,99.3,36.9,175.7,92.9,17.6 +PT1004,2026-06-14 04:45:00,68.0,99.1,37.3,173.1,92.9,17.1 +PT1004,2026-06-14 05:00:00,69.4,99.1,37.6,171.1,93.3,17.8 +PT1004,2026-06-14 05:15:00,67.7,98.7,36.9,167.7,91.6,17.9 +PT1004,2026-06-14 05:30:00,66.8,99.0,37.3,168.8,89.0,18.3 +PT1004,2026-06-14 05:45:00,67.5,98.9,36.8,168.4,86.1,18.7 +PT1004,2026-06-14 06:00:00,66.5,98.6,37.1,172.0,85.1,19.1 +PT1004,2026-06-14 06:15:00,65.5,98.4,37.0,170.8,85.0,19.3 +PT1004,2026-06-14 06:30:00,65.0,98.2,36.9,168.4,83.0,19.7 +PT1004,2026-06-14 06:45:00,64.5,98.0,37.2,167.7,83.6,19.5 +PT1004,2026-06-14 07:00:00,66.3,97.8,36.7,166.9,84.6,20.1 +PT1004,2026-06-14 07:15:00,64.3,97.8,37.1,166.7,85.6,20.3 +PT1004,2026-06-14 07:30:00,65.6,97.6,36.7,167.1,83.8,20.3 +PT1004,2026-06-14 07:45:00,64.4,98.1,37.8,163.4,83.5,20.6 +PT1004,2026-06-14 08:00:00,64.6,98.1,36.9,163.5,85.1,20.8 +PT1004,2026-06-14 08:15:00,66.0,98.0,37.1,160.3,82.7,20.7 +PT1004,2026-06-14 08:30:00,67.3,98.2,36.7,160.5,84.2,20.7 +PT1004,2026-06-14 08:45:00,65.5,98.5,37.2,156.0,83.9,21.9 +PT1004,2026-06-14 09:00:00,65.3,98.1,37.1,159.2,85.7,22.2 +PT1004,2026-06-14 09:15:00,66.1,98.1,37.3,157.3,87.1,22.2 +PT1004,2026-06-14 09:30:00,66.0,98.2,38.0,157.2,87.0,22.2 +PT1004,2026-06-14 09:45:00,67.0,98.8,37.6,157.2,86.5,21.8 +PT1004,2026-06-14 10:00:00,66.0,99.3,37.0,155.2,87.9,21.1 +PT1004,2026-06-14 10:15:00,66.1,99.2,36.5,154.9,87.6,21.4 +PT1004,2026-06-14 10:30:00,65.4,99.5,36.8,156.0,89.5,21.8 +PT1004,2026-06-14 10:45:00,66.3,99.5,37.3,160.5,90.7,22.0 +PT1004,2026-06-14 11:00:00,66.9,99.6,37.4,160.0,91.5,22.3 +PT1004,2026-06-14 11:15:00,68.1,100.0,36.8,162.2,92.5,21.9 +PT1004,2026-06-14 11:30:00,67.8,100.0,37.0,165.0,88.3,21.5 +PT1004,2026-06-14 11:45:00,66.7,99.8,37.5,164.0,86.9,21.2 +PT1004,2026-06-14 12:00:00,67.5,100.0,37.3,164.0,88.4,21.5 +PT1004,2026-06-14 12:15:00,66.8,99.8,36.9,166.1,87.6,21.0 +PT1004,2026-06-14 12:30:00,68.7,99.7,37.3,166.7,86.7,21.3 +PT1004,2026-06-14 12:45:00,66.9,99.8,37.7,163.4,85.9,21.3 +PT1004,2026-06-14 13:00:00,67.4,99.6,37.4,162.7,87.3,21.0 +PT1004,2026-06-14 13:15:00,66.8,99.3,37.1,161.8,84.8,20.1 +PT1004,2026-06-14 13:30:00,66.8,99.4,36.7,161.6,88.3,20.2 +PT1004,2026-06-14 13:45:00,65.5,99.4,37.1,160.7,86.5,20.2 +PT1004,2026-06-14 14:00:00,67.5,99.2,36.8,159.9,88.9,20.3 +PT1004,2026-06-14 14:15:00,66.7,98.9,36.7,160.0,90.4,20.9 +PT1004,2026-06-14 14:30:00,67.8,98.9,37.3,159.5,89.8,20.2 +PT1004,2026-06-14 14:45:00,66.2,98.7,37.5,160.3,87.1,19.6 +PT1004,2026-06-14 15:00:00,66.4,98.6,36.8,160.6,88.1,20.1 +PT1004,2026-06-14 15:15:00,65.3,98.7,37.0,161.9,86.1,19.7 +PT1004,2026-06-14 15:30:00,65.4,98.7,36.8,159.2,86.1,19.4 +PT1004,2026-06-14 15:45:00,65.4,98.7,36.6,160.8,84.8,19.5 +PT1004,2026-06-14 16:00:00,65.1,98.8,37.0,161.8,85.7,19.8 +PT1004,2026-06-14 16:15:00,65.8,99.3,37.0,160.9,87.7,20.2 +PT1004,2026-06-14 16:30:00,65.6,99.3,36.5,162.6,88.3,20.0 +PT1004,2026-06-14 16:45:00,66.5,98.8,37.2,159.8,87.7,19.5 +PT1004,2026-06-14 17:00:00,66.2,99.0,37.1,156.6,86.7,19.5 +PT1004,2026-06-14 17:15:00,67.1,98.8,37.2,155.7,87.5,18.6 +PT1004,2026-06-14 17:30:00,68.1,98.5,37.2,155.0,89.7,18.9 +PT1004,2026-06-14 17:45:00,69.3,98.9,37.0,155.1,89.1,19.3 +PT1004,2026-06-14 18:00:00,68.2,98.8,36.8,155.7,88.4,19.1 +PT1004,2026-06-14 18:15:00,70.0,98.7,37.3,154.3,87.5,19.5 +PT1004,2026-06-14 18:30:00,69.5,98.7,37.3,154.8,86.5,18.8 +PT1004,2026-06-14 18:45:00,68.7,98.8,36.9,155.5,86.6,18.7 +PT1004,2026-06-14 19:00:00,67.4,98.7,37.1,156.6,88.7,19.2 +PT1004,2026-06-14 19:15:00,69.1,98.6,36.6,154.0,91.5,19.4 +PT1004,2026-06-14 19:30:00,71.0,98.4,36.8,153.0,93.1,19.9 +PT1004,2026-06-14 19:45:00,72.8,98.6,36.6,151.4,92.7,20.5 +PT1004,2026-06-14 20:00:00,74.5,98.9,37.7,152.4,92.9,21.3 +PT1004,2026-06-14 20:15:00,73.8,99.0,37.4,156.1,91.7,21.4 +PT1004,2026-06-14 20:30:00,71.4,99.2,36.4,154.0,92.0,21.9 +PT1004,2026-06-14 20:45:00,72.4,99.7,36.6,152.9,92.9,22.4 +PT1004,2026-06-14 21:00:00,73.3,100.0,37.5,154.2,93.0,22.0 +PT1004,2026-06-14 21:15:00,73.4,99.8,37.1,153.5,93.6,21.4 +PT1004,2026-06-14 21:30:00,72.9,100.0,36.5,149.8,95.0,22.0 +PT1004,2026-06-14 21:45:00,70.9,100.0,37.2,148.0,99.6,21.2 +PT1004,2026-06-14 22:00:00,70.9,99.9,36.8,148.9,100.4,21.2 +PT1004,2026-06-14 22:15:00,72.2,100.0,36.9,149.1,101.3,21.5 +PT1004,2026-06-14 22:30:00,72.9,99.9,37.0,150.7,101.0,21.7 +PT1004,2026-06-14 22:45:00,73.7,99.6,37.2,150.8,102.5,21.9 +PT1004,2026-06-14 23:00:00,75.9,99.9,37.6,152.5,103.5,22.2 +PT1004,2026-06-14 23:15:00,75.4,100.0,37.2,153.2,102.9,22.2 +PT1004,2026-06-14 23:30:00,74.4,100.0,37.1,153.0,103.0,22.7 +PT1004,2026-06-14 23:45:00,76.3,99.9,37.4,150.8,102.6,21.6 +PT1004,2026-06-15 00:00:00,75.0,99.7,36.5,152.3,102.8,21.4 +PT1004,2026-06-15 00:15:00,76.6,99.9,37.4,156.4,101.9,20.8 +PT1004,2026-06-15 00:30:00,76.4,100.0,37.2,159.6,102.4,20.9 +PT1004,2026-06-15 00:45:00,74.4,100.0,37.1,162.0,103.2,20.3 +PT1004,2026-06-15 01:00:00,76.2,99.9,37.0,164.3,103.3,20.6 +PT1004,2026-06-15 01:15:00,76.3,100.0,36.9,162.2,103.7,19.5 +PT1004,2026-06-15 01:30:00,76.9,100.0,36.8,163.1,101.6,19.9 +PT1004,2026-06-15 01:45:00,77.7,99.7,37.0,161.6,100.2,20.0 +PT1004,2026-06-15 02:00:00,78.3,99.7,36.8,158.5,100.6,19.3 +PT1004,2026-06-15 02:15:00,77.9,99.6,37.8,155.2,102.7,19.9 +PT1004,2026-06-15 02:30:00,79.2,99.5,37.1,154.4,102.0,20.7 +PT1004,2026-06-15 02:45:00,80.7,99.8,37.1,154.8,99.8,20.7 +PT1004,2026-06-15 03:00:00,82.3,99.8,36.3,152.4,101.3,20.6 +PT1004,2026-06-15 03:15:00,82.6,99.9,37.2,150.7,101.0,20.9 +PT1004,2026-06-15 03:30:00,80.7,100.0,37.3,154.1,100.2,20.1 +PT1004,2026-06-15 03:45:00,79.9,100.0,37.0,158.5,97.9,19.8 +PT1004,2026-06-15 04:00:00,81.5,100.0,36.9,159.0,95.5,19.6 +PT1004,2026-06-15 04:15:00,82.3,100.0,37.0,156.9,94.2,19.5 +PT1004,2026-06-15 04:30:00,82.2,100.0,36.7,159.4,93.6,19.3 +PT1004,2026-06-15 04:45:00,81.9,100.0,37.3,155.9,93.1,19.7 +PT1004,2026-06-15 05:00:00,82.4,100.0,37.3,154.8,92.0,20.2 +PT1004,2026-06-15 05:15:00,81.5,99.5,37.2,153.3,92.9,20.0 +PT1004,2026-06-15 05:30:00,83.1,99.5,36.9,153.8,93.9,19.6 +PT1004,2026-06-15 05:45:00,84.0,99.5,37.2,154.1,93.9,19.9 +PT1004,2026-06-15 06:00:00,84.5,99.8,37.8,157.3,97.3,19.7 +PT1004,2026-06-15 06:15:00,83.1,100.0,36.8,156.0,97.2,19.7 +PT1004,2026-06-15 06:30:00,83.2,99.8,37.0,153.5,97.1,20.4 +PT1004,2026-06-15 06:45:00,84.3,99.6,37.2,151.0,97.8,21.1 +PT1004,2026-06-15 07:00:00,85.3,99.9,37.3,150.9,97.6,21.2 +PT1004,2026-06-15 07:15:00,83.6,100.0,36.8,150.9,96.4,21.2 +PT1004,2026-06-15 07:30:00,81.7,100.0,36.9,152.7,95.9,20.8 +PT1004,2026-06-15 07:45:00,82.4,100.0,37.1,154.2,97.8,20.4 +PT1004,2026-06-15 08:00:00,83.6,99.6,36.8,152.9,99.3,20.5 +PT1004,2026-06-15 08:15:00,81.6,100.0,37.4,148.8,100.2,20.3 +PT1004,2026-06-15 08:30:00,80.3,100.0,37.1,149.6,101.1,20.0 +PT1004,2026-06-15 08:45:00,80.2,100.0,37.3,150.4,101.9,20.2 +PT1004,2026-06-15 09:00:00,78.5,100.0,37.7,148.7,101.8,20.8 +PT1004,2026-06-15 09:15:00,79.5,99.9,36.7,148.9,102.1,20.9 +PT1004,2026-06-15 09:30:00,81.0,99.9,36.7,147.5,101.3,21.0 +PT1004,2026-06-15 09:45:00,82.0,100.0,36.7,150.6,101.4,20.6 +PT1004,2026-06-15 10:00:00,81.5,99.9,37.2,149.5,101.6,20.3 +PT1004,2026-06-15 10:15:00,80.9,100.0,37.2,148.8,103.5,20.6 +PT1004,2026-06-15 10:30:00,80.6,99.6,37.2,151.7,102.5,20.6 +PT1004,2026-06-15 10:45:00,80.4,100.0,37.0,149.2,105.1,20.9 +PT1004,2026-06-15 11:00:00,80.1,99.4,37.5,147.5,104.5,21.0 +PT1004,2026-06-15 11:15:00,82.5,99.5,36.9,147.9,103.8,20.3 +PT1004,2026-06-15 11:30:00,82.3,99.7,36.5,149.0,104.1,20.1 +PT1004,2026-06-15 11:45:00,79.9,99.3,37.3,148.4,105.6,20.4 +PT1004,2026-06-15 12:00:00,79.3,99.6,36.7,146.5,106.9,19.8 +PT1004,2026-06-15 12:15:00,81.3,99.5,37.0,145.2,108.6,20.3 +PT1004,2026-06-15 12:30:00,81.6,99.5,36.9,139.5,106.5,20.6 +PT1004,2026-06-15 12:45:00,82.2,99.6,37.1,142.0,104.4,20.8 +PT1004,2026-06-15 13:00:00,81.2,99.4,37.1,142.4,105.4,20.8 +PT1004,2026-06-15 13:15:00,80.6,99.3,37.3,140.8,104.6,21.1 +PT1004,2026-06-15 13:30:00,79.1,99.1,36.8,139.4,104.5,20.4 +PT1004,2026-06-15 13:45:00,77.4,99.2,37.0,139.3,103.8,20.0 +PT1004,2026-06-15 14:00:00,76.7,99.6,37.4,141.3,102.8,20.0 +PT1004,2026-06-15 14:15:00,75.9,99.2,37.2,137.7,104.7,20.0 +PT1004,2026-06-15 14:30:00,75.2,98.9,37.5,135.6,102.7,20.3 +PT1004,2026-06-15 14:45:00,75.3,98.5,37.1,136.6,104.6,20.7 +PT1004,2026-06-15 15:00:00,75.0,98.5,37.0,139.0,105.7,20.5 +PT1004,2026-06-15 15:15:00,74.5,98.3,36.9,141.7,104.5,20.7 +PT1004,2026-06-15 15:30:00,73.9,98.2,37.1,142.8,104.1,20.3 +PT1004,2026-06-15 15:45:00,73.0,98.6,37.3,142.3,103.1,21.1 +PT1004,2026-06-15 16:00:00,72.0,98.4,36.9,143.2,103.2,21.4 +PT1004,2026-06-15 16:15:00,72.8,97.9,37.1,142.9,102.3,21.2 +PT1004,2026-06-15 16:30:00,74.2,97.6,36.6,138.6,100.7,21.6 +PT1004,2026-06-15 16:45:00,73.6,97.8,37.0,138.4,102.4,20.8 +PT1004,2026-06-15 17:00:00,75.2,97.5,37.5,140.5,102.1,21.0 +PT1004,2026-06-15 17:15:00,75.7,97.4,36.7,141.6,101.1,21.1 +PT1004,2026-06-15 17:30:00,75.8,97.7,37.1,141.0,102.7,22.3 +PT1004,2026-06-15 17:45:00,76.5,97.8,36.9,141.5,103.9,22.2 +PT1004,2026-06-15 18:00:00,74.7,97.7,37.1,143.3,102.5,22.3 +PT1004,2026-06-15 18:15:00,74.0,97.3,37.4,146.0,103.2,23.4 +PT1004,2026-06-15 18:30:00,75.6,96.9,36.9,142.5,103.3,23.0 +PT1004,2026-06-15 18:45:00,78.6,97.2,36.9,140.6,99.8,22.5 +PT1004,2026-06-15 19:00:00,78.2,96.9,37.1,142.9,98.7,22.8 +PT1004,2026-06-15 19:15:00,79.4,96.8,37.7,141.0,97.8,22.6 +PT1004,2026-06-15 19:30:00,79.4,96.8,37.0,142.8,97.8,23.0 +PT1004,2026-06-15 19:45:00,78.9,96.6,37.2,146.5,97.7,22.5 +PT1004,2026-06-15 20:00:00,78.1,96.5,36.9,147.1,100.0,22.6 +PT1004,2026-06-15 20:15:00,77.5,96.7,36.6,143.2,98.4,22.7 +PT1004,2026-06-15 20:30:00,77.1,96.6,37.1,145.0,98.0,23.1 +PT1004,2026-06-15 20:45:00,79.2,96.2,37.5,148.2,97.4,23.7 +PT1004,2026-06-15 21:00:00,75.8,96.4,37.3,150.2,99.4,23.3 +PT1004,2026-06-15 21:15:00,76.1,96.5,37.2,152.2,101.1,23.0 +PT1004,2026-06-15 21:30:00,76.1,96.5,37.4,151.9,101.4,22.8 +PT1004,2026-06-15 21:45:00,77.7,96.3,37.5,154.5,100.2,23.1 +PT1004,2026-06-15 22:00:00,77.5,96.1,36.6,153.3,100.8,23.9 +PT1004,2026-06-15 22:15:00,77.7,96.1,37.5,152.4,100.6,23.7 +PT1004,2026-06-15 22:30:00,79.3,96.1,37.7,152.2,99.9,23.7 +PT1004,2026-06-15 22:45:00,79.1,95.9,37.1,151.4,101.0,23.4 +PT1004,2026-06-15 23:00:00,79.7,95.8,37.0,147.8,99.4,23.1 +PT1004,2026-06-15 23:15:00,79.8,96.0,36.6,145.4,100.4,23.0 +PT1004,2026-06-15 23:30:00,79.8,96.3,37.2,147.1,100.3,23.4 +PT1004,2026-06-15 23:45:00,80.9,95.9,37.2,144.6,101.4,24.0 +PT1004,2026-06-16 00:00:00,80.3,95.7,37.4,144.0,103.2,23.9 +PT1004,2026-06-16 00:15:00,81.1,96.2,36.8,144.4,103.2,24.3 +PT1004,2026-06-16 00:30:00,80.5,95.8,36.7,141.9,106.0,24.6 +PT1004,2026-06-16 00:45:00,82.0,95.6,36.9,143.2,107.0,25.3 +PT1004,2026-06-16 01:00:00,81.1,95.0,37.5,142.9,108.1,25.6 +PT1004,2026-06-16 01:15:00,81.4,95.1,36.7,143.1,109.1,25.2 +PT1004,2026-06-16 01:30:00,80.4,95.2,37.3,140.5,108.2,25.0 +PT1004,2026-06-16 01:45:00,81.2,95.2,36.9,141.4,108.9,24.8 +PT1004,2026-06-16 02:00:00,83.0,94.6,37.4,139.9,108.6,25.1 +PT1004,2026-06-16 02:15:00,85.2,94.6,36.7,139.8,109.1,24.9 +PT1004,2026-06-16 02:30:00,85.0,94.8,37.1,139.4,109.7,24.1 +PT1004,2026-06-16 02:45:00,84.5,94.5,37.4,140.7,112.5,24.5 +PT1004,2026-06-16 03:00:00,85.3,94.7,37.3,137.1,112.3,24.7 +PT1004,2026-06-16 03:15:00,86.8,94.5,37.1,138.3,110.7,24.6 +PT1004,2026-06-16 03:30:00,87.8,94.7,37.0,138.5,107.5,24.8 +PT1004,2026-06-16 03:45:00,89.4,95.0,37.3,136.7,108.4,25.0 +PT1004,2026-06-16 04:00:00,89.9,95.2,37.3,139.7,107.5,24.7 +PT1004,2026-06-16 04:15:00,87.5,95.4,37.6,140.6,104.0,24.4 +PT1004,2026-06-16 04:30:00,85.7,95.4,37.1,138.6,103.0,25.2 +PT1004,2026-06-16 04:45:00,86.3,95.4,37.1,135.6,101.2,25.7 +PT1004,2026-06-16 05:00:00,85.4,95.4,36.6,136.9,101.9,25.4 +PT1004,2026-06-16 05:15:00,84.8,95.7,36.9,138.6,102.5,25.3 +PT1004,2026-06-16 05:30:00,84.6,95.9,37.1,140.6,102.1,26.3 +PT1004,2026-06-16 05:45:00,84.2,96.3,37.5,136.5,102.8,26.3 +PT1004,2026-06-16 06:00:00,84.9,96.4,36.7,137.9,101.2,26.7 +PT1004,2026-06-16 06:15:00,85.3,96.4,36.9,134.3,101.3,26.8 +PT1004,2026-06-16 06:30:00,84.0,96.5,36.9,135.1,101.7,26.8 +PT1004,2026-06-16 06:45:00,86.7,96.5,37.0,133.3,101.8,26.7 +PT1004,2026-06-16 07:00:00,88.9,96.2,37.6,133.4,100.2,26.5 +PT1004,2026-06-16 07:15:00,89.2,96.3,37.2,131.5,99.5,27.2 +PT1004,2026-06-16 07:30:00,88.7,96.4,37.8,132.1,98.3,27.1 +PT1004,2026-06-16 07:45:00,89.1,96.0,37.0,133.1,100.2,26.7 +PT1004,2026-06-16 08:00:00,90.8,96.0,37.0,132.8,98.2,27.1 +PT1004,2026-06-16 08:15:00,88.2,95.7,37.8,131.7,96.6,26.8 +PT1004,2026-06-16 08:30:00,89.0,95.0,37.3,131.1,96.5,26.2 +PT1004,2026-06-16 08:45:00,86.5,95.3,36.7,133.9,100.0,25.5 +PT1004,2026-06-16 09:00:00,87.3,95.7,37.2,135.6,101.6,26.1 +PT1004,2026-06-16 09:15:00,86.9,95.3,37.1,135.0,101.4,25.7 +PT1004,2026-06-16 09:30:00,85.6,95.6,36.8,135.8,100.7,25.8 +PT1004,2026-06-16 09:45:00,84.4,95.5,36.7,135.4,100.9,25.9 +PT1004,2026-06-16 10:00:00,84.3,95.3,36.9,128.6,105.5,25.5 +PT1004,2026-06-16 10:15:00,82.6,95.1,37.0,128.2,107.6,25.5 +PT1004,2026-06-16 10:30:00,84.0,94.9,37.4,128.3,106.2,26.1 +PT1004,2026-06-16 10:45:00,83.8,94.9,37.4,128.2,106.0,25.5 +PT1004,2026-06-16 11:00:00,83.5,95.4,36.5,129.1,102.2,25.0 +PT1004,2026-06-16 11:15:00,81.9,95.0,37.1,129.6,101.7,25.3 +PT1004,2026-06-16 11:30:00,81.6,95.5,36.7,130.0,101.6,25.0 +PT1004,2026-06-16 11:45:00,82.5,95.7,37.3,133.1,102.3,24.8 +PT1004,2026-06-16 12:00:00,82.4,95.9,37.5,135.8,102.1,25.5 +PT1004,2026-06-16 12:15:00,82.4,96.1,37.3,136.4,102.1,26.3 +PT1004,2026-06-16 12:30:00,81.4,95.9,37.2,134.5,102.8,26.1 +PT1004,2026-06-16 12:45:00,82.5,96.4,36.7,133.8,100.7,26.8 +PT1004,2026-06-16 13:00:00,80.7,96.8,37.0,136.0,101.4,26.8 +PT1004,2026-06-16 13:15:00,79.9,96.8,36.5,135.9,99.4,26.5 +PT1004,2026-06-16 13:30:00,80.0,96.8,37.0,139.4,99.9,26.3 +PT1004,2026-06-16 13:45:00,80.5,96.9,36.9,140.6,100.5,26.2 +PT1004,2026-06-16 14:00:00,79.8,96.7,37.1,138.4,103.3,26.2 +PT1004,2026-06-16 14:15:00,79.2,96.8,36.9,140.8,104.4,26.6 +PT1004,2026-06-16 14:30:00,79.2,96.6,37.6,141.0,106.3,26.8 +PT1004,2026-06-16 14:45:00,78.8,96.5,37.2,142.1,106.4,26.9 +PT1004,2026-06-16 15:00:00,78.3,96.5,37.2,144.0,108.1,26.7 +PT1004,2026-06-16 15:15:00,80.0,96.4,36.8,142.7,109.2,26.9 +PT1004,2026-06-16 15:30:00,78.3,96.5,37.3,141.9,106.7,26.7 +PT1004,2026-06-16 15:45:00,78.2,96.9,37.0,137.7,108.7,26.5 +PT1004,2026-06-16 16:00:00,76.3,97.0,36.7,134.0,110.0,25.9 +PT1004,2026-06-16 16:15:00,74.9,96.8,37.1,135.9,112.2,25.7 +PT1004,2026-06-16 16:30:00,75.5,96.8,36.7,136.8,112.2,25.6 +PT1004,2026-06-16 16:45:00,75.7,97.0,37.6,135.3,109.3,25.5 +PT1004,2026-06-16 17:00:00,77.1,96.9,36.6,136.2,110.2,26.1 +PT1004,2026-06-16 17:15:00,75.9,96.4,36.7,134.8,111.8,25.8 +PT1004,2026-06-16 17:30:00,76.1,96.5,37.3,132.8,111.0,25.9 +PT1004,2026-06-16 17:45:00,75.4,96.3,37.3,136.6,110.6,26.0 +PT1004,2026-06-16 18:00:00,73.2,96.3,36.8,133.3,110.4,26.5 +PT1004,2026-06-16 18:15:00,71.3,96.8,36.7,131.0,108.2,27.2 +PT1004,2026-06-16 18:30:00,73.3,96.9,36.8,133.6,108.4,27.6 +PT1004,2026-06-16 18:45:00,72.6,96.3,36.6,135.5,109.1,27.2 +PT1004,2026-06-16 19:00:00,72.9,96.8,37.5,135.3,108.1,26.8 +PT1004,2026-06-16 19:15:00,72.0,96.7,36.9,137.3,109.0,26.7 +PT1004,2026-06-16 19:30:00,73.8,96.4,37.0,136.9,106.8,27.2 +PT1004,2026-06-16 19:45:00,73.0,96.6,36.7,134.1,107.7,27.0 +PT1004,2026-06-16 20:00:00,71.8,96.5,36.7,133.2,105.9,27.2 +PT1004,2026-06-16 20:15:00,69.0,96.9,37.2,133.6,108.9,26.7 +PT1004,2026-06-16 20:30:00,70.1,96.9,37.3,130.7,108.5,27.0 +PT1004,2026-06-16 20:45:00,70.2,97.1,37.2,132.4,107.8,26.4 +PT1004,2026-06-16 21:00:00,69.3,97.2,36.8,135.1,108.4,26.9 +PT1004,2026-06-16 21:15:00,70.7,97.6,36.9,135.2,111.9,26.6 +PT1004,2026-06-16 21:30:00,71.5,97.6,36.9,133.7,112.8,26.7 +PT1004,2026-06-16 21:45:00,71.7,97.8,36.9,132.5,113.6,26.4 +PT1004,2026-06-16 22:00:00,73.1,98.0,37.1,128.7,113.0,26.5 +PT1004,2026-06-16 22:15:00,73.9,98.0,37.3,128.5,112.8,27.0 +PT1004,2026-06-16 22:30:00,74.4,98.1,37.4,127.4,112.3,27.4 +PT1004,2026-06-16 22:45:00,73.6,98.1,36.8,128.4,113.0,27.6 +PT1004,2026-06-16 23:00:00,72.2,98.4,37.3,131.4,110.8,27.6 +PT1004,2026-06-16 23:15:00,69.6,98.1,37.5,131.2,109.9,27.7 +PT1004,2026-06-16 23:30:00,68.6,98.1,37.9,130.5,110.1,27.7 +PT1004,2026-06-16 23:45:00,70.5,97.7,36.7,128.7,108.9,27.2 +PT1005,2026-06-14 00:00:00,65.8,98.7,37.0,123.2,83.0,12.7 +PT1005,2026-06-14 00:15:00,66.7,98.6,37.0,120.9,82.6,13.5 +PT1005,2026-06-14 00:30:00,65.6,98.7,37.6,120.3,86.8,13.2 +PT1005,2026-06-14 00:45:00,67.0,98.6,37.0,120.3,85.2,13.0 +PT1005,2026-06-14 01:00:00,67.2,98.3,37.3,120.9,85.0,13.2 +PT1005,2026-06-14 01:15:00,66.9,98.4,37.2,120.7,86.1,13.3 +PT1005,2026-06-14 01:30:00,66.8,98.7,37.0,121.5,84.1,13.1 +PT1005,2026-06-14 01:45:00,66.8,98.8,37.4,119.6,84.0,13.0 +PT1005,2026-06-14 02:00:00,65.6,98.8,36.6,118.3,86.8,13.5 +PT1005,2026-06-14 02:15:00,64.6,99.0,37.4,119.2,87.5,13.6 +PT1005,2026-06-14 02:30:00,65.5,98.9,36.5,116.8,84.9,13.5 +PT1005,2026-06-14 02:45:00,65.8,98.8,36.6,120.7,85.4,13.5 +PT1005,2026-06-14 03:00:00,64.3,99.0,37.2,120.0,89.2,13.5 +PT1005,2026-06-14 03:15:00,62.8,99.2,37.1,118.2,90.0,13.8 +PT1005,2026-06-14 03:30:00,64.9,99.1,37.1,121.5,88.1,14.1 +PT1005,2026-06-14 03:45:00,64.0,98.7,37.3,121.0,87.6,14.2 +PT1005,2026-06-14 04:00:00,63.1,99.1,37.0,119.9,88.5,14.2 +PT1005,2026-06-14 04:15:00,63.1,98.9,37.0,119.2,86.5,14.0 +PT1005,2026-06-14 04:30:00,64.2,98.8,36.9,118.3,86.9,14.1 +PT1005,2026-06-14 04:45:00,64.7,98.7,37.0,117.1,86.1,14.5 +PT1005,2026-06-14 05:00:00,65.0,98.4,37.0,119.3,85.2,14.6 +PT1005,2026-06-14 05:15:00,65.4,98.5,37.1,119.0,82.4,15.0 +PT1005,2026-06-14 05:30:00,65.9,98.7,37.2,118.1,83.2,14.7 +PT1005,2026-06-14 05:45:00,65.9,98.6,37.2,118.2,81.6,14.9 +PT1005,2026-06-14 06:00:00,66.3,99.0,37.6,118.0,81.6,14.4 +PT1005,2026-06-14 06:15:00,64.5,99.0,37.4,116.8,81.7,13.9 +PT1005,2026-06-14 06:30:00,63.4,99.3,36.9,114.9,83.1,13.5 +PT1005,2026-06-14 06:45:00,63.4,99.1,37.1,113.2,81.9,13.7 +PT1005,2026-06-14 07:00:00,63.5,99.0,37.0,114.3,83.5,13.9 +PT1005,2026-06-14 07:15:00,62.0,98.5,37.5,114.1,80.5,13.8 +PT1005,2026-06-14 07:30:00,60.7,98.2,37.5,115.4,76.3,14.0 +PT1005,2026-06-14 07:45:00,59.6,98.0,36.8,116.6,74.5,14.3 +PT1005,2026-06-14 08:00:00,61.8,98.1,37.2,116.7,77.1,14.7 +PT1005,2026-06-14 08:15:00,59.6,98.0,36.8,118.9,75.1,14.4 +PT1005,2026-06-14 08:30:00,60.1,98.2,36.8,120.8,73.9,14.6 +PT1005,2026-06-14 08:45:00,59.9,98.3,37.5,122.9,70.6,14.6 +PT1005,2026-06-14 09:00:00,60.2,98.4,37.1,121.8,72.7,14.4 +PT1005,2026-06-14 09:15:00,59.6,98.4,37.2,124.6,71.3,14.4 +PT1005,2026-06-14 09:30:00,58.7,98.4,37.2,128.3,68.7,14.3 +PT1005,2026-06-14 09:45:00,58.3,99.1,37.2,129.4,67.1,13.3 +PT1005,2026-06-14 10:00:00,57.4,99.4,37.4,128.9,66.3,13.1 +PT1005,2026-06-14 10:15:00,58.0,99.9,37.3,128.4,67.6,13.5 +PT1005,2026-06-14 10:30:00,57.4,100.0,36.5,128.3,67.4,13.1 +PT1005,2026-06-14 10:45:00,58.9,100.0,37.3,125.6,68.5,13.6 +PT1005,2026-06-14 11:00:00,57.9,99.8,37.9,124.5,69.7,13.8 +PT1005,2026-06-14 11:15:00,56.0,99.8,37.5,120.6,70.6,14.3 +PT1005,2026-06-14 11:30:00,56.2,99.3,37.0,120.5,71.3,13.9 +PT1005,2026-06-14 11:45:00,54.8,99.2,36.9,122.3,72.3,13.3 +PT1005,2026-06-14 12:00:00,54.9,99.2,36.3,121.0,73.0,13.3 +PT1005,2026-06-14 12:15:00,54.3,99.1,37.2,122.4,74.1,12.6 +PT1005,2026-06-14 12:30:00,54.2,99.1,37.1,121.1,74.0,13.1 +PT1005,2026-06-14 12:45:00,54.2,99.0,36.7,123.2,72.1,12.8 +PT1005,2026-06-14 13:00:00,54.5,99.3,37.2,122.6,70.5,13.4 +PT1005,2026-06-14 13:15:00,54.9,99.2,37.0,123.9,70.8,13.2 +PT1005,2026-06-14 13:30:00,53.8,98.9,37.4,123.3,72.6,12.8 +PT1005,2026-06-14 13:45:00,52.9,98.5,36.6,124.4,75.0,12.5 +PT1005,2026-06-14 14:00:00,53.5,98.3,37.3,125.5,76.7,12.6 +PT1005,2026-06-14 14:15:00,54.5,98.5,37.2,125.6,77.9,12.7 +PT1005,2026-06-14 14:30:00,58.2,98.6,37.0,122.6,77.6,12.5 +PT1005,2026-06-14 14:45:00,59.4,98.8,36.9,122.4,75.5,12.6 +PT1005,2026-06-14 15:00:00,59.7,98.8,36.7,124.8,75.9,12.4 +PT1005,2026-06-14 15:15:00,59.7,98.8,36.9,124.3,77.1,11.8 +PT1005,2026-06-14 15:30:00,59.8,98.7,37.1,123.6,77.0,12.1 +PT1005,2026-06-14 15:45:00,57.4,98.5,37.4,124.6,78.2,12.4 +PT1005,2026-06-14 16:00:00,57.6,98.6,36.9,122.5,74.9,11.8 +PT1005,2026-06-14 16:15:00,56.0,98.5,37.1,121.6,76.3,11.5 +PT1005,2026-06-14 16:30:00,55.6,98.3,37.5,120.2,73.2,11.8 +PT1005,2026-06-14 16:45:00,55.3,98.3,37.2,119.6,72.0,12.0 +PT1005,2026-06-14 17:00:00,51.9,98.0,37.2,115.5,74.3,12.0 +PT1005,2026-06-14 17:15:00,51.5,98.3,37.2,117.2,74.0,12.7 +PT1005,2026-06-14 17:30:00,49.8,98.3,37.6,118.2,73.8,12.5 +PT1005,2026-06-14 17:45:00,48.5,97.6,37.0,121.5,72.0,12.4 +PT1005,2026-06-14 18:00:00,50.1,98.0,37.1,118.9,74.0,12.9 +PT1005,2026-06-14 18:15:00,51.3,98.3,36.6,118.4,73.8,13.1 +PT1005,2026-06-14 18:30:00,50.9,98.0,37.0,121.2,73.2,13.3 +PT1005,2026-06-14 18:45:00,50.6,98.0,37.0,119.8,72.9,13.2 +PT1005,2026-06-14 19:00:00,51.2,97.9,37.3,123.0,73.9,12.6 +PT1005,2026-06-14 19:15:00,50.4,98.0,36.7,121.5,70.6,12.6 +PT1005,2026-06-14 19:30:00,51.0,98.0,36.9,120.3,73.3,12.1 +PT1005,2026-06-14 19:45:00,49.7,98.5,36.9,123.0,71.2,11.8 +PT1005,2026-06-14 20:00:00,49.2,98.3,36.6,121.8,72.7,12.6 +PT1005,2026-06-14 20:15:00,48.0,98.3,37.3,118.6,73.0,12.8 +PT1005,2026-06-14 20:30:00,48.7,98.2,37.6,118.3,71.3,13.0 +PT1005,2026-06-14 20:45:00,49.3,98.0,37.3,120.3,74.8,13.1 +PT1005,2026-06-14 21:00:00,50.2,97.6,37.3,119.4,74.1,13.4 +PT1005,2026-06-14 21:15:00,50.2,97.5,36.8,116.1,74.0,13.0 +PT1005,2026-06-14 21:30:00,51.4,97.7,37.4,115.1,71.7,12.7 +PT1005,2026-06-14 21:45:00,52.0,97.6,37.7,115.2,68.6,11.8 +PT1005,2026-06-14 22:00:00,52.7,97.6,36.8,114.4,65.9,12.2 +PT1005,2026-06-14 22:15:00,53.6,97.6,37.2,114.3,64.0,11.7 +PT1005,2026-06-14 22:30:00,53.7,97.7,37.0,114.9,61.1,12.1 +PT1005,2026-06-14 22:45:00,55.2,97.2,36.9,116.0,61.9,11.5 +PT1005,2026-06-14 23:00:00,54.0,97.4,37.3,116.6,64.3,11.6 +PT1005,2026-06-14 23:15:00,55.5,97.5,37.3,115.9,63.4,11.6 +PT1005,2026-06-14 23:30:00,54.6,97.7,37.1,116.5,61.6,11.8 +PT1005,2026-06-14 23:45:00,54.0,97.7,36.6,115.5,61.9,11.8 +PT1005,2026-06-15 00:00:00,53.9,97.6,36.9,116.8,63.3,11.6 +PT1005,2026-06-15 00:15:00,51.9,97.4,37.2,116.1,61.2,11.9 +PT1005,2026-06-15 00:30:00,51.9,97.4,37.0,116.7,62.2,12.2 +PT1005,2026-06-15 00:45:00,51.8,97.5,37.2,116.4,63.5,12.7 +PT1005,2026-06-15 01:00:00,50.7,97.6,36.9,117.1,62.0,12.9 +PT1005,2026-06-15 01:15:00,51.7,97.8,36.7,117.6,62.1,12.0 +PT1005,2026-06-15 01:30:00,51.6,98.1,37.1,118.7,64.8,12.1 +PT1005,2026-06-15 01:45:00,53.4,98.1,36.9,116.7,65.3,12.5 +PT1005,2026-06-15 02:00:00,54.2,98.1,37.1,117.6,65.7,12.3 +PT1005,2026-06-15 02:15:00,53.8,98.1,37.2,115.9,64.8,12.2 +PT1005,2026-06-15 02:30:00,52.2,98.1,37.2,114.5,64.2,11.9 +PT1005,2026-06-15 02:45:00,52.1,98.3,37.0,115.3,61.9,11.5 +PT1005,2026-06-15 03:00:00,52.1,98.1,37.2,117.9,63.2,10.9 +PT1005,2026-06-15 03:15:00,52.1,98.4,37.2,114.8,66.3,10.5 +PT1005,2026-06-15 03:30:00,51.4,98.3,37.0,111.4,68.1,10.4 +PT1005,2026-06-15 03:45:00,54.3,98.5,37.3,110.1,67.2,10.5 +PT1005,2026-06-15 04:00:00,56.4,98.1,37.0,111.5,68.5,10.2 +PT1005,2026-06-15 04:15:00,54.5,98.0,36.8,112.0,70.9,10.9 +PT1005,2026-06-15 04:30:00,56.3,97.5,37.1,110.8,70.4,11.0 +PT1005,2026-06-15 04:45:00,56.8,97.5,37.4,112.8,71.5,10.9 +PT1005,2026-06-15 05:00:00,59.4,97.3,36.9,116.1,70.6,11.4 +PT1005,2026-06-15 05:15:00,60.3,97.4,36.7,112.5,73.5,11.1 +PT1005,2026-06-15 05:30:00,59.6,98.0,36.8,110.0,73.8,10.6 +PT1005,2026-06-15 05:45:00,57.7,98.1,37.4,109.7,72.1,11.0 +PT1005,2026-06-15 06:00:00,58.2,98.4,36.6,109.0,72.5,10.8 +PT1005,2026-06-15 06:15:00,58.5,98.4,37.0,108.9,73.1,11.4 +PT1005,2026-06-15 06:30:00,57.4,98.4,36.8,108.7,74.6,11.4 +PT1005,2026-06-15 06:45:00,58.4,98.5,37.0,108.9,76.0,11.9 +PT1005,2026-06-15 07:00:00,57.4,98.5,37.1,110.0,75.8,11.5 +PT1005,2026-06-15 07:15:00,55.0,98.5,37.0,111.7,77.2,10.0 +PT1005,2026-06-15 07:30:00,55.7,98.2,37.6,110.9,79.0,9.8 +PT1005,2026-06-15 07:45:00,54.9,98.5,36.7,111.0,77.7,10.4 +PT1005,2026-06-15 08:00:00,54.0,98.6,36.7,111.1,78.1,10.2 +PT1005,2026-06-15 08:15:00,53.3,99.0,36.9,108.5,80.6,10.3 +PT1005,2026-06-15 08:30:00,50.9,98.5,37.6,107.8,79.9,10.4 +PT1005,2026-06-15 08:45:00,51.7,98.5,36.9,110.2,80.1,11.0 +PT1005,2026-06-15 09:00:00,50.4,98.0,37.4,110.0,78.2,10.5 +PT1005,2026-06-15 09:15:00,48.4,98.0,36.9,109.8,78.4,11.1 +PT1005,2026-06-15 09:30:00,50.1,97.6,37.1,111.1,80.6,9.5 +PT1005,2026-06-15 09:45:00,50.1,97.6,37.1,114.5,79.4,9.0 +PT1005,2026-06-15 10:00:00,51.5,97.8,37.3,114.6,79.1,8.2 +PT1005,2026-06-15 10:15:00,52.4,97.6,37.0,113.7,77.5,8.5 +PT1005,2026-06-15 10:30:00,52.3,97.7,37.2,114.3,78.4,8.6 +PT1005,2026-06-15 10:45:00,52.6,97.9,37.0,115.3,76.5,8.4 +PT1005,2026-06-15 11:00:00,53.2,98.3,37.5,113.7,77.8,8.1 +PT1005,2026-06-15 11:15:00,55.6,97.8,36.6,113.1,74.3,8.0 +PT1005,2026-06-15 11:30:00,56.4,98.0,37.1,114.7,75.2,8.2 +PT1005,2026-06-15 11:45:00,56.3,98.2,36.7,114.7,76.0,8.0 +PT1005,2026-06-15 12:00:00,57.5,98.0,37.0,111.9,77.0,8.0 +PT1005,2026-06-15 12:15:00,59.3,98.4,37.4,111.5,78.1,8.0 +PT1005,2026-06-15 12:30:00,58.1,98.0,37.3,107.9,75.3,8.4 +PT1005,2026-06-15 12:45:00,57.2,98.2,37.1,106.8,75.8,8.2 +PT1005,2026-06-15 13:00:00,56.1,98.1,36.6,107.8,76.8,8.1 +PT1005,2026-06-15 13:15:00,59.1,98.1,37.5,108.5,74.9,8.6 +PT1005,2026-06-15 13:30:00,57.1,98.0,36.7,108.1,78.5,9.1 +PT1005,2026-06-15 13:45:00,56.3,97.8,37.3,108.9,80.9,9.2 +PT1005,2026-06-15 14:00:00,55.6,98.0,37.1,107.9,78.4,9.4 +PT1005,2026-06-15 14:15:00,54.3,98.4,37.6,106.4,79.3,9.2 +PT1005,2026-06-15 14:30:00,54.1,98.0,37.3,108.0,81.6,9.0 +PT1005,2026-06-15 14:45:00,54.3,97.9,37.2,109.7,80.4,9.1 +PT1005,2026-06-15 15:00:00,54.6,97.7,37.5,113.8,82.3,9.4 +PT1005,2026-06-15 15:15:00,54.7,97.6,36.9,111.6,81.3,9.0 +PT1005,2026-06-15 15:30:00,55.1,97.8,37.4,113.4,79.5,9.3 +PT1005,2026-06-15 15:45:00,54.9,98.1,36.9,115.1,77.6,10.2 +PT1005,2026-06-15 16:00:00,56.1,98.4,36.7,112.7,77.9,10.6 +PT1005,2026-06-15 16:15:00,56.3,98.6,37.5,114.8,77.3,11.2 +PT1005,2026-06-15 16:30:00,56.6,98.5,37.1,112.5,77.8,11.8 +PT1005,2026-06-15 16:45:00,55.6,98.7,37.0,112.8,78.6,11.5 +PT1005,2026-06-15 17:00:00,55.0,98.8,37.2,112.1,79.5,11.3 +PT1005,2026-06-15 17:15:00,55.9,98.9,37.2,114.0,78.8,11.6 +PT1005,2026-06-15 17:30:00,55.0,98.4,37.0,110.6,75.5,11.7 +PT1005,2026-06-15 17:45:00,55.2,98.4,37.1,111.8,76.4,11.8 +PT1005,2026-06-15 18:00:00,55.4,98.7,37.4,107.8,75.4,12.1 +PT1005,2026-06-15 18:15:00,56.0,98.7,37.5,111.5,75.7,12.1 +PT1005,2026-06-15 18:30:00,56.6,98.9,36.4,113.6,75.1,12.8 +PT1005,2026-06-15 18:45:00,54.2,98.7,37.1,112.7,75.6,12.6 +PT1005,2026-06-15 19:00:00,54.1,99.2,36.9,111.1,73.1,13.0 +PT1005,2026-06-15 19:15:00,54.0,99.1,37.5,112.6,71.0,11.9 +PT1005,2026-06-15 19:30:00,54.4,99.3,37.3,115.1,69.7,11.9 +PT1005,2026-06-15 19:45:00,54.3,99.3,37.3,114.7,71.3,11.8 +PT1005,2026-06-15 20:00:00,54.8,99.0,37.4,115.3,69.0,12.0 +PT1005,2026-06-15 20:15:00,56.2,98.8,36.5,114.2,69.4,11.8 +PT1005,2026-06-15 20:30:00,55.6,98.8,37.3,116.4,72.0,11.8 +PT1005,2026-06-15 20:45:00,56.8,98.3,37.3,114.3,72.1,12.4 +PT1005,2026-06-15 21:00:00,57.2,98.3,36.9,115.2,71.2,12.1 +PT1005,2026-06-15 21:15:00,58.9,98.1,37.2,114.4,71.9,11.8 +PT1005,2026-06-15 21:30:00,59.2,97.9,37.2,113.9,70.5,12.3 +PT1005,2026-06-15 21:45:00,58.0,98.0,36.8,114.2,67.1,12.9 +PT1005,2026-06-15 22:00:00,60.5,98.2,37.0,112.0,66.7,13.2 +PT1005,2026-06-15 22:15:00,61.9,98.1,36.8,111.8,68.1,13.5 +PT1005,2026-06-15 22:30:00,62.5,98.1,37.0,110.0,66.0,12.7 +PT1005,2026-06-15 22:45:00,62.4,98.2,36.9,111.6,65.4,12.7 +PT1005,2026-06-15 23:00:00,62.6,98.5,37.5,111.8,67.1,13.1 +PT1005,2026-06-15 23:15:00,62.7,98.4,36.9,113.1,66.6,13.3 +PT1005,2026-06-15 23:30:00,61.8,98.7,37.1,111.0,68.1,13.5 +PT1005,2026-06-15 23:45:00,59.5,99.0,36.9,109.2,69.5,13.3 +PT1005,2026-06-16 00:00:00,60.3,99.2,37.1,106.9,71.7,13.2 +PT1005,2026-06-16 00:15:00,60.0,98.9,37.4,108.3,72.1,12.8 +PT1005,2026-06-16 00:30:00,60.1,98.9,36.7,111.9,69.7,12.2 +PT1005,2026-06-16 00:45:00,60.6,98.8,37.7,111.3,68.3,12.9 +PT1005,2026-06-16 01:00:00,61.7,98.4,37.4,110.4,69.5,12.8 +PT1005,2026-06-16 01:15:00,63.2,98.9,36.5,109.1,69.7,12.7 +PT1005,2026-06-16 01:30:00,64.1,99.1,37.3,108.0,67.3,12.5 +PT1005,2026-06-16 01:45:00,65.7,98.9,36.7,110.2,68.2,12.7 +PT1005,2026-06-16 02:00:00,64.2,98.7,37.3,109.5,70.9,12.4 +PT1005,2026-06-16 02:15:00,63.6,98.8,37.0,109.4,71.2,12.6 +PT1005,2026-06-16 02:30:00,64.1,99.1,37.0,107.9,72.9,12.5 +PT1005,2026-06-16 02:45:00,64.9,99.0,37.2,108.5,73.3,11.6 +PT1005,2026-06-16 03:00:00,63.2,98.7,36.8,109.3,74.1,12.1 +PT1005,2026-06-16 03:15:00,62.3,98.8,37.6,111.7,74.4,11.8 +PT1005,2026-06-16 03:30:00,62.0,98.7,36.9,108.8,75.5,12.1 +PT1005,2026-06-16 03:45:00,64.2,98.6,37.3,110.1,75.8,11.3 +PT1005,2026-06-16 04:00:00,64.7,98.2,36.6,113.1,76.5,11.8 +PT1005,2026-06-16 04:15:00,64.2,98.5,36.5,110.0,75.9,11.9 +PT1005,2026-06-16 04:30:00,62.6,98.8,37.8,110.1,77.7,12.0 +PT1005,2026-06-16 04:45:00,63.2,99.1,37.3,109.6,78.0,12.3 +PT1005,2026-06-16 05:00:00,63.2,99.1,37.2,110.6,78.7,11.9 +PT1005,2026-06-16 05:15:00,63.6,98.9,37.1,112.5,79.4,12.8 +PT1005,2026-06-16 05:30:00,64.9,99.0,36.8,116.3,77.9,12.6 +PT1005,2026-06-16 05:45:00,64.8,98.7,37.3,113.2,74.7,11.7 +PT1005,2026-06-16 06:00:00,64.3,98.4,37.6,111.9,73.9,11.3 +PT1005,2026-06-16 06:15:00,66.0,98.8,36.8,112.3,74.3,11.1 +PT1005,2026-06-16 06:30:00,66.0,99.0,37.3,114.7,73.5,10.6 +PT1005,2026-06-16 06:45:00,63.9,99.0,37.0,114.9,73.0,10.0 +PT1005,2026-06-16 07:00:00,65.8,99.1,37.1,117.2,71.1,10.1 +PT1005,2026-06-16 07:15:00,66.0,99.3,37.4,117.5,69.3,10.3 +PT1005,2026-06-16 07:30:00,67.6,99.6,37.0,118.4,67.6,9.7 +PT1005,2026-06-16 07:45:00,68.6,99.8,37.3,119.0,67.6,10.5 +PT1005,2026-06-16 08:00:00,68.5,99.6,37.2,117.0,65.9,10.0 +PT1005,2026-06-16 08:15:00,68.5,99.6,36.9,118.4,68.6,9.7 +PT1005,2026-06-16 08:30:00,65.8,99.5,36.9,118.2,70.0,9.7 +PT1005,2026-06-16 08:45:00,66.1,99.7,37.3,114.9,71.5,10.2 +PT1005,2026-06-16 09:00:00,64.9,99.6,37.1,117.3,70.0,10.5 +PT1005,2026-06-16 09:15:00,65.1,99.4,37.1,118.0,70.4,9.9 +PT1005,2026-06-16 09:30:00,65.9,99.3,37.0,113.1,70.2,10.4 +PT1005,2026-06-16 09:45:00,67.6,99.1,37.2,110.7,70.2,10.1 +PT1005,2026-06-16 10:00:00,67.1,99.4,37.4,109.9,70.4,10.4 +PT1005,2026-06-16 10:15:00,68.9,99.4,37.2,109.1,67.5,11.2 +PT1005,2026-06-16 10:30:00,69.8,99.5,37.0,109.2,68.0,10.9 +PT1005,2026-06-16 10:45:00,68.6,99.9,36.7,110.3,71.0,11.9 +PT1005,2026-06-16 11:00:00,69.8,99.6,36.9,110.6,71.4,11.3 +PT1005,2026-06-16 11:15:00,70.2,99.6,36.7,108.6,70.4,10.7 +PT1005,2026-06-16 11:30:00,69.7,99.8,37.2,110.8,73.1,10.9 +PT1005,2026-06-16 11:45:00,70.3,100.0,37.4,107.6,76.0,10.1 +PT1005,2026-06-16 12:00:00,70.4,99.7,36.7,108.7,75.8,9.9 +PT1005,2026-06-16 12:15:00,68.6,99.5,36.8,107.9,74.0,9.9 +PT1005,2026-06-16 12:30:00,69.0,99.8,37.5,108.5,73.8,9.7 +PT1005,2026-06-16 12:45:00,68.8,100.0,36.9,106.1,74.3,10.2 +PT1005,2026-06-16 13:00:00,68.5,100.0,37.0,106.9,75.1,10.7 +PT1005,2026-06-16 13:15:00,70.2,99.6,36.7,109.0,76.8,10.4 +PT1005,2026-06-16 13:30:00,69.9,99.7,36.7,108.4,77.6,11.2 +PT1005,2026-06-16 13:45:00,67.5,99.6,37.1,107.0,76.9,11.7 +PT1005,2026-06-16 14:00:00,67.5,99.5,37.2,106.9,77.3,12.8 +PT1005,2026-06-16 14:15:00,68.9,99.6,37.3,102.9,76.4,12.9 +PT1005,2026-06-16 14:30:00,69.1,99.8,36.8,99.9,76.5,13.4 +PT1005,2026-06-16 14:45:00,70.4,100.0,37.0,97.5,77.0,13.5 +PT1005,2026-06-16 15:00:00,68.6,99.9,36.8,97.2,74.5,13.0 +PT1005,2026-06-16 15:15:00,67.3,100.0,37.4,99.0,74.0,13.3 +PT1005,2026-06-16 15:30:00,67.2,100.0,37.2,98.5,72.3,13.0 +PT1005,2026-06-16 15:45:00,67.0,100.0,37.1,94.8,69.8,12.4 +PT1005,2026-06-16 16:00:00,65.4,100.0,36.9,96.3,72.1,12.9 +PT1005,2026-06-16 16:15:00,63.4,99.8,36.9,98.2,71.5,12.9 +PT1005,2026-06-16 16:30:00,65.3,99.6,36.9,98.4,73.2,13.7 +PT1005,2026-06-16 16:45:00,66.4,99.4,37.3,101.1,75.8,13.3 +PT1005,2026-06-16 17:00:00,67.8,99.3,36.5,102.2,76.7,14.1 +PT1005,2026-06-16 17:15:00,67.7,99.0,36.8,102.2,75.5,14.0 +PT1005,2026-06-16 17:30:00,67.9,99.3,37.7,101.5,77.7,14.4 +PT1005,2026-06-16 17:45:00,68.4,99.3,37.1,98.3,76.5,14.3 +PT1005,2026-06-16 18:00:00,71.2,99.2,37.0,94.8,77.5,14.6 +PT1005,2026-06-16 18:15:00,73.7,98.7,37.8,97.3,77.0,14.2 +PT1005,2026-06-16 18:30:00,74.5,98.7,37.5,96.6,77.5,14.0 +PT1005,2026-06-16 18:45:00,74.6,98.9,37.6,97.1,78.8,14.6 +PT1005,2026-06-16 19:00:00,75.2,98.7,36.9,96.7,78.7,14.3 +PT1005,2026-06-16 19:15:00,75.3,98.5,37.2,94.4,76.2,14.5 +PT1005,2026-06-16 19:30:00,74.9,98.7,36.9,92.4,76.8,14.5 +PT1005,2026-06-16 19:45:00,74.2,98.6,36.9,92.9,77.6,14.4 +PT1005,2026-06-16 20:00:00,74.4,98.2,37.0,92.9,80.0,14.1 +PT1005,2026-06-16 20:15:00,75.6,98.4,37.2,93.1,79.9,13.6 +PT1005,2026-06-16 20:30:00,73.9,97.8,36.9,95.1,80.5,13.9 +PT1005,2026-06-16 20:45:00,74.4,97.7,36.9,94.4,81.9,13.9 +PT1005,2026-06-16 21:00:00,72.7,97.8,36.8,96.5,80.8,14.2 +PT1005,2026-06-16 21:15:00,73.6,97.8,36.9,97.1,79.7,14.3 +PT1005,2026-06-16 21:30:00,73.1,97.5,37.3,95.5,78.9,14.4 +PT1005,2026-06-16 21:45:00,72.3,97.4,36.6,98.9,79.1,14.2 +PT1005,2026-06-16 22:00:00,71.2,97.2,37.2,102.9,77.9,14.2 +PT1005,2026-06-16 22:15:00,72.5,97.2,36.9,101.8,77.0,14.4 +PT1005,2026-06-16 22:30:00,71.2,97.1,37.6,99.2,79.8,14.6 +PT1005,2026-06-16 22:45:00,71.7,97.5,36.8,99.9,80.9,13.8 +PT1005,2026-06-16 23:00:00,71.8,97.5,37.4,99.8,81.5,14.0 +PT1005,2026-06-16 23:15:00,72.5,97.8,37.5,102.2,81.8,14.8 +PT1005,2026-06-16 23:30:00,71.5,97.9,36.8,98.5,79.3,14.6 +PT1005,2026-06-16 23:45:00,70.9,98.0,36.8,101.0,81.0,14.8 +PT1006,2026-06-14 00:00:00,94.3,95.4,37.1,133.3,80.1,20.2 +PT1006,2026-06-14 00:15:00,94.1,95.6,37.2,135.5,82.8,19.9 +PT1006,2026-06-14 00:30:00,94.1,95.7,36.8,133.3,80.7,19.9 +PT1006,2026-06-14 00:45:00,95.2,95.3,37.6,130.4,80.0,19.3 +PT1006,2026-06-14 01:00:00,95.0,95.2,37.1,131.4,81.4,19.4 +PT1006,2026-06-14 01:15:00,93.8,95.3,37.2,134.2,81.0,19.0 +PT1006,2026-06-14 01:30:00,93.8,95.0,36.9,133.2,83.7,18.5 +PT1006,2026-06-14 01:45:00,92.7,94.8,37.2,132.3,84.4,19.0 +PT1006,2026-06-14 02:00:00,91.9,95.2,37.1,128.2,85.4,18.6 +PT1006,2026-06-14 02:15:00,92.6,94.8,37.9,128.4,85.7,19.2 +PT1006,2026-06-14 02:30:00,90.7,95.2,36.7,128.4,84.5,19.4 +PT1006,2026-06-14 02:45:00,89.3,94.7,37.6,129.5,85.0,19.0 +PT1006,2026-06-14 03:00:00,88.5,95.1,36.7,129.7,84.0,19.0 +PT1006,2026-06-14 03:15:00,88.8,95.1,36.7,130.8,85.3,19.0 +PT1006,2026-06-14 03:30:00,89.9,95.1,37.0,127.0,85.8,19.2 +PT1006,2026-06-14 03:45:00,89.7,94.9,37.6,127.8,86.0,18.8 +PT1006,2026-06-14 04:00:00,89.0,94.2,36.6,126.9,87.5,18.7 +PT1006,2026-06-14 04:15:00,87.8,94.0,37.1,125.7,87.1,18.9 +PT1006,2026-06-14 04:30:00,88.0,94.4,36.9,127.4,88.3,18.2 +PT1006,2026-06-14 04:45:00,86.1,94.2,37.3,129.0,87.7,18.6 +PT1006,2026-06-14 05:00:00,86.2,94.5,37.3,131.7,88.4,18.7 +PT1006,2026-06-14 05:15:00,84.6,94.5,37.4,131.7,87.8,18.4 +PT1006,2026-06-14 05:30:00,84.8,94.6,37.5,134.5,87.5,18.3 +PT1006,2026-06-14 05:45:00,83.1,94.6,37.3,133.1,88.0,18.5 +PT1006,2026-06-14 06:00:00,84.4,94.5,36.7,132.7,88.8,18.8 +PT1006,2026-06-14 06:15:00,84.8,94.4,36.8,132.9,88.2,18.6 +PT1006,2026-06-14 06:30:00,84.7,94.5,37.2,131.7,90.0,19.5 +PT1006,2026-06-14 06:45:00,84.7,94.3,37.5,132.4,92.2,20.3 +PT1006,2026-06-14 07:00:00,85.8,94.4,37.1,130.3,92.1,20.2 +PT1006,2026-06-14 07:15:00,84.9,94.6,37.2,129.8,91.6,19.9 +PT1006,2026-06-14 07:30:00,86.8,94.6,37.3,130.3,94.5,20.4 +PT1006,2026-06-14 07:45:00,87.5,94.4,36.8,128.9,94.7,20.5 +PT1006,2026-06-14 08:00:00,88.4,94.4,36.8,131.2,94.6,20.4 +PT1006,2026-06-14 08:15:00,87.4,94.7,36.7,131.7,95.2,21.1 +PT1006,2026-06-14 08:30:00,88.3,94.3,36.5,130.8,93.5,21.4 +PT1006,2026-06-14 08:45:00,88.0,94.0,37.0,129.1,92.4,21.9 +PT1006,2026-06-14 09:00:00,90.1,94.5,37.2,133.4,92.3,22.0 +PT1006,2026-06-14 09:15:00,89.7,94.6,37.0,131.5,89.5,22.3 +PT1006,2026-06-14 09:30:00,88.6,94.4,36.7,134.5,90.2,21.7 +PT1006,2026-06-14 09:45:00,88.2,94.5,37.1,132.9,89.9,21.8 +PT1006,2026-06-14 10:00:00,85.4,94.6,36.8,129.5,89.5,21.6 +PT1006,2026-06-14 10:15:00,86.5,94.3,36.9,128.4,90.8,21.3 +PT1006,2026-06-14 10:30:00,86.2,94.5,37.0,131.3,89.4,21.0 +PT1006,2026-06-14 10:45:00,86.5,94.3,37.3,132.7,88.1,20.2 +PT1006,2026-06-14 11:00:00,87.3,94.5,37.6,128.7,87.1,20.1 +PT1006,2026-06-14 11:15:00,87.2,94.2,37.3,129.3,89.0,20.6 +PT1006,2026-06-14 11:30:00,87.5,93.7,37.3,129.3,89.3,20.5 +PT1006,2026-06-14 11:45:00,87.3,93.6,37.4,131.4,88.7,20.5 +PT1006,2026-06-14 12:00:00,86.2,93.3,36.6,134.1,87.8,20.8 +PT1006,2026-06-14 12:15:00,83.2,93.4,36.7,133.9,88.3,21.6 +PT1006,2026-06-14 12:30:00,83.3,93.8,37.8,131.7,87.5,20.8 +PT1006,2026-06-14 12:45:00,80.7,94.0,36.9,129.1,85.9,21.3 +PT1006,2026-06-14 13:00:00,81.6,94.3,37.1,129.5,87.2,21.3 +PT1006,2026-06-14 13:15:00,80.9,94.8,36.9,130.9,88.0,21.6 +PT1006,2026-06-14 13:30:00,82.1,95.2,36.9,128.2,88.8,21.6 +PT1006,2026-06-14 13:45:00,80.8,95.5,37.1,128.6,88.5,21.9 +PT1006,2026-06-14 14:00:00,80.1,95.5,36.7,128.5,85.8,21.6 +PT1006,2026-06-14 14:15:00,78.1,95.6,37.0,127.2,87.4,20.9 +PT1006,2026-06-14 14:30:00,77.5,95.2,37.3,127.2,85.2,21.0 +PT1006,2026-06-14 14:45:00,77.9,95.3,36.9,129.3,85.1,20.6 +PT1006,2026-06-14 15:00:00,77.3,95.1,36.9,130.8,85.9,20.0 +PT1006,2026-06-14 15:15:00,76.1,95.1,37.0,133.0,86.6,19.7 +PT1006,2026-06-14 15:30:00,74.5,94.8,37.1,134.7,88.8,19.4 +PT1006,2026-06-14 15:45:00,75.5,94.4,37.0,132.6,91.7,19.0 +PT1006,2026-06-14 16:00:00,74.8,93.9,37.1,132.8,91.7,19.1 +PT1006,2026-06-14 16:15:00,74.4,93.8,36.8,131.8,90.2,18.8 +PT1006,2026-06-14 16:30:00,75.2,93.9,37.4,131.8,93.1,18.4 +PT1006,2026-06-14 16:45:00,75.0,93.9,36.8,133.2,92.4,18.0 +PT1006,2026-06-14 17:00:00,72.5,94.1,37.3,134.3,94.8,18.1 +PT1006,2026-06-14 17:15:00,72.5,94.2,37.0,136.5,95.1,17.9 +PT1006,2026-06-14 17:30:00,73.6,94.1,37.3,138.3,97.9,18.3 +PT1006,2026-06-14 17:45:00,74.1,93.9,37.0,136.5,96.6,18.5 +PT1006,2026-06-14 18:00:00,74.1,94.0,37.0,134.9,95.9,18.6 +PT1006,2026-06-14 18:15:00,74.0,93.7,36.8,134.5,98.3,18.5 +PT1006,2026-06-14 18:30:00,75.3,93.9,36.6,134.9,96.4,18.0 +PT1006,2026-06-14 18:45:00,75.9,94.1,37.0,135.8,99.3,17.8 +PT1006,2026-06-14 19:00:00,76.1,94.1,36.6,136.8,98.3,17.2 +PT1006,2026-06-14 19:15:00,76.8,94.0,36.8,134.5,97.4,18.0 +PT1006,2026-06-14 19:30:00,77.7,94.1,37.4,137.2,97.2,17.4 +PT1006,2026-06-14 19:45:00,77.5,94.4,37.2,138.8,98.7,18.4 +PT1006,2026-06-14 20:00:00,79.4,94.3,37.2,139.9,98.0,18.5 +PT1006,2026-06-14 20:15:00,77.0,94.2,37.4,140.4,94.6,18.5 +PT1006,2026-06-14 20:30:00,78.6,94.0,37.1,143.1,96.4,17.6 +PT1006,2026-06-14 20:45:00,79.0,94.3,36.6,143.7,98.5,17.3 +PT1006,2026-06-14 21:00:00,78.3,94.7,37.4,145.5,102.0,16.8 +PT1006,2026-06-14 21:15:00,79.3,94.7,37.3,147.1,102.2,16.9 +PT1006,2026-06-14 21:30:00,80.5,94.7,36.8,150.6,101.8,17.7 +PT1006,2026-06-14 21:45:00,79.4,94.5,36.9,152.5,100.6,18.3 +PT1006,2026-06-14 22:00:00,80.0,94.6,37.0,150.5,98.5,18.4 +PT1006,2026-06-14 22:15:00,80.6,94.3,37.4,149.8,98.3,17.4 +PT1006,2026-06-14 22:30:00,79.8,94.7,37.4,148.4,97.5,16.9 +PT1006,2026-06-14 22:45:00,80.4,95.0,36.9,148.0,97.4,16.3 +PT1006,2026-06-14 23:00:00,80.7,95.1,37.0,151.6,94.7,16.4 +PT1006,2026-06-14 23:15:00,80.9,95.2,37.0,151.3,93.0,15.8 +PT1006,2026-06-14 23:30:00,79.2,95.1,37.1,150.8,89.3,16.6 +PT1006,2026-06-14 23:45:00,76.4,95.2,36.8,150.3,87.3,16.7 +PT1006,2026-06-15 00:00:00,76.7,95.0,37.1,148.5,87.3,16.1 +PT1006,2026-06-15 00:15:00,77.6,95.3,36.8,150.7,89.3,15.9 +PT1006,2026-06-15 00:30:00,78.6,95.2,37.3,150.7,90.4,16.7 +PT1006,2026-06-15 00:45:00,79.0,94.9,37.0,153.1,91.0,16.6 +PT1006,2026-06-15 01:00:00,78.6,94.9,37.0,150.1,92.9,17.0 +PT1006,2026-06-15 01:15:00,78.2,94.9,36.7,150.4,92.4,17.4 +PT1006,2026-06-15 01:30:00,77.4,95.1,36.9,151.1,91.4,17.5 +PT1006,2026-06-15 01:45:00,77.1,95.4,37.0,153.0,91.8,17.1 +PT1006,2026-06-15 02:00:00,77.3,95.8,37.5,149.4,90.5,17.6 +PT1006,2026-06-15 02:15:00,77.3,96.1,37.5,147.9,88.3,17.9 +PT1006,2026-06-15 02:30:00,78.9,95.9,37.5,148.3,89.5,18.0 +PT1006,2026-06-15 02:45:00,78.5,95.9,37.4,148.8,90.8,17.9 +PT1006,2026-06-15 03:00:00,80.5,95.8,37.3,148.5,92.2,18.7 +PT1006,2026-06-15 03:15:00,79.7,95.8,37.0,150.4,91.0,18.3 +PT1006,2026-06-15 03:30:00,80.5,95.5,37.2,149.0,91.4,18.7 +PT1006,2026-06-15 03:45:00,81.1,95.7,37.1,152.2,93.6,17.9 +PT1006,2026-06-15 04:00:00,82.2,96.1,36.9,153.5,92.4,17.6 +PT1006,2026-06-15 04:15:00,82.7,96.0,36.7,147.4,90.6,17.4 +PT1006,2026-06-15 04:30:00,81.3,96.5,37.4,147.4,90.0,17.7 +PT1006,2026-06-15 04:45:00,84.0,96.9,37.0,148.2,87.7,17.3 +PT1006,2026-06-15 05:00:00,84.7,97.0,37.1,145.3,85.2,17.4 +PT1006,2026-06-15 05:15:00,84.5,97.1,37.7,147.8,85.7,17.0 +PT1006,2026-06-15 05:30:00,84.3,97.1,36.7,146.5,84.1,16.6 +PT1006,2026-06-15 05:45:00,80.8,97.0,37.5,148.7,82.6,17.6 +PT1006,2026-06-15 06:00:00,80.8,96.7,37.0,145.5,82.4,17.7 +PT1006,2026-06-15 06:15:00,82.2,97.1,37.1,146.4,83.2,17.5 +PT1006,2026-06-15 06:30:00,82.7,97.0,36.8,147.8,81.6,17.2 +PT1006,2026-06-15 06:45:00,82.0,96.9,36.7,149.8,81.7,16.7 +PT1006,2026-06-15 07:00:00,81.6,97.1,37.0,152.6,79.3,16.9 +PT1006,2026-06-15 07:15:00,81.2,96.9,37.4,152.2,77.7,16.8 +PT1006,2026-06-15 07:30:00,82.1,97.3,36.9,153.2,77.9,17.0 +PT1006,2026-06-15 07:45:00,79.6,97.5,36.8,149.6,79.6,17.3 +PT1006,2026-06-15 08:00:00,79.2,97.5,36.7,147.8,80.4,17.5 +PT1006,2026-06-15 08:15:00,78.3,97.5,37.0,150.1,81.4,16.6 +PT1006,2026-06-15 08:30:00,78.9,97.3,36.8,148.3,80.3,16.5 +PT1006,2026-06-15 08:45:00,79.8,97.0,37.3,146.2,79.7,17.1 +PT1006,2026-06-15 09:00:00,80.6,97.1,37.4,144.4,78.7,16.8 +PT1006,2026-06-15 09:15:00,81.0,96.7,37.4,147.3,78.2,17.0 +PT1006,2026-06-15 09:30:00,78.0,96.8,37.0,146.8,74.6,16.6 +PT1006,2026-06-15 09:45:00,79.1,96.7,37.3,147.1,74.0,17.0 +PT1006,2026-06-15 10:00:00,79.4,96.4,36.9,147.3,78.2,17.3 +PT1006,2026-06-15 10:15:00,81.7,96.2,37.2,148.7,78.1,17.4 +PT1006,2026-06-15 10:30:00,81.4,96.1,36.9,146.1,76.5,17.5 +PT1006,2026-06-15 10:45:00,80.4,96.8,36.9,151.1,77.3,17.8 +PT1006,2026-06-15 11:00:00,79.1,96.7,37.7,151.1,78.4,17.1 +PT1006,2026-06-15 11:15:00,79.4,96.3,36.8,151.4,77.0,16.7 +PT1006,2026-06-15 11:30:00,79.2,96.9,37.1,151.6,78.1,17.1 +PT1006,2026-06-15 11:45:00,77.9,96.5,37.2,150.8,79.8,17.4 +PT1006,2026-06-15 12:00:00,78.4,96.4,37.6,149.8,78.7,16.9 +PT1006,2026-06-15 12:15:00,78.7,96.3,37.0,153.5,81.7,17.9 +PT1006,2026-06-15 12:30:00,78.9,96.5,36.9,156.8,81.8,17.6 +PT1006,2026-06-15 12:45:00,80.4,96.6,37.5,156.4,81.4,17.5 +PT1006,2026-06-15 13:00:00,79.6,96.3,37.3,160.1,81.5,17.5 +PT1006,2026-06-15 13:15:00,78.5,96.5,37.2,159.3,83.2,16.8 +PT1006,2026-06-15 13:30:00,78.3,96.3,37.5,160.9,83.0,17.0 +PT1006,2026-06-15 13:45:00,79.3,96.0,37.0,159.8,83.6,17.3 +PT1006,2026-06-15 14:00:00,79.6,96.1,36.4,160.4,81.9,16.8 +PT1006,2026-06-15 14:15:00,79.8,95.7,37.4,164.7,82.9,16.3 +PT1006,2026-06-15 14:30:00,81.3,96.0,37.6,163.1,83.9,16.8 +PT1006,2026-06-15 14:45:00,79.5,96.0,37.4,161.4,86.7,17.0 +PT1006,2026-06-15 15:00:00,80.1,96.1,36.9,159.7,86.1,17.0 +PT1006,2026-06-15 15:15:00,79.2,96.0,36.9,158.5,86.1,16.8 +PT1006,2026-06-15 15:30:00,78.2,96.0,37.4,160.2,87.1,16.2 +PT1006,2026-06-15 15:45:00,79.0,96.2,37.6,162.4,86.0,16.1 +PT1006,2026-06-15 16:00:00,81.2,96.2,37.2,163.6,87.0,16.8 +PT1006,2026-06-15 16:15:00,79.8,96.1,37.8,169.9,85.2,16.8 +PT1006,2026-06-15 16:30:00,78.9,95.4,37.4,164.8,84.0,16.1 +PT1006,2026-06-15 16:45:00,79.3,94.8,37.5,161.6,85.8,16.2 +PT1006,2026-06-15 17:00:00,80.7,94.6,36.7,163.4,86.7,15.4 +PT1006,2026-06-15 17:15:00,83.7,94.3,37.1,164.2,86.4,15.5 +PT1006,2026-06-15 17:30:00,85.0,94.6,36.6,164.4,85.0,15.3 +PT1006,2026-06-15 17:45:00,84.6,94.1,36.7,164.9,85.5,15.7 +PT1006,2026-06-15 18:00:00,83.3,94.5,36.8,162.1,88.6,15.3 +PT1006,2026-06-15 18:15:00,84.3,94.7,37.1,165.4,85.7,15.5 +PT1006,2026-06-15 18:30:00,83.1,95.1,36.6,165.9,85.6,15.7 +PT1006,2026-06-15 18:45:00,81.7,95.0,36.8,166.5,87.5,15.3 +PT1006,2026-06-15 19:00:00,82.3,95.0,37.1,162.7,86.2,15.3 +PT1006,2026-06-15 19:15:00,82.5,94.7,37.0,162.4,87.6,14.1 +PT1006,2026-06-15 19:30:00,80.6,94.7,36.8,159.4,87.8,14.8 +PT1006,2026-06-15 19:45:00,79.6,94.6,36.9,160.0,86.2,14.6 +PT1006,2026-06-15 20:00:00,79.2,94.7,38.0,161.1,84.0,14.8 +PT1006,2026-06-15 20:15:00,81.1,94.5,37.0,161.4,84.0,14.9 +PT1006,2026-06-15 20:30:00,80.8,94.3,37.5,163.6,84.4,15.1 +PT1006,2026-06-15 20:45:00,82.4,94.6,37.0,166.0,86.8,14.7 +PT1006,2026-06-15 21:00:00,83.3,94.4,37.1,165.3,87.1,14.6 +PT1006,2026-06-15 21:15:00,82.0,94.4,36.9,165.5,89.5,14.5 +PT1006,2026-06-15 21:30:00,82.9,93.6,37.5,164.9,88.7,14.6 +PT1006,2026-06-15 21:45:00,84.8,93.6,37.2,161.8,88.0,14.4 +PT1006,2026-06-15 22:00:00,85.0,93.5,37.6,159.3,86.7,14.1 +PT1006,2026-06-15 22:15:00,84.1,93.5,37.4,161.2,87.0,13.6 +PT1006,2026-06-15 22:30:00,84.6,93.0,37.6,163.7,88.3,13.8 +PT1006,2026-06-15 22:45:00,85.6,93.3,36.6,165.8,89.4,13.0 +PT1006,2026-06-15 23:00:00,86.7,93.6,36.7,164.4,87.7,13.1 +PT1006,2026-06-15 23:15:00,86.5,93.5,37.1,163.9,90.6,12.9 +PT1006,2026-06-15 23:30:00,85.0,93.7,37.1,163.6,92.3,11.9 +PT1006,2026-06-15 23:45:00,85.2,94.0,37.1,162.3,93.5,11.7 +PT1006,2026-06-16 00:00:00,86.4,93.7,36.9,163.8,94.0,11.6 +PT1006,2026-06-16 00:15:00,83.9,93.7,37.4,163.1,95.0,11.8 +PT1006,2026-06-16 00:30:00,85.3,94.5,37.6,164.2,93.7,12.1 +PT1006,2026-06-16 00:45:00,85.9,94.0,37.2,165.3,92.7,11.6 +PT1006,2026-06-16 01:00:00,84.1,94.3,37.0,166.7,92.6,11.4 +PT1006,2026-06-16 01:15:00,83.0,94.2,37.4,161.0,92.7,11.4 +PT1006,2026-06-16 01:30:00,83.4,94.5,37.2,162.1,94.3,12.5 +PT1006,2026-06-16 01:45:00,83.6,94.8,37.1,161.2,94.1,12.6 +PT1006,2026-06-16 02:00:00,83.8,95.0,37.0,157.8,97.2,12.8 +PT1006,2026-06-16 02:15:00,85.8,95.1,37.1,158.1,96.8,13.4 +PT1006,2026-06-16 02:30:00,85.2,95.3,37.4,160.4,99.2,13.7 +PT1006,2026-06-16 02:45:00,84.9,95.6,37.0,161.9,100.0,13.0 +PT1006,2026-06-16 03:00:00,84.9,95.7,37.0,166.7,101.3,12.7 +PT1006,2026-06-16 03:15:00,86.6,95.6,36.9,168.7,101.5,12.6 +PT1006,2026-06-16 03:30:00,83.0,95.7,37.4,166.6,99.4,12.7 +PT1006,2026-06-16 03:45:00,81.0,95.9,37.0,164.8,100.4,13.0 +PT1006,2026-06-16 04:00:00,81.1,95.8,36.7,165.4,100.7,12.6 +PT1006,2026-06-16 04:15:00,82.4,95.9,36.8,167.1,99.7,12.3 +PT1006,2026-06-16 04:30:00,82.3,95.9,37.2,166.0,102.1,12.0 +PT1006,2026-06-16 04:45:00,81.3,95.8,37.2,165.8,100.8,12.1 +PT1006,2026-06-16 05:00:00,82.7,95.5,36.8,166.2,100.7,11.3 +PT1006,2026-06-16 05:15:00,83.3,95.2,36.5,166.0,97.6,11.3 +PT1006,2026-06-16 05:30:00,82.6,95.0,36.7,166.3,97.2,10.8 +PT1006,2026-06-16 05:45:00,80.7,95.1,36.6,166.6,98.2,10.6 +PT1006,2026-06-16 06:00:00,80.4,95.1,37.1,164.3,96.6,10.8 +PT1006,2026-06-16 06:15:00,81.9,95.5,37.2,161.3,95.9,10.8 +PT1006,2026-06-16 06:30:00,83.2,95.7,37.7,163.5,96.0,10.6 +PT1006,2026-06-16 06:45:00,83.4,95.6,36.9,161.4,96.3,11.0 +PT1006,2026-06-16 07:00:00,83.3,95.7,36.9,162.3,95.9,10.8 +PT1006,2026-06-16 07:15:00,82.0,95.5,37.2,160.8,93.6,11.2 +PT1006,2026-06-16 07:30:00,82.3,95.8,37.4,162.2,92.4,11.7 +PT1006,2026-06-16 07:45:00,81.0,96.1,36.9,161.3,93.9,11.5 +PT1006,2026-06-16 08:00:00,80.5,95.8,37.9,158.3,90.1,11.1 +PT1006,2026-06-16 08:15:00,81.2,96.3,37.2,157.7,89.4,11.8 +PT1006,2026-06-16 08:30:00,80.1,96.4,36.7,160.2,87.3,12.0 +PT1006,2026-06-16 08:45:00,81.6,96.5,37.0,161.4,87.0,11.3 +PT1006,2026-06-16 09:00:00,82.8,97.0,37.4,162.0,85.9,11.5 +PT1006,2026-06-16 09:15:00,83.0,97.0,37.6,162.4,86.0,11.6 +PT1006,2026-06-16 09:30:00,80.6,96.9,37.3,160.5,87.8,11.5 +PT1006,2026-06-16 09:45:00,82.4,96.6,37.0,159.5,89.8,11.1 +PT1006,2026-06-16 10:00:00,80.6,97.0,36.9,158.3,90.3,11.4 +PT1006,2026-06-16 10:15:00,78.4,96.9,37.0,157.9,90.2,11.3 +PT1006,2026-06-16 10:30:00,77.8,97.0,37.2,156.2,90.0,11.1 +PT1006,2026-06-16 10:45:00,79.2,97.2,36.7,158.8,89.5,11.0 +PT1006,2026-06-16 11:00:00,78.9,97.2,36.7,157.6,88.6,10.3 +PT1006,2026-06-16 11:15:00,79.0,97.2,37.5,158.5,88.2,10.4 +PT1006,2026-06-16 11:30:00,79.0,97.0,36.8,156.1,89.4,9.7 +PT1006,2026-06-16 11:45:00,79.6,96.5,36.8,154.9,89.6,9.5 +PT1006,2026-06-16 12:00:00,79.0,96.7,37.3,158.6,89.8,8.7 +PT1006,2026-06-16 12:15:00,78.6,96.4,37.1,157.0,88.7,8.2 +PT1006,2026-06-16 12:30:00,80.9,96.2,37.0,160.6,89.0,8.1 +PT1006,2026-06-16 12:45:00,80.0,96.2,36.6,161.6,85.4,9.1 +PT1006,2026-06-16 13:00:00,79.4,95.6,37.2,161.1,84.7,8.9 +PT1006,2026-06-16 13:15:00,79.2,95.7,37.0,158.6,84.8,8.7 +PT1006,2026-06-16 13:30:00,79.6,95.6,37.3,158.4,83.1,9.1 +PT1006,2026-06-16 13:45:00,79.8,95.5,37.4,158.2,84.7,9.4 +PT1006,2026-06-16 14:00:00,79.5,95.6,37.2,160.6,83.3,9.0 +PT1006,2026-06-16 14:15:00,78.1,95.2,36.7,162.9,85.3,8.5 +PT1006,2026-06-16 14:30:00,77.4,95.5,37.2,162.1,85.4,8.6 +PT1006,2026-06-16 14:45:00,79.2,95.3,36.7,161.9,85.8,8.6 +PT1006,2026-06-16 15:00:00,77.5,94.9,37.1,163.3,84.6,8.8 +PT1006,2026-06-16 15:15:00,76.5,94.7,37.0,163.6,84.7,9.0 +PT1006,2026-06-16 15:30:00,75.5,94.7,37.3,166.4,81.9,8.7 +PT1006,2026-06-16 15:45:00,75.9,94.9,37.4,165.6,79.4,9.4 +PT1006,2026-06-16 16:00:00,76.0,94.7,37.1,164.6,79.8,9.3 +PT1006,2026-06-16 16:15:00,78.0,94.9,37.2,162.3,79.9,9.0 +PT1006,2026-06-16 16:30:00,78.0,95.7,37.2,163.1,79.7,9.8 +PT1006,2026-06-16 16:45:00,76.3,95.6,37.1,164.3,80.4,10.2 +PT1006,2026-06-16 17:00:00,76.5,95.3,37.9,167.4,80.0,9.8 +PT1006,2026-06-16 17:15:00,78.6,95.2,37.2,163.6,78.9,10.4 +PT1006,2026-06-16 17:30:00,77.0,95.4,37.5,163.2,77.9,10.2 +PT1006,2026-06-16 17:45:00,77.8,95.0,37.0,164.0,78.1,10.0 +PT1006,2026-06-16 18:00:00,76.8,94.8,36.9,164.5,77.7,10.2 +PT1006,2026-06-16 18:15:00,77.8,95.1,36.9,164.5,78.4,10.5 +PT1006,2026-06-16 18:30:00,78.5,94.6,37.1,159.2,78.0,10.7 +PT1006,2026-06-16 18:45:00,79.5,94.3,37.3,161.0,80.4,10.4 +PT1006,2026-06-16 19:00:00,79.6,94.4,36.7,164.2,80.9,10.8 +PT1006,2026-06-16 19:15:00,80.6,94.8,37.2,162.4,80.4,11.0 +PT1006,2026-06-16 19:30:00,79.0,94.8,37.1,161.7,78.9,11.6 +PT1006,2026-06-16 19:45:00,80.3,94.6,37.0,162.9,80.5,11.5 +PT1006,2026-06-16 20:00:00,78.8,94.3,37.1,162.0,79.1,11.2 +PT1006,2026-06-16 20:15:00,79.2,94.6,37.0,160.4,79.1,11.0 +PT1006,2026-06-16 20:30:00,78.9,94.6,36.6,160.9,78.6,11.5 +PT1006,2026-06-16 20:45:00,80.2,94.5,36.8,160.6,78.6,11.8 +PT1006,2026-06-16 21:00:00,79.5,94.6,36.8,157.2,78.6,11.5 +PT1006,2026-06-16 21:15:00,77.6,94.8,36.8,157.5,77.5,11.4 +PT1006,2026-06-16 21:30:00,77.1,94.8,37.2,157.6,78.1,10.7 +PT1006,2026-06-16 21:45:00,75.1,94.9,37.3,157.2,79.8,10.4 +PT1006,2026-06-16 22:00:00,73.8,94.9,36.9,153.1,81.1,11.1 +PT1006,2026-06-16 22:15:00,74.0,95.0,37.8,150.0,80.0,10.8 +PT1006,2026-06-16 22:30:00,75.4,95.0,36.8,151.6,80.3,11.0 +PT1006,2026-06-16 22:45:00,77.1,94.8,37.1,150.1,81.2,11.1 +PT1006,2026-06-16 23:00:00,78.2,94.5,37.7,153.8,80.4,11.1 +PT1006,2026-06-16 23:15:00,77.5,94.7,37.3,153.4,79.2,10.9 +PT1006,2026-06-16 23:30:00,78.8,94.8,36.8,150.2,80.1,10.9 +PT1006,2026-06-16 23:45:00,79.3,95.1,37.2,150.2,81.5,11.1 +PT1007,2026-06-14 00:00:00,73.6,98.0,37.4,121.8,76.2,14.9 +PT1007,2026-06-14 00:15:00,74.1,97.8,37.4,121.1,75.4,14.1 +PT1007,2026-06-14 00:30:00,77.8,98.1,37.1,121.4,74.6,13.7 +PT1007,2026-06-14 00:45:00,79.0,97.9,37.1,126.5,72.5,13.8 +PT1007,2026-06-14 01:00:00,78.9,97.8,37.6,126.7,71.9,14.3 +PT1007,2026-06-14 01:15:00,78.5,97.3,37.3,127.3,72.3,14.4 +PT1007,2026-06-14 01:30:00,80.1,97.5,36.8,128.4,73.4,14.5 +PT1007,2026-06-14 01:45:00,81.8,97.6,36.7,126.5,71.7,14.1 +PT1007,2026-06-14 02:00:00,82.6,97.5,37.3,128.0,73.5,14.5 +PT1007,2026-06-14 02:15:00,82.9,97.5,37.1,127.8,74.4,14.1 +PT1007,2026-06-14 02:30:00,81.9,97.8,36.9,129.2,77.6,13.8 +PT1007,2026-06-14 02:45:00,82.0,97.6,37.4,130.3,77.5,13.6 +PT1007,2026-06-14 03:00:00,79.7,97.7,36.4,129.2,78.7,14.0 +PT1007,2026-06-14 03:15:00,79.4,97.8,36.7,124.5,79.1,13.8 +PT1007,2026-06-14 03:30:00,78.6,97.5,37.1,123.3,79.3,14.2 +PT1007,2026-06-14 03:45:00,79.9,97.3,36.6,123.7,82.5,13.5 +PT1007,2026-06-14 04:00:00,81.4,97.3,37.1,122.4,80.8,13.5 +PT1007,2026-06-14 04:15:00,81.5,97.1,36.8,121.8,79.9,13.8 +PT1007,2026-06-14 04:30:00,81.6,97.7,36.2,119.5,78.8,13.7 +PT1007,2026-06-14 04:45:00,79.8,97.8,37.0,119.1,80.4,13.7 +PT1007,2026-06-14 05:00:00,79.0,97.7,36.7,116.7,80.2,13.3 +PT1007,2026-06-14 05:15:00,78.2,97.8,37.1,117.0,81.2,12.9 +PT1007,2026-06-14 05:30:00,80.2,98.2,37.2,114.4,79.7,13.6 +PT1007,2026-06-14 05:45:00,79.9,98.1,37.1,114.9,80.0,13.4 +PT1007,2026-06-14 06:00:00,79.2,98.1,37.1,113.4,78.1,13.9 +PT1007,2026-06-14 06:15:00,81.2,97.7,36.8,110.5,78.8,13.9 +PT1007,2026-06-14 06:30:00,82.6,97.4,36.9,112.9,78.7,13.5 +PT1007,2026-06-14 06:45:00,84.2,97.4,37.0,114.9,80.8,13.5 +PT1007,2026-06-14 07:00:00,83.6,97.5,37.2,117.9,79.0,13.5 +PT1007,2026-06-14 07:15:00,81.4,97.2,36.5,116.5,80.1,13.9 +PT1007,2026-06-14 07:30:00,82.2,97.4,37.5,117.7,80.4,14.3 +PT1007,2026-06-14 07:45:00,80.2,97.4,37.2,117.2,79.5,14.1 +PT1007,2026-06-14 08:00:00,78.6,97.5,36.9,116.4,80.8,13.9 +PT1007,2026-06-14 08:15:00,77.4,97.4,37.2,114.8,81.5,14.3 +PT1007,2026-06-14 08:30:00,77.3,97.5,37.4,114.7,81.5,14.2 +PT1007,2026-06-14 08:45:00,74.2,97.0,36.9,116.8,81.2,14.5 +PT1007,2026-06-14 09:00:00,76.2,96.9,36.6,117.7,80.5,14.2 +PT1007,2026-06-14 09:15:00,77.1,97.0,37.1,117.9,78.8,14.7 +PT1007,2026-06-14 09:30:00,78.0,97.0,37.0,115.7,80.3,14.9 +PT1007,2026-06-14 09:45:00,78.5,97.3,37.3,117.0,77.8,14.3 +PT1007,2026-06-14 10:00:00,77.6,97.0,37.4,117.8,76.1,14.1 +PT1007,2026-06-14 10:15:00,75.8,96.7,36.9,114.5,74.9,14.2 +PT1007,2026-06-14 10:30:00,77.6,96.8,37.4,114.5,76.8,13.6 +PT1007,2026-06-14 10:45:00,77.3,96.7,37.1,115.7,76.1,13.7 +PT1007,2026-06-14 11:00:00,77.6,96.5,36.5,117.6,73.1,14.0 +PT1007,2026-06-14 11:15:00,76.7,96.7,36.8,113.6,73.3,13.4 +PT1007,2026-06-14 11:30:00,75.5,96.4,36.7,110.1,76.4,13.3 +PT1007,2026-06-14 11:45:00,74.8,96.4,37.5,109.3,74.5,13.0 +PT1007,2026-06-14 12:00:00,73.1,95.9,36.7,108.6,71.6,12.6 +PT1007,2026-06-14 12:15:00,71.6,95.9,36.8,109.1,70.4,12.6 +PT1007,2026-06-14 12:30:00,72.1,95.5,36.6,109.4,70.8,13.5 +PT1007,2026-06-14 12:45:00,75.3,95.7,37.3,113.1,72.1,13.1 +PT1007,2026-06-14 13:00:00,74.5,95.7,37.2,110.7,71.1,13.5 +PT1007,2026-06-14 13:15:00,75.7,95.4,37.2,107.0,72.8,13.9 +PT1007,2026-06-14 13:30:00,76.2,95.6,37.1,107.3,73.6,14.2 +PT1007,2026-06-14 13:45:00,75.8,95.7,36.6,111.9,72.3,14.1 +PT1007,2026-06-14 14:00:00,76.3,95.6,37.0,109.1,72.2,14.7 +PT1007,2026-06-14 14:15:00,76.0,96.0,37.4,109.1,70.4,14.9 +PT1007,2026-06-14 14:30:00,75.7,96.0,37.1,106.4,69.1,14.8 +PT1007,2026-06-14 14:45:00,75.0,95.9,37.4,106.2,67.6,14.7 +PT1007,2026-06-14 15:00:00,74.3,95.7,37.3,110.4,67.9,14.4 +PT1007,2026-06-14 15:15:00,74.6,95.6,37.3,110.3,67.5,14.8 +PT1007,2026-06-14 15:30:00,72.0,96.1,37.2,109.7,70.1,15.1 +PT1007,2026-06-14 15:45:00,71.9,96.8,37.1,109.1,69.1,14.8 +PT1007,2026-06-14 16:00:00,71.9,97.0,37.3,110.7,70.2,14.7 +PT1007,2026-06-14 16:15:00,72.8,97.0,37.2,111.2,71.4,14.8 +PT1007,2026-06-14 16:30:00,74.5,97.1,37.0,110.0,69.4,14.9 +PT1007,2026-06-14 16:45:00,75.5,97.5,36.9,107.9,68.0,14.9 +PT1007,2026-06-14 17:00:00,75.2,97.3,37.6,105.9,69.3,14.9 +PT1007,2026-06-14 17:15:00,75.7,97.7,36.9,104.5,68.2,15.8 +PT1007,2026-06-14 17:30:00,74.5,97.4,37.1,108.3,67.7,15.9 +PT1007,2026-06-14 17:45:00,73.6,97.3,37.5,110.0,65.9,16.2 +PT1007,2026-06-14 18:00:00,74.0,97.6,36.9,107.2,63.2,16.3 +PT1007,2026-06-14 18:15:00,75.0,97.6,36.9,107.5,63.3,16.4 +PT1007,2026-06-14 18:30:00,73.4,97.5,37.1,110.4,62.4,16.1 +PT1007,2026-06-14 18:45:00,72.0,97.8,36.8,108.3,61.9,17.1 +PT1007,2026-06-14 19:00:00,73.8,97.8,37.0,108.8,60.7,17.4 +PT1007,2026-06-14 19:15:00,72.4,98.2,37.3,108.0,57.9,17.3 +PT1007,2026-06-14 19:30:00,73.2,98.0,37.1,106.1,55.9,17.3 +PT1007,2026-06-14 19:45:00,74.0,98.0,37.1,105.7,55.5,17.4 +PT1007,2026-06-14 20:00:00,75.2,98.0,37.1,105.9,55.4,17.0 +PT1007,2026-06-14 20:15:00,74.4,98.1,36.2,105.5,57.9,16.5 +PT1007,2026-06-14 20:30:00,74.7,98.0,37.0,105.8,56.1,17.3 +PT1007,2026-06-14 20:45:00,73.8,98.4,37.1,107.5,58.1,17.2 +PT1007,2026-06-14 21:00:00,73.1,98.2,37.4,108.3,57.6,18.1 +PT1007,2026-06-14 21:15:00,75.4,97.7,36.6,112.1,54.0,17.6 +PT1007,2026-06-14 21:30:00,75.7,97.7,36.8,113.7,53.9,18.1 +PT1007,2026-06-14 21:45:00,77.2,97.7,37.1,118.4,55.2,18.0 +PT1007,2026-06-14 22:00:00,75.9,97.8,37.0,117.8,56.3,17.4 +PT1007,2026-06-14 22:15:00,74.5,97.5,37.7,119.0,58.0,16.5 +PT1007,2026-06-14 22:30:00,76.2,97.2,37.3,120.7,57.3,16.5 +PT1007,2026-06-14 22:45:00,76.8,97.0,36.5,119.5,56.5,16.9 +PT1007,2026-06-14 23:00:00,76.6,97.4,36.8,120.9,58.1,16.8 +PT1007,2026-06-14 23:15:00,76.6,97.2,37.6,125.4,57.8,17.1 +PT1007,2026-06-14 23:30:00,75.3,96.7,36.8,126.4,58.8,16.9 +PT1007,2026-06-14 23:45:00,75.7,96.7,37.3,127.0,57.1,17.1 +PT1007,2026-06-15 00:00:00,73.9,97.0,37.3,127.5,58.4,16.6 +PT1007,2026-06-15 00:15:00,71.9,96.8,37.7,128.0,58.0,16.6 +PT1007,2026-06-15 00:30:00,71.9,97.0,37.2,127.9,57.9,16.2 +PT1007,2026-06-15 00:45:00,75.0,97.0,37.2,127.4,59.6,16.6 +PT1007,2026-06-15 01:00:00,74.6,97.3,36.9,127.6,60.9,16.3 +PT1007,2026-06-15 01:15:00,74.7,97.0,37.8,126.9,59.0,15.6 +PT1007,2026-06-15 01:30:00,74.0,96.9,37.7,127.0,57.4,15.4 +PT1007,2026-06-15 01:45:00,74.4,97.1,36.7,130.2,57.7,15.4 +PT1007,2026-06-15 02:00:00,73.9,97.1,37.4,128.6,60.1,15.8 +PT1007,2026-06-15 02:15:00,73.8,96.8,37.3,131.2,60.6,16.1 +PT1007,2026-06-15 02:30:00,74.2,97.3,37.1,129.9,60.1,16.8 +PT1007,2026-06-15 02:45:00,74.0,97.3,37.3,131.3,59.8,16.6 +PT1007,2026-06-15 03:00:00,74.1,97.0,37.6,131.3,61.9,16.9 +PT1007,2026-06-15 03:15:00,73.3,97.3,37.1,130.0,60.0,16.6 +PT1007,2026-06-15 03:30:00,74.5,97.4,37.4,129.7,58.5,16.9 +PT1007,2026-06-15 03:45:00,74.8,97.1,37.0,131.3,60.3,17.5 +PT1007,2026-06-15 04:00:00,75.4,97.0,37.5,129.5,62.7,17.7 +PT1007,2026-06-15 04:15:00,73.9,97.1,37.0,130.5,61.4,18.3 +PT1007,2026-06-15 04:30:00,74.4,96.9,37.2,128.1,62.8,18.5 +PT1007,2026-06-15 04:45:00,74.1,97.0,37.2,130.7,61.8,18.7 +PT1007,2026-06-15 05:00:00,73.9,96.6,36.7,130.6,62.8,18.8 +PT1007,2026-06-15 05:15:00,75.4,97.0,36.7,130.4,66.2,18.5 +PT1007,2026-06-15 05:30:00,74.1,97.1,36.6,126.9,65.8,19.7 +PT1007,2026-06-15 05:45:00,73.5,96.8,37.1,126.3,65.3,19.4 +PT1007,2026-06-15 06:00:00,74.3,97.2,36.7,125.7,65.3,19.6 +PT1007,2026-06-15 06:15:00,74.1,97.1,37.5,127.6,67.9,19.3 +PT1007,2026-06-15 06:30:00,72.3,97.1,36.8,128.1,65.7,18.9 +PT1007,2026-06-15 06:45:00,70.8,96.5,37.3,127.7,65.5,18.9 +PT1007,2026-06-15 07:00:00,68.4,96.4,36.8,132.8,66.9,19.3 +PT1007,2026-06-15 07:15:00,68.2,95.8,36.8,134.0,69.0,18.7 +PT1007,2026-06-15 07:30:00,68.2,95.9,37.1,132.9,67.7,18.4 +PT1007,2026-06-15 07:45:00,69.0,95.9,37.1,132.6,65.1,18.7 +PT1007,2026-06-15 08:00:00,68.5,95.9,36.9,131.0,64.5,18.8 +PT1007,2026-06-15 08:15:00,66.5,95.5,36.8,131.9,64.4,18.7 +PT1007,2026-06-15 08:30:00,66.5,95.4,37.6,130.7,64.3,18.8 +PT1007,2026-06-15 08:45:00,67.2,95.6,36.8,132.9,63.2,18.7 +PT1007,2026-06-15 09:00:00,66.5,95.5,36.7,131.4,63.5,18.9 +PT1007,2026-06-15 09:15:00,66.1,95.5,37.4,128.5,62.4,19.2 +PT1007,2026-06-15 09:30:00,64.2,95.6,37.3,125.6,61.8,19.2 +PT1007,2026-06-15 09:45:00,64.0,95.3,37.0,123.2,62.0,18.9 +PT1007,2026-06-15 10:00:00,65.3,95.5,37.2,126.4,60.5,18.7 +PT1007,2026-06-15 10:15:00,67.5,95.3,37.4,126.4,62.5,18.7 +PT1007,2026-06-15 10:30:00,69.9,95.4,36.7,127.4,63.6,18.3 +PT1007,2026-06-15 10:45:00,70.1,95.2,36.7,129.5,64.0,18.7 +PT1007,2026-06-15 11:00:00,71.3,94.7,37.0,127.2,65.0,18.5 +PT1007,2026-06-15 11:15:00,71.4,95.0,36.9,123.4,66.9,19.1 +PT1007,2026-06-15 11:30:00,70.6,95.0,36.6,122.0,67.4,19.2 +PT1007,2026-06-15 11:45:00,69.5,94.7,37.4,122.4,68.7,18.8 +PT1007,2026-06-15 12:00:00,68.4,94.9,37.6,121.8,68.0,19.3 +PT1007,2026-06-15 12:15:00,66.1,95.1,36.8,122.2,69.0,18.7 +PT1007,2026-06-15 12:30:00,65.4,95.2,37.7,120.7,68.5,19.0 +PT1007,2026-06-15 12:45:00,66.3,95.4,37.1,120.3,67.2,18.9 +PT1007,2026-06-15 13:00:00,65.0,95.6,37.5,123.4,67.4,19.3 +PT1007,2026-06-15 13:15:00,63.8,95.2,37.5,122.4,67.5,18.9 +PT1007,2026-06-15 13:30:00,66.2,95.2,37.4,120.4,68.3,18.5 +PT1007,2026-06-15 13:45:00,65.9,95.4,37.2,122.2,69.1,19.2 +PT1007,2026-06-15 14:00:00,65.4,94.9,36.9,117.7,70.0,19.1 +PT1007,2026-06-15 14:15:00,64.1,95.1,36.8,115.7,72.5,20.0 +PT1007,2026-06-15 14:30:00,64.9,95.2,36.8,113.7,71.0,20.0 +PT1007,2026-06-15 14:45:00,66.3,95.2,36.9,111.5,70.9,20.2 +PT1007,2026-06-15 15:00:00,63.9,95.2,36.9,109.0,69.7,20.4 +PT1007,2026-06-15 15:15:00,63.8,95.6,36.8,108.3,72.7,20.7 +PT1007,2026-06-15 15:30:00,63.3,95.3,36.5,109.6,74.7,20.5 +PT1007,2026-06-15 15:45:00,63.8,95.1,37.3,108.2,75.2,21.0 +PT1007,2026-06-15 16:00:00,64.3,95.1,36.9,105.5,75.7,21.3 +PT1007,2026-06-15 16:15:00,63.9,95.4,37.3,104.8,75.3,21.3 +PT1007,2026-06-15 16:30:00,64.4,95.4,37.4,107.8,74.7,20.9 +PT1007,2026-06-15 16:45:00,64.7,95.3,36.7,107.1,72.8,21.0 +PT1007,2026-06-15 17:00:00,65.5,95.2,37.2,104.3,74.4,21.9 +PT1007,2026-06-15 17:15:00,65.2,95.0,37.4,104.8,75.4,21.9 +PT1007,2026-06-15 17:30:00,67.1,94.7,37.3,105.4,72.5,21.6 +PT1007,2026-06-15 17:45:00,67.1,94.3,37.3,107.5,71.7,21.9 +PT1007,2026-06-15 18:00:00,66.1,94.5,36.8,108.1,72.0,21.7 +PT1007,2026-06-15 18:15:00,65.7,94.4,37.6,109.8,69.5,22.3 +PT1007,2026-06-15 18:30:00,64.9,94.8,37.4,107.8,71.2,22.0 +PT1007,2026-06-15 18:45:00,63.2,95.1,37.4,110.4,69.0,22.7 +PT1007,2026-06-15 19:00:00,60.9,95.0,37.4,112.5,70.1,22.7 +PT1007,2026-06-15 19:15:00,59.9,95.0,37.3,110.8,70.3,23.1 +PT1007,2026-06-15 19:30:00,60.3,95.2,37.3,113.0,73.0,23.6 +PT1007,2026-06-15 19:45:00,61.4,95.3,37.2,112.4,74.3,23.9 +PT1007,2026-06-15 20:00:00,61.3,95.3,37.4,111.6,76.1,24.4 +PT1007,2026-06-15 20:15:00,60.1,95.2,37.2,111.1,75.2,25.1 +PT1007,2026-06-15 20:30:00,60.5,95.1,37.0,112.8,78.5,25.1 +PT1007,2026-06-15 20:45:00,60.5,95.0,37.1,112.8,77.6,24.8 +PT1007,2026-06-15 21:00:00,60.7,95.0,37.3,115.7,78.2,25.1 +PT1007,2026-06-15 21:15:00,60.9,95.0,36.9,114.0,79.2,24.9 +PT1007,2026-06-15 21:30:00,62.5,94.7,37.6,117.4,81.7,24.9 +PT1007,2026-06-15 21:45:00,61.5,95.0,37.0,117.5,79.0,24.6 +PT1007,2026-06-15 22:00:00,62.5,94.9,37.1,116.9,79.8,24.8 +PT1007,2026-06-15 22:15:00,62.2,95.1,37.3,116.3,78.0,24.6 +PT1007,2026-06-15 22:30:00,62.0,95.0,36.8,113.8,77.8,24.7 +PT1007,2026-06-15 22:45:00,61.9,94.8,36.6,113.5,80.4,24.8 +PT1007,2026-06-15 23:00:00,62.3,95.1,37.1,110.8,78.8,24.9 +PT1007,2026-06-15 23:15:00,63.8,95.1,37.3,112.4,81.1,24.6 +PT1007,2026-06-15 23:30:00,63.4,94.5,37.0,113.4,82.0,23.9 +PT1007,2026-06-15 23:45:00,62.7,94.7,37.2,110.3,82.1,23.0 +PT1007,2026-06-16 00:00:00,62.9,94.6,37.5,113.1,78.2,23.0 +PT1007,2026-06-16 00:15:00,63.1,95.0,37.4,112.2,78.0,23.5 +PT1007,2026-06-16 00:30:00,66.1,95.0,37.4,112.6,77.3,23.4 +PT1007,2026-06-16 00:45:00,66.1,94.8,37.0,111.9,77.1,23.1 +PT1007,2026-06-16 01:00:00,65.0,94.7,36.9,114.2,77.2,24.1 +PT1007,2026-06-16 01:15:00,65.6,94.8,37.2,115.5,76.3,23.9 +PT1007,2026-06-16 01:30:00,65.0,94.4,37.2,118.1,77.6,23.8 +PT1007,2026-06-16 01:45:00,66.3,94.7,37.1,118.3,76.7,24.4 +PT1007,2026-06-16 02:00:00,66.1,94.8,37.0,120.6,76.7,24.8 +PT1007,2026-06-16 02:15:00,66.9,94.6,36.7,122.8,75.7,24.9 +PT1007,2026-06-16 02:30:00,67.0,94.7,37.3,121.4,75.5,25.0 +PT1007,2026-06-16 02:45:00,67.1,95.0,37.0,123.7,75.5,24.5 +PT1007,2026-06-16 03:00:00,64.5,95.0,36.9,126.5,76.7,24.6 +PT1007,2026-06-16 03:15:00,64.7,95.5,37.8,129.5,76.4,24.0 +PT1007,2026-06-16 03:30:00,63.8,95.7,36.8,126.4,75.9,23.3 +PT1007,2026-06-16 03:45:00,62.8,95.8,37.4,126.2,80.0,23.8 +PT1007,2026-06-16 04:00:00,63.5,95.9,36.7,128.6,76.4,23.5 +PT1007,2026-06-16 04:15:00,61.2,95.7,36.5,126.3,78.2,23.6 +PT1007,2026-06-16 04:30:00,61.7,95.5,37.2,126.4,78.8,23.3 +PT1007,2026-06-16 04:45:00,62.2,95.4,37.2,125.0,78.8,23.2 +PT1007,2026-06-16 05:00:00,62.0,95.1,37.1,124.6,79.3,23.3 +PT1007,2026-06-16 05:15:00,61.4,95.0,37.1,123.8,80.9,22.9 +PT1007,2026-06-16 05:30:00,60.0,95.2,36.4,122.7,79.7,23.0 +PT1007,2026-06-16 05:45:00,58.5,95.3,37.8,124.7,80.4,23.1 +PT1007,2026-06-16 06:00:00,59.2,95.1,36.7,126.8,79.4,22.8 +PT1007,2026-06-16 06:15:00,58.8,94.8,37.1,127.9,79.2,22.2 +PT1007,2026-06-16 06:30:00,60.0,95.2,37.2,124.3,78.0,21.7 +PT1007,2026-06-16 06:45:00,58.4,95.5,36.9,126.7,79.3,21.4 +PT1007,2026-06-16 07:00:00,57.9,95.8,37.0,123.3,79.9,21.1 +PT1007,2026-06-16 07:15:00,58.9,95.4,37.1,122.8,79.7,21.0 +PT1007,2026-06-16 07:30:00,59.6,95.3,37.3,123.5,80.2,21.2 +PT1007,2026-06-16 07:45:00,60.1,95.3,37.0,121.0,82.2,21.8 +PT1007,2026-06-16 08:00:00,60.7,95.2,37.6,119.5,82.3,23.0 +PT1007,2026-06-16 08:15:00,62.5,95.3,37.2,117.7,83.8,21.8 +PT1007,2026-06-16 08:30:00,63.8,95.4,37.1,121.0,81.7,22.5 +PT1007,2026-06-16 08:45:00,65.6,95.6,37.5,124.0,83.2,22.7 +PT1007,2026-06-16 09:00:00,65.7,95.8,37.2,124.0,82.1,22.9 +PT1007,2026-06-16 09:15:00,67.3,95.8,36.9,122.5,84.0,23.0 +PT1007,2026-06-16 09:30:00,69.0,96.0,36.8,126.2,83.5,22.8 +PT1007,2026-06-16 09:45:00,68.3,95.9,37.6,127.6,82.1,22.5 +PT1007,2026-06-16 10:00:00,64.9,96.0,37.1,125.0,80.9,23.1 +PT1007,2026-06-16 10:15:00,68.1,96.2,37.3,123.3,81.7,23.5 +PT1007,2026-06-16 10:30:00,67.9,95.8,37.0,122.7,84.2,23.2 +PT1007,2026-06-16 10:45:00,69.1,96.0,37.1,120.1,84.1,23.8 +PT1007,2026-06-16 11:00:00,70.8,96.3,36.6,118.2,83.6,24.0 +PT1007,2026-06-16 11:15:00,70.6,96.5,36.9,117.0,84.5,23.8 +PT1007,2026-06-16 11:30:00,71.5,96.8,37.2,115.5,82.7,23.8 +PT1007,2026-06-16 11:45:00,70.6,97.2,37.5,115.2,81.6,24.6 +PT1007,2026-06-16 12:00:00,69.8,97.5,36.7,113.9,82.7,25.3 +PT1007,2026-06-16 12:15:00,69.1,97.4,36.6,114.5,83.4,25.2 +PT1007,2026-06-16 12:30:00,67.7,97.2,36.8,115.6,81.4,24.9 +PT1007,2026-06-16 12:45:00,68.1,97.5,37.1,115.9,84.3,24.9 +PT1007,2026-06-16 13:00:00,67.2,97.5,37.0,114.2,82.9,24.5 +PT1007,2026-06-16 13:15:00,66.7,98.2,38.0,114.7,83.2,24.3 +PT1007,2026-06-16 13:30:00,65.6,98.1,37.1,116.7,83.5,23.8 +PT1007,2026-06-16 13:45:00,66.4,98.2,37.3,118.0,86.7,23.9 +PT1007,2026-06-16 14:00:00,63.6,98.6,37.3,118.1,85.4,23.8 +PT1007,2026-06-16 14:15:00,64.9,98.6,37.2,119.3,85.0,24.0 +PT1007,2026-06-16 14:30:00,65.3,98.5,36.9,120.1,83.8,24.1 +PT1007,2026-06-16 14:45:00,64.1,98.4,37.1,119.7,83.0,24.3 +PT1007,2026-06-16 15:00:00,65.4,98.3,37.0,120.1,85.8,24.1 +PT1007,2026-06-16 15:15:00,66.9,98.1,37.4,122.7,85.5,23.7 +PT1007,2026-06-16 15:30:00,66.6,98.5,37.1,122.9,85.6,23.5 +PT1007,2026-06-16 15:45:00,66.3,98.9,37.0,123.4,86.6,23.6 +PT1007,2026-06-16 16:00:00,66.8,99.3,36.9,121.3,87.3,24.2 +PT1007,2026-06-16 16:15:00,67.9,99.5,37.2,118.7,88.9,23.9 +PT1007,2026-06-16 16:30:00,69.2,99.8,37.4,115.7,91.6,24.5 +PT1007,2026-06-16 16:45:00,69.7,99.7,37.4,113.5,89.2,24.7 +PT1007,2026-06-16 17:00:00,69.6,99.5,36.9,113.6,88.2,24.7 +PT1007,2026-06-16 17:15:00,70.3,99.8,37.1,114.7,88.1,25.1 +PT1007,2026-06-16 17:30:00,71.5,99.7,37.4,113.7,86.6,25.0 +PT1007,2026-06-16 17:45:00,70.5,99.1,37.7,112.8,84.8,24.8 +PT1007,2026-06-16 18:00:00,69.4,99.2,37.4,112.7,85.4,24.6 +PT1007,2026-06-16 18:15:00,70.0,99.3,37.2,112.9,87.3,24.8 +PT1007,2026-06-16 18:30:00,70.8,98.9,36.9,113.2,87.2,25.2 +PT1007,2026-06-16 18:45:00,71.0,99.4,36.9,113.2,85.2,26.1 +PT1007,2026-06-16 19:00:00,69.8,99.1,37.1,114.6,87.1,26.8 +PT1007,2026-06-16 19:15:00,68.6,99.0,36.7,114.7,87.1,27.3 +PT1007,2026-06-16 19:30:00,67.3,98.9,37.5,115.4,86.4,27.1 +PT1007,2026-06-16 19:45:00,67.9,98.6,37.3,114.4,87.2,26.6 +PT1007,2026-06-16 20:00:00,67.5,98.7,37.5,114.7,85.5,26.4 +PT1007,2026-06-16 20:15:00,70.4,98.3,36.9,116.8,86.0,27.2 +PT1007,2026-06-16 20:30:00,71.5,98.2,36.8,119.3,89.5,27.3 +PT1007,2026-06-16 20:45:00,73.2,98.3,36.9,120.1,91.8,26.8 +PT1007,2026-06-16 21:00:00,73.9,98.1,36.7,119.4,93.7,27.0 +PT1007,2026-06-16 21:15:00,74.4,98.5,37.2,119.8,95.1,26.8 +PT1007,2026-06-16 21:30:00,72.5,98.6,37.3,120.5,93.1,27.4 +PT1007,2026-06-16 21:45:00,71.7,98.8,36.8,118.5,91.8,27.0 +PT1007,2026-06-16 22:00:00,72.2,98.8,37.0,120.0,87.6,26.9 +PT1007,2026-06-16 22:15:00,72.3,98.8,37.0,120.5,87.7,26.7 +PT1007,2026-06-16 22:30:00,72.3,98.9,37.3,120.7,86.6,26.3 +PT1007,2026-06-16 22:45:00,73.2,99.2,36.9,119.7,83.8,26.5 +PT1007,2026-06-16 23:00:00,73.1,99.2,37.5,120.8,85.1,27.0 +PT1007,2026-06-16 23:15:00,73.2,98.8,37.8,119.6,87.2,27.0 +PT1007,2026-06-16 23:30:00,72.7,99.3,37.3,119.6,86.6,26.7 +PT1007,2026-06-16 23:45:00,71.0,99.2,37.6,119.5,83.2,26.7 +PT1008,2026-06-14 00:00:00,82.5,95.8,37.2,141.0,88.5,16.8 +PT1008,2026-06-14 00:15:00,81.9,95.6,37.0,143.4,89.6,16.0 +PT1008,2026-06-14 00:30:00,83.1,95.5,37.0,142.2,89.2,16.1 +PT1008,2026-06-14 00:45:00,83.0,95.5,37.1,140.3,87.7,15.6 +PT1008,2026-06-14 01:00:00,83.7,95.3,37.0,137.3,86.3,16.2 +PT1008,2026-06-14 01:15:00,83.4,95.1,36.8,138.4,86.2,15.9 +PT1008,2026-06-14 01:30:00,83.9,95.1,36.4,136.0,88.0,15.7 +PT1008,2026-06-14 01:45:00,85.7,95.1,37.2,136.8,90.5,15.3 +PT1008,2026-06-14 02:00:00,87.1,94.9,36.8,139.8,88.4,15.2 +PT1008,2026-06-14 02:15:00,87.9,94.7,36.9,138.5,87.1,14.7 +PT1008,2026-06-14 02:30:00,87.8,94.6,36.6,138.1,86.1,14.6 +PT1008,2026-06-14 02:45:00,87.0,94.6,37.2,138.7,86.3,14.1 +PT1008,2026-06-14 03:00:00,87.1,95.0,37.0,135.7,86.1,14.5 +PT1008,2026-06-14 03:15:00,86.0,94.8,36.8,137.3,83.8,14.4 +PT1008,2026-06-14 03:30:00,85.0,94.9,37.3,136.5,84.2,13.9 +PT1008,2026-06-14 03:45:00,85.2,95.2,37.2,135.7,84.8,14.2 +PT1008,2026-06-14 04:00:00,87.2,94.8,37.5,136.0,84.2,14.0 +PT1008,2026-06-14 04:15:00,86.5,95.0,37.0,133.9,85.8,14.0 +PT1008,2026-06-14 04:30:00,84.6,94.9,36.9,132.5,88.4,14.0 +PT1008,2026-06-14 04:45:00,83.8,94.6,37.8,135.6,90.3,14.0 +PT1008,2026-06-14 05:00:00,83.8,94.9,37.2,136.7,89.4,14.1 +PT1008,2026-06-14 05:15:00,82.2,95.0,36.8,139.0,88.4,14.0 +PT1008,2026-06-14 05:30:00,81.7,94.9,37.1,142.1,87.9,13.8 +PT1008,2026-06-14 05:45:00,79.6,94.3,37.4,139.4,88.4,13.8 +PT1008,2026-06-14 06:00:00,77.8,94.2,37.0,136.2,88.8,13.2 +PT1008,2026-06-14 06:15:00,78.1,94.1,36.6,131.7,91.3,13.0 +PT1008,2026-06-14 06:30:00,79.0,94.4,37.2,131.1,93.6,12.7 +PT1008,2026-06-14 06:45:00,79.6,94.7,37.2,127.2,97.0,13.2 +PT1008,2026-06-14 07:00:00,78.7,94.5,37.1,127.7,97.7,13.3 +PT1008,2026-06-14 07:15:00,79.2,94.0,37.5,127.2,95.7,13.3 +PT1008,2026-06-14 07:30:00,78.1,93.8,37.3,125.5,94.6,13.5 +PT1008,2026-06-14 07:45:00,79.9,93.6,36.8,126.9,95.9,14.2 +PT1008,2026-06-14 08:00:00,77.5,93.5,36.4,132.5,94.2,14.4 +PT1008,2026-06-14 08:15:00,79.7,93.1,37.5,127.7,94.4,14.5 +PT1008,2026-06-14 08:30:00,80.8,92.6,37.2,127.4,93.3,13.9 +PT1008,2026-06-14 08:45:00,82.0,92.4,37.0,126.7,92.9,13.7 +PT1008,2026-06-14 09:00:00,81.2,92.4,37.3,125.6,93.6,13.4 +PT1008,2026-06-14 09:15:00,80.5,92.6,37.1,123.9,94.9,12.7 +PT1008,2026-06-14 09:30:00,79.8,92.6,37.0,121.5,94.6,12.3 +PT1008,2026-06-14 09:45:00,79.4,92.7,37.1,121.6,97.4,12.1 +PT1008,2026-06-14 10:00:00,83.3,92.7,36.7,123.5,98.3,13.0 +PT1008,2026-06-14 10:15:00,81.4,92.4,36.8,123.9,96.8,12.1 +PT1008,2026-06-14 10:30:00,81.8,92.2,37.0,126.2,95.1,12.1 +PT1008,2026-06-14 10:45:00,82.1,92.3,37.3,129.3,96.1,12.0 +PT1008,2026-06-14 11:00:00,83.0,92.8,36.5,129.0,96.0,12.5 +PT1008,2026-06-14 11:15:00,82.7,93.0,36.4,131.1,92.7,12.0 +PT1008,2026-06-14 11:30:00,83.8,93.1,36.8,134.0,92.7,12.9 +PT1008,2026-06-14 11:45:00,83.3,93.2,37.0,132.5,93.4,12.8 +PT1008,2026-06-14 12:00:00,83.2,93.4,36.9,131.9,91.7,12.8 +PT1008,2026-06-14 12:15:00,82.0,93.0,37.1,133.7,92.7,13.4 +PT1008,2026-06-14 12:30:00,83.2,92.8,37.2,129.9,91.6,13.3 +PT1008,2026-06-14 12:45:00,84.8,92.9,37.2,134.4,91.7,13.4 +PT1008,2026-06-14 13:00:00,85.2,93.0,36.8,131.9,93.0,14.4 +PT1008,2026-06-14 13:15:00,85.2,92.6,36.7,133.5,94.1,13.8 +PT1008,2026-06-14 13:30:00,82.6,93.0,37.4,131.8,93.9,13.6 +PT1008,2026-06-14 13:45:00,83.4,93.2,37.3,130.2,95.0,14.0 +PT1008,2026-06-14 14:00:00,81.9,92.9,37.1,133.6,97.9,14.0 +PT1008,2026-06-14 14:15:00,82.1,93.1,37.1,130.7,98.2,13.6 +PT1008,2026-06-14 14:30:00,81.0,93.0,37.5,131.1,97.3,13.1 +PT1008,2026-06-14 14:45:00,79.7,92.4,37.1,132.2,96.9,13.1 +PT1008,2026-06-14 15:00:00,81.2,92.9,37.3,132.7,95.1,13.2 +PT1008,2026-06-14 15:15:00,82.5,92.9,36.6,131.6,93.7,13.1 +PT1008,2026-06-14 15:30:00,82.9,93.0,37.1,132.0,94.8,13.7 +PT1008,2026-06-14 15:45:00,83.0,92.9,37.4,133.1,94.8,14.2 +PT1008,2026-06-14 16:00:00,83.4,92.9,37.0,132.5,95.5,14.3 +PT1008,2026-06-14 16:15:00,83.7,92.7,37.0,133.4,94.5,14.7 +PT1008,2026-06-14 16:30:00,85.7,92.7,37.1,133.9,92.4,15.2 +PT1008,2026-06-14 16:45:00,87.8,92.8,37.3,133.5,91.6,15.5 +PT1008,2026-06-14 17:00:00,86.2,92.7,37.2,134.9,90.7,15.1 +PT1008,2026-06-14 17:15:00,86.2,92.6,36.6,138.5,90.4,14.6 +PT1008,2026-06-14 17:30:00,87.5,92.3,37.2,138.5,89.1,14.6 +PT1008,2026-06-14 17:45:00,85.8,92.2,36.9,137.2,87.7,14.5 +PT1008,2026-06-14 18:00:00,86.8,92.0,36.9,138.1,88.3,13.9 +PT1008,2026-06-14 18:15:00,86.7,92.1,37.2,137.6,89.9,13.9 +PT1008,2026-06-14 18:30:00,85.9,92.3,37.0,141.5,90.6,14.3 +PT1008,2026-06-14 18:45:00,87.0,92.5,37.1,142.0,90.5,13.7 +PT1008,2026-06-14 19:00:00,87.7,92.4,36.7,139.4,90.7,13.8 +PT1008,2026-06-14 19:15:00,87.7,92.4,37.1,142.1,90.0,14.7 +PT1008,2026-06-14 19:30:00,86.2,92.4,37.2,139.8,89.7,14.9 +PT1008,2026-06-14 19:45:00,84.8,92.1,36.3,140.7,90.7,14.7 +PT1008,2026-06-14 20:00:00,83.4,92.4,37.0,139.2,90.2,14.9 +PT1008,2026-06-14 20:15:00,85.1,92.3,36.8,137.5,91.9,14.9 +PT1008,2026-06-14 20:30:00,85.7,92.2,36.6,135.2,92.1,14.8 +PT1008,2026-06-14 20:45:00,84.4,92.7,37.5,135.4,94.1,15.0 +PT1008,2026-06-14 21:00:00,85.0,92.5,37.2,136.6,92.7,15.3 +PT1008,2026-06-14 21:15:00,85.0,92.4,36.6,138.2,92.4,14.6 +PT1008,2026-06-14 21:30:00,83.5,92.6,37.5,139.9,92.9,14.7 +PT1008,2026-06-14 21:45:00,83.9,92.8,37.7,139.9,92.2,14.6 +PT1008,2026-06-14 22:00:00,82.6,92.9,36.6,136.8,91.3,14.9 +PT1008,2026-06-14 22:15:00,83.7,93.4,37.3,137.6,93.2,15.0 +PT1008,2026-06-14 22:30:00,84.2,93.3,37.1,136.4,95.0,15.0 +PT1008,2026-06-14 22:45:00,84.0,93.4,36.7,134.0,94.7,15.1 +PT1008,2026-06-14 23:00:00,84.2,93.2,36.8,134.6,97.9,15.0 +PT1008,2026-06-14 23:15:00,84.5,93.3,37.1,132.7,95.4,14.7 +PT1008,2026-06-14 23:30:00,84.0,93.6,37.3,133.8,95.5,14.0 +PT1008,2026-06-14 23:45:00,86.3,93.8,37.5,132.5,95.3,14.2 +PT1008,2026-06-15 00:00:00,85.4,93.7,37.2,132.4,95.1,14.5 +PT1008,2026-06-15 00:15:00,83.8,93.6,37.1,131.1,91.8,14.8 +PT1008,2026-06-15 00:30:00,83.1,93.8,37.5,131.7,89.9,15.1 +PT1008,2026-06-15 00:45:00,82.9,93.8,36.8,131.9,88.0,15.1 +PT1008,2026-06-15 01:00:00,82.9,93.8,37.2,133.0,88.9,14.8 +PT1008,2026-06-15 01:15:00,84.1,93.6,36.8,136.5,87.4,15.4 +PT1008,2026-06-15 01:30:00,84.0,93.5,37.3,133.8,88.5,15.7 +PT1008,2026-06-15 01:45:00,83.7,93.4,37.2,136.0,88.8,15.4 +PT1008,2026-06-15 02:00:00,81.6,93.4,37.3,137.3,88.5,15.7 +PT1008,2026-06-15 02:15:00,82.0,93.9,37.0,140.0,89.5,15.8 +PT1008,2026-06-15 02:30:00,81.2,94.1,36.9,139.6,88.0,15.5 +PT1008,2026-06-15 02:45:00,83.3,94.3,36.8,139.6,88.6,15.7 +PT1008,2026-06-15 03:00:00,81.9,94.6,37.2,136.9,88.6,15.5 +PT1008,2026-06-15 03:15:00,81.6,94.7,37.4,132.3,90.2,15.7 +PT1008,2026-06-15 03:30:00,82.7,94.8,37.4,131.0,90.9,15.9 +PT1008,2026-06-15 03:45:00,83.4,94.8,37.6,131.9,91.7,16.3 +PT1008,2026-06-15 04:00:00,84.1,95.0,36.1,131.5,91.2,16.0 +PT1008,2026-06-15 04:15:00,83.1,94.9,36.9,130.8,91.8,15.7 +PT1008,2026-06-15 04:30:00,80.6,95.0,36.8,129.1,90.8,15.9 +PT1008,2026-06-15 04:45:00,81.0,94.7,37.6,129.0,89.9,15.8 +PT1008,2026-06-15 05:00:00,79.1,95.1,37.2,127.2,91.2,16.2 +PT1008,2026-06-15 05:15:00,77.6,95.2,37.0,132.3,91.2,16.2 +PT1008,2026-06-15 05:30:00,78.3,95.2,37.8,132.9,90.7,15.8 +PT1008,2026-06-15 05:45:00,78.2,96.0,36.9,133.7,91.6,15.7 +PT1008,2026-06-15 06:00:00,77.8,95.8,37.5,131.9,94.3,16.0 +PT1008,2026-06-15 06:15:00,79.2,95.6,37.4,128.8,93.6,16.0 +PT1008,2026-06-15 06:30:00,79.2,96.4,37.2,127.9,94.5,15.8 +PT1008,2026-06-15 06:45:00,79.0,96.3,36.8,126.7,94.7,16.1 +PT1008,2026-06-15 07:00:00,79.0,96.4,37.0,128.1,97.5,16.3 +PT1008,2026-06-15 07:15:00,78.3,96.3,37.3,126.8,97.8,16.5 +PT1008,2026-06-15 07:30:00,79.1,96.6,37.2,125.5,100.3,16.3 +PT1008,2026-06-15 07:45:00,78.9,96.6,37.3,126.8,98.1,15.9 +PT1008,2026-06-15 08:00:00,78.9,96.5,36.9,124.6,97.8,16.2 +PT1008,2026-06-15 08:15:00,80.6,96.8,36.8,123.9,96.9,15.1 +PT1008,2026-06-15 08:30:00,79.2,96.4,37.1,123.8,97.3,15.8 +PT1008,2026-06-15 08:45:00,76.8,96.2,36.9,125.0,97.2,16.2 +PT1008,2026-06-15 09:00:00,78.2,96.3,37.1,125.5,97.5,15.8 +PT1008,2026-06-15 09:15:00,78.6,95.9,37.5,125.7,99.3,16.0 +PT1008,2026-06-15 09:30:00,79.1,95.7,37.0,127.3,97.6,15.9 +PT1008,2026-06-15 09:45:00,78.3,96.3,36.9,127.1,100.3,16.1 +PT1008,2026-06-15 10:00:00,77.8,96.3,37.2,126.5,99.9,16.3 +PT1008,2026-06-15 10:15:00,78.7,96.7,37.5,125.5,101.5,16.9 +PT1008,2026-06-15 10:30:00,76.6,97.1,37.3,124.2,98.8,17.6 +PT1008,2026-06-15 10:45:00,77.3,97.0,37.1,124.6,98.6,17.3 +PT1008,2026-06-15 11:00:00,77.4,96.7,37.1,124.7,95.9,18.1 +PT1008,2026-06-15 11:15:00,76.2,96.8,36.8,123.2,95.8,18.3 +PT1008,2026-06-15 11:30:00,78.5,97.3,37.0,122.2,94.2,18.1 +PT1008,2026-06-15 11:45:00,79.9,97.2,37.4,119.9,94.3,17.5 +PT1008,2026-06-15 12:00:00,80.6,97.0,36.9,118.9,94.7,17.0 +PT1008,2026-06-15 12:15:00,80.3,96.7,37.0,118.0,93.1,17.6 +PT1008,2026-06-15 12:30:00,79.2,96.9,37.0,116.7,91.4,17.9 +PT1008,2026-06-15 12:45:00,80.2,96.9,36.9,117.0,92.3,17.7 +PT1008,2026-06-15 13:00:00,81.7,97.0,37.4,116.8,93.5,17.9 +PT1008,2026-06-15 13:15:00,80.3,97.0,37.1,119.1,96.0,17.7 +PT1008,2026-06-15 13:30:00,80.3,96.7,36.8,118.5,93.6,17.6 +PT1008,2026-06-15 13:45:00,80.6,96.6,37.7,117.9,95.9,17.7 +PT1008,2026-06-15 14:00:00,81.1,96.8,37.5,116.1,94.9,17.7 +PT1008,2026-06-15 14:15:00,80.7,96.4,37.0,116.9,95.0,17.4 +PT1008,2026-06-15 14:30:00,79.6,96.6,37.5,117.0,95.4,17.2 +PT1008,2026-06-15 14:45:00,79.9,96.1,37.4,117.9,95.0,17.1 +PT1008,2026-06-15 15:00:00,80.0,96.5,36.9,118.1,94.3,16.4 +PT1008,2026-06-15 15:15:00,79.6,96.9,36.9,117.2,96.7,16.0 +PT1008,2026-06-15 15:30:00,81.0,96.7,37.3,119.4,95.5,15.7 +PT1008,2026-06-15 15:45:00,80.0,96.7,36.7,120.2,95.1,15.4 +PT1008,2026-06-15 16:00:00,81.8,97.1,37.3,120.8,94.8,15.4 +PT1008,2026-06-15 16:15:00,83.0,96.9,36.6,123.0,95.7,15.8 +PT1008,2026-06-15 16:30:00,82.5,96.9,37.2,122.0,98.5,15.6 +PT1008,2026-06-15 16:45:00,82.7,96.8,37.4,120.6,101.6,15.5 +PT1008,2026-06-15 17:00:00,82.7,96.7,36.9,120.8,102.1,15.4 +PT1008,2026-06-15 17:15:00,83.3,96.7,36.5,119.5,100.7,15.5 +PT1008,2026-06-15 17:30:00,82.9,96.7,37.2,123.0,100.7,15.4 +PT1008,2026-06-15 17:45:00,82.1,96.7,37.1,123.1,101.6,15.1 +PT1008,2026-06-15 18:00:00,79.9,96.8,36.8,122.6,104.5,15.2 +PT1008,2026-06-15 18:15:00,78.6,97.0,37.2,126.2,106.7,14.8 +PT1008,2026-06-15 18:30:00,80.0,96.6,37.2,128.3,105.7,14.7 +PT1008,2026-06-15 18:45:00,81.3,97.0,37.3,127.6,104.9,14.5 +PT1008,2026-06-15 19:00:00,82.5,97.2,37.1,128.2,105.5,14.4 +PT1008,2026-06-15 19:15:00,83.5,97.3,37.1,127.2,107.1,14.1 +PT1008,2026-06-15 19:30:00,82.0,97.1,37.5,127.3,106.1,14.0 +PT1008,2026-06-15 19:45:00,81.9,97.3,37.0,125.7,106.9,13.6 +PT1008,2026-06-15 20:00:00,82.6,97.3,37.5,127.6,107.9,13.5 +PT1008,2026-06-15 20:15:00,83.1,97.2,37.1,127.9,108.1,13.6 +PT1008,2026-06-15 20:30:00,83.5,97.4,36.8,128.7,108.6,13.5 +PT1008,2026-06-15 20:45:00,82.2,97.2,36.9,127.9,111.1,14.0 +PT1008,2026-06-15 21:00:00,82.7,97.2,37.7,128.4,110.3,14.9 +PT1008,2026-06-15 21:15:00,82.3,97.0,37.1,130.2,108.5,15.3 +PT1008,2026-06-15 21:30:00,80.6,97.0,36.7,128.9,108.8,15.3 +PT1008,2026-06-15 21:45:00,80.2,97.1,37.2,130.4,108.2,15.5 +PT1008,2026-06-15 22:00:00,80.2,97.2,37.1,128.5,108.2,14.8 +PT1008,2026-06-15 22:15:00,81.9,97.1,37.3,131.2,107.8,14.4 +PT1008,2026-06-15 22:30:00,82.5,97.7,37.4,129.2,108.3,14.6 +PT1008,2026-06-15 22:45:00,83.1,97.6,37.3,127.1,108.8,14.7 +PT1008,2026-06-15 23:00:00,82.7,97.7,37.2,124.0,107.3,15.1 +PT1008,2026-06-15 23:15:00,83.3,97.5,37.3,122.5,106.6,15.2 +PT1008,2026-06-15 23:30:00,83.0,97.1,37.4,123.4,107.0,15.4 +PT1008,2026-06-15 23:45:00,83.9,97.5,37.4,123.4,106.4,15.8 +PT1008,2026-06-16 00:00:00,83.6,97.7,37.9,123.6,108.3,16.5 +PT1008,2026-06-16 00:15:00,83.7,98.1,37.4,125.3,109.7,16.7 +PT1008,2026-06-16 00:30:00,82.0,98.1,36.9,124.0,108.6,16.1 +PT1008,2026-06-16 00:45:00,81.8,98.1,36.5,123.9,110.2,15.7 +PT1008,2026-06-16 01:00:00,82.5,98.1,37.0,123.8,109.1,16.1 +PT1008,2026-06-16 01:15:00,81.4,98.5,37.0,125.2,109.1,15.1 +PT1008,2026-06-16 01:30:00,81.4,98.8,36.7,121.7,111.4,15.3 +PT1008,2026-06-16 01:45:00,82.5,98.8,37.1,118.4,110.7,15.4 +PT1008,2026-06-16 02:00:00,83.3,99.0,36.7,116.2,110.7,15.1 +PT1008,2026-06-16 02:15:00,83.2,99.1,36.9,117.1,110.1,14.7 +PT1008,2026-06-16 02:30:00,80.9,98.8,37.7,114.9,111.4,15.1 +PT1008,2026-06-16 02:45:00,81.2,98.7,37.2,115.0,111.1,14.8 +PT1008,2026-06-16 03:00:00,81.5,98.6,37.0,114.4,112.1,14.6 +PT1008,2026-06-16 03:15:00,82.0,98.9,37.0,116.2,111.7,14.1 +PT1008,2026-06-16 03:30:00,82.1,98.6,36.9,115.6,113.5,14.2 +PT1008,2026-06-16 03:45:00,82.2,98.6,37.2,114.8,114.7,13.4 +PT1008,2026-06-16 04:00:00,81.5,98.8,37.2,112.3,116.1,13.1 +PT1008,2026-06-16 04:15:00,80.9,99.1,37.0,111.9,115.0,13.7 +PT1008,2026-06-16 04:30:00,81.6,99.3,36.6,110.2,115.6,13.9 +PT1008,2026-06-16 04:45:00,81.9,99.2,36.5,113.4,116.9,14.1 +PT1008,2026-06-16 05:00:00,82.5,99.0,37.0,115.1,116.7,13.9 +PT1008,2026-06-16 05:15:00,82.0,98.7,37.3,112.7,116.2,14.5 +PT1008,2026-06-16 05:30:00,83.0,98.9,36.9,113.3,115.5,14.3 +PT1008,2026-06-16 05:45:00,84.0,98.7,37.5,117.5,114.1,14.8 +PT1008,2026-06-16 06:00:00,84.7,99.1,37.3,117.1,114.3,14.9 +PT1008,2026-06-16 06:15:00,82.5,99.0,37.1,118.8,113.8,15.7 +PT1008,2026-06-16 06:30:00,83.1,99.4,37.3,119.0,116.1,15.9 +PT1008,2026-06-16 06:45:00,82.0,99.7,37.0,117.8,115.8,16.4 +PT1008,2026-06-16 07:00:00,82.5,99.6,37.3,117.8,115.6,16.0 +PT1008,2026-06-16 07:15:00,83.2,99.5,37.1,116.9,116.9,15.9 +PT1008,2026-06-16 07:30:00,82.2,99.4,37.4,115.2,116.0,15.6 +PT1008,2026-06-16 07:45:00,80.6,99.5,36.7,114.7,118.1,15.9 +PT1008,2026-06-16 08:00:00,79.9,99.5,37.0,113.6,119.5,16.0 +PT1008,2026-06-16 08:15:00,81.1,99.2,36.2,113.1,119.9,15.9 +PT1008,2026-06-16 08:30:00,81.5,99.3,37.0,111.0,116.6,15.6 +PT1008,2026-06-16 08:45:00,81.4,98.8,37.5,111.4,118.1,16.0 +PT1008,2026-06-16 09:00:00,79.9,99.0,37.2,109.6,119.3,15.7 +PT1008,2026-06-16 09:15:00,81.8,99.2,37.5,107.7,117.6,16.0 +PT1008,2026-06-16 09:30:00,82.3,99.0,36.8,107.8,118.2,16.0 +PT1008,2026-06-16 09:45:00,83.6,99.5,37.3,110.7,115.0,16.5 +PT1008,2026-06-16 10:00:00,82.8,99.0,37.5,110.4,115.5,16.0 +PT1008,2026-06-16 10:15:00,84.2,99.1,37.3,107.7,115.1,16.3 +PT1008,2026-06-16 10:30:00,83.4,98.9,36.9,106.2,114.7,16.1 +PT1008,2026-06-16 10:45:00,83.2,98.9,36.9,108.4,112.0,16.6 +PT1008,2026-06-16 11:00:00,85.4,99.1,37.1,109.5,111.9,17.4 +PT1008,2026-06-16 11:15:00,87.2,98.9,37.2,110.9,114.7,17.1 +PT1008,2026-06-16 11:30:00,86.3,99.0,36.8,114.7,113.3,17.2 +PT1008,2026-06-16 11:45:00,86.2,99.2,36.7,114.1,115.7,17.3 +PT1008,2026-06-16 12:00:00,86.5,99.5,37.1,115.2,116.1,17.2 +PT1008,2026-06-16 12:15:00,86.5,98.9,37.2,116.1,117.6,16.9 +PT1008,2026-06-16 12:30:00,86.9,99.1,36.8,116.2,118.4,16.5 +PT1008,2026-06-16 12:45:00,87.4,99.0,37.9,113.0,118.9,16.0 +PT1008,2026-06-16 13:00:00,84.8,99.0,37.4,110.8,120.3,15.8 +PT1008,2026-06-16 13:15:00,85.7,98.7,37.0,109.3,119.8,15.8 +PT1008,2026-06-16 13:30:00,86.5,98.8,37.2,108.1,118.4,15.4 +PT1008,2026-06-16 13:45:00,86.3,99.3,36.7,108.1,118.7,14.7 +PT1008,2026-06-16 14:00:00,84.9,99.1,36.8,105.1,117.0,15.0 +PT1008,2026-06-16 14:15:00,84.8,99.2,37.4,107.0,117.4,15.1 +PT1008,2026-06-16 14:30:00,85.3,99.5,37.1,102.7,117.3,15.2 +PT1008,2026-06-16 14:45:00,85.5,99.4,37.5,104.3,116.5,15.1 +PT1008,2026-06-16 15:00:00,87.0,99.4,37.3,103.0,114.0,15.0 +PT1008,2026-06-16 15:15:00,86.1,99.4,37.2,102.3,111.4,15.1 +PT1008,2026-06-16 15:30:00,86.3,99.8,36.7,101.7,110.8,15.9 +PT1008,2026-06-16 15:45:00,85.5,99.8,37.6,103.9,112.2,15.5 +PT1008,2026-06-16 16:00:00,86.1,99.6,37.2,102.5,112.3,16.4 +PT1008,2026-06-16 16:15:00,88.6,99.8,36.9,100.0,114.4,16.0 +PT1008,2026-06-16 16:30:00,88.9,99.8,37.6,101.7,115.2,15.9 +PT1008,2026-06-16 16:45:00,88.3,99.5,37.3,102.7,115.2,16.0 +PT1008,2026-06-16 17:00:00,88.1,100.0,37.1,103.2,114.5,16.3 +PT1008,2026-06-16 17:15:00,88.2,99.7,37.1,101.2,116.1,15.8 +PT1008,2026-06-16 17:30:00,88.5,100.0,36.4,100.2,117.2,15.7 +PT1008,2026-06-16 17:45:00,88.5,100.0,37.5,101.1,116.3,15.5 +PT1008,2026-06-16 18:00:00,88.1,99.5,36.9,102.1,117.6,15.9 +PT1008,2026-06-16 18:15:00,88.1,99.6,36.9,104.0,118.3,16.2 +PT1008,2026-06-16 18:30:00,85.3,99.8,37.1,102.1,118.1,16.5 +PT1008,2026-06-16 18:45:00,86.1,100.0,37.3,103.2,117.0,15.9 +PT1008,2026-06-16 19:00:00,86.2,99.6,37.8,105.6,118.0,15.9 +PT1008,2026-06-16 19:15:00,87.4,99.4,37.4,107.9,118.4,16.7 +PT1008,2026-06-16 19:30:00,88.0,99.5,36.7,105.5,117.7,16.8 +PT1008,2026-06-16 19:45:00,88.5,99.3,37.2,104.8,118.7,16.5 +PT1008,2026-06-16 20:00:00,88.6,99.0,37.7,106.5,120.1,16.9 +PT1008,2026-06-16 20:15:00,88.1,98.5,36.7,105.2,121.6,16.9 +PT1008,2026-06-16 20:30:00,86.1,98.8,37.9,106.4,120.8,17.6 +PT1008,2026-06-16 20:45:00,87.3,99.0,36.8,107.5,122.1,18.4 +PT1008,2026-06-16 21:00:00,86.8,99.0,37.3,108.6,124.4,18.6 +PT1008,2026-06-16 21:15:00,87.6,99.0,36.9,107.8,124.6,18.3 +PT1008,2026-06-16 21:30:00,88.0,98.8,36.7,111.5,124.8,18.9 +PT1008,2026-06-16 21:45:00,86.6,98.8,37.4,113.4,124.0,18.8 +PT1008,2026-06-16 22:00:00,86.1,98.6,37.1,114.8,122.1,18.7 +PT1008,2026-06-16 22:15:00,86.7,98.8,37.3,116.7,121.6,19.1 +PT1008,2026-06-16 22:30:00,87.5,98.6,37.1,118.1,121.4,19.1 +PT1008,2026-06-16 22:45:00,90.0,98.4,36.9,120.4,123.6,19.4 +PT1008,2026-06-16 23:00:00,92.0,98.3,37.3,121.8,123.7,19.3 +PT1008,2026-06-16 23:15:00,94.2,98.3,36.7,125.8,123.5,19.3 +PT1008,2026-06-16 23:30:00,93.5,98.2,37.0,125.1,122.0,19.0 +PT1008,2026-06-16 23:45:00,94.9,97.9,37.3,121.0,119.4,18.7 diff --git a/medical-imaging-demo/pages/__init__.py b/medical-imaging-demo/pages/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/medical-imaging-demo/pages/cohort.py b/medical-imaging-demo/pages/cohort.py new file mode 100644 index 0000000..d8ee78f --- /dev/null +++ b/medical-imaging-demo/pages/cohort.py @@ -0,0 +1,214 @@ +import dash_mantine_components as dmc +from dash import dcc, html +from dash_iconify import DashIconify +import numpy as np + +from components.charts import (create_crossfilter_scatter, create_diagnosis_donut, + create_age_sex_chart, create_risk_strat_chart, + create_vitals_chart) +from components.tables import create_patient_table +from utils.data_loader import get_cohort, get_vitals, df_patients + +df_cohort = get_cohort() + +VITALS_ALL = ["HR", "SpO2", "Temp", "SysBP", "DiaBP", "RR"] +PATIENT_OPTIONS = [ + {"value": row["patient_id"], "label": f"{row['patient_id']} — {row['name']}"} + for _, row in df_patients.head(8).iterrows() +] +_default_patient = PATIENT_OPTIONS[0]["value"] +_df_vitals0 = get_vitals(_default_patient, "24h") + +_cf1 = create_crossfilter_scatter(df_cohort, "age", "bmi") +_cf2 = create_crossfilter_scatter(df_cohort, "systolic_bp","ldl") +_cf3 = create_crossfilter_scatter(df_cohort, "hba1c", "egfr") + +SCATTER_CONFIG = { + "displayModeBar": True, + "modeBarButtonsToRemove": [ + "zoom2d", "pan2d", "zoomIn2d", "zoomOut2d", + "autoScale2d", "toImage", "hoverClosestCartesian", + "hoverCompareCartesian", "toggleSpikelines", + ], + "displaylogo": False, +} + +crossfilter_view = html.Div([ + dmc.Alert( + "Lasso or box-select points on any chart — the selection propagates across all three plots.", + color="navy", variant="light", + icon=DashIconify(icon="tabler:filter"), + mb="md", + ), + dmc.Grid([ + dmc.GridCol([ + dmc.Paper( + dcc.Graph(id="cf-scatter1", figure=_cf1, + config=SCATTER_CONFIG, + style={"height": "320px"}), + p=0, radius="md", withBorder=True, + style={"overflow": "hidden"}, + ), + ], span={"base": 12, "md": 4}), + dmc.GridCol([ + dmc.Paper( + dcc.Graph(id="cf-scatter2", figure=_cf2, + config=SCATTER_CONFIG, + style={"height": "320px"}), + p=0, radius="md", withBorder=True, + style={"overflow": "hidden"}, + ), + ], span={"base": 12, "md": 4}), + dmc.GridCol([ + dmc.Paper( + dcc.Graph(id="cf-scatter3", figure=_cf3, + config=SCATTER_CONFIG, + style={"height": "320px"}), + p=0, radius="md", withBorder=True, + style={"overflow": "hidden"}, + ), + ], span={"base": 12, "md": 4}), + ], gutter="md"), + + dmc.Grid([ + dmc.GridCol([ + dmc.Paper( + dmc.Stack([ + dmc.Text("Cohort Summary", fw=600, size="lg"), + dmc.Divider(), + dmc.SimpleGrid(id="cf-summary-grid", cols=3, spacing="sm"), + ], gap="sm"), + p="md", radius="md", withBorder=True, + ), + ], span={"base": 12, "md": 4}), + dmc.GridCol([ + dmc.Paper( + dmc.Stack([ + dmc.Text("Filtered Patients", fw=600, size="lg"), + html.Div(id="cf-patient-table"), + ], gap="sm"), + p="md", radius="md", withBorder=True, + ), + ], span={"base": 12, "md": 8}), + ], gutter="md", mt="md"), + + # ── Vital Signs Trend (per-patient) ────────────────────────────────────── + dmc.Divider(mt="xl", mb="md"), + dmc.Group([ + DashIconify(icon="tabler:activity-heartbeat", width=20, color="#1e3a8a"), + dmc.Text("Vital Signs Trend", fw=600, size="lg"), + dmc.Text("per selected patient", c="dimmed", size="sm"), + ], gap=8, align="center", mb="md"), + dmc.Paper( + dmc.Group([ + dmc.Group([ + dmc.Text("Patient", size="xs", fw=500, c="dimmed"), + dmc.Select( + id="cohort-vitals-patient", + data=PATIENT_OPTIONS, + value=_default_patient, + w=260, size="xs", + ), + ], gap=6), + dmc.Divider(orientation="vertical", style={"alignSelf": "stretch"}), + dmc.Group([ + dmc.Text("Period", size="xs", fw=500, c="dimmed"), + dmc.SegmentedControl( + id="cohort-vitals-period", + data=["6h", "12h", "24h", "48h", "72h"], + value="24h", size="xs", color="navy", + ), + ], gap=6), + dmc.Divider(orientation="vertical", style={"alignSelf": "stretch"}), + dmc.Group([ + dmc.Text("Vitals", size="xs", fw=500, c="dimmed"), + dmc.MultiSelect( + id="cohort-vitals-select", + data=[{"value": v, "label": v} for v in VITALS_ALL], + value=["HR", "SpO2"], + w=260, size="xs", clearable=True, + ), + ], gap=6), + dmc.Divider(orientation="vertical", style={"alignSelf": "stretch"}), + dmc.Group([ + dmc.Text("Display", size="xs", fw=500, c="dimmed"), + dmc.Switch(id="cohort-vitals-ref-toggle", label="Reference bands", + checked=True, size="xs", color="navy"), + dmc.Select( + id="cohort-vitals-ma", + data=[{"value": "none", "label": "No smoothing"}, + {"value": "20", "label": "20-pt MA"}, + {"value": "50", "label": "50-pt MA"}], + value="none", w=130, size="xs", + ), + ], gap=8), + ], gap="md", align="center"), + p="sm", radius="md", withBorder=True, mb="md", + ), + dmc.Paper( + dcc.Graph( + id="cohort-vitals-trend-chart", + figure=create_vitals_chart(_df_vitals0, ["HR", "SpO2"]), + config={"displayModeBar": False}, + style={"height": "420px"}, + ), + p="md", radius="md", withBorder=True, + ), +], id="crossfilter-view") + + +# ── Combined Demographics & Risk view ──────────────────────────────────────── +overview_view = html.Div([ + dmc.Grid([ + dmc.GridCol([ + dmc.Paper( + dcc.Graph(id="demo-donut", + figure=create_diagnosis_donut(df_cohort), + config={"displayModeBar": False}, + style={"height": "380px"}), + p="md", radius="md", withBorder=True, + ), + ], span={"base": 12, "md": 6}), + dmc.GridCol([ + dmc.Paper( + dcc.Graph(id="demo-agesex", + figure=create_age_sex_chart(df_cohort), + config={"displayModeBar": False}, + style={"height": "380px"}), + p="md", radius="md", withBorder=True, + ), + ], span={"base": 12, "md": 6}), + ], gutter="md"), + dmc.Paper( + dcc.Graph(id="risk-strat-chart", + figure=create_risk_strat_chart(df_cohort), + config={"displayModeBar": False}, + style={"height": "420px"}), + p="md", radius="md", withBorder=True, mt="md", + ), +], id="overview-view", style={"display": "none"}) + + +layout = dmc.Box( + dmc.Stack([ + dmc.Group([ + dmc.Stack([ + dmc.Title("Cohort Explorer", order=2), + dmc.Text("200-patient biomarker cohort — linked crossfilter brushing", + c="dimmed"), + ], gap=4), + dmc.SegmentedControl( + id="cohort-view", + data=[ + {"value": "crossfilter", "label": "Crossfilter"}, + {"value": "overview", "label": "Demographics & Risk"}, + ], + value="crossfilter", color="navy", size="sm", radius="md", + ), + ], justify="space-between", mb="lg"), + + crossfilter_view, + overview_view, + ], gap="md"), + p="md", +) diff --git a/medical-imaging-demo/pages/dashboard.py b/medical-imaging-demo/pages/dashboard.py new file mode 100644 index 0000000..b1f75c7 --- /dev/null +++ b/medical-imaging-demo/pages/dashboard.py @@ -0,0 +1,286 @@ +import dash_mantine_components as dmc +from dash import dcc, html +from dash_iconify import DashIconify + +from components.charts import create_admissions_chart, create_ecg_sparkline +from components.kpi_cards import create_kpi_card, create_risk_row +from utils.data_loader import get_census_metrics, get_risk_overview, get_admissions_data + +metrics = get_census_metrics() +risk = get_risk_overview() +adm_df = get_admissions_data() + +# ── 5 hardcoded ICU patients that the websocket callback streams ────────────── +ICU_PATIENTS = [ + {"id": "PT1001", "name": "J. Smith", "dx": "Sepsis"}, + {"id": "PT1002", "name": "M. Johnson", "dx": "Heart Failure"}, + {"id": "PT1003", "name": "R. Williams", "dx": "COPD Exacerbation"}, + {"id": "PT1004", "name": "P. Brown", "dx": "Hypertensive Crisis"}, + {"id": "PT1005", "name": "J. Garcia", "dx": "Pneumonia"}, +] + +# ── Alert thresholds ────────────────────────────────────────────────────────── +ICU_BASE = { + "PT1001": {"hr": 72, "spo2": 98.5, "sbp": 118, "dbp": 76, "rr": 14}, + "PT1002": {"hr": 92, "spo2": 96.8, "sbp": 148, "dbp": 90, "rr": 18}, + "PT1003": {"hr": 88, "spo2": 93.5, "sbp": 108, "dbp": 68, "rr": 21}, + "PT1004": {"hr": 78, "spo2": 99.1, "sbp": 168, "dbp": 97, "rr": 16}, + "PT1005": {"hr": 66, "spo2": 98.9, "sbp": 125, "dbp": 80, "rr": 13}, +} + + +def _vital_badge(value_str: str, pid: str, vital: str) -> html.Span: + return html.Span(value_str, id=f"live-{vital}-{pid}", + style={"fontFamily": "monospace", "fontWeight": 700}) + + +def _icu_row(p: dict) -> dmc.Paper: + pid = p["id"] + base = ICU_BASE[pid] + return dmc.Paper( + dmc.Group([ + dmc.Stack([ + dmc.Text(p["name"], size="sm", fw=600), + dmc.Text(p["dx"], size="xs", c="dimmed"), + ], gap=2, w=120), + dmc.Divider(orientation="vertical"), + dmc.Stack([ + dmc.Text("HR", size="xs", c="dimmed"), + _vital_badge(str(base["hr"]), pid, "hr"), + dmc.Text("bpm", size="xs", c="dimmed"), + ], gap=1, align="center"), + dmc.Stack([ + dmc.Text("SpO₂", size="xs", c="dimmed"), + _vital_badge(f"{base['spo2']}%", pid, "spo2"), + ], gap=1, align="center"), + dmc.Stack([ + dmc.Text("BP", size="xs", c="dimmed"), + _vital_badge(f"{base['sbp']}/{base['dbp']}", pid, "bp"), + dmc.Text("mmHg", size="xs", c="dimmed"), + ], gap=1, align="center"), + dmc.Stack([ + dmc.Text("RR", size="xs", c="dimmed"), + _vital_badge(str(base["rr"]), pid, "rr"), + dmc.Text("/min", size="xs", c="dimmed"), + ], gap=1, align="center"), + ], gap="lg", align="center"), + p="xs", + radius="sm", + withBorder=True, + style={"backgroundColor": "rgba(0,0,0,0.01)"}, + ) + + +layout = dmc.Stack([ + # ── Header ──────────────────────────────────────────────────────────────── + dmc.Group([ + dmc.Stack([ + dmc.Title("Clinical Dashboard", order=2), + dmc.Text("Real-time census, ICU vitals, and risk overview", c="dimmed"), + ], gap=4), + dmc.Group([ + dmc.SegmentedControl( + id="dashboard-period", + data=[{"value": v, "label": v} + for v in ["7d","14d","30d"]], + value="30d", + size="sm", + ), + dmc.Select( + id="dashboard-dept", + data=[{"value": "All", "label": "All Departments"}] + + [{"value": d, "label": d} for d in + ["Cardiology","Pulmonology","Neurology", + "General Medicine","Surgery","Nephrology","Oncology"]], + value="All", + w=200, + size="sm", + ), + ], gap="sm"), + ], justify="space-between", mb="lg"), + + # ── KPI Cards ───────────────────────────────────────────────────────────── + dmc.SimpleGrid([ + create_kpi_card("kpi-total", "Total Patients", + str(metrics["total_patients"]), + icon="tabler:users"), + create_kpi_card("kpi-icu", "ICU Occupancy", + f"{metrics['icu_occupancy']:.1f}%", + trend="25 beds", + trend_positive=True, + icon="tabler:activity"), + create_kpi_card("kpi-los", "Avg Length of Stay", + f"{metrics['avg_los']} days", + icon="tabler:clock"), + create_kpi_card("kpi-alerts", "Critical Alerts", + str(metrics["critical_alerts"]), + trend="Risk score > 70", + trend_positive=False, + icon="tabler:alert-triangle", + alert_color="red"), + ], cols={"base": 1, "sm": 2, "lg": 4}, spacing="md"), + + # ── Main Row: Live Vitals + Admissions chart ─────────────────────────────── + dmc.Grid([ + # Live ICU vitals panel + dmc.GridCol([ + dcc.Store(id="live-streaming", data=True), + dmc.Paper( + dmc.Stack([ + dmc.Group([ + dmc.Group([ + dmc.Text("Live ICU Monitor", fw=600, size="lg"), + html.Div( + style={ + "width": 8, "height": 8, + "borderRadius": "50%", + "backgroundColor": "#22c55e", + "animation": "pulse 1.5s ease-in-out infinite", + }, + id="live-indicator", + ), + dmc.Badge("LIVE", color="green", size="sm", variant="light"), + ], gap="xs"), + dmc.Switch(id="icu-live-toggle", label="Stream", + checked=True, size="sm"), + ], justify="space-between"), + dmc.Divider(), + + dmc.Stack([_icu_row(p) for p in ICU_PATIENTS], gap="xs"), + + dmc.Divider(), + dmc.Group([ + dmc.Text("ECG — ", size="xs", c="dimmed"), + dmc.Select( + id="ecg-patient-select", + data=[{"value": p["id"], "label": p["name"]} + for p in ICU_PATIENTS], + value="PT1001", + size="xs", w=150, + ), + ], gap=4), + dcc.Graph( + id="ecg-sparkline-chart", + figure=create_ecg_sparkline([72], "PT1001"), + config={"displayModeBar": False}, + style={"height": "100px"}, + ), + ], gap="sm"), + p="md", radius="md", withBorder=True, + ), + ], span={"base": 12, "md": 6}), + + # Admissions chart + dmc.GridCol([ + dmc.Paper( + dmc.Stack([ + dcc.Graph( + id="admissions-chart", + figure=create_admissions_chart(adm_df), + config={"displayModeBar": False}, + style={"height": "360px"}, + ), + ]), + p="md", radius="md", withBorder=True, + ), + ], span={"base": 12, "md": 6}), + ], gutter="md"), + + # ── Bottom Row: Risk Overview + Quick Stats ──────────────────────────────── + dmc.Grid([ + dmc.GridCol([ + dmc.Paper( + dmc.Stack([ + dmc.Text("Population Risk Overview", fw=600, size="lg"), + dmc.Text("Average risk scores across all admitted patients", + size="xs", c="dimmed"), + dmc.Divider(my="sm"), + dmc.Stack([ + create_risk_row("risk-sepsis", "Sepsis Risk", + f"{risk['sepsis']:.1f}%", + risk["sepsis"], "red"), + create_risk_row("risk-fall", "Fall Risk", + f"{risk['fall']:.1f}%", + risk["fall"], "orange"), + create_risk_row("risk-readmit", "Readmission", + f"{risk['readmit']:.1f}%", + risk["readmit"], "yellow"), + create_risk_row("risk-deterioration", "Deterioration", + f"{risk['deterioration']:.1f}%", + risk["deterioration"], "grape"), + ], gap="md", mt="sm"), + ], gap="sm"), + p="md", radius="md", withBorder=True, h="100%", + ), + ], span={"base": 12, "md": 4}), + + dmc.GridCol([ + dmc.Paper( + dmc.Stack([ + dmc.Text("Department Snapshot", fw=600, size="lg"), + dmc.SimpleGrid([ + dmc.Paper( + dmc.Stack([ + dmc.Text(dept, size="xs", c="dimmed", fw=600), + dmc.Text(str(count), size="lg", fw=700), + dmc.Text("admitted today", size="xs", c="dimmed"), + ], gap=4), + p="sm", radius="sm", withBorder=True, + ) + for dept, count in [ + ("Cardiology", 12), ("Pulmonology", 8), + ("Neurology", 6), ("Surgery", 10), + ("Nephrology", 5), ("Oncology", 4), + ] + ], cols=2, spacing="sm"), + ], gap="sm"), + p="md", radius="md", withBorder=True, + ), + ], span={"base": 12, "md": 4}), + + dmc.GridCol([ + dmc.Paper( + dmc.Stack([ + dmc.Text("System Status", fw=600, size="lg"), + dmc.Stack([ + dmc.Group([ + DashIconify(icon="tabler:circle-filled", + width=10, color="#22c55e"), + dmc.Text("EMR System", size="sm"), + dmc.Text("Online", size="sm", c="teal", fw=500, + style={"marginLeft": "auto"}), + ]), + dmc.Group([ + DashIconify(icon="tabler:circle-filled", + width=10, color="#22c55e"), + dmc.Text("PACS Imaging", size="sm"), + dmc.Text("Online", size="sm", c="teal", fw=500, + style={"marginLeft": "auto"}), + ]), + dmc.Group([ + DashIconify(icon="tabler:circle-filled", + width=10, color="#22c55e"), + dmc.Text("Lab Interface", size="sm"), + dmc.Text("Online", size="sm", c="teal", fw=500, + style={"marginLeft": "auto"}), + ]), + dmc.Group([ + DashIconify(icon="tabler:circle-filled", + width=10, color="#f59e0b"), + dmc.Text("ICU Monitoring", size="sm"), + dmc.Text("Degraded", size="sm", c="yellow", fw=500, + style={"marginLeft": "auto"}), + ]), + ], gap="md", mt="sm"), + dmc.Divider(my="sm"), + dmc.Alert( + "All patient data is synthetic and for demonstration only.", + color="blue", variant="light", icon=DashIconify(icon="tabler:info-circle"), + ), + ], gap="sm"), + p="md", radius="md", withBorder=True, h="100%", + ), + ], span={"base": 12, "md": 4}), + ], gutter="md"), + +], gap="md") diff --git a/medical-imaging-demo/pages/imaging.py b/medical-imaging-demo/pages/imaging.py new file mode 100644 index 0000000..da76c9e --- /dev/null +++ b/medical-imaging-demo/pages/imaging.py @@ -0,0 +1,557 @@ +import dash_mantine_components as dmc +from dash import dcc, html +from dash_iconify import DashIconify + +from components.imaging import (load_xray_b64, create_xray_figure, XRAY_DIR, + SEVERITY_COLORS, severity_color, newshape_for) +from components.charts import create_ecg_sparkline +from utils.data_loader import (get_studies, get_patient, get_labs, + get_vitals, get_vitals_stats) + +df_studies = get_studies() +STUDIES = df_studies.to_dict("records") + +# ── Palette (scoped to this page) — light cream + deep navy ───────────────────── +BG_DEEP = "#f4f3ef" # off-white, faint cream wash (page backdrop — minimal cream) +BG_SURFACE = "#fcfcfb" # clean near-white (panels / Paper) +BG_INSET = "#eef0f2" # very light cool grey (cards, toolbars, insets) +BORDER = "#e1e3e7" # neutral grey border +TEXT_HI = "#1e2433" # charcoal (primary text) +TEXT_DIM = "#6b7280" # cool slate (secondary text) +ACCENT = "#1e3a8a" # deep navy highlight +ACCENT_DK = "#172554" # deepest navy (top accent borders) + +# Custom Mantine "navy" color ramp (shade 9 = ACCENT) +NAVY_RAMP = ["#eef2fb", "#d9e1f4", "#b3c2e8", "#8aa1db", "#6886d0", + "#5274c9", "#456bc6", "#37539e", "#27407f", "#1e3a8a"] + +# Active study-card tint (replaces the old cyan glow) +CARD_ACTIVE_BG = "#e6eaf5" # pale navy +CARD_ACTIVE_SHADOW = "0 0 0 1px rgba(30,58,138,0.2)" +# Neutral light grey behind the X-ray canvas (light viewport) +VIEWPORT_BG = "#e7e9ec" +# DICOM corner overlays render ON TOP of the (inherently dark) X-ray image, +# so they keep light text regardless of the light chrome around them. +OVERLAY_HI = "#eef2f8" # near-white +OVERLAY_DIM = "#aab4c5" # light slate +OVERLAY_ACCENT = "#7da2e8" # light navy (legible on the dark X-ray) + + +# Key labs → one-line clinical interpretation when flagged abnormal +_LAB_INTERPRETATION = { + "WBC": "infection / pneumonia", + "Troponin": "cardiac injury", + "Lactate": "sepsis / hypoperfusion", + "Creatinine": "renal function", + "BUN": "renal function", + "Hemoglobin": "anemia / bleeding", + "Glucose": "glycemic control", + "Potassium": "electrolyte imbalance", + "Sodium": "electrolyte imbalance", +} + + +def _risk_badge(patient: dict): + """Coloured risk badge from a patient's risk_score.""" + score = patient.get("risk_score") + if score is None: + return None + color = "red" if score > 70 else "yellow" if score > 40 else "teal" + return dmc.Badge(f"Risk {score:.0f}", color=color, variant="light", size="sm") + + +# ── Premium PACS chrome: patient banner, image overlays, status bar ─────────── +_MONO = "ui-monospace, SFMono-Regular, Menlo, monospace" + +_DRAW_LABELS = { + "drawrect": "Rectangle", "drawline": "Line", + "drawcircle": "Circle", "drawopenpath": "Freehand", +} + + +def _meta_chip(label: str, value, mono: bool = False): + """A compact label/value pair for the banner identity row.""" + return dmc.Group([ + dmc.Text(label, size="9px", c=TEXT_DIM, tt="uppercase", + style={"letterSpacing": "0.6px", "fontWeight": 700}), + dmc.Text(str(value), size="xs", fw=600, c=TEXT_HI, + style={"fontFamily": _MONO} if mono else None), + ], gap=5, wrap="nowrap") + + +def _vitals_tile(pid: str): + """HR/SpO₂ readout + HR sparkline for the banner.""" + df_vit = get_vitals(pid, "24h") + if df_vit.empty: + return dmc.Text("No vitals", size="xs", c=TEXT_DIM) + hr = get_vitals_stats(pid, "HR", "24h") + spo2 = get_vitals_stats(pid, "SpO2", "24h") + spark = create_ecg_sparkline(df_vit["HR"].tolist()) + return dmc.Group([ + dmc.Stack([ + dmc.Text(f"HR {hr.get('current', '—')}", size="sm", fw=700, c="#22c55e"), + dmc.Text(f"SpO₂ {spo2.get('current', '—')}%", size="xs", fw=600, c=ACCENT), + ], gap=2), + html.Div( + dcc.Graph(figure=spark, config={"displayModeBar": False}, + style={"height": "34px", "width": "96px"}), + style={"width": "96px"}, + ), + ], gap=8, wrap="nowrap", align="center") + + +def _lab_chip(test: str, value, unit: str, flag: str): + up = flag == "H" + color = "#dc2626" if up else ACCENT + return dmc.Tooltip( + label=f"{test} {value:.1f} {unit} — {_LAB_INTERPRETATION.get(test, 'abnormal')}", + withArrow=True, position="bottom", color="dark", + children=dmc.Group([ + dmc.Text(test, size="xs", fw=700, c=TEXT_HI), + DashIconify(icon="tabler:arrow-up" if up else "tabler:arrow-down", + width=13, color=color), + ], gap=3, wrap="nowrap", + style={"padding": "3px 9px", "borderRadius": "6px", + "backgroundColor": BG_INSET, + "border": f"1px solid {color}55"}), + ) + + +def _patient_banner_content(study: dict): + """Full-width PACS banner: identity (left) + clinical signal (right).""" + if not study: + return dmc.Text("No study selected.", size="sm", c=TEXT_DIM) + pid = study.get("patient_id") + patient = get_patient(pid) if pid else {} + + # Identity ──────────────────────────────────────────────────────────────── + identity = dmc.Stack([ + dmc.Group([ + dmc.Text(study.get("patient_name", "—"), size="lg", fw=700, c=TEXT_HI), + (_risk_badge(patient) or html.Span()), + (dmc.Text(patient.get("diagnosis", ""), size="xs", c=TEXT_DIM) + if patient.get("diagnosis") else html.Span()), + ], gap=10, align="center", wrap="nowrap"), + dmc.Group([ + _meta_chip("MRN", pid or "—", mono=True), + _meta_chip("Age/Sex", f"{study.get('age', '—')}/{study.get('gender', '—')}"), + _meta_chip("Modality", f"CXR {study.get('view_position', '')}".strip()), + _meta_chip("Acc", study.get("accession", "—"), mono=True), + _meta_chip("Date", study.get("study_date", "—"), mono=True), + ], gap=18, wrap="nowrap"), + ], gap=8) + + # Clinical signal ─────────────────────────────────────────────────────────── + df_labs = get_labs(pid) if pid else None + abnormal = (df_labs[df_labs["flag"] != "N"] + if df_labs is not None and not df_labs.empty else None) + if abnormal is None or abnormal.empty: + lab_block = dmc.Text("Labs WNL", size="xs", c="#22c55e", fw=600) + else: + lab_block = dmc.Group( + [_lab_chip(r["test"], r["value"], r["unit"], r["flag"]) + for _, r in abnormal.iterrows()], + gap=8, wrap="nowrap", + ) + + clinical = dmc.Group([ + dmc.Stack([ + dmc.Text("ABNORMAL LABS", size="9px", c=TEXT_DIM, tt="uppercase", + style={"letterSpacing": "0.6px", "fontWeight": 700}), + lab_block, + ], gap=4), + dmc.Divider(orientation="vertical", color=BORDER), + dmc.Stack([ + dmc.Text("VITALS · 24H", size="9px", c=TEXT_DIM, tt="uppercase", + style={"letterSpacing": "0.6px", "fontWeight": 700}), + _vitals_tile(pid) if pid else dmc.Text("—", size="xs", c=TEXT_DIM), + ], gap=4), + ], gap=16, wrap="nowrap", align="center") + + return dmc.Group( + [identity, clinical], + justify="space-between", align="center", wrap="nowrap", + style={"flex": 1}, + ) + + +def _corner(children, vertical: str, horizontal: str, align: str): + # A subtle dark "scrim" chip keeps the light DICOM text legible whether it + # falls over the dark X-ray or the light letterbox margins. + style = {"position": "absolute", vertical: "10px", horizontal: "12px", + "pointerEvents": "none", "textAlign": align, + "fontFamily": _MONO, "fontSize": "10px", "lineHeight": "1.5", + "color": OVERLAY_DIM, + "backgroundColor": "rgba(15,23,42,0.62)", + "padding": "5px 9px", "borderRadius": "6px", + "backdropFilter": "blur(1.5px)"} + return html.Div(children, style=style) + + +def _image_overlays(study: dict, window, level, invert: bool): + """DICOM-style text overlaid in the four corners of the image.""" + study = study or {} + tl = [html.Div(study.get("patient_name", "—"), + style={"color": OVERLAY_HI, "fontWeight": 700}), + html.Div(f"MRN {study.get('patient_id', '—')}"), + html.Div(f"{study.get('age', '—')}/{study.get('gender', '—')}")] + tr = [html.Div(f"ACC {study.get('accession', '—')}", + style={"color": OVERLAY_HI, "fontWeight": 700}), + html.Div(f"{study.get('view_position', '—')} · {study.get('study_date', '—')}")] + bl = [html.Div(f"W: {int(window or 0)} L: {int(level or 0)}", + style={"color": OVERLAY_ACCENT}), + html.Div(f"Invert: {'ON' if invert else 'OFF'}")] + br = [html.Div("CXR", style={"color": OVERLAY_HI, "fontWeight": 700}), + html.Div("General Hospital"), + html.Div(study.get("referrer", ""))] + return [ + _corner(tl, "top", "left", "left"), + _corner(tr, "top", "right", "right"), + _corner(bl, "bottom", "left", "left"), + _corner(br, "bottom", "right", "right"), + ] + + +def _status_bar(draw_mode, window, level, invert: bool): + """Thin professional readout strip under the image.""" + def seg(label, value, accent=False): + return dmc.Group([ + dmc.Text(label, size="10px", c=TEXT_DIM, tt="uppercase", + style={"letterSpacing": "0.5px"}), + dmc.Text(str(value), size="11px", fw=600, + c=ACCENT if accent else TEXT_HI, + style={"fontFamily": _MONO}), + ], gap=5, wrap="nowrap") + + return dmc.Group([ + dmc.Group([ + DashIconify(icon="tabler:pencil", width=13, color=TEXT_DIM), + seg("Tool", _DRAW_LABELS.get(draw_mode, "Rectangle")), + ], gap=6, wrap="nowrap"), + seg("Window", int(window or 0), accent=True), + seg("Level", int(level or 0), accent=True), + seg("Invert", "On" if invert else "Off"), + seg("Matrix", "512×512"), + ], gap=20, wrap="nowrap", + style={"padding": "6px 14px", "backgroundColor": BG_DEEP, + "borderTop": f"1px solid {BORDER}"}) + + +def _study_card(study: dict) -> dmc.UnstyledButton: + sid = study["study_id"] + name = study.get("patient_name", sid) + age_sex = f"{study.get('age', '—')} / {study.get('gender', '—')}" + view = study.get("view_position", "") + finding = study.get("finding_labels", "").split("|")[0] + is_normal = finding.lower() in ("no finding", "") + badge_color = "gray" if is_normal else "navy" + + return dmc.UnstyledButton( + dmc.Stack([ + dmc.Group([ + dmc.Text(sid, size="xs", c=TEXT_DIM, ff="monospace", fw=600), + dmc.Badge(view, size="xs", variant="outline", + color="gray", radius="sm"), + ], justify="space-between", wrap="nowrap"), + dmc.Text(name, size="sm", fw=600, c=TEXT_HI, truncate=True), + dmc.Group([ + dmc.Text(age_sex, size="xs", c=TEXT_DIM), + dmc.Badge(finding or "—", size="xs", variant="light", + color=badge_color, radius="sm"), + ], justify="space-between", wrap="nowrap"), + ], gap=6), + id={"type": "study-thumb", "index": sid}, + className="study-card", + style={ + "width": "100%", + "padding": "10px 12px", + "backgroundColor": BG_INSET, + "border": f"1px solid {BORDER}", + "borderRadius": "8px", + "textAlign": "left", + "transition": "border-color 0.15s ease, background-color 0.15s ease", + }, + ) + + +# ── Defaults ─────────────────────────────────────────────────────────────────── +_default = STUDIES[0] +_img_path = XRAY_DIR / _default["image_file"] +_img_b64 = load_xray_b64(_img_path) +_fig0 = create_xray_figure(_img_b64) +_fig0.update_layout(newshape=newshape_for("Medium")) # match default severity + +DRAW_TOOLS = [ + {"value": "drawrect", "label": "Rect"}, + {"value": "drawline", "label": "Line"}, + {"value": "drawcircle", "label": "Circle"}, + {"value": "drawopenpath", "label": "Path"}, +] + +FINDING_OPTIONS = [{"value": v, "label": v} for v in [ + "Nodule", "Mass", "Effusion", "Cardiomegaly", "Pneumothorax", + "Atelectasis", "Consolidation", "Pneumonia", "Infiltration", + "Fibrosis", "Fracture", "Foreign Body", "Unspecified", +]] + + +_panel_style = { + "backgroundColor": BG_SURFACE, + "border": f"1px solid {BORDER}", +} + +_section_label = lambda text: dmc.Text( + text, size="xs", fw=700, c=TEXT_DIM, tt="uppercase", + style={"letterSpacing": "0.6px"}, +) + + +# ── Studies panel ────────────────────────────────────────────────────────────── +studies_panel = dmc.Paper( + dmc.Stack([ + dmc.Group([ + _section_label("Studies"), + dmc.Badge(str(len(STUDIES)), size="sm", color="navy", + variant="light"), + ], justify="space-between"), + dmc.Divider(color=BORDER), + dmc.ScrollArea( + dmc.Stack([_study_card(s) for s in STUDIES], gap="xs"), + type="auto", offsetScrollbars=True, + style={"height": "calc(100vh - 200px)"}, + ), + ], gap="sm"), + p="md", radius="md", + style={**_panel_style, "height": "100%"}, +) + + +# ── Viewport toolbar ─────────────────────────────────────────────────────────── +def _slider_control(label, slider_id, mn, mx, val, step=5): + return dmc.Group([ + dmc.Text(label, size="xs", fw=600, c=TEXT_DIM, w=52), + html.Div( + dmc.Slider( + id=slider_id, min=mn, max=mx, step=step, value=val, + color="navy", size="sm", + label=None, + showLabelOnHover=False, + marks=[], + ), + style={"width": "150px"}, + ), + ], gap=8, wrap="nowrap") + + +viewport_toolbar = dmc.Group([ + dmc.Group([ + _slider_control("Window", "window-slider", 30, 255, 220), + _slider_control("Level", "level-slider", 10, 245, 128), + dmc.Switch( + id="invert-toggle", + label="Invert", + checked=False, + size="sm", color="navy", + styles={"label": {"color": TEXT_HI, "fontSize": "12px"}}, + ), + ], gap="lg", wrap="nowrap"), + dmc.Group([ + dmc.SegmentedControl( + id="draw-mode-select", + data=DRAW_TOOLS, + value="drawrect", + size="xs", color="navy", + styles={ + "root": {"backgroundColor": BG_INSET, + "border": f"1px solid {BORDER}"}, + }, + ), + dmc.Button( + "Reset", + id="reset-annotations-btn", + size="xs", variant="subtle", color="gray", + leftSection=DashIconify(icon="tabler:rotate-clockwise", width=14), + ), + ], gap="sm", wrap="nowrap"), +], justify="space-between", align="center", wrap="wrap", + style={"padding": "10px 14px", + "backgroundColor": BG_INSET, + "borderBottom": f"1px solid {BORDER}", + "borderRadius": "8px 8px 0 0"}) + + +def _severity_dot(level: str): + return dmc.Group([ + html.Div(style={"width": 8, "height": 8, "borderRadius": "50%", + "backgroundColor": SEVERITY_COLORS[level]}), + dmc.Text(level, size="xs", c=TEXT_DIM), + ], gap=4, wrap="nowrap") + + +def _pending_tag(finding="Nodule", severity="Medium", note=""): + """Live badge showing how the next-drawn shape will be tagged.""" + children = [ + DashIconify(icon="tabler:pencil-plus", width=13, + color=severity_color(severity)), + dmc.Text("Next:", size="xs", c=TEXT_DIM), + dmc.Text(f"{finding or 'Unspecified'} · {severity or 'Medium'}", + size="xs", fw=700, c=severity_color(severity)), + ] + if note: + children.append(dmc.Text(f"“{note}”", size="xs", c=TEXT_DIM, + style={"fontStyle": "italic"}, truncate=True)) + return dmc.Group(children, gap=6, wrap="nowrap") + + +severity_legend = dmc.Group( + [dmc.Text("Severity", size="xs", fw=600, c=TEXT_DIM)] + + [_severity_dot(l) for l in ("Low", "Medium", "High")], + gap=10, wrap="nowrap", +) + + +annotation_bar = dmc.Stack([ + dmc.Group([ + dmc.Select( + id="finding-label-select", + data=FINDING_OPTIONS, + value="Nodule", + placeholder="Finding", + size="xs", w=150, + leftSection=DashIconify(icon="tabler:tag", width=14), + ), + dmc.Select( + id="severity-select", + data=[{"value": v, "label": v} for v in ["Low", "Medium", "High"]], + value="Medium", size="xs", w=100, + ), + dmc.TextInput( + id="annotation-note", + placeholder="Note (optional)", + size="xs", + style={"flex": 1, "minWidth": "80px"}, + leftSection=DashIconify(icon="tabler:note", width=14), + ), + ], gap="sm", wrap="wrap"), + dmc.Group([ + html.Div(id="pending-annotation", children=_pending_tag()), + severity_legend, + ], justify="space-between", align="center", wrap="nowrap"), +], gap=8, + style={"padding": "10px 14px", + "backgroundColor": BG_INSET, + "borderTop": f"1px solid {BORDER}", + "borderRadius": "0 0 8px 8px"}) + + +viewport_panel = dmc.Paper( + dmc.Stack([ + dcc.Store(id="xray-annotations", data=[]), + dcc.Store(id="annotations-store", data={}), # {study_id: [annotations]} + dcc.Store(id="current-study-id", data=_default["study_id"]), + viewport_toolbar, + html.Div([ + dcc.Graph( + id="xray-graph", + figure=_fig0, + config={ + "displayModeBar": "hover", + "modeBarButtonsToAdd": [ + "drawrect", "drawline", + "drawcircle", "drawopenpath", "eraseshape", + ], + "modeBarButtonsToRemove": ["toImage"], + "scrollZoom": True, + "displaylogo": False, + }, + style={"height": "520px", + "backgroundColor": VIEWPORT_BG}, + ), + html.Div( + id="image-overlays", + children=_image_overlays(_default, 220, 128, False), + style={"position": "absolute", "inset": 0, + "pointerEvents": "none"}, + ), + ], style={"position": "relative", "backgroundColor": VIEWPORT_BG}), + html.Div(id="image-status-bar", + children=_status_bar("drawrect", 220, 128, False)), + annotation_bar, + ], gap=0), + p=0, radius="md", + style={**_panel_style, "overflow": "hidden"}, +) + + +# ── Right detail panel — Findings (primary focus) ───────────────────────────── +detail_panel = dmc.Paper( + dmc.Stack([ + dmc.Group([ + dmc.Group([ + DashIconify(icon="tabler:list-search", width=16, color=ACCENT), + _section_label("Findings"), + ], gap=8), + dmc.Badge(id="findings-count", children="0", + color="navy", variant="light", size="sm"), + ], justify="space-between"), + dmc.Divider(color=BORDER), + html.Div( + id="findings-table-container", + children=dmc.Text( + "No annotations yet. Draw on the X-ray to add findings.", + size="sm", c=TEXT_DIM, ta="center", py="md", + ), + ), + ], gap="sm"), + p="md", radius="md", + style={**_panel_style, "height": "100%", + "borderTop": f"2px solid {ACCENT_DK}"}, +) + + +# ── Full layout (scoped dark provider, full-bleed) ──────────────────────────── +layout = dmc.MantineProvider( + forceColorScheme="light", + theme={ + "primaryColor": "navy", + "primaryShade": 9, + "colors": {"navy": NAVY_RAMP}, + "fontFamily": "Inter, -apple-system, BlinkMacSystemFont, sans-serif", + "components": { + "Paper": {"defaultProps": {"shadow": "none"}}, + }, + }, + children=dmc.Box( + dmc.Stack([ + dcc.Download(id="download-radiology-pdf"), + + # ── PACS patient banner ────────────────────────────────────────── + dmc.Paper( + dmc.Group([ + html.Div(id="patient-banner", + children=_patient_banner_content(_default), + style={"flex": 1, "minWidth": 0}), + dmc.Button( + "Export", + id="export-radiology-btn", + size="xs", variant="subtle", color="navy", + leftSection=DashIconify(icon="tabler:file-type-pdf", width=15), + ), + ], gap="md", wrap="nowrap", align="center"), + px="lg", py="sm", radius="md", + style={**_panel_style, "borderTop": f"2px solid {ACCENT_DK}"}, + ), + + dmc.Grid([ + dmc.GridCol(studies_panel, span={"base": 12, "md": 2}), + dmc.GridCol(viewport_panel, span={"base": 12, "md": 6}), + dmc.GridCol(detail_panel, span={"base": 12, "md": 4}), + ], gutter="md", align="stretch"), + ], gap="md", p="md"), + style={ + "backgroundColor": BG_DEEP, + "minHeight": "calc(100vh - 64px)", + "color": TEXT_HI, + }, + ), +) diff --git a/medical-imaging-demo/pages/vitals.py b/medical-imaging-demo/pages/vitals.py new file mode 100644 index 0000000..ec5d337 --- /dev/null +++ b/medical-imaging-demo/pages/vitals.py @@ -0,0 +1,176 @@ +import dash_mantine_components as dmc +from dash import dcc +from dash_iconify import DashIconify + +from components.charts import create_vitals_chart, create_vitals_variability +from utils.data_loader import get_vitals, df_patients + +VITALS_ALL = ["HR", "SpO2", "Temp", "SysBP", "DiaBP", "RR"] +UNITS = {"HR": "bpm", "SpO2": "%", "Temp": "°C", + "SysBP": "mmHg", "DiaBP": "mmHg", "RR": "/min"} + +PATIENT_OPTIONS = [ + {"value": row["patient_id"], "label": f"{row['patient_id']} — {row['name']}"} + for _, row in df_patients.head(8).iterrows() +] + +DEFAULT_PATIENT = PATIENT_OPTIONS[0]["value"] +DEFAULT_VITALS = ["HR", "SpO2"] +DEFAULT_PERIOD = "24h" + +_df0 = get_vitals(DEFAULT_PATIENT, DEFAULT_PERIOD) + +layout = dmc.Stack([ + # ── Page Header ──────────────────────────────────────────────────────────── + dmc.Group([ + dmc.Stack([ + dmc.Title("Patient Vitals", order=2), + dmc.Text("Vital-sign trends with normal-range reference bands", + c="dimmed"), + ], gap=4), + ], justify="space-between", mb="md"), + + # ── Filter bar ───────────────────────────────────────────────────────────── + dmc.Paper( + dmc.Group([ + dmc.Group([ + dmc.Text("Patient", size="xs", fw=500, c="dimmed"), + dmc.Select( + id="vitals-patient-select", + data=PATIENT_OPTIONS, + value=DEFAULT_PATIENT, + w=260, size="xs", + ), + ], gap=6), + dmc.Divider(orientation="vertical", style={"alignSelf": "stretch"}), + dmc.Group([ + dmc.Text("Period", size="xs", fw=500, c="dimmed"), + dmc.SegmentedControl( + id="vitals-period", + data=["6h", "12h", "24h", "48h", "72h"], + value=DEFAULT_PERIOD, size="xs", + ), + ], gap=6), + dmc.Divider(orientation="vertical", style={"alignSelf": "stretch"}), + dmc.Group([ + dmc.Text("Vitals", size="xs", fw=500, c="dimmed"), + dmc.MultiSelect( + id="vitals-select", + data=[{"value": v, "label": v} for v in VITALS_ALL], + value=DEFAULT_VITALS, + w=260, size="xs", clearable=True, + ), + ], gap=6), + dmc.Divider(orientation="vertical", style={"alignSelf": "stretch"}), + dmc.Group([ + dmc.Text("Display", size="xs", fw=500, c="dimmed"), + dmc.Switch(id="vitals-ref-toggle", label="Reference bands", + checked=True, size="xs"), + dmc.Select( + id="vitals-ma-select", + data=[{"value": "none", "label": "No smoothing"}, + {"value": "20", "label": "20-pt MA"}, + {"value": "50", "label": "50-pt MA"}], + value="none", w=130, size="xs", + ), + ], gap=8), + ], gap="md", align="center"), + p="sm", radius="md", withBorder=True, + ), + + # ── Stat Cards ───────────────────────────────────────────────────────────── + dmc.SimpleGrid([ + dmc.Paper( + dmc.Stack([ + dmc.Text("Current HR", size="sm", c="dimmed"), + dmc.Text( + f"{_df0['HR'].iloc[-1]:.0f} bpm" if not _df0.empty else "—", + size="xl", fw=700, id="stat-current-hr", + ), + dmc.Text("Latest reading", size="xs", c="dimmed"), + ], gap=4), + p="md", radius="md", withBorder=True, + ), + dmc.Paper( + dmc.Stack([ + dmc.Text("Period High / Low", size="sm", c="dimmed"), + dmc.Group([ + dmc.Text( + f"{_df0['HR'].max():.0f}" if not _df0.empty else "—", + size="xl", fw=700, c="red", id="stat-high-hr", + ), + dmc.Text("/", size="xl", c="dimmed"), + dmc.Text( + f"{_df0['HR'].min():.0f}" if not _df0.empty else "—", + size="xl", fw=700, c="blue", id="stat-low-hr", + ), + ], gap=4), + dmc.Text("bpm", size="xs", c="dimmed"), + ], gap=4), + p="md", radius="md", withBorder=True, + ), + dmc.Paper( + dmc.Stack([ + dmc.Text("Current SpO₂", size="sm", c="dimmed"), + dmc.Text( + f"{_df0['SpO2'].iloc[-1]:.1f}%" if not _df0.empty else "—", + size="xl", fw=700, id="stat-current-spo2", + ), + dmc.Text("Latest reading", size="xs", c="dimmed"), + ], gap=4), + p="md", radius="md", withBorder=True, + ), + dmc.Paper( + dmc.Stack([ + dmc.Text("Abnormal Readings", size="sm", c="dimmed"), + dmc.Text("—", size="xl", fw=700, c="red", id="stat-abnormal"), + dmc.Text("Outside reference range", size="xs", c="dimmed"), + ], gap=4), + p="md", radius="md", withBorder=True, + ), + ], cols={"base": 2, "md": 4}, spacing="md"), + + # ── Charts with tabs ─────────────────────────────────────────────────────── + dmc.Paper( + dmc.Stack([ + dmc.Tabs([ + dmc.TabsList([ + dmc.TabsTab("Trend", value="trend"), + dmc.TabsTab("Variability", value="var"), + ]), + dmc.TabsPanel( + dcc.Graph( + id="vitals-trend-chart", + figure=create_vitals_chart(_df0, DEFAULT_VITALS), + config={"displayModeBar": False}, + style={"height": "400px"}, + ), + value="trend", pt="md", + ), + dmc.TabsPanel( + dcc.Graph( + id="vitals-var-chart", + figure=create_vitals_variability(_df0, DEFAULT_VITALS), + config={"displayModeBar": False}, + style={"height": "400px"}, + ), + value="var", pt="md", + ), + ], value="trend"), + ], gap="sm"), + p="md", radius="md", withBorder=True, + ), + + # ── Vitals Summary Table ─────────────────────────────────────────────────── + dmc.Paper( + dmc.Stack([ + dmc.Text("Vitals Summary", fw=600, size="lg"), + dmc.Text("Min / Mean / Max for the selected period", + size="xs", c="dimmed"), + dmc.Divider(my="xs"), + dmc.SimpleGrid(id="vitals-summary-grid", cols=3, spacing="sm"), + ], gap="sm"), + p="md", radius="md", withBorder=True, + ), + +], gap="md") diff --git a/medical-imaging-demo/requirements.txt b/medical-imaging-demo/requirements.txt new file mode 100644 index 0000000..54a2459 --- /dev/null +++ b/medical-imaging-demo/requirements.txt @@ -0,0 +1,13 @@ +dash[fastapi]==4.2.0rc3 +dash-mantine-components>=0.14.0 +dash-iconify>=0.1.2 +pandas>=2.0.0 +plotly>=5.18.0 +numpy>=1.24.0 +uvicorn[standard] +reportlab>=4.0.0 +kaleido==0.2.1 +PyPDF2>=3.0.0 +Pillow>=10.0.0 +requests>=2.31.0 +scipy>=1.11.0 diff --git a/medical-imaging-demo/scripts/generate_data.py b/medical-imaging-demo/scripts/generate_data.py new file mode 100644 index 0000000..4c204e5 --- /dev/null +++ b/medical-imaging-demo/scripts/generate_data.py @@ -0,0 +1,216 @@ +"""Generate all synthetic clinical CSVs for the demo.""" +import numpy as np +import pandas as pd +from pathlib import Path +from datetime import datetime, timedelta + +np.random.seed(42) +ROOT = Path(__file__).parent.parent +DATA = ROOT / "data" +DATA.mkdir(exist_ok=True) + +# ── Names ──────────────────────────────────────────────────────────────────── +FIRST = ["James","Mary","Robert","Patricia","John","Jennifer","Michael","Linda", + "David","Barbara","William","Elizabeth","Richard","Susan","Joseph", + "Jessica","Thomas","Sarah","Charles","Karen","Christopher","Lisa", + "Daniel","Nancy","Matthew","Betty","Anthony","Margaret","Mark","Sandra"] +LAST = ["Smith","Johnson","Williams","Brown","Jones","Garcia","Miller","Davis", + "Wilson","Moore","Taylor","Anderson","Thomas","Jackson","White","Harris", + "Martin","Thompson","Young","Lewis","Walker","Hall","Allen","King", + "Wright","Scott","Green","Baker","Adams","Nelson"] + +DIAGNOSES = ["Pneumonia","Sepsis","COPD Exacerbation","Heart Failure","Acute MI", + "Stroke","Trauma","UTI","GI Bleed","Pulmonary Embolism", + "Hypertensive Crisis","Diabetic Ketoacidosis","Cellulitis", + "Atrial Fibrillation","Respiratory Failure"] +WARDS = ["ICU","MICU","CCU","Step-Down","General Med","ED Obs"] +DEPARTMENTS = ["Cardiology","Pulmonology","Neurology","General Medicine", + "Surgery","Nephrology","Oncology"] + +# ── Patient roster ──────────────────────────────────────────────────────────── +N = 60 +rows = [] +for i in range(N): + ward = np.random.choice(WARDS, p=[0.10,0.08,0.07,0.15,0.45,0.15]) + rows.append({ + "patient_id": f"PT{i+1001}", + "name": f"{np.random.choice(FIRST)} {np.random.choice(LAST)}", + "age": int(np.random.randint(22, 91)), + "gender": np.random.choice(["M","F"]), + "diagnosis": np.random.choice(DIAGNOSES), + "ward": ward, + "department": np.random.choice(DEPARTMENTS), + "admitted_date": (datetime(2026,6,1) + timedelta(days=int(np.random.randint(0,15)))).strftime("%Y-%m-%d"), + "los_days": int(np.random.randint(1,15)), + "risk_score": round(float(np.random.beta(2,5)*100), 1), + "sepsis_risk": round(float(np.random.beta(1.5,8)*100), 1), + "fall_risk": round(float(np.random.beta(2,6)*100), 1), + "readmit_risk": round(float(np.random.beta(2,5)*100), 1), + "deterioration_risk": round(float(np.random.beta(1.5,7)*100), 1), + "is_icu": ward in ("ICU","MICU","CCU"), + }) + +df_patients = pd.DataFrame(rows) +# Ensure first 5 are ICU patients for the live panel +for i in range(5): + df_patients.at[i, "ward"] = ["ICU","MICU","CCU","ICU","MICU"][i] + df_patients.at[i, "is_icu"] = True +df_patients.to_csv(DATA / "patients.csv", index=False) +print(f"patients.csv — {len(df_patients)} rows") + +# ── Vitals time series (72 h, 15-min intervals, 8 ICU patients) ─────────────── +ICU_BASES = [ + {"patient_id":"PT1001","base_hr":72,"base_spo2":98.5,"base_sbp":118,"base_dbp":76,"base_rr":14}, + {"patient_id":"PT1002","base_hr":92,"base_spo2":96.8,"base_sbp":148,"base_dbp":90,"base_rr":18}, + {"patient_id":"PT1003","base_hr":88,"base_spo2":93.5,"base_sbp":108,"base_dbp":68,"base_rr":21}, + {"patient_id":"PT1004","base_hr":78,"base_spo2":99.1,"base_sbp":168,"base_dbp":97,"base_rr":16}, + {"patient_id":"PT1005","base_hr":66,"base_spo2":98.9,"base_sbp":125,"base_dbp":80,"base_rr":13}, + {"patient_id":"PT1006","base_hr":95,"base_spo2":95.2,"base_sbp":135,"base_dbp":82,"base_rr":20}, + {"patient_id":"PT1007","base_hr":74,"base_spo2":97.8,"base_sbp":120,"base_dbp":75,"base_rr":15}, + {"patient_id":"PT1008","base_hr":82,"base_spo2":96.0,"base_sbp":142,"base_dbp":88,"base_rr":17}, +] + +base_time = datetime(2026, 6, 14, 0, 0, 0) +vitals_rows = [] +for p in ICU_BASES: + pid = p["patient_id"] + hr = float(p["base_hr"]) + spo = float(p["base_spo2"]) + sbp = float(p["base_sbp"]) + dbp = float(p["base_dbp"]) + rr = float(p["base_rr"]) + for i in range(72 * 4): + t = base_time + timedelta(minutes=15*i) + hour = t.hour + # Gentle circadian drift + hr = float(np.clip(hr + np.random.normal(-0.05*(hr-p["base_hr"])*0.1, 1.2), 40, 200)) + spo = float(np.clip(spo + np.random.normal(-0.05*(spo-p["base_spo2"])*0.1, 0.25), 85, 100)) + sbp = float(np.clip(sbp + np.random.normal(0, 2.0), 70, 220)) + dbp = float(np.clip(dbp + np.random.normal(0, 1.5), 40, 130)) + rr = float(np.clip(rr + np.random.normal(0, 0.4), 8, 40)) + vitals_rows.append({ + "patient_id": pid, + "timestamp": t.strftime("%Y-%m-%d %H:%M:%S"), + "HR": round(hr, 1), + "SpO2": round(spo, 1), + "Temp": round(np.random.normal(37.1, 0.3), 1), + "SysBP": round(sbp, 1), + "DiaBP": round(dbp, 1), + "RR": round(rr, 1), + }) + +df_vitals = pd.DataFrame(vitals_rows) +df_vitals.to_csv(DATA / "vitals.csv", index=False) +print(f"vitals.csv — {len(df_vitals)} rows") + +# ── Cohort biomarkers (200 patients) ───────────────────────────────────────── +COH_DIAG = ["Type 2 Diabetes","Hypertension","COPD","Heart Failure","CKD", + "Obesity","CAD","Asthma","Hyperlipidemia","Atrial Fibrillation"] +cohort = [] +for i in range(200): + age = int(np.random.randint(20, 85)) + bmi = float(np.clip(np.random.normal(28, 6), 16, 55)) + sbp = float(np.clip(np.random.normal(130, 22), 80, 220)) + ldl = float(np.clip(np.random.normal(115, 38), 40, 260)) + hba1c= float(np.clip(np.random.normal(6.8, 1.6), 4.5, 14)) + egfr = float(np.clip(np.random.normal(68, 26), 5, 130)) + + score = (int(sbp>160)*2 + int(ldl>160) + int(hba1c>8)*2 + + int(egfr<45)*2 + int(bmi>35)) + risk = "High" if score >= 4 else "Medium" if score >= 2 else "Low" + cohort.append({ + "patient_id": f"CO{i+2001}", + "age": age, + "gender": np.random.choice(["M","F"]), + "bmi": round(bmi, 1), + "systolic_bp": round(sbp, 0), + "ldl": round(ldl, 1), + "hba1c": round(hba1c, 1), + "egfr": round(egfr, 1), + "diagnosis": np.random.choice(COH_DIAG), + "risk_level": risk, + }) + +df_cohort = pd.DataFrame(cohort) +df_cohort.to_csv(DATA / "cohort.csv", index=False) +print(f"cohort.csv — {len(df_cohort)} rows") + +# ── Admissions time series (30 days) ───────────────────────────────────────── +BASE_COUNT = {"Cardiology":12,"Pulmonology":8,"Neurology":6, + "General Medicine":20,"Surgery":10,"Nephrology":5,"Oncology":4} +adm_rows = [] +for d in range(30): + dt = datetime(2026,5,17) + timedelta(days=d) + for dept, base in BASE_COUNT.items(): + # Weekend dip + weekend = dt.weekday() >= 5 + count = max(0, int(np.random.normal(base * (0.75 if weekend else 1.0), 2))) + adm_rows.append({"date": dt.strftime("%Y-%m-%d"), "department": dept, "admissions": count}) + +pd.DataFrame(adm_rows).to_csv(DATA / "admissions.csv", index=False) +print(f"admissions.csv — {len(adm_rows)} rows") + +# ── Labs (20 patients) ──────────────────────────────────────────────────────── +LAB_TESTS = { + "WBC": (4.5, 11.0, "10³/µL"), + "Hemoglobin": (12.0, 17.5, "g/dL"), + "Platelets": (150, 400, "10³/µL"), + "Sodium": (136, 145, "mEq/L"), + "Potassium": (3.5, 5.0, "mEq/L"), + "Creatinine": (0.7, 1.3, "mg/dL"), + "BUN": (7, 25, "mg/dL"), + "Glucose": (70, 100, "mg/dL"), + "Lactate": (0.5, 2.0, "mmol/L"), + "Troponin": (0.0, 0.04, "ng/mL"), +} +lab_rows = [] +for _, pat in df_patients.head(20).iterrows(): + for test, (lo, hi, unit) in LAB_TESTS.items(): + mid = (lo + hi) / 2 + val = round(float(np.clip(np.random.normal(mid, (hi-lo)*0.3), lo*0.5, hi*2)), 3) + flag = "H" if val > hi else "L" if val < lo else "N" + lab_rows.append({ + "patient_id": pat["patient_id"], + "date": "2026-06-15", + "test": test, + "value": val, + "unit": unit, + "reference_low": lo, + "reference_high": hi, + "flag": flag, + }) + +pd.DataFrame(lab_rows).to_csv(DATA / "labs.csv", index=False) +print(f"labs.csv — {len(lab_rows)} rows") + +# ── Imaging studies metadata ────────────────────────────────────────────────── +STUDIES = [ + {"study_id":"ST0001","findings":"No Finding", "age":45,"gender":"M","view":"PA"}, + {"study_id":"ST0002","findings":"Cardiomegaly", "age":67,"gender":"F","view":"PA"}, + {"study_id":"ST0003","findings":"Pleural Effusion|Cardiomegaly","age":72,"gender":"M","view":"AP"}, + {"study_id":"ST0004","findings":"Pneumonia|Consolidation", "age":58,"gender":"F","view":"PA"}, + {"study_id":"ST0005","findings":"Atelectasis", "age":81,"gender":"M","view":"AP"}, + {"study_id":"ST0006","findings":"Nodule", "age":63,"gender":"F","view":"PA"}, + {"study_id":"ST0007","findings":"Pneumothorax", "age":34,"gender":"M","view":"AP"}, + {"study_id":"ST0008","findings":"Mass", "age":69,"gender":"F","view":"PA"}, +] +pat_names = df_patients["name"].tolist() +study_rows = [] +for i, s in enumerate(STUDIES): + study_rows.append({ + "study_id": s["study_id"], + "patient_id": f"PT{i+1001}", + "patient_name": pat_names[i], + "age": s["age"], + "gender": s["gender"], + "view_position":s["view"], + "finding_labels":s["findings"], + "study_date": "2026-06-15", + "accession": f"ACC{np.random.randint(100000,999999)}", + "image_file": f"xray_{i+1:02d}.png", + "referrer": "Dr. " + np.random.choice(LAST), + }) + +pd.DataFrame(study_rows).to_csv(DATA / "studies.csv", index=False) +print(f"studies.csv — {len(study_rows)} rows") +print("\nAll data generated.") diff --git a/medical-imaging-demo/scripts/generate_xrays.py b/medical-imaging-demo/scripts/generate_xrays.py new file mode 100644 index 0000000..16fd90a --- /dev/null +++ b/medical-imaging-demo/scripts/generate_xrays.py @@ -0,0 +1,164 @@ +"""Generate synthetic chest X-ray-like grayscale PNG images for the demo.""" +import numpy as np +from PIL import Image, ImageFilter +from pathlib import Path + +ROOT = Path(__file__).parent.parent +OUTDIR = ROOT / "assets" / "xrays" +OUTDIR.mkdir(parents=True, exist_ok=True) + +STUDIES = [ + ("xray_01.png", [], 42), + ("xray_02.png", ["Cardiomegaly"], 43), + ("xray_03.png", ["Pleural Effusion","Cardiomegaly"], 44), + ("xray_04.png", ["Pneumonia","Consolidation"], 45), + ("xray_05.png", ["Atelectasis"], 46), + ("xray_06.png", ["Nodule"], 47), + ("xray_07.png", ["Pneumothorax"], 48), + ("xray_08.png", ["Mass"], 49), +] + + +def generate_xray(width: int = 512, height: int = 512, + findings: list = None, seed: int = 42) -> Image.Image: + """Return a PIL grayscale image resembling a chest X-ray PA view.""" + np.random.seed(seed) + if findings is None: + findings = [] + + W, H = width, height + cx, cy = W / 2, H / 2 + img = np.zeros((H, W), dtype=np.float32) + + yy, xx = np.mgrid[0:H, 0:W] + + # ── Chest outline ───────────────────────────────────────────────────────── + chest = ((xx - cx) ** 2 / (cx * 0.88) ** 2 + + (yy - cy * 0.96) ** 2 / (cy * 0.92) ** 2) < 1 + img[chest] = 35 + + # ── Lung fields (darker — air) ──────────────────────────────────────────── + lL = ((xx - cx * 0.57) ** 2 / (cx * 0.26) ** 2 + + (yy - cy * 0.84) ** 2 / (cy * 0.36) ** 2) < 1 + rL = ((xx - cx * 1.43) ** 2 / (cx * 0.26) ** 2 + + (yy - cy * 0.84) ** 2 / (cy * 0.36) ** 2) < 1 + img[lL] = 14 + img[rL] = 14 + + # ── Mediastinum / heart ─────────────────────────────────────────────────── + heart = ((xx - cx * 0.91) ** 2 / (cx * 0.19) ** 2 + + (yy - cy * 1.06) ** 2 / (cy * 0.22) ** 2) < 1 + img[heart] = 125 + + # ── Aortic knob ─────────────────────────────────────────────────────────── + aorta = ((xx - cx * 0.84) ** 2 + (yy - cy * 0.60) ** 2) < (W * 0.05) ** 2 + img[aorta] = 145 + + # ── Trachea ─────────────────────────────────────────────────────────────── + trachea = (np.abs(xx - cx) < W * 0.025) & (yy < cy * 0.58) + img[trachea] = 8 + + # ── Spine ───────────────────────────────────────────────────────────────── + spine = (np.abs(xx - cx) < W * 0.025) & (yy > cy * 0.38) & (yy < cy * 1.65) + img[spine] = np.maximum(img[spine], 195) + + # ── Clavicles ───────────────────────────────────────────────────────────── + for x in range(int(cx * 0.20), int(cx)): + cy_clav = int(cy * 0.27 - cy * 0.09 * (x - cx * 0.20) / (cx * 0.80)) + if 0 <= cy_clav < H: + img[max(0, cy_clav - 2):cy_clav + 3, x] = 210 + for x in range(int(cx), int(cx * 1.80)): + cy_clav = int(cy * 0.27 + cy * 0.09 * (x - cx) / (cx * 0.80)) + if 0 <= cy_clav < H: + img[max(0, cy_clav - 2):cy_clav + 3, x] = 210 + + # ── Ribs ────────────────────────────────────────────────────────────────── + for i in range(12): + rib_y0 = cy * 0.24 + i * cy * 0.12 + rw = 2 + for side, x0, x1, xref, sign in [ + ("L", int(cx*0.22), int(cx*0.88), cx*0.22, 1), + ("R", int(cx*1.12), int(cx*1.78), cx*1.78, -1), + ]: + span = abs(x1 - x0) + for x in range(x0, x1): + arc = int(rib_y0 + cy * 0.07 * np.sin(np.pi * abs(x - xref) / span)) + if 0 <= arc - rw and arc + rw < H: + img[arc - rw:arc + rw + 1, x] = np.maximum( + img[arc - rw:arc + rw + 1, x], 195) + + # ── Diaphragm ───────────────────────────────────────────────────────────── + for x in range(int(cx * 0.22), int(cx * 0.90)): + d = int(cy * 1.36 - cy * 0.10 * np.sin(np.pi * (x - cx*0.22) / (cx*0.68))) + if 0 <= d < H: + img[d:min(H, d+3), x] = 190 + for x in range(int(cx * 1.10), int(cx * 1.78)): + d = int(cy * 1.42 - cy * 0.09 * np.sin(np.pi * (cx*1.78 - x) / (cx*0.68))) + if 0 <= d < H: + img[d:min(H, d+3), x] = 190 + + # ── Pulmonary vascular markings ─────────────────────────────────────────── + for lung_mask, x_base in [(lL, cx * 0.40), (rL, cx * 1.30)]: + for _ in range(18): + vx = int(np.random.uniform(x_base * 0.8, x_base * 1.2)) + vy = int(np.random.uniform(cy * 0.28, cy * 0.65)) + ln = int(np.random.uniform(25, 90)) + ang = np.random.uniform(-0.5, 0.5) + intens = float(np.random.uniform(28, 65)) + for j in range(ln): + px_ = int(vx + j * np.sin(ang)) + py_ = int(vy + j * np.cos(ang)) + if (0 <= px_ < W and 0 <= py_ < H and lung_mask[py_, px_]): + img[py_, px_] = min(255, img[py_, px_] + intens * (1 - j / ln)) + + # ── Findings ────────────────────────────────────────────────────────────── + for f in findings: + if f == "Cardiomegaly": + hc = ((xx - cx * 0.88) ** 2 / (cx * 0.28) ** 2 + + (yy - cy * 1.03) ** 2 / (cy * 0.26) ** 2) < 1 + img[hc] = np.maximum(img[hc], 118) + + elif f == "Pleural Effusion": + eff = (yy > cy * 1.22) & rL + img[eff] = 155 + + elif f == "Pneumothorax": + ptx = (xx < cx * 0.38) & lL + img[ptx] = 5 + line_x = int(cx * 0.39) + img[int(cy*0.22):int(cy*0.88), line_x:line_x+3] = 205 + + elif f in ("Nodule", "Mass"): + sz = 11 if f == "Nodule" else 32 + nx, ny = int(cx * 1.50), int(cy * 0.57) + nod = ((xx - nx) ** 2 + (yy - ny) ** 2) < sz ** 2 + img[nod] = 170 + + elif f == "Atelectasis": + atel_y0 = int(cy * 1.20) + atel_y1 = int(cy * 1.27) + img[atel_y0:atel_y1, int(cx*0.35):int(cx*0.82)] = 145 + + elif f in ("Pneumonia", "Consolidation"): + con = ((xx - cx * 1.42) ** 2 / (cx * 0.24) ** 2 + + (yy - cy * 1.12) ** 2 / (cy * 0.20) ** 2) < 1 + img[con] = np.where(img[con] < 132, 132, img[con]) + + elif f == "Infiltration": + inf = ((xx - cx * 0.60) ** 2 / (cx * 0.20) ** 2 + + (yy - cy * 1.05) ** 2 / (cy * 0.18) ** 2) < 1 + img[inf] = np.where(img[inf] < 120, 120, img[inf]) + + # ── Noise + blur ────────────────────────────────────────────────────────── + img = np.clip(img + np.random.normal(0, 5.5, img.shape), 0, 255).astype(np.uint8) + pil = Image.fromarray(img, mode="L").filter(ImageFilter.GaussianBlur(radius=1.2)) + return pil + + +if __name__ == "__main__": + for fname, findings, seed in STUDIES: + out = OUTDIR / fname + img = generate_xray(512, 512, findings=findings, seed=seed) + img.save(out) + print(f" {fname} findings={findings or ['No Finding']}") + print(f"\n{len(STUDIES)} X-ray images written to {OUTDIR}") diff --git a/medical-imaging-demo/utils/__init__.py b/medical-imaging-demo/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/medical-imaging-demo/utils/data_loader.py b/medical-imaging-demo/utils/data_loader.py new file mode 100644 index 0000000..93993af --- /dev/null +++ b/medical-imaging-demo/utils/data_loader.py @@ -0,0 +1,104 @@ +import pandas as pd +import pathlib + +ROOT = pathlib.Path(__file__).parent.parent +DATA_PATH = ROOT / "data" + +def _csv(name: str) -> pd.DataFrame: + return pd.read_csv(DATA_PATH / name) + +# Cached loads +df_patients = _csv("patients.csv") +df_vitals = _csv("vitals.csv") +df_cohort = _csv("cohort.csv") +df_admissions = _csv("admissions.csv") +df_labs = _csv("labs.csv") +df_studies = _csv("studies.csv") + + +# ── Census / dashboard metrics ──────────────────────────────────────────────── +def get_census_metrics() -> dict: + total = len(df_patients) + icu_total = df_patients["is_icu"].sum() + icu_cap = 25 # beds + avg_los = round(float(df_patients["los_days"].mean()), 1) + critical = int((df_patients["risk_score"] > 70).sum()) + return { + "total_patients": total, + "icu_occupancy": round(icu_total / icu_cap * 100, 1), + "avg_los": avg_los, + "critical_alerts":critical, + } + +def get_risk_overview() -> dict: + return { + "sepsis": round(float(df_patients["sepsis_risk"].mean()), 1), + "fall": round(float(df_patients["fall_risk"].mean()), 1), + "readmit": round(float(df_patients["readmit_risk"].mean()), 1), + "deterioration":round(float(df_patients["deterioration_risk"].mean()), 1), + } + + +# ── Admissions ──────────────────────────────────────────────────────────────── +def get_admissions_data(department: str = "All", period: str = "30d") -> pd.DataFrame: + df = df_admissions.copy() + df["date"] = pd.to_datetime(df["date"]) + days = {"7d": 7, "14d": 14, "30d": 30}.get(period, 30) + df = df[df["date"] >= df["date"].max() - pd.Timedelta(days=days-1)] + if department != "All": + df = df[df["department"] == department] + return df + + +# ── Vitals ──────────────────────────────────────────────────────────────────── +PERIOD_HOURS = {"6h": 6, "12h": 12, "24h": 24, "48h": 48, "72h": 72} + +def get_vitals(patient_id: str, period: str = "24h") -> pd.DataFrame: + df = df_vitals[df_vitals["patient_id"] == patient_id].copy() + df["timestamp"] = pd.to_datetime(df["timestamp"]) + df = df.sort_values("timestamp") + hours = PERIOD_HOURS.get(period, 24) + cutoff = df["timestamp"].max() - pd.Timedelta(hours=hours) + return df[df["timestamp"] >= cutoff].reset_index(drop=True) + +def get_vitals_stats(patient_id: str, vital: str, period: str = "24h") -> dict: + df = get_vitals(patient_id, period) + if df.empty or vital not in df.columns: + return {} + col = df[vital] + return { + "current": round(float(col.iloc[-1]), 1), + "min": round(float(col.min()), 1), + "max": round(float(col.max()), 1), + "mean": round(float(col.mean()), 1), + } + + +# ── Cohort ──────────────────────────────────────────────────────────────────── +def get_cohort() -> pd.DataFrame: + return df_cohort.copy() + + +# ── Labs ────────────────────────────────────────────────────────────────────── +def get_labs(patient_id: str) -> pd.DataFrame: + return df_labs[df_labs["patient_id"] == patient_id].copy() + + +# ── Studies ─────────────────────────────────────────────────────────────────── +def get_studies() -> pd.DataFrame: + return df_studies.copy() + +def get_study(study_id: str) -> dict: + row = df_studies[df_studies["study_id"] == study_id] + if row.empty: + return {} + return row.iloc[0].to_dict() + + +# ── Patient helpers ─────────────────────────────────────────────────────────── +def get_patient(patient_id: str) -> dict: + row = df_patients[df_patients["patient_id"] == patient_id] + return row.iloc[0].to_dict() if not row.empty else {} + +def get_icu_patients() -> pd.DataFrame: + return df_patients[df_patients["is_icu"]].head(5).copy() diff --git a/medical-imaging-demo/utils/pdf_export.py b/medical-imaging-demo/utils/pdf_export.py new file mode 100644 index 0000000..9e99c10 --- /dev/null +++ b/medical-imaging-demo/utils/pdf_export.py @@ -0,0 +1,214 @@ +import copy +import io +from datetime import datetime + +import plotly.io as pio +from PIL import Image as PILImage, ImageDraw, ImageFont +from reportlab.lib import colors +from reportlab.lib.pagesizes import A4, landscape, portrait +from reportlab.lib.units import inch +from reportlab.lib.utils import ImageReader +from reportlab.pdfgen import canvas as rl_canvas +from PyPDF2 import PdfWriter, PdfReader + + +def figure_to_image_bytes(figure, width: int = 1100, height: int = 650) -> bytes: + try: + fig = copy.deepcopy(figure) + if isinstance(fig, dict): + fig.setdefault("layout", {}) + fig["layout"]["paper_bgcolor"] = "white" + fig["layout"]["plot_bgcolor"] = "white" + return pio.to_image(fig, format="png", width=width, height=height) + except Exception as e: + img = PILImage.new("RGB", (width, height), color=(220, 220, 220)) + ImageDraw.Draw(img).text((20, height // 2), f"Render error: {e}", fill="black") + buf = io.BytesIO() + img.save(buf, format="PNG") + return buf.getvalue() + + +def create_radiology_report( + xray_figure, + findings: list, + patient_info: dict, + study_info: dict, +) -> bytes: + """ + Build a PDF radiology report with: + - Title page (patient + study info) + - Full-page annotated X-ray image + - Findings table + """ + port_w, port_h = portrait(A4) + land_w, land_h = landscape(A4) + + out = io.BytesIO() + writer = PdfWriter() + + # ── Title page ───────────────────────────────────────────────────────────── + tp = io.BytesIO() + cp = rl_canvas.Canvas(tp, pagesize=portrait(A4)) + + # Header band + cp.setFillColor(colors.HexColor("#0d9488")) + cp.rect(0, port_h - 2.2 * inch, port_w, 2.2 * inch, fill=1, stroke=0) + + cp.setFillColor(colors.white) + cp.setFont("Helvetica-Bold", 26) + cp.drawCentredString(port_w / 2, port_h - 1.0 * inch, "VitalSight Radiology Report") + cp.setFont("Helvetica", 13) + cp.drawCentredString(port_w / 2, port_h - 1.65 * inch, + f"Generated: {datetime.now().strftime('%B %d, %Y %H:%M')}") + + # Patient / study info table + info_y = port_h - 3.2 * inch + items = [ + ("Patient Name", patient_info.get("name", "—")), + ("Patient ID", patient_info.get("patient_id", "—")), + ("Age / Gender", f"{patient_info.get('age','—')} / {patient_info.get('gender','—')}"), + ("Study ID", study_info.get("study_id", "—")), + ("Accession", study_info.get("accession", "—")), + ("Study Date", study_info.get("study_date", "—")), + ("View", study_info.get("view_position", "—")), + ("Referring Physician", study_info.get("referrer", "—")), + ] + cp.setFont("Helvetica-Bold", 10) + cp.setFillColor(colors.HexColor("#1e293b")) + for label, value in items: + cp.setFont("Helvetica-Bold", 10) + cp.setFillColor(colors.HexColor("#475569")) + cp.drawString(1.0 * inch, info_y, f"{label}:") + cp.setFont("Helvetica", 10) + cp.setFillColor(colors.HexColor("#1e293b")) + cp.drawString(3.0 * inch, info_y, str(value)) + info_y -= 0.32 * inch + + # Disclaimer + cp.setFont("Helvetica-Oblique", 8) + cp.setFillColor(colors.HexColor("#94a3b8")) + cp.drawCentredString(port_w / 2, 0.6 * inch, + "SYNTHETIC DATA — FOR DEMONSTRATION PURPOSES ONLY") + cp.save() + tp.seek(0) + writer.add_page(PdfReader(tp).pages[0]) + + # ── Annotated X-ray page ─────────────────────────────────────────────────── + xr = io.BytesIO() + cl = rl_canvas.Canvas(xr, pagesize=landscape(A4)) + + cl.setFillColor(colors.HexColor("#0d9488")) + cl.setFont("Helvetica-Bold", 16) + cl.drawString(0.8 * inch, land_h - 0.7 * inch, "Imaging Study") + + xray_bytes = figure_to_image_bytes(xray_figure, width=1100, height=750) + reader = ImageReader(io.BytesIO(xray_bytes)) + img_w, img_h = 10 * inch, 6.8 * inch + x_off = (land_w - img_w) / 2 + y_off = (land_h - img_h) / 2 - 0.3 * inch + cl.drawImage(reader, x_off, y_off, width=img_w, height=img_h) + + cl.setFont("Helvetica", 7) + cl.setFillColor(colors.HexColor("#94a3b8")) + cl.drawCentredString(land_w / 2, 0.35 * inch, + "SYNTHETIC — NOT FOR CLINICAL USE") + cl.save() + xr.seek(0) + writer.add_page(PdfReader(xr).pages[0]) + + # ── Findings table page ──────────────────────────────────────────────────── + if findings: + ft = io.BytesIO() + fp = rl_canvas.Canvas(ft, pagesize=portrait(A4)) + + fp.setFillColor(colors.HexColor("#0d9488")) + fp.rect(0, port_h - 1.2 * inch, port_w, 1.2 * inch, fill=1, stroke=0) + fp.setFillColor(colors.white) + fp.setFont("Helvetica-Bold", 18) + fp.drawCentredString(port_w / 2, port_h - 0.75 * inch, "Findings") + + headers = ["#", "Finding", "Location (px)", "Type", "Severity", "Note"] + col_w = [0.3, 2.0, 2.2, 1.0, 1.0, 1.5] + col_x = [1.0 * inch] + for w in col_w[:-1]: + col_x.append(col_x[-1] + w * inch) + + row_y = port_h - 1.7 * inch + fp.setFont("Helvetica-Bold", 9) + fp.setFillColor(colors.HexColor("#1e293b")) + for i, h in enumerate(headers): + fp.drawString(col_x[i], row_y, h) + row_y -= 0.05 * inch + fp.setStrokeColor(colors.HexColor("#e2e8f0")) + fp.line(0.8 * inch, row_y, port_w - 0.8 * inch, row_y) + row_y -= 0.28 * inch + + fp.setFont("Helvetica", 9) + for idx, finding in enumerate(findings, 1): + if row_y < 1.5 * inch: + break + fp.setFillColor(colors.HexColor("#1e293b") if idx % 2 else colors.HexColor("#f8fafc")) + fp.rect(0.8*inch, row_y-0.05*inch, port_w-1.6*inch, 0.28*inch, fill=1, stroke=0) + fp.setFillColor(colors.HexColor("#1e293b")) + cells = [ + str(idx), + finding.get("label", "Unspecified"), + finding.get("location", "—"), + finding.get("shape_type", "rect"), + finding.get("severity", "—"), + finding.get("note", ""), + ] + for i, cell in enumerate(cells): + fp.drawString(col_x[i], row_y, str(cell)[:28]) + row_y -= 0.28 * inch + + fp.setFont("Helvetica-Oblique", 7) + fp.setFillColor(colors.HexColor("#94a3b8")) + fp.drawCentredString(port_w / 2, 0.5 * inch, "SYNTHETIC — NOT FOR CLINICAL USE") + fp.save() + ft.seek(0) + writer.add_page(PdfReader(ft).pages[0]) + + writer.write(out) + out.seek(0) + return out.getvalue() + + +def create_summary_pdf(figures: list, titles: list, report_title: str = "Clinical Report") -> bytes: + """Multi-figure PDF (for future use).""" + port_w, port_h = portrait(A4) + land_w, land_h = landscape(A4) + out = io.BytesIO() + writer = PdfWriter() + + tp = io.BytesIO() + cp = rl_canvas.Canvas(tp, pagesize=portrait(A4)) + cp.setFillColor(colors.HexColor("#0d9488")) + cp.rect(0, port_h - 2*inch, port_w, 2*inch, fill=1, stroke=0) + cp.setFillColor(colors.white) + cp.setFont("Helvetica-Bold", 26) + cp.drawCentredString(port_w/2, port_h - 1.1*inch, report_title) + cp.setFont("Helvetica", 12) + cp.drawCentredString(port_w/2, port_h - 1.7*inch, + datetime.now().strftime("%B %d, %Y")) + cp.save() + tp.seek(0) + writer.add_page(PdfReader(tp).pages[0]) + + for fig, title in zip(figures, titles): + pb = io.BytesIO() + cl = rl_canvas.Canvas(pb, pagesize=landscape(A4)) + cl.setFillColor(colors.HexColor("#0d9488")) + cl.setFont("Helvetica-Bold", 18) + cl.drawString(1*inch, land_h - 0.75*inch, title) + img_bytes = figure_to_image_bytes(fig) + reader = ImageReader(io.BytesIO(img_bytes)) + iw, ih = 10*inch, 6*inch + cl.drawImage(reader, (land_w-iw)/2, (land_h-ih)/2-0.4*inch, width=iw, height=ih) + cl.save() + pb.seek(0) + writer.add_page(PdfReader(pb).pages[0]) + + writer.write(out) + out.seek(0) + return out.getvalue()