packages feed

flamingra (empty) → 0.1.0.0

raw patch · 6 files changed

+602/−0 lines, 6 filesdep +basedep +eitherdep +optparse-applicativesetup-changed

Dependencies added: base, either, optparse-applicative, pipes

Files

+ I'mHereOnlyToPleaseHaddock.hs view
@@ -0,0 +1,2 @@++module I'mHereOnlyToPleaseHaddock where
+ LICENSE view
@@ -0,0 +1,30 @@+Copyright (c) 2015, Antonio Nikishaev++All rights reserved.++Redistribution and use in source and binary forms, with or without+modification, are permitted provided that the following conditions are met:++    * Redistributions of source code must retain the above copyright+      notice, this list of conditions and the following disclaimer.++    * Redistributions in binary form must reproduce the above+      copyright notice, this list of conditions and the following+      disclaimer in the documentation and/or other materials provided+      with the distribution.++    * Neither the name of Antonio Nikishaev nor the names of other+      contributors may be used to endorse or promote products derived+      from this software without specific prior written permission.++THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ Main.hs view
@@ -0,0 +1,80 @@+module Main where++import Text.Printf+import Data.List+import Pipes+import qualified Pipes.Prelude as P+import Control.Monad+import Options.Applicative+import System.IO+import System.Exit+import Control.Monad.Trans.Either++++type State = ([String], Int)+type Foldee = (State, Maybe String)++-- COST CENTRE    ticks+-- A       …      n₁                     A n₁+--  B      …      n₂            ===>     A;B n₂+--  C      …      n₃                     A;C n₃+-- +conv :: Foldee -> String -> Foldee+conv (state@(stack,prevLevel),_) str+    | length ws == 10 && ticks>0 = ((stack',level), Just $ printf "%s %d" (intercalate ";" stack') ticks)+    | otherwise                  = (state,          Nothing)+    where +      ws = words str+      level = length . takeWhile (==' ') $ str+      fun = printf "%s:%s" (ws!!1) (ws!!0)+      ticks = read (ws!!8) :: Int+      stack' = take (length stack - (prevLevel-level+1)) stack ++ [fun]+++data Status = OK | PTooSmall deriving Show+++work :: Producer String (EitherT Status IO) ()+     -> Producer String (EitherT Status IO) ()+work input =+     input >-> P.dropWhile (not . ((&&) <$> isPrefixOf "COST CENTRE"+                                        <*> isInfixOf "no."))+           >-> do line <- await+                  when ("%alloc" `isSuffixOf` line) . lift $ left PTooSmall+                  cat+           >-> P.dropWhile null+           >-> P.scan conv (([],0),Nothing) snd+           >-> P.concat+           >-> P.tee P.stdoutLn++++data Options = Options {+      inputFile :: Maybe String+}++options = Options <$> optional (argument str (metavar "PROF-FILE"))+++main :: IO ()+main = execParser opts >>= main'+    where opts = info (helper <*> options) fullDesc+++main' :: Options -> IO ()+main' opts = do+  inp <- case inputFile opts of+           Just file -> P.fromHandle <$> openFile file ReadMode+           Nothing   -> return P.stdinLn++  r <- runEitherT . P.length $ work inp++  case r of+    Left PTooSmall -> die "Error: looks like it’s -p output, I need a -P one"+    Right 0        -> die "Error: the input doesn't look like a .prof"+    Right _        -> return ()+++die :: String -> IO ()+die str = hPutStrLn stderr str >> exitWith (ExitFailure 1)
+ Setup.hs view
@@ -0,0 +1,2 @@+import Distribution.Simple+main = defaultMain
+ flamingra.cabal view
@@ -0,0 +1,59 @@++name:                flamingra+version:             0.1.0.0+synopsis:            FlameGraphs of profiling+description:         Hack to turn the profiling output into the format suitable for FlameGraph.+                     It will be (kind of) interactive (e.g. <http://lelf.lu/files/pandoc.svg>).+                     .+                     <<pandoc.svg>>+                     .+                     =TL;DR (and the only one available) guide:+                     .+                     > some-program +RTS -P+                     > wget https://raw.githubusercontent.com/brendangregg/FlameGraph/master/flamegraph.pl+                     > flamingra some-program.prof | perl flamegraph.pl > picturesque.svg+                     .+                     =Usage:+                     .+                     > flamingra out.prof | …+                     or+                     .+                     > … | flamingra | …+                     .+                     where out.prof is @-P@ profiling output.++license:             BSD3+license-file:        LICENSE+author:              Antonio Nikishaev+maintainer:          me@lelf.lu+-- copyright:           +category:            Development+build-type:          Simple+extra-doc-files:     pandoc.svg+cabal-version:       >=1.10+tested-with:         GHC==7.8.3++source-repository head+  type:     git+  location: https://github.com/llelf/flamingra++source-repository head+  type:     darcs+  location: http://hub.darcs.net/lelf/flamingra++++executable flamingra+  main-is:             Main.hs+  -- other-modules:       +  -- other-extensions:    +  build-depends:       base >=4.7 && <5, pipes,+                       optparse-applicative, either+  -- hs-source-dirs:      +  default-language:    Haskell2010++library+  exposed-modules: I'mHereOnlyToPleaseHaddock+  default-language: Haskell2010+  build-depends:   base < 666+
+ pandoc.svg view
@@ -0,0 +1,429 @@+<?xml version="1.0" standalone="no"?>+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">+<svg version="1.1" width="1024" height="472" onload="init(evt)" viewBox="0 0 1024 472" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">+<defs >+	<linearGradient id="background" y1="0" y2="1" x1="0" x2="0" >+		<stop stop-color="#eeeeee" offset="5%" />+		<stop stop-color="#eeeeb0" offset="95%" />+	</linearGradient>+</defs>+<style type="text/css">+	.func_g:hover { stroke:black; stroke-width:0.5; cursor:pointer; }+</style>+<script type="text/ecmascript">+<![CDATA[+	var details, svg;+	function init(evt) { +		details = document.getElementById("details").firstChild; +		svg = document.getElementsByTagName("svg")[0];+	}+	function s(info) { details.nodeValue = "Function: " + info; }+	function c() { details.nodeValue = ' '; }+	function find_child(parent, name, attr) {+		var children = parent.childNodes;+		for (var i=0; i<children.length;i++) {+			if (children[i].tagName == name)+				return (attr != undefined) ? children[i].attributes[attr].value : children[i];+		}+		return;+	}+	function orig_save(e, attr, val) {+		if (e.attributes["_orig_"+attr] != undefined) return;+		if (e.attributes[attr] == undefined) return;+		if (val == undefined) val = e.attributes[attr].value;+		e.setAttribute("_orig_"+attr, val);+	}+	function orig_load(e, attr) {+		if (e.attributes["_orig_"+attr] == undefined) return;+		e.attributes[attr].value = e.attributes["_orig_"+attr].value;+		e.removeAttribute("_orig_"+attr);+	}+	function update_text(e) {+		var r = find_child(e, "rect");+		var t = find_child(e, "text");+		var w = parseFloat(r.attributes["width"].value) -3;+		var txt = find_child(e, "title").textContent.replace(/\([^(]*\)/,"");+		t.attributes["x"].value = parseFloat(r.attributes["x"].value) +3;+		+		// Smaller than this size won't fit anything+		if (w < 2*11*0.59) {+			t.textContent = "";+			return;+		}+		+		t.textContent = txt;+		// Fit in full text width+		if (/^ *$/.test(txt) || t.getSubStringLength(0, txt.length) < w)+			return;+		+		for (var x=txt.length-2; x>0; x--) {+			if (t.getSubStringLength(0, x+2) <= w) { +				t.textContent = txt.substring(0,x) + "..";+				return;+			}+		}+		t.textContent = "";+	}+	function zoom_reset(e) {+		if (e.attributes != undefined) {+			orig_load(e, "x");+			orig_load(e, "width");+		}+		if (e.childNodes == undefined) return;+		for(var i=0, c=e.childNodes; i<c.length; i++) {+			zoom_reset(c[i]);+		}+	}+	function zoom_child(e, x, ratio) {+		if (e.attributes != undefined) {+			if (e.attributes["x"] != undefined) {+				orig_save(e, "x");+				e.attributes["x"].value = (parseFloat(e.attributes["x"].value) - x - 10) * ratio + 10;+				if(e.tagName == "text") e.attributes["x"].value = find_child(e.parentNode, "rect", "x") + 3;+			}+			if (e.attributes["width"] != undefined) {+				orig_save(e, "width");+				e.attributes["width"].value = parseFloat(e.attributes["width"].value) * ratio;+			}+		}+		+		if (e.childNodes == undefined) return;+		for(var i=0, c=e.childNodes; i<c.length; i++) {+			zoom_child(c[i], x-10, ratio);+		}+	}+	function zoom_parent(e) {+		if (e.attributes) {+			if (e.attributes["x"] != undefined) {+				orig_save(e, "x");+				e.attributes["x"].value = 10;+			}+			if (e.attributes["width"] != undefined) {+				orig_save(e, "width");+				e.attributes["width"].value = parseInt(svg.width.baseVal.value) - (10*2);+			}+		}+		if (e.childNodes == undefined) return;+		for(var i=0, c=e.childNodes; i<c.length; i++) {+			zoom_parent(c[i]);+		}+	}+	function zoom(node) { +		var attr = find_child(node, "rect").attributes;+		var width = parseFloat(attr["width"].value);+		var xmin = parseFloat(attr["x"].value);+		var xmax = parseFloat(xmin + width);+		var ymin = parseFloat(attr["y"].value);+		var ratio = (svg.width.baseVal.value - 2*10) / width;+		+		// XXX: Workaround for JavaScript float issues (fix me)+		var fudge = 0.0001;+		+		var unzoombtn = document.getElementById("unzoom");+		unzoombtn.style["opacity"] = "1.0";+		+		var el = document.getElementsByTagName("g");+		for(var i=0;i<el.length;i++){+			var e = el[i];+			var a = find_child(e, "rect").attributes;+			var ex = parseFloat(a["x"].value);+			var ew = parseFloat(a["width"].value);+			// Is it an ancestor+			if (0 == 0) {+				var upstack = parseFloat(a["y"].value) > ymin;+			} else {+				var upstack = parseFloat(a["y"].value) < ymin;+			}+			if (upstack) {+				// Direct ancestor+				if (ex <= xmin && (ex+ew+fudge) >= xmax) {+					e.style["opacity"] = "0.5";+					zoom_parent(e);+					e.onclick = function(e){unzoom(); zoom(this);};+					update_text(e);+				}+				// not in current path+				else+					e.style["display"] = "none";+			}+			// Children maybe+			else {+				// no common path+				if (ex < xmin || ex + fudge >= xmax) {+					e.style["display"] = "none";+				}+				else {+					zoom_child(e, xmin, ratio);+					e.onclick = function(e){zoom(this);};+					update_text(e);+				}+			}+		}+	}+	function unzoom() {+		var unzoombtn = document.getElementById("unzoom");+		unzoombtn.style["opacity"] = "0.0";+		+		var el = document.getElementsByTagName("g");+		for(i=0;i<el.length;i++) {+			el[i].style["display"] = "block";+			el[i].style["opacity"] = "1";+			zoom_reset(el[i]);+			update_text(el[i]);+		}+	}	+]]>+</script>+<rect x="0.0" y="0" width="1024.0" height="472.0" fill="url(#background)"  />+<text text-anchor="middle" x="512.00" y="22" font-size="22" font-family="comic sans ms" fill="rgb(0,0,0)"  >pandoc +RTS -P</text>+<text text-anchor="" x="10.00" y="456" font-size="11" font-family="verdana" fill="rgb(0,0,0)" id="details" > </text>+<text text-anchor="" x="10.00" y="22" font-size="11" font-family="verdana" fill="rgb(0,0,0)" id="unzoom" onclick="unzoom()" style="opacity:0.0;cursor:pointer" >Reset Zoom</text>+<g class="func_g" onmouseover="s('Text.Pandoc.Readers.Markdown:notFollowedByHtmlCloser (357 samples, 5.40%)')" onmouseout="c()" onclick="zoom(this)">+<title>Text.Pandoc.Readers.Markdown:notFollowedByHtmlCloser (357 samples, 5.40%)</title><rect x="720.4" y="155" width="54.3" height="21.0" fill="rgb(242,13,27)" rx="2" ry="2" />+<text text-anchor="" x="723.41" y="168.5" font-size="11" font-family="verdana" fill="rgb(0,0,0)"  >Text.P..</text>+</g>+<g class="func_g" onmouseover="s('Text.Pandoc.Readers.Markdown:endline (941 samples, 14.24%)')" onmouseout="c()" onclick="zoom(this)">+<title>Text.Pandoc.Readers.Markdown:endline (941 samples, 14.24%)</title><rect x="631.7" y="199" width="143.0" height="21.0" fill="rgb(249,217,41)" rx="2" ry="2" />+<text text-anchor="" x="634.67" y="212.5" font-size="11" font-family="verdana" fill="rgb(0,0,0)"  >Text.Pandoc.Readers...</text>+</g>+<g class="func_g" onmouseover="s('Text.Pandoc.Options:compare (515 samples, 7.79%)')" onmouseout="c()" onclick="zoom(this)">+<title>Text.Pandoc.Options:compare (515 samples, 7.79%)</title><rect x="341.9" y="133" width="78.2" height="21.0" fill="rgb(231,130,50)" rx="2" ry="2" />+<text text-anchor="" x="344.88" y="146.5" font-size="11" font-family="verdana" fill="rgb(0,0,0)"  >Text.Pando..</text>+</g>+<g class="func_g" onmouseover="s('Text.Pandoc:writers (1 samples, 0.02%)')" onmouseout="c()" onclick="zoom(this)">+<title>Text.Pandoc:writers (1 samples, 0.02%)</title><rect x="1013.8" y="397" width="0.2" height="21.0" fill="rgb(245,96,1)" rx="2" ry="2" />+<text text-anchor="" x="1016.85" y="410.5" font-size="11" font-family="verdana" fill="rgb(0,0,0)"  ></text>+</g>+<g class="func_g" onmouseover="s('Text.Pandoc.Parsing:blankline (789 samples, 11.94%)')" onmouseout="c()" onclick="zoom(this)">+<title>Text.Pandoc.Parsing:blankline (789 samples, 11.94%)</title><rect x="300.2" y="177" width="119.9" height="21.0" fill="rgb(221,165,4)" rx="2" ry="2" />+<text text-anchor="" x="303.24" y="190.5" font-size="11" font-family="verdana" fill="rgb(0,0,0)"  >Text.Pandoc.Pars..</text>+</g>+<g class="func_g" onmouseover="s('Text.Pandoc.Readers.Markdown:str (146 samples, 2.21%)')" onmouseout="c()" onclick="zoom(this)">+<title>Text.Pandoc.Readers.Markdown:str (146 samples, 2.21%)</title><rect x="398.0" y="89" width="22.1" height="21.0" fill="rgb(232,55,29)" rx="2" ry="2" />+<text text-anchor="" x="400.95" y="102.5" font-size="11" font-family="verdana" fill="rgb(0,0,0)"  >T..</text>+</g>+<g class="func_g" onmouseover="s('Text.Pandoc.Writers.Docbook:hasLineBreaks.removeNote (6 samples, 0.09%)')" onmouseout="c()" onclick="zoom(this)">+<title>Text.Pandoc.Writers.Docbook:hasLineBreaks.removeNote (6 samples, 0.09%)</title><rect x="920.2" y="375" width="1.0" height="21.0" fill="rgb(208,114,40)" rx="2" ry="2" />+<text text-anchor="" x="923.24" y="388.5" font-size="11" font-family="verdana" fill="rgb(0,0,0)"  ></text>+</g>+<g class="func_g" onmouseover="s('Text.Pandoc.Readers.Markdown:whitespace (968 samples, 14.65%)')" onmouseout="c()" onclick="zoom(this)">+<title>Text.Pandoc.Readers.Markdown:whitespace (968 samples, 14.65%)</title><rect x="627.6" y="221" width="147.1" height="21.0" fill="rgb(206,185,31)" rx="2" ry="2" />+<text text-anchor="" x="630.57" y="234.5" font-size="11" font-family="verdana" fill="rgb(0,0,0)"  >Text.Pandoc.Readers...</text>+</g>+<g class="func_g" onmouseover="s('Text.Pandoc.Readers.Markdown:endline (11 samples, 0.17%)')" onmouseout="c()" onclick="zoom(this)">+<title>Text.Pandoc.Readers.Markdown:endline (11 samples, 0.17%)</title><rect x="418.5" y="23" width="1.6" height="21.0" fill="rgb(249,217,41)" rx="2" ry="2" />+<text text-anchor="" x="421.47" y="36.5" font-size="11" font-family="verdana" fill="rgb(0,0,0)"  ></text>+</g>+<g class="func_g" onmouseover="s('Text.Pandoc.Pretty:outp.\ (68 samples, 1.03%)')" onmouseout="c()" onclick="zoom(this)">+<title>Text.Pandoc.Pretty:outp.\ (68 samples, 1.03%)</title><rect x="888.0" y="309" width="10.4" height="21.0" fill="rgb(205,171,42)" rx="2" ry="2" />+<text text-anchor="" x="891.03" y="322.5" font-size="11" font-family="verdana" fill="rgb(0,0,0)"  ></text>+</g>+<g class="func_g" onmouseover="s('Text.Pandoc.Readers.Markdown:table (1 samples, 0.02%)')" onmouseout="c()" onclick="zoom(this)">+<title>Text.Pandoc.Readers.Markdown:table (1 samples, 0.02%)</title><rect x="907.6" y="397" width="0.2" height="21.0" fill="rgb(235,191,29)" rx="2" ry="2" />+<text text-anchor="" x="910.63" y="410.5" font-size="11" font-family="verdana" fill="rgb(0,0,0)"  ></text>+</g>+<g class="func_g" onmouseover="s('Text.Pandoc.Readers.Markdown:inline (259 samples, 3.92%)')" onmouseout="c()" onclick="zoom(this)">+<title>Text.Pandoc.Readers.Markdown:inline (259 samples, 3.92%)</title><rect x="380.8" y="111" width="39.3" height="21.0" fill="rgb(226,43,24)" rx="2" ry="2" />+<text text-anchor="" x="383.78" y="124.5" font-size="11" font-family="verdana" fill="rgb(0,0,0)"  >Text..</text>+</g>+<g class="func_g" onmouseover="s('Text.Pandoc.Pretty:realLength (7 samples, 0.11%)')" onmouseout="c()" onclick="zoom(this)">+<title>Text.Pandoc.Pretty:realLength (7 samples, 0.11%)</title><rect x="897.3" y="287" width="1.1" height="21.0" fill="rgb(214,174,36)" rx="2" ry="2" />+<text text-anchor="" x="900.29" y="300.5" font-size="11" font-family="verdana" fill="rgb(0,0,0)"  ></text>+</g>+<g class="func_g" onmouseover="s('Text.Pandoc.Pretty:renderList.off (28 samples, 0.42%)')" onmouseout="c()" onclick="zoom(this)">+<title>Text.Pandoc.Pretty:renderList.off (28 samples, 0.42%)</title><rect x="902.0" y="331" width="4.3" height="21.0" fill="rgb(217,92,19)" rx="2" ry="2" />+<text text-anchor="" x="905.01" y="344.5" font-size="11" font-family="verdana" fill="rgb(0,0,0)"  ></text>+</g>+<g class="func_g" onmouseover="s('Text.Pandoc.Pretty:realLength.\ (53 samples, 0.80%)')" onmouseout="c()" onclick="zoom(this)">+<title>Text.Pandoc.Pretty:realLength.\ (53 samples, 0.80%)</title><rect x="982.5" y="287" width="8.1" height="21.0" fill="rgb(254,216,18)" rx="2" ry="2" />+<text text-anchor="" x="985.54" y="300.5" font-size="11" font-family="verdana" fill="rgb(0,0,0)"  ></text>+</g>+<g class="func_g" onmouseover="s('Text.Pandoc.Readers.Markdown:bareURL (30 samples, 0.45%)')" onmouseout="c()" onclick="zoom(this)">+<title>Text.Pandoc.Readers.Markdown:bareURL (30 samples, 0.45%)</title><rect x="420.1" y="243" width="4.6" height="21.0" fill="rgb(239,55,47)" rx="2" ry="2" />+<text text-anchor="" x="423.14" y="256.5" font-size="11" font-family="verdana" fill="rgb(0,0,0)"  ></text>+</g>+<g class="func_g" onmouseover="s('Text.Pandoc.Pretty:offsetOf (8 samples, 0.12%)')" onmouseout="c()" onclick="zoom(this)">+<title>Text.Pandoc.Pretty:offsetOf (8 samples, 0.12%)</title><rect x="905.0" y="309" width="1.3" height="21.0" fill="rgb(235,104,14)" rx="2" ry="2" />+<text text-anchor="" x="908.04" y="322.5" font-size="11" font-family="verdana" fill="rgb(0,0,0)"  ></text>+</g>+<g class="func_g" onmouseover="s('Text.Pandoc.UTF8:toString (4,849 samples, 73.39%)')" onmouseout="c()" onclick="zoom(this)">+<title>Text.Pandoc.UTF8:toString (4,849 samples, 73.39%)</title><rect x="57.6" y="331" width="736.8" height="21.0" fill="rgb(212,114,33)" rx="2" ry="2" />+<text text-anchor="" x="60.56" y="344.5" font-size="11" font-family="verdana" fill="rgb(0,0,0)"  >Text.Pandoc.UTF8:toString</text>+</g>+<g class="func_g" onmouseover="s('Text.Pandoc.XML:escapeStringForXML (153 samples, 2.32%)')" onmouseout="c()" onclick="zoom(this)">+<title>Text.Pandoc.XML:escapeStringForXML (153 samples, 2.32%)</title><rect x="990.6" y="353" width="23.2" height="21.0" fill="rgb(221,21,2)" rx="2" ry="2" />+<text text-anchor="" x="993.60" y="366.5" font-size="11" font-family="verdana" fill="rgb(0,0,0)"  >T..</text>+</g>+<g class="func_g" onmouseover="s('Text.Pandoc.Parsing:skipSpaces (1,074 samples, 16.26%)')" onmouseout="c()" onclick="zoom(this)">+<title>Text.Pandoc.Parsing:skipSpaces (1,074 samples, 16.26%)</title><rect x="256.9" y="221" width="163.2" height="21.0" fill="rgb(237,134,36)" rx="2" ry="2" />+<text text-anchor="" x="259.94" y="234.5" font-size="11" font-family="verdana" fill="rgb(0,0,0)"  >Text.Pandoc.Parsing:ski..</text>+</g>+<g class="func_g" onmouseover="s('Text.Pandoc.Pretty:realLength (183 samples, 2.77%)')" onmouseout="c()" onclick="zoom(this)">+<title>Text.Pandoc.Pretty:realLength (183 samples, 2.77%)</title><rect x="962.8" y="309" width="27.8" height="21.0" fill="rgb(214,174,36)" rx="2" ry="2" />+<text text-anchor="" x="965.79" y="322.5" font-size="11" font-family="verdana" fill="rgb(0,0,0)"  >Te..</text>+</g>+<g class="func_g" onmouseover="s('Text.Pandoc.Parsing:updateLastStrPos (212 samples, 3.21%)')" onmouseout="c()" onclick="zoom(this)">+<title>Text.Pandoc.Parsing:updateLastStrPos (212 samples, 3.21%)</title><rect x="595.4" y="221" width="32.2" height="21.0" fill="rgb(234,50,31)" rx="2" ry="2" />+<text text-anchor="" x="598.35" y="234.5" font-size="11" font-family="verdana" fill="rgb(0,0,0)"  >Te..</text>+</g>+<g class="func_g" onmouseover="s('Text.Pandoc.XML:escapeCharForXML (27 samples, 0.41%)')" onmouseout="c()" onclick="zoom(this)">+<title>Text.Pandoc.XML:escapeCharForXML (27 samples, 0.41%)</title><rect x="1009.7" y="331" width="4.1" height="21.0" fill="rgb(247,108,3)" rx="2" ry="2" />+<text text-anchor="" x="1012.75" y="344.5" font-size="11" font-family="verdana" fill="rgb(0,0,0)"  ></text>+</g>+<g class="func_g" onmouseover="s('Text.Pandoc.Parsing:getOption (4,338 samples, 65.66%)')" onmouseout="c()" onclick="zoom(this)">+<title>Text.Pandoc.Parsing:getOption (4,338 samples, 65.66%)</title><rect x="135.2" y="265" width="659.2" height="21.0" fill="rgb(209,181,31)" rx="2" ry="2" />+<text text-anchor="" x="138.22" y="278.5" font-size="11" font-family="verdana" fill="rgb(0,0,0)"  >Text.Pandoc.Parsing:getOption</text>+</g>+<g class="func_g" onmouseover="s('Text.Pandoc.Readers.Markdown:str (2,303 samples, 34.86%)')" onmouseout="c()" onclick="zoom(this)">+<title>Text.Pandoc.Readers.Markdown:str (2,303 samples, 34.86%)</title><rect x="424.7" y="243" width="350.0" height="21.0" fill="rgb(232,55,29)" rx="2" ry="2" />+<text text-anchor="" x="427.70" y="256.5" font-size="11" font-family="verdana" fill="rgb(0,0,0)"  >Text.Pandoc.Readers.Markdown:str</text>+</g>+<g class="func_g" onmouseover="s('Text.Pandoc.Writers.Docbook:inlinesToDocbook (610 samples, 9.23%)')" onmouseout="c()" onclick="zoom(this)">+<title>Text.Pandoc.Writers.Docbook:inlinesToDocbook (610 samples, 9.23%)</title><rect x="921.2" y="397" width="92.6" height="21.0" fill="rgb(216,198,19)" rx="2" ry="2" />+<text text-anchor="" x="924.15" y="410.5" font-size="11" font-family="verdana" fill="rgb(0,0,0)"  >Text.Pandoc...</text>+</g>+<g class="func_g" onmouseover="s('Text.Pandoc.Pretty:renderList.next (24 samples, 0.36%)')" onmouseout="c()" onclick="zoom(this)">+<title>Text.Pandoc.Pretty:renderList.next (24 samples, 0.36%)</title><rect x="898.4" y="331" width="3.6" height="21.0" fill="rgb(205,26,37)" rx="2" ry="2" />+<text text-anchor="" x="901.36" y="344.5" font-size="11" font-family="verdana" fill="rgb(0,0,0)"  ></text>+</g>+<g class="func_g" onmouseover="s('Text.Pandoc.Pretty:renderDoc (299 samples, 4.53%)')" onmouseout="c()" onclick="zoom(this)">+<title>Text.Pandoc.Pretty:renderDoc (299 samples, 4.53%)</title><rect x="862.2" y="375" width="45.4" height="21.0" fill="rgb(237,56,17)" rx="2" ry="2" />+<text text-anchor="" x="865.19" y="388.5" font-size="11" font-family="verdana" fill="rgb(0,0,0)"  >Text...</text>+</g>+<g class="func_g" onmouseover="s('Text.Pandoc.Parsing:spaceChar (1,053 samples, 15.94%)')" onmouseout="c()" onclick="zoom(this)">+<title>Text.Pandoc.Parsing:spaceChar (1,053 samples, 15.94%)</title><rect x="260.1" y="199" width="160.0" height="21.0" fill="rgb(231,95,6)" rx="2" ry="2" />+<text text-anchor="" x="263.13" y="212.5" font-size="11" font-family="verdana" fill="rgb(0,0,0)"  >Text.Pandoc.Parsing:sp..</text>+</g>+<g class="func_g" onmouseover="s('Text.Pandoc.Shared:tabFilter.go (177 samples, 2.68%)')" onmouseout="c()" onclick="zoom(this)">+<title>Text.Pandoc.Shared:tabFilter.go (177 samples, 2.68%)</title><rect x="29.1" y="375" width="26.9" height="21.0" fill="rgb(251,67,25)" rx="2" ry="2" />+<text text-anchor="" x="32.15" y="388.5" font-size="11" font-family="verdana" fill="rgb(0,0,0)"  >Te..</text>+</g>+<g class="func_g" onmouseover="s('Text.Pandoc.Pretty:render (436 samples, 6.60%)')" onmouseout="c()" onclick="zoom(this)">+<title>Text.Pandoc.Pretty:render (436 samples, 6.60%)</title><rect x="841.4" y="397" width="66.2" height="21.0" fill="rgb(241,63,2)" rx="2" ry="2" />+<text text-anchor="" x="844.37" y="410.5" font-size="11" font-family="verdana" fill="rgb(0,0,0)"  >Text.Pan..</text>+</g>+<g class="func_g" onmouseover="s('Text.Pandoc.Parsing:stateOptions (28 samples, 0.42%)')" onmouseout="c()" onclick="zoom(this)">+<title>Text.Pandoc.Parsing:stateOptions (28 samples, 0.42%)</title><rect x="837.1" y="397" width="4.3" height="21.0" fill="rgb(213,5,7)" rx="2" ry="2" />+<text text-anchor="" x="840.12" y="410.5" font-size="11" font-family="verdana" fill="rgb(0,0,0)"  ></text>+</g>+<g class="func_g" onmouseover="s('Text.Pandoc.UTF8:hGetContents (4,858 samples, 73.53%)')" onmouseout="c()" onclick="zoom(this)">+<title>Text.Pandoc.UTF8:hGetContents (4,858 samples, 73.53%)</title><rect x="56.2" y="353" width="738.2" height="21.0" fill="rgb(240,0,4)" rx="2" ry="2" />+<text text-anchor="" x="59.20" y="366.5" font-size="11" font-family="verdana" fill="rgb(0,0,0)"  >Text.Pandoc.UTF8:hGetContents</text>+</g>+<g class="func_g" onmouseover="s('Text.Pandoc.Parsing:guardDisabled (669 samples, 10.13%)')" onmouseout="c()" onclick="zoom(this)">+<title>Text.Pandoc.Parsing:guardDisabled (669 samples, 10.13%)</title><rect x="318.5" y="155" width="101.6" height="21.0" fill="rgb(248,84,41)" rx="2" ry="2" />+<text text-anchor="" x="321.48" y="168.5" font-size="11" font-family="verdana" fill="rgb(0,0,0)"  >Text.Pandoc.P..</text>+</g>+<g class="func_g" onmouseover="s('Text.Pandoc.Writers.Docbook:inlineToDocbook (539 samples, 8.16%)')" onmouseout="c()" onclick="zoom(this)">+<title>Text.Pandoc.Writers.Docbook:inlineToDocbook (539 samples, 8.16%)</title><rect x="931.9" y="375" width="81.9" height="21.0" fill="rgb(242,28,47)" rx="2" ry="2" />+<text text-anchor="" x="934.94" y="388.5" font-size="11" font-family="verdana" fill="rgb(0,0,0)"  >Text.Pando..</text>+</g>+<g class="func_g" onmouseover="s('Text.Pandoc.Pretty:renderList.xs' (9 samples, 0.14%)')" onmouseout="c()" onclick="zoom(this)">+<title>Text.Pandoc.Pretty:renderList.xs' (9 samples, 0.14%)</title><rect x="906.3" y="331" width="1.3" height="21.0" fill="rgb(247,208,21)" rx="2" ry="2" />+<text text-anchor="" x="909.26" y="344.5" font-size="11" font-family="verdana" fill="rgb(0,0,0)"  ></text>+</g>+<g class="func_g" onmouseover="s('Text.Pandoc.Pretty:text.toChunks (366 samples, 5.54%)')" onmouseout="c()" onclick="zoom(this)">+<title>Text.Pandoc.Pretty:text.toChunks (366 samples, 5.54%)</title><rect x="935.0" y="331" width="55.6" height="21.0" fill="rgb(211,153,0)" rx="2" ry="2" />+<text text-anchor="" x="937.98" y="344.5" font-size="11" font-family="verdana" fill="rgb(0,0,0)"  >Text.P..</text>+</g>+<g class="func_g" onmouseover="s('Text.Pandoc.Options:readerExtensions (49 samples, 0.74%)')" onmouseout="c()" onclick="zoom(this)">+<title>Text.Pandoc.Options:readerExtensions (49 samples, 0.74%)</title><rect x="829.7" y="397" width="7.4" height="21.0" fill="rgb(208,88,12)" rx="2" ry="2" />+<text text-anchor="" x="832.67" y="410.5" font-size="11" font-family="verdana" fill="rgb(0,0,0)"  ></text>+</g>+<g class="func_g" onmouseover="s('Text.Pandoc.Pretty:renderList (273 samples, 4.13%)')" onmouseout="c()" onclick="zoom(this)">+<title>Text.Pandoc.Pretty:renderList (273 samples, 4.13%)</title><rect x="866.1" y="353" width="41.5" height="21.0" fill="rgb(248,73,18)" rx="2" ry="2" />+<text text-anchor="" x="869.14" y="366.5" font-size="11" font-family="verdana" fill="rgb(0,0,0)"  >Text..</text>+</g>+<g class="func_g" onmouseover="s('Text.Pandoc.UTF8:readFile (4,859 samples, 73.54%)')" onmouseout="c()" onclick="zoom(this)">+<title>Text.Pandoc.UTF8:readFile (4,859 samples, 73.54%)</title><rect x="56.0" y="375" width="738.4" height="21.0" fill="rgb(231,211,13)" rx="2" ry="2" />+<text text-anchor="" x="59.04" y="388.5" font-size="11" font-family="verdana" fill="rgb(0,0,0)"  >Text.Pandoc.UTF8:readFile</text>+</g>+<g class="func_g" onmouseover="s('Text.Pandoc.Readers.Markdown:whitespace (130 samples, 1.97%)')" onmouseout="c()" onclick="zoom(this)">+<title>Text.Pandoc.Readers.Markdown:whitespace (130 samples, 1.97%)</title><rect x="774.7" y="243" width="19.7" height="21.0" fill="rgb(206,185,31)" rx="2" ry="2" />+<text text-anchor="" x="777.66" y="256.5" font-size="11" font-family="verdana" fill="rgb(0,0,0)"  >T..</text>+</g>+<g class="func_g" onmouseover="s('Text.Pandoc.Parsing:mconcat (210 samples, 3.18%)')" onmouseout="c()" onclick="zoom(this)">+<title>Text.Pandoc.Parsing:mconcat (210 samples, 3.18%)</title><rect x="348.9" y="111" width="31.9" height="21.0" fill="rgb(245,193,31)" rx="2" ry="2" />+<text text-anchor="" x="351.87" y="124.5" font-size="11" font-family="verdana" fill="rgb(0,0,0)"  >Te..</text>+</g>+<g class="func_g" onmouseover="s('Text.Pandoc.Parsing:))= (124 samples, 1.88%)')" onmouseout="c()" onclick="zoom(this)">+<title>Text.Pandoc.Parsing:))= (124 samples, 1.88%)</title><rect x="401.3" y="45" width="18.8" height="21.0" fill="rgb(219,182,54)" rx="2" ry="2" />+<text text-anchor="" x="404.30" y="58.5" font-size="11" font-family="verdana" fill="rgb(0,0,0)"  ></text>+</g>+<g class="func_g" onmouseover="s('Text.Pandoc.Parsing:setLastStrPos (21 samples, 0.32%)')" onmouseout="c()" onclick="zoom(this)">+<title>Text.Pandoc.Parsing:setLastStrPos (21 samples, 0.32%)</title><rect x="624.4" y="199" width="3.2" height="21.0" fill="rgb(244,112,4)" rx="2" ry="2" />+<text text-anchor="" x="627.37" y="212.5" font-size="11" font-family="verdana" fill="rgb(0,0,0)"  ></text>+</g>+<g class="func_g" onmouseover="s('Text.Pandoc.UTF8:hPutStr (82 samples, 1.24%)')" onmouseout="c()" onclick="zoom(this)">+<title>Text.Pandoc.UTF8:hPutStr (82 samples, 1.24%)</title><rect x="794.6" y="353" width="12.4" height="21.0" fill="rgb(208,109,24)" rx="2" ry="2" />+<text text-anchor="" x="797.57" y="366.5" font-size="11" font-family="verdana" fill="rgb(0,0,0)"  ></text>+</g>+<g class="func_g" onmouseover="s('Text.Pandoc.Pretty:outp (125 samples, 1.89%)')" onmouseout="c()" onclick="zoom(this)">+<title>Text.Pandoc.Pretty:outp (125 samples, 1.89%)</title><rect x="879.4" y="331" width="19.0" height="21.0" fill="rgb(207,74,20)" rx="2" ry="2" />+<text text-anchor="" x="882.36" y="344.5" font-size="11" font-family="verdana" fill="rgb(0,0,0)"  ></text>+</g>+<g class="func_g" onmouseover="s('Text.Pandoc.Pretty:charWidth (1 samples, 0.02%)')" onmouseout="c()" onclick="zoom(this)">+<title>Text.Pandoc.Pretty:charWidth (1 samples, 0.02%)</title><rect x="990.4" y="265" width="0.2" height="21.0" fill="rgb(220,2,17)" rx="2" ry="2" />+<text text-anchor="" x="993.45" y="278.5" font-size="11" font-family="verdana" fill="rgb(0,0,0)"  ></text>+</g>+<g class="func_g" onmouseover="s('Text.Pandoc.Options:readerSmart (1,095 samples, 16.57%)')" onmouseout="c()" onclick="zoom(this)">+<title>Text.Pandoc.Options:readerSmart (1,095 samples, 16.57%)</title><rect x="253.7" y="243" width="166.4" height="21.0" fill="rgb(216,201,15)" rx="2" ry="2" />+<text text-anchor="" x="256.74" y="256.5" font-size="11" font-family="verdana" fill="rgb(0,0,0)"  >Text.Pandoc.Options:rea..</text>+</g>+<g class="func_g" onmouseover="s('Main:main (5,245 samples, 79.39%)')" onmouseout="c()" onclick="zoom(this)">+<title>Main:main (5,245 samples, 79.39%)</title><rect x="10.0" y="397" width="797.0" height="21.0" fill="rgb(230,190,5)" rx="2" ry="2" />+<text text-anchor="" x="13.00" y="410.5" font-size="11" font-family="verdana" fill="rgb(0,0,0)"  >Main:main</text>+</g>+<g class="func_g" onmouseover="s('Text.Pandoc.Options:compare (149 samples, 2.26%)')" onmouseout="c()" onclick="zoom(this)">+<title>Text.Pandoc.Options:compare (149 samples, 2.26%)</title><rect x="807.0" y="397" width="22.7" height="21.0" fill="rgb(231,130,50)" rx="2" ry="2" />+<text text-anchor="" x="810.03" y="410.5" font-size="11" font-family="verdana" fill="rgb(0,0,0)"  >T..</text>+</g>+<g class="func_g" onmouseover="s('Text.Pandoc.Pretty:text (368 samples, 5.57%)')" onmouseout="c()" onclick="zoom(this)">+<title>Text.Pandoc.Pretty:text (368 samples, 5.57%)</title><rect x="934.7" y="353" width="55.9" height="21.0" fill="rgb(247,37,32)" rx="2" ry="2" />+<text text-anchor="" x="937.68" y="366.5" font-size="11" font-family="verdana" fill="rgb(0,0,0)"  >Text.P..</text>+</g>+<g class="func_g" onmouseover="s('Text.Pandoc.Parsing:guardEnabled (4,523 samples, 68.46%)')" onmouseout="c()" onclick="zoom(this)">+<title>Text.Pandoc.Parsing:guardEnabled (4,523 samples, 68.46%)</title><rect x="107.1" y="287" width="687.3" height="21.0" fill="rgb(229,94,53)" rx="2" ry="2" />+<text text-anchor="" x="110.10" y="300.5" font-size="11" font-family="verdana" fill="rgb(0,0,0)"  >Text.Pandoc.Parsing:guardEnabled</text>+</g>+<g class="func_g" onmouseover="s('Text.Pandoc.Writers.Docbook:hasLineBreaks (88 samples, 1.33%)')" onmouseout="c()" onclick="zoom(this)">+<title>Text.Pandoc.Writers.Docbook:hasLineBreaks (88 samples, 1.33%)</title><rect x="907.8" y="397" width="13.4" height="21.0" fill="rgb(208,70,24)" rx="2" ry="2" />+<text text-anchor="" x="910.78" y="410.5" font-size="11" font-family="verdana" fill="rgb(0,0,0)"  ></text>+</g>+<g class="func_g" onmouseover="s('Text.Pandoc.Readers.Markdown:inList (616 samples, 9.32%)')" onmouseout="c()" onclick="zoom(this)">+<title>Text.Pandoc.Readers.Markdown:inList (616 samples, 9.32%)</title><rect x="681.1" y="177" width="93.6" height="21.0" fill="rgb(245,76,37)" rx="2" ry="2" />+<text text-anchor="" x="684.06" y="190.5" font-size="11" font-family="verdana" fill="rgb(0,0,0)"  >Text.Pandoc...</text>+</g>+<g class="func_g" onmouseover="s('all (6,607 samples, 100%)')" onmouseout="c()" onclick="zoom(this)">+<title>all (6,607 samples, 100%)</title><rect x="10.0" y="419" width="1004.0" height="21.0" fill="rgb(244,197,31)" rx="2" ry="2" />+<text text-anchor="" x="13.00" y="432.5" font-size="11" font-family="verdana" fill="rgb(0,0,0)"  ></text>+</g>+<g class="func_g" onmouseover="s('Text.Pandoc.Parsing:updateLastStrPos (48 samples, 0.73%)')" onmouseout="c()" onclick="zoom(this)">+<title>Text.Pandoc.Parsing:updateLastStrPos (48 samples, 0.73%)</title><rect x="767.4" y="133" width="7.3" height="21.0" fill="rgb(234,50,31)" rx="2" ry="2" />+<text text-anchor="" x="770.37" y="146.5" font-size="11" font-family="verdana" fill="rgb(0,0,0)"  ></text>+</g>+<g class="func_g" onmouseover="s('Text.Pandoc.Parsing:mconcat (142 samples, 2.15%)')" onmouseout="c()" onclick="zoom(this)">+<title>Text.Pandoc.Parsing:mconcat (142 samples, 2.15%)</title><rect x="398.6" y="67" width="21.5" height="21.0" fill="rgb(245,193,31)" rx="2" ry="2" />+<text text-anchor="" x="401.56" y="80.5" font-size="11" font-family="verdana" fill="rgb(0,0,0)"  >T..</text>+</g>+<g class="func_g" onmouseover="s('Text.Pandoc.Pretty:realLength.\ (2 samples, 0.03%)')" onmouseout="c()" onclick="zoom(this)">+<title>Text.Pandoc.Pretty:realLength.\ (2 samples, 0.03%)</title><rect x="898.1" y="265" width="0.3" height="21.0" fill="rgb(254,216,18)" rx="2" ry="2" />+<text text-anchor="" x="901.05" y="278.5" font-size="11" font-family="verdana" fill="rgb(0,0,0)"  ></text>+</g>+<g class="func_g" onmouseover="s('Text.Pandoc.UTF8:writeFile (83 samples, 1.26%)')" onmouseout="c()" onclick="zoom(this)">+<title>Text.Pandoc.UTF8:writeFile (83 samples, 1.26%)</title><rect x="794.4" y="375" width="12.6" height="21.0" fill="rgb(244,168,51)" rx="2" ry="2" />+<text text-anchor="" x="797.42" y="388.5" font-size="11" font-family="verdana" fill="rgb(0,0,0)"  ></text>+</g>+<g class="func_g" onmouseover="s('Text.Pandoc.Writers.Docbook:hasLineBreaks.isLineBreak (7 samples, 0.11%)')" onmouseout="c()" onclick="zoom(this)">+<title>Text.Pandoc.Writers.Docbook:hasLineBreaks.isLineBreak (7 samples, 0.11%)</title><rect x="919.2" y="375" width="1.0" height="21.0" fill="rgb(245,90,28)" rx="2" ry="2" />+<text text-anchor="" x="922.18" y="388.5" font-size="11" font-family="verdana" fill="rgb(0,0,0)"  ></text>+</g>+<g class="func_g" onmouseover="s('Text.Pandoc.Readers.Markdown:readMarkdownWithWarnings (4,638 samples, 70.20%)')" onmouseout="c()" onclick="zoom(this)">+<title>Text.Pandoc.Readers.Markdown:readMarkdownWithWarnings (4,638 samples, 70.20%)</title><rect x="89.6" y="309" width="704.8" height="21.0" fill="rgb(215,173,27)" rx="2" ry="2" />+<text text-anchor="" x="92.63" y="322.5" font-size="11" font-family="verdana" fill="rgb(0,0,0)"  >Text.Pandoc.Readers.Markdown:readMarkdownWithWarnings</text>+</g>+<g class="func_g" onmouseover="s('Text.Pandoc.Pretty:renderList.isText (3 samples, 0.05%)')" onmouseout="c()" onclick="zoom(this)">+<title>Text.Pandoc.Pretty:renderList.isText (3 samples, 0.05%)</title><rect x="901.5" y="309" width="0.5" height="21.0" fill="rgb(229,65,33)" rx="2" ry="2" />+<text text-anchor="" x="904.55" y="322.5" font-size="11" font-family="verdana" fill="rgb(0,0,0)"  ></text>+</g>+</svg>