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 +2/−0
- LICENSE +30/−0
- Main.hs +80/−0
- Setup.hs +2/−0
- flamingra.cabal +59/−0
- pandoc.svg +429/−0
+ 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>