<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
 
 <title>David Chudzicki</title>
 <link href="http://www.davidchudzicki.com/atom.xml" rel="self"/>
 <link href="http://www.davidchudzicki.com/"/>
 <updated>2025-05-24T22:15:13+00:00</updated>
 <id>http://www.davidchudzicki.com</id>
 <author>
   <name>David Chudzicki</name>
 </author>
 
 
     
 
     
 <entry>
   <title>GPT4 can play chess</title>
   <link href="http://www.davidchudzicki.com/posts/gpt4-can-play-chess/"/>
   <updated>2023-07-29T00:00:00+00:00</updated>
   <id>http://www.davidchudzicki.com/posts/gpt4-can-play-chess</id>
   <content type="html">&lt;h2&gt;How general are Large Language Model (LLMs) chatbots?&lt;/h2&gt;

&lt;p&gt;If you&amp;#39;re interested in how AI will play out over the next few years, you might care how much &amp;quot;general&amp;quot; intelligence is embedded in these systems. Do they just predict text? Or can they learn to do other interesting things?&lt;/p&gt;

&lt;p&gt;Twice today I saw a experts use chess as an example to show that they aren&amp;#39;t very general.&lt;/p&gt;

&lt;p&gt;In an interview a few weeks ago with &lt;a href=&quot;https://www.nytimes.com/2023/07/11/opinion/ezra-klein-podcast-demis-hassabis.html?showTranscript=1&quot;&gt;Ezra Klein&lt;/a&gt;, Demis Hassabis (CEO and co-founder of DeepMind) said:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;So if you challenge one of these chat bots to a game, you want to play a game of chess or a game of Go against it, they’re actually all pretty bad at it currently, which is one of the tests I give these chat bots is, can they play a good game and hold the board state in mind? And they can’t really at the moment. They’re not very good.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In a &lt;a href=&quot;https://scottaaronson.blog/?p=7431&quot;&gt;roundtable&lt;/a&gt; with Eliezer Yudkowsky and Scott Aaronson, Gary Marcus said:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I would say that the core of artificial general intelligence is the ability to flexibly deal with new problems that you haven’t seen before. The current systems can do that a little bit, but not very well. My typical example of this now is GPT-4. It is exposed to the game of chess, sees lots of games of chess, sees the rules of chess but it never actually figure out the rules of chess. They often make illegal moves and so forth. So it’s in no way a general intelligence that can just pick up new things.&lt;/p&gt;

&lt;p&gt;...&lt;/p&gt;

&lt;p&gt;I mean, to take the example I just gave you a minute ago, it never learns to play chess even with a huge amount of data. It will play a little bit of chess; it will memorize the openings and be okay for the first 15 moves. But, it gets far enough away from what it’s trained on, and it falls apart. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;But they &lt;em&gt;can&lt;/em&gt; play chess!&lt;/h2&gt;

&lt;p&gt;A couple months ago I saw &lt;a href=&quot;https://twitter.com/kenshinsamurai9/status/1662510532585291779&quot;&gt;some tweets&lt;/a&gt; about how GPT3.5 and GPT4 can play chess if you give it very specialized prompts. (That same account has some other interesting examples showing a &amp;quot;logic core&amp;quot; in GPT.)&lt;/p&gt;

&lt;p&gt;That made me curious to try more &amp;quot;normal&amp;quot; prompts, and I found that if you prompt it like this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Let&amp;#39;s play chess. I&amp;#39;ll start.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;e4&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;

&lt;p&gt;... and proceed with standard PGN notation, GPT4 makes reasonable, legal moves, even long after the opening.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/chess.png&quot; alt=&quot;chess-prompt&quot; style=&quot;width:400px;&quot;/&gt;&lt;/p&gt;

&lt;p&gt;(I don&amp;#39;t know why GPT4 is refusing to increment the move numbers with me. When I tried this a couple months ago its move numbers made sense. You&amp;#39;ll see in the transcript I got one move number wrong myself.)&lt;/p&gt;

&lt;p&gt;I don&amp;#39;t know what Demis considers a &amp;quot;good game&amp;quot;, but it seems pretty clear to me that GPT4 is able to &amp;quot;hold the board state in mind&amp;quot;.&lt;/p&gt;

&lt;p&gt;Here&amp;#39;s the final position in the game I just played (GPT4 won):&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/chess-final-position.png&quot; alt=&quot;chess-final-position&quot; style=&quot;width:400px;&quot;/&gt;&lt;/p&gt;

&lt;p&gt;You can see the full transcript &lt;a href=&quot;https://chat.openai.com/share/1cfb845f-1a95-424f-ac1a-9259a8c826ac&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;To see the full game played out, go to a &lt;a href=&quot;https://lichess.org/analysis&quot;&gt;lichess.org analysis board&lt;/a&gt; and paste in the game&amp;#39;s PGN notation:&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-text&quot; data-lang=&quot;text&quot;&gt;1. e4 e5 2. d4 exd4 3. Qxd4 Nc6 4. Qd1 Nf6 5. Bc4 Bc5 6. b4 Bxb4+ 7. c3 Ba5 8. Nf3 O-O 9. O-O Nxe4 10. Re1 Nf6 11. Qb3 d5 12. Rd1 dxc4 13. Rxd8 cxb3 14. Rxf8+ Kxf8 15. axb3 Bg4 16. Ba3+ Kg8 17. Nbd2 Re8 18. Re1 Rxe1+ 19. Nxe1 Bxc3 20. f3 Bxd2 21. fxg4 Bxe1 22. Kf1 Bb4 23. Bxb4 Nxb4 24. Ke2 c5 25. g5 Ne4 26. h4 b5 27. Ke3 Nd6 28. g4 a5 29. h5 a4 30. bxa4 bxa4 31. h6 gxh6 32. gxh6 a3 33. Kf4 a2 34. Ke3 a1=Q 35. Kf4 Qf6+ 36. Ke3 Nd5+ 37. Kd2 Qf2+ 38. Kd3 c4#
&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Aside from the move numbers, there&amp;#39;s one way in which this record of the game differs from our transcript: On move 17, I said &amp;quot;Nd2&amp;quot;, which is an incorrect thing to write, since there are &lt;em&gt;two&lt;/em&gt; knights that could move to d2. But GPT4 just went with it, and seems to have correctly figured out which one I meant.&lt;/p&gt;

&lt;h2&gt;Could this game be memorized?&lt;/h2&gt;

&lt;p&gt;I can&amp;#39;t really prove to you that this game isn&amp;#39;t in GPT4&amp;#39;s training data, but it seems exceedingly unlikely. I made some intentionally weird moves just to try to get out of any common sequence pretty early.&lt;/p&gt;

&lt;h2&gt;Is GPT4 good at chess?&lt;/h2&gt;

&lt;p&gt;This isn&amp;#39;t a particularly good chess game, though it&amp;#39;s me rather than GPT4 who didn&amp;#39;t play very well. I blundered a piece on move 12, and (as mentioned) made a few other intentionally not-good moves.&lt;/p&gt;

&lt;p&gt;I don&amp;#39;t really know how good GPT4 is at chess. If I can get API access, I&amp;#39;d love to try making a chess bot that could play online.&lt;/p&gt;

&lt;h2&gt;Why can GPT4 play chess?&lt;/h2&gt;

&lt;p&gt;I don&amp;#39;t work in AI these days, but I&amp;#39;d guess that: GPT4 is trained to predict the text in its training data, and presumably there are a lot of chess games out there on the internet for it to read. By learning the rules of chess and some ability to reason about the board state and good moves, it does a better job predicting those games.&lt;/p&gt;

&lt;h2&gt;Did I cherry-pick this example? Is this behavior reliable?&lt;/h2&gt;

&lt;p&gt;First, I even one example like this shows that GPT4 is able to hold the board state in mind. If I&amp;#39;d had to play 100 games where forgot the board position, even one where it tracks the board and plays pretty well is interesting.&lt;/p&gt;

&lt;p&gt;But no, I didn&amp;#39;t cherry-pick the example. I played a little bit in this format a couple months ago (and I don&amp;#39;t think GPT4 made any illegal moves), and then today after seeing these comments that chat bots can&amp;#39;t play chess, I tried one and only one game. That&amp;#39;s this one. I didn&amp;#39;t play any other game for this post, and certainly not any where it made illegal moves and I gave up.&lt;/p&gt;

&lt;p&gt;I tried this a couple other times two months ago, but I don&amp;#39;t have great data on how often GPT4 is able to complete a game this way.&lt;/p&gt;

&lt;h2&gt;But it does make illegal moves for some prompts...&lt;/h2&gt;

&lt;p&gt;Using prompts like the one above seems to work well, but it&amp;#39;s true at GPT4 can quickly go off the rails with other prompts. &lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://chat.openai.com/share/fd02ffa7-c5fe-4d70-81cb-050805817dea&quot;&gt;Here&amp;#39;s&lt;/a&gt; an example where I asked it to explain its moves, and its 4th move was illegal. That&amp;#39;s a big contrast with the above 38-move game where it plays legally the whole time, and wins!&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/chess-illegal.png&quot; alt=&quot;chess-illegal&quot; style=&quot;width:600px;&quot;/&gt;&lt;/p&gt;

&lt;p&gt;Also &lt;a href=&quot;https://chat.openai.com/?model=gpt-4&quot;&gt;here&lt;/a&gt;&amp;#39;s a chat with the same initial few moves where it plays legally.&lt;/p&gt;
</content>
 </entry>
 
 
     
 
     
 
     
 <entry>
   <title>Git First-Parent</title>
   <link href="http://www.davidchudzicki.com/posts/first-parent/"/>
   <updated>2018-02-18T00:00:00+00:00</updated>
   <id>http://www.davidchudzicki.com/posts/first-parent</id>
   <content type="html">&lt;p&gt;&lt;em&gt;Messy git history is a display problem, not a data problem.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The first thing I encountered learning about git: there&amp;#39;s a lot of conflict about whether it&amp;#39;s important to keep a &amp;quot;clean&amp;quot; git history by squashing, rebasing instead of merging, etc. If the &lt;code&gt;--first-parent&lt;/code&gt; featue were well supported, it would give us the best of both worlds.&lt;/p&gt;

&lt;!--more--&gt;

&lt;h2&gt;In favor of &amp;#39;cleanliness&amp;#39;:&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;git log&lt;/code&gt; shows the higher-level history most people will care more about&lt;/li&gt;
&lt;li&gt;the one-to-one relationship between code-reviewed changes and commits is nice&lt;/li&gt;
&lt;li&gt;it&amp;#39;s quicker to identify where problems were introduced&lt;/li&gt;
&lt;li&gt;... and safer to fix those problems by deploying an earlier commit (and easier to use tools like &lt;code&gt;git bisect&lt;/code&gt;) because every commit in &lt;code&gt;master&lt;/code&gt;&amp;#39;s history should be good (this is often very important when quickly fixing production problems)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Against cleanliness:&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;just committing often and merging normally is much easier for newbies, and somewhat easier for everyone&lt;/li&gt;
&lt;li&gt;messing with history complicates everything&lt;/li&gt;
&lt;li&gt;more history is useful, e.g. for cherry-picking into another branch, or understanding what someone was thinking when they wrote something&lt;/li&gt;
&lt;li&gt;changing history makes code review much harder (which version was this comment left on? has the author changed anything since I reviewed this?)&lt;sup id=&quot;fnref1&quot;&gt;&lt;a href=&quot;#fn1&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;squashing complicates various operations (like branching off a branch that&amp;#39;s under review to work on something new that depends on it)&lt;sup id=&quot;fnref2&quot;&gt;&lt;a href=&quot;#fn2&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then I came across a blog post (sorry, can&amp;#39;t find it now) arguing that this disagreement is stupid and git is stupid because the clean-history side is having a problem with &lt;em&gt;data display&lt;/em&gt;, not &lt;em&gt;data collection&lt;/em&gt;. The problem isn&amp;#39;t the extra information (messy commits): it&amp;#39;s that the information isn&amp;#39;t displayed in a way that shows them what they&amp;#39;re interested in (larger changes that are code-reviewed).&lt;/p&gt;

&lt;p&gt;The post struck a chord with me, but didn&amp;#39;t suggest any solution so it just made me grumpy and otherwise I ignored it.&lt;/p&gt;

&lt;p&gt;Now I know about &lt;code&gt;--first-parent&lt;/code&gt; (because my last company used it) which gets you the best of all worlds:&lt;/p&gt;

&lt;h2&gt;First Parent&lt;/h2&gt;

&lt;p&gt;When &lt;code&gt;git log&lt;/code&gt; encounters a merge commit, it normally follows the history backwards through both parents.&lt;/p&gt;

&lt;p&gt;For example, after branching off master, adding some commits, and merging into master&lt;sup id=&quot;fnref3&quot;&gt;&lt;a href=&quot;#fn3&quot;&gt;3&lt;/a&gt;&lt;/sup&gt;, we might see&lt;sup id=&quot;fnref4&quot;&gt;&lt;a href=&quot;#fn4&quot;&gt;4&lt;/a&gt;&lt;/sup&gt;:&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-text&quot; data-lang=&quot;text&quot;&gt;&amp;gt; git log
7e066db David Chudzicki Sat Feb 10 14:23:43 2018 -0500  Merge branch &amp;#39;feature-branch&amp;#39;
29061db David Chudzicki Sat Feb 10 14:23:30 2018 -0500  2nd commit on master
04bb2b7 David Chudzicki Sat Feb 10 14:22:32 2018 -0500  2nd commit on feature
0d1561a David Chudzicki Sat Feb 10 14:21:43 2018 -0500  first commit on feature
725034c David Chudzicki Sat Feb 10 14:21:23 2018 -0500  first commit on master
&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;But if we say &lt;code&gt;--first-parent&lt;/code&gt;, &lt;code&gt;git log&lt;/code&gt; will ignore all of the history in the second parent of a merge commit:&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-text&quot; data-lang=&quot;text&quot;&gt;&amp;gt; git log --first-parent
7e066db David Chudzicki Sat Feb 10 14:23:43 2018 -0500  Merge branch &amp;#39;feature-branch&amp;#39;
29061db David Chudzicki Sat Feb 10 14:23:30 2018 -0500  2nd commit on master
725034c David Chudzicki Sat Feb 10 14:21:23 2018 -0500  first commit on master
&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Which is the &amp;quot;first&amp;quot; and which is the &amp;quot;second&amp;quot; parent of a merge? If you&amp;#39;re on branch &lt;code&gt;some-branch&lt;/code&gt; and say &lt;code&gt;git merge some-other branch&lt;/code&gt;, then the &lt;em&gt;first&lt;/em&gt; parent is the latest commit on &lt;code&gt;some-branch&lt;/code&gt; and the &lt;em&gt;second&lt;/em&gt; is the latest commit on &lt;code&gt;some-other-branch&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;You can also use &lt;code&gt;--first-parent&lt;/code&gt; with other git commands, like &lt;code&gt;blame&lt;/code&gt; and &lt;code&gt;rev-list&lt;/code&gt;. By default we see the two individual commits in the file introduced by the merge:&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-text&quot; data-lang=&quot;text&quot;&gt;&amp;gt; git blame feature
0d1561a2 (David Chudzicki 2018-02-10 14:21:43 -0500 1) cats
04bb2b70 (David Chudzicki 2018-02-10 14:22:32 -0500 2) dogs
&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;... but with &lt;code&gt;--first-parent&lt;/code&gt; we only see the merge commit:&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-text&quot; data-lang=&quot;text&quot;&gt;&amp;gt; git blame feature --first-parent
7e066dba (David Chudzicki 2018-02-10 14:23:43 -0500 1) cats
7e066dba (David Chudzicki 2018-02-10 14:23:43 -0500 2) dogs
&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;h2&gt;Don&amp;#39;t fast forward&lt;/h2&gt;

&lt;p&gt;By default, git uses a &amp;quot;fast-forward&amp;quot; when the two branches haven&amp;#39;t diverged at all so you don&amp;#39;t really need a merge at all. The new commits are just applied as-is with no merge. If you&amp;#39;re hoping to get a clean history from &lt;code&gt;--first-parent&lt;/code&gt;, you should avoid that because then    the individual commits from your feature branch would show up in &lt;code&gt;git log --first-parent&lt;/code&gt;. You should only merge with the  &lt;code&gt;--no-ff&lt;/code&gt; option, which is Github&amp;#39;s default merge strategy.&lt;/p&gt;

&lt;p&gt;You can turn fast-forward off (for a particular local repository) by running:&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-text&quot; data-lang=&quot;text&quot;&gt;git config --local --add merge.ff false
&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;h2&gt;Give your merge commits a good top-line message&lt;/h2&gt;

&lt;p&gt;Merge commits should always have nice messages summarizing, in the first line, what was introduced/changed.&lt;/p&gt;

&lt;p&gt;If you&amp;#39;re using Github, it will by default put the the pull request title in the 2nd line of the merge commit&amp;#39;s message (and something like &lt;code&gt;Merge pull request #&amp;lt;number&amp;gt; from &amp;lt;username&amp;gt;/&amp;lt;branch&amp;gt;&lt;/code&gt; in the first line, which is not as good as putting it in the first line.&lt;/p&gt;

&lt;p&gt;At the company where I was introduced to &lt;code&gt;--first-parent&lt;/code&gt;, I think we used a custom script that made more useful topline merge commit messages based on pull request titles. But I don&amp;#39;t expect everyone to do that, so I&amp;#39;m not sure what to suggest. Unfortunately, this alone might be enough reason to use the squash option instead, if you&amp;#39;re using Github for your merges.&lt;/p&gt;

&lt;p&gt;Where I work now, if you merge using our (internal) code review tool, the default commit message for the merge will have its top line be the title of your pull request. That&amp;#39;s great for this workflow, because a good commit message for posterity is the same as a good title for reviewers. Just by looking at the title of your request, reviewers are reviewing the commit message.&lt;/p&gt;

&lt;h2&gt;&lt;code&gt;--first-parent&lt;/code&gt; is useful in feature branches too&lt;/h2&gt;

&lt;p&gt;Let&amp;#39;s say you&amp;#39;re in a feature branch and have merged changes from &lt;code&gt;master&lt;/code&gt; a few times. Then using &lt;code&gt;--first-parent&lt;/code&gt; here in your feature branch has the same benefits, but in reverse: You can see the history of your work on this feature, but with merges from &lt;code&gt;master&lt;/code&gt; grouped into a single commit.&lt;/p&gt;

&lt;h2&gt;I hope tooling gets better&lt;/h2&gt;

&lt;p&gt;The workflow I&amp;#39;ve described here seems good enough that I would suggest it for my team. But not all tools will nicely support &lt;code&gt;--first-parent&lt;/code&gt;. For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;most online code viewing tools (e.g. Github&amp;#39;s, or my current company&amp;#39;s internal one) will show you a list of commits on a branch, but won&amp;#39;t let you filter that by &lt;code&gt;--first-parent&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;some editors (e.g. PyCharm) will annotate lines with git history (like &lt;code&gt;git blame&lt;/code&gt;), but often won&amp;#39;t let you customize this by giving option like &lt;code&gt;--first-parent&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;for this workflow, you really want the pull request title to be in the top line of the merge commit message&lt;/li&gt;
&lt;li&gt;some &lt;code&gt;git&lt;/code&gt; commands don&amp;#39;t support &lt;code&gt;--first-parent&lt;/code&gt; (but some do even if they&amp;#39;re not documented as doing so!)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Thanks&lt;/h2&gt;

&lt;p&gt;Thanks to Ben Kuhn for comments on an earlier draft, and showing me this when we worked together.&lt;/p&gt;

&lt;div class=&quot;footnotes&quot;&gt;
&lt;hr&gt;
&lt;ol&gt;

&lt;li id=&quot;fn1&quot;&gt;
&lt;p&gt;If you use Github&amp;#39;s &amp;quot;Squash and merge&amp;quot; feature, this won&amp;#39;t be a problem: You can just commit freely as you go and squash/merge after code review is all over. Other teams I&amp;#39;ve been on asked people to squash before posting a pull request, but had a strong norm against changing history once anyone else has seen the code. My current company&amp;#39;s code review tool supports &amp;quot;revisions&amp;quot;, so it&amp;#39;s possible to see what&amp;#39;s changed even if every new version is completely squashed. But that means we&amp;#39;re using this internal tool to track history, which is a job much better suited for git.&amp;nbsp;&lt;a href=&quot;#fnref1&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;li id=&quot;fn2&quot;&gt;
&lt;p&gt;If you make changes to the first branch (based on code review feedback) and squash them into the previous commit, it can be tricky to merge those changes into your 2nd feature branch.&amp;nbsp;&lt;a href=&quot;#fnref2&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;li id=&quot;fn3&quot;&gt;
&lt;p&gt;In an empty directory, you can do this to reproduce my git history: &lt;code&gt;git init &amp;amp;&amp;amp; touch hi &amp;amp;&amp;amp; git add hi &amp;amp;&amp;amp; git commit -m &amp;#39;first commit on master&amp;#39; &amp;amp;&amp;amp; git checkout -b feature-branch &amp;amp;&amp;amp; echo &amp;quot;cats&amp;quot; &amp;gt; feature &amp;amp;&amp;amp; git add feature &amp;amp;&amp;amp; git commit -m &amp;#39;first commit on feature&amp;#39; &amp;amp;&amp;amp; echo &amp;#39;dogs&amp;#39; &amp;gt;&amp;gt; feature &amp;amp;&amp;amp; git add feature &amp;amp;&amp;amp; git commit -m &amp;#39;2nd commit on feature&amp;#39; &amp;amp;&amp;amp; git checkout master &amp;amp;&amp;amp; echo &amp;quot;hello&amp;quot; &amp;gt;&amp;gt; &amp;quot;hi&amp;quot; &amp;amp;&amp;amp; git commit -am &amp;quot;2nd commit on master&amp;quot; &amp;amp;&amp;amp; git merge feature-branch&lt;/code&gt;&amp;nbsp;&lt;a href=&quot;#fnref3&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;li id=&quot;fn4&quot;&gt;
&lt;p&gt;My log is showing up consisely formatted with one commit per line because I did &lt;code&gt;git config format.pretty &amp;quot;format:%h%x09%an%x09%ad%x09%s&amp;quot;&lt;/code&gt;&amp;nbsp;&lt;a href=&quot;#fnref4&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;/ol&gt;
&lt;/div&gt;
</content>
 </entry>
 
 
     
 <entry>
   <title>Regexes for replacing ugly unittest-style assertions</title>
   <link href="http://www.davidchudzicki.com/posts/replace-ugly-assert-methods/"/>
   <updated>2017-12-30T00:00:00+00:00</updated>
   <id>http://www.davidchudzicki.com/posts/replace-ugly-assert-methods</id>
   <content type="html">&lt;p&gt;In case they help anyone else, here are some regular expressions I used once to convert some ugly unittest-style assertions (e.g. &lt;code&gt;self.assertEqual(something, something_else)&lt;/code&gt; to the pytest style (simply &lt;code&gt;assert something == something_else&lt;/code&gt;):&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-text&quot; data-lang=&quot;text&quot;&gt;sed -i &amp;quot;.bak&amp;quot; -E &amp;#39;s/self\.assertFalse\((.*)\)/assert not \1/g&amp;#39; tests/*.py
sed -i &amp;quot;.bak&amp;quot; -E &amp;#39;s/self\.assertTrue\((.*)\)/assert \1/g&amp;#39; tests/*.py
sed -i &amp;quot;.bak&amp;quot; -E &amp;#39;s/self\.assertEqual\(([^,]*), (.*)\)$/assert \1 == \2/g&amp;#39; tests/*.py
sed -i &amp;quot;.bak&amp;quot; -E &amp;#39;s/self\.assertIn\(([^,]*), (.*)\)$/assert \1 in \2/g&amp;#39; tests/*.py
sed -i &amp;quot;.bak&amp;quot; -E &amp;#39;s/self\.assertNotEqual\(([^,]*), (.*)\)$/assert \1 != \2/g&amp;#39; tests/*.py
sed -i &amp;quot;.bak&amp;quot; -E &amp;#39;s/self\.assertNotIn\(([^,]*), (.*)\)$/assert \1 not in \2/g&amp;#39; tests/*.py
sed -i &amp;quot;.bak&amp;quot; -E &amp;#39;s/self\.assertIsNone\((.*)\)$/assert \1 is None/g&amp;#39; tests/*.py
sed -i &amp;quot;.bak&amp;quot; -E &amp;#39;s/self\.assertIsNotNone\((.*)\)$/assert \1 is not None/g&amp;#39; tests/*.py
&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;(Pytest gives nice informative error messages even if you just use the prettier form.)&lt;/p&gt;

&lt;p&gt;Note:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The option &lt;code&gt;-i&lt;/code&gt; means &amp;quot;do it in-place&amp;quot; (modify the file). Including &lt;code&gt;&amp;quot;.bak&amp;quot;&lt;/code&gt; means &amp;quot;make backups of the old version with this extension&amp;quot;.&lt;/li&gt;
&lt;li&gt;I don&amp;#39;t actually want the backups, but (for some odd reason) on my Mac, not asking for them changed how the regex was interpreted to something that&amp;#39;s not right.&lt;/li&gt;
&lt;li&gt;After reviewing and checking in the changes I wanted, I cleaned up the backups with &lt;code&gt;git clean -f&lt;/code&gt; (careful you don&amp;#39;t have any unchecked-in changes you want to keep!).&lt;/li&gt;
&lt;/ul&gt;
</content>
 </entry>
 
 
     
 
     
 <entry>
   <title>An Interaction or Not? How a few ML Models Generalize to New Data</title>
   <link href="http://www.davidchudzicki.com/posts/interaction-or-not/"/>
   <updated>2015-03-04T00:00:00+00:00</updated>
   <id>http://www.davidchudzicki.com/posts/interaction-or-not</id>
   <content type="html">&lt;p&gt;&lt;em&gt;Source code for this post is &lt;a href=&quot;https://github.com/dchudz/dchudz.github.io/blob/master/post_source/interaction-or-not.Rmd&quot;&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This post examines how a few statistical and machine learning models respond to a simple toy example where they&amp;#39;re asked to make predictions on new regions of feature space. The key question the models will answer differently is whether there&amp;#39;s an &amp;quot;interaction&amp;quot; between two features: does the influence of one feature differ depending on the value of another. &lt;/p&gt;

&lt;p&gt;In this case, the data won&amp;#39;t provide information about whether there&amp;#39;s an interaction or not. Interactions are often real and important, but in many contexts we treat interaction effects as likely to be small (without evidence otherwise). I&amp;#39;ll walk through why decision trees and bagged ensembles of decision trees (random forests) can make the opposite assumption: they can strongly prefer an interaction, even when the evidence is equally consistent with including or not including an interaction.&lt;/p&gt;

&lt;p&gt;I&amp;#39;ll look at point estimates from:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a linear model&lt;/li&gt;
&lt;li&gt;decision trees and bagged decision trees (random forest), using R&amp;#39;s &lt;code&gt;randomForest&lt;/code&gt; package&lt;/li&gt;
&lt;li&gt;boosted decision trees, using the R&amp;#39;s &lt;code&gt;gbm&lt;/code&gt; package&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I&amp;#39;ll also look at two models that capture &lt;strong&gt;uncertainty&lt;/strong&gt; about whether there&amp;#39;s an interaction:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bayesian linear model with an interaction term&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://cran.r-project.org/web/packages/bartMachine/vignettes/bartMachine.pdf&quot;&gt;Bayesian Additive Regression Trees&lt;/a&gt; (BART) &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;BART has the advantage of expressing uncertainty while still being a &amp;quot;machine learning&amp;quot; type model that learns interactions, non-linearities, etc. without the user having to decide which terms to include or the particular functional form.&lt;/p&gt;

&lt;p&gt;Whenever possible, I recommend using models like BART that explicitly allow for uncertainty.&lt;/p&gt;

&lt;h1&gt;The Example&lt;/h1&gt;

&lt;p&gt;Suppose you&amp;#39;re given this data and asked to make a prediction at &lt;code&gt;$X_1 = 0$, $X_2 = 1$&lt;/code&gt; (where there isn&amp;#39;t any training data):&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/interaction-or-not/unnamed-chunk-2.png&quot; alt=&quot;plot of chunk unnamed-chunk-2&quot;&gt; &lt;/p&gt;

&lt;!-- html table generated in R 3.1.1 by xtable 1.7-3 package --&gt;

&lt;!-- Wed Mar  4 11:12:37 2015 --&gt;

&lt;TABLE border=1&gt;
&lt;TR&gt; &lt;TH&gt; X1 &lt;/TH&gt; &lt;TH&gt; X2 &lt;/TH&gt; &lt;TH&gt; Y &lt;/TH&gt; &lt;TH&gt; N Training Rows: &lt;/TH&gt;  &lt;/TR&gt;
  &lt;TR&gt; &lt;TD align=&quot;center&quot;&gt; 0 &lt;/TD&gt; &lt;TD align=&quot;center&quot;&gt; 0 &lt;/TD&gt; &lt;TD align=&quot;center&quot;&gt; Y = 5 + noise &lt;/TD&gt; &lt;TD align=&quot;center&quot;&gt; 52 &lt;/TD&gt; &lt;/TR&gt;
  &lt;TR&gt; &lt;TD align=&quot;center&quot;&gt; 1 &lt;/TD&gt; &lt;TD align=&quot;center&quot;&gt; 0 &lt;/TD&gt; &lt;TD align=&quot;center&quot;&gt; Y = 15 + noise &lt;/TD&gt; &lt;TD align=&quot;center&quot;&gt; 23 &lt;/TD&gt; &lt;/TR&gt;
  &lt;TR&gt; &lt;TD align=&quot;center&quot;&gt; 1 &lt;/TD&gt; &lt;TD align=&quot;center&quot;&gt; 1 &lt;/TD&gt; &lt;TD align=&quot;center&quot;&gt; Y = 19 + noise &lt;/TD&gt; &lt;TD align=&quot;center&quot;&gt; 25 &lt;/TD&gt; &lt;/TR&gt;
  &lt;TR&gt; &lt;TD align=&quot;center&quot;&gt; 0 &lt;/TD&gt; &lt;TD align=&quot;center&quot;&gt; 1 &lt;/TD&gt; &lt;TD align=&quot;center&quot;&gt; ? &lt;/TD&gt; &lt;TD align=&quot;center&quot;&gt; 0 &lt;/TD&gt; &lt;/TR&gt;
   &lt;/TABLE&gt;

&lt;!--more--&gt;

&lt;p&gt;In practice, making an inference at &lt;code&gt;$X_1 = 0$, $X_2 = 1$&lt;/code&gt; would be pretty hopeless. The training data doesn&amp;#39;t help much, so your prediction will depend almost entirely on your priors. But that&amp;#39;s exactly why I&amp;#39;m using this example to get at what the biases are in various models. Real problems will have elements in common with this example, so it helps get a handle on how models will behave for those problems.&lt;/p&gt;

&lt;h1&gt;A Linear Model&lt;/h1&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-r&quot; data-lang=&quot;r&quot;&gt;lmFit &amp;lt;- lm(Y ~ X1 + X2, data = train)
&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;If you fit a linear model of the form &lt;code&gt;$\mathbb{E}[Y] = \beta_0 + \beta_1 X_1 + \beta_2 X_2$&lt;/code&gt;, you find&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$$\mathbb{E}[Y] = 5 + 10 X_1 + 4 X_2.$$&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This fits the training data perfectly and extrapolates to the unseen region of feature space using the assumption that effects are additive.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/interaction-or-not/unnamed-chunk-6.png&quot; alt=&quot;plot of chunk unnamed-chunk-6&quot;&gt; &lt;/p&gt;

&lt;p&gt;The line for &lt;code&gt;$X_1 = 0$&lt;/code&gt; is parallel to the one for &lt;code&gt;$X_1 = 1$&lt;/code&gt;, meaning that the influence of &lt;code&gt;$X_2$&lt;/code&gt; is the same (+4) regardless of the value of &lt;code&gt;$X_1$&lt;/code&gt;&lt;/p&gt;

&lt;h1&gt;Decision Trees (and Random Forest)&lt;/h1&gt;

&lt;p&gt;Random forests are built from decision trees using an ensembling technique called &lt;em&gt;bagging&lt;/em&gt;, which averages a number of independent decision trees. To make the trees different, different trees use different random subsets of the training data. (Additional randomness is usually introduced by allowing each tree to consider a random subset of the features at each split.)&lt;/p&gt;

&lt;p&gt;I&amp;#39;ve fit a random forest and plotted its predictions and the training data. Where there is training data, the model fits that data perfectly (making the same predictions as the linear model), but has decided that &lt;code&gt;$X_2$&lt;/code&gt; only matters when &lt;code&gt;$X_1 = 1$&lt;/code&gt;:&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-r&quot; data-lang=&quot;r&quot;&gt;rfFit &amp;lt;- randomForest(Y ~ X1 + X2, data = train, mtry=2)
&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;&lt;img src=&quot;/images/posts/interaction-or-not/unnamed-chunk-9.png&quot; alt=&quot;plot of chunk unnamed-chunk-9&quot;&gt; &lt;/p&gt;

&lt;p&gt;It&amp;#39;s easy to understand from the trees why this happened. In this simple example, all of the trees are the same, so it&amp;#39;s just as if there were one decision tree. &lt;code&gt;$X_1$&lt;/code&gt; is the most important variable, so first the tree splits on that. Then only the right side splits again on &lt;code&gt;$X_2$&lt;/code&gt; (since the left side has no training set variation in &lt;code&gt;$X_2$&lt;/code&gt;):&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/interaction-or-not-trees/tree.png&quot; alt=&quot;tree&quot;&gt;&lt;/p&gt;

&lt;p&gt;A couple important settings are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; &lt;code&gt;mtry=2&lt;/code&gt; means both variables are considered at each split. This choice makes the example clearer, but it also makes sense here because &lt;code&gt;mtry=2&lt;/code&gt; would be the parameter you choose as optimal based on the training data (e.g. through cross-validation). With the default settings, the random forest would fail to replicate even the training data (where there should be no question which predictions are correct).&lt;/li&gt;
&lt;li&gt;I&amp;#39;m using the default minimum node size (for regression problems) of 1. If the minimum node size were smaller, it would sometimes happen that a tree doesn&amp;#39;t have enough data from one region of feature space to support a split. Even with a minimum size of 1, you would (very rarely) end up working with a random subset of the rows that doesn&amp;#39;t represent one region of feature space at all.&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;Boosted Decision Trees&lt;/h1&gt;

&lt;p&gt;&lt;em&gt;Boosting&lt;/em&gt; is an ensembling technique in which each tree is built based on the residuals from the previous one. Unlike with bagging, this allows the model to add together effects that are each chosen whole controlling for the others, giving the model a bit of an additive charactaristic. &lt;/p&gt;

&lt;p&gt;It&amp;#39;s possible to represent a well-fitting model as a sum of only two depth-1 trees (this is the same as the linear model):&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/interaction-or-not-trees/two-trees.png&quot; alt=&quot;two-trees&quot;&gt;&lt;/p&gt;

&lt;p&gt;But the &lt;code&gt;gbm&lt;/code&gt; can&amp;#39;t get to this answer with only two depth-1 trees. &lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-r&quot; data-lang=&quot;r&quot;&gt;library(gbm)
gbmFit1 &amp;lt;- gbm(Y ~ X1 + X2, data = train, n.trees=2, shrinkage = 1, distribution = &amp;quot;gaussian&amp;quot;)
&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;These are (approximately) the trees we get:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/interaction-or-not-trees/two-trees-wrong.png&quot; alt=&quot;two-trees&quot;&gt;&lt;/p&gt;

&lt;!-- html table generated in R 3.1.1 by xtable 1.7-3 package --&gt;

&lt;!-- Wed Mar  4 11:12:39 2015 --&gt;

&lt;TABLE border=1&gt;
&lt;TR&gt; &lt;TH&gt; X1 &lt;/TH&gt; &lt;TH&gt; X2 &lt;/TH&gt; &lt;TH&gt; Y (mean) &lt;/TH&gt; &lt;TH&gt; N Training Rows &lt;/TH&gt; &lt;TH&gt; First Tree Predictions &lt;/TH&gt; &lt;TH&gt; First Tree Residual &lt;/TH&gt;  &lt;/TR&gt;
  &lt;TR&gt; &lt;TD align=&quot;center&quot;&gt; 0 &lt;/TD&gt; &lt;TD align=&quot;center&quot;&gt; 0 &lt;/TD&gt; &lt;TD align=&quot;center&quot;&gt; 5 &lt;/TD&gt; &lt;TD align=&quot;center&quot;&gt; 52 &lt;/TD&gt; &lt;TD align=&quot;center&quot;&gt; 5 &lt;/TD&gt; &lt;TD align=&quot;center&quot;&gt; 0 &lt;/TD&gt; &lt;/TR&gt;
  &lt;TR&gt; &lt;TD align=&quot;center&quot;&gt; 1 &lt;/TD&gt; &lt;TD align=&quot;center&quot;&gt; 0 &lt;/TD&gt; &lt;TD align=&quot;center&quot;&gt; 15 &lt;/TD&gt; &lt;TD align=&quot;center&quot;&gt; 23 &lt;/TD&gt; &lt;TD align=&quot;center&quot;&gt; 17 &lt;/TD&gt; &lt;TD align=&quot;center&quot;&gt; -2 &lt;/TD&gt; &lt;/TR&gt;
  &lt;TR&gt; &lt;TD align=&quot;center&quot;&gt; 1 &lt;/TD&gt; &lt;TD align=&quot;center&quot;&gt; 1 &lt;/TD&gt; &lt;TD align=&quot;center&quot;&gt; 19 &lt;/TD&gt; &lt;TD align=&quot;center&quot;&gt; 25 &lt;/TD&gt; &lt;TD align=&quot;center&quot;&gt; 17 &lt;/TD&gt; &lt;TD align=&quot;center&quot;&gt; 2 &lt;/TD&gt; &lt;/TR&gt;
   &lt;/TABLE&gt;

&lt;p&gt;Related to the correlation between &lt;code&gt;$X_1$&lt;/code&gt; and &lt;code&gt;$X_2$&lt;/code&gt; in the training data, the first tree (with a split on &lt;code&gt;$X_1$&lt;/code&gt;) assigns too much of the effect to &lt;code&gt;$X_1$&lt;/code&gt; (effect size of $12$ instead of $10$). Then the second tree&amp;#39;s split on &lt;code&gt;$X_2$&lt;/code&gt; is based on the residuals from the first (shown in the table above). The residuals for &lt;code&gt;$X_2=0$&lt;/code&gt; (-2 and 0, with roughly twice as much weight on the latter) average to roughly &lt;code&gt;$-\frac{2}{3}$&lt;/code&gt;, while the residual on the &lt;code&gt;$X_2=1$&lt;/code&gt; side is roughly $2$.&lt;/p&gt;

&lt;p&gt;The second tree has no way to correct the fact that too much signal went into &lt;code&gt;$X_1$&lt;/code&gt; in the first tree. We&amp;#39;ve fit the two parameters for linear model in two iterations rather than simultaneously.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/interaction-or-not/unnamed-chunk-13.png&quot; alt=&quot;plot of chunk unnamed-chunk-13&quot;&gt; &lt;/p&gt;

&lt;p&gt;Instead, boosting generally fits just a small amount of the signal at each stage, making only very small adjustments in the direction of fitting the residuals. This works much better:&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-r&quot; data-lang=&quot;r&quot;&gt;library(gbm)
gbmFit2 &amp;lt;- gbm(Y ~ X1 + X2, data = train, n.trees=10000, shrinkage = .01, distribution = &amp;quot;gaussian&amp;quot;)
&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;&lt;img src=&quot;/images/posts/interaction-or-not/unnamed-chunk-15.png&quot; alt=&quot;plot of chunk unnamed-chunk-15&quot;&gt; &lt;/p&gt;

&lt;p&gt;But this is using the default &lt;code&gt;interaction.depth=1&lt;/code&gt;, which forces the model to be linear. If &lt;code&gt;interaction.depth=2&lt;/code&gt;, the results are similar to if there were only one decision tree:&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-r&quot; data-lang=&quot;r&quot;&gt;library(gbm)
gbmFit3 &amp;lt;- gbm(Y ~ X1 + X2, data = train, n.trees=10000, shrinkage = .01, distribution = &amp;quot;gaussian&amp;quot;, interaction.depth = 2)
&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;&lt;img src=&quot;/images/posts/interaction-or-not/unnamed-chunk-17.png&quot; alt=&quot;plot of chunk unnamed-chunk-17&quot;&gt; &lt;/p&gt;

&lt;p&gt;Is it possible for &lt;code&gt;gbm&lt;/code&gt; to result in a middle ground between the linear model and the one-tree model? Yes! Two parameters we can tweak for this are: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;n.minobsinnode&lt;/code&gt; (default: $10$), the minimum number of observations for a leaf node.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;bag.fraction&lt;/code&gt; (default: $0.5$), the number of randomly selected training observations to use for each tree&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To get the second (deeper) split, there must be at least &lt;code&gt;n.minobsinnode&lt;/code&gt; in each of the smaller groups (&lt;code&gt;$X_1 = 1$, $X_2 = 0$&lt;/code&gt; or  &lt;code&gt;$X_1 = 1$, $X_2 = 1$&lt;/code&gt;). Increasing &lt;code&gt;n.minobsinnode&lt;/code&gt; decreases the number of trees that meet the threshold for a second split:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/interaction-or-not/unnamed-chunk-18.png&quot; alt=&quot;plot of chunk unnamed-chunk-18&quot;&gt; &lt;/p&gt;

&lt;p&gt;Varying &lt;code&gt;bag.fraction&lt;/code&gt; would have a similar effect.&lt;/p&gt;

&lt;h1&gt;Models with Uncertainty: Linear Regression with Interaction Term&lt;/h1&gt;

&lt;p&gt;All of the above models deliver point estimates. But really, we should admit to uncertainty about the predictions. Going back to the linear regression, we can add an interaction term to let the model consider interactions. The model is:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$$Y = \beta_0 + \beta_1 X_1 + \beta_2 X_2 + \beta_{12} X_1 X_2 + N(0,\sigma).$$&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Without an informative prior distribution, this would be too many free parameters. But I&amp;#39;ll put a prior on &lt;code&gt;$\beta_{12}$&lt;/code&gt; (pushing it toward zero). All parameters except &lt;code&gt;$\beta_{12}$&lt;/code&gt; have improper flat priors while &lt;code&gt;$$\beta_{12} \sim N(0,2).$$&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Such a simple model doesn&amp;#39;t need a flexible tool like Stan, but I like how clear and explicit a model is when you write it down in the Stan language. Stan fits Bayesian models using Markov Chain Monte Carlo (MCMC), so the output is a set of parameter samples from the posterior distribution.&lt;/p&gt;

&lt;p&gt;Here&amp;#39;s what the model looks like in Stan:&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-r&quot; data-lang=&quot;r&quot;&gt;library(rstan)

stanModel1 &amp;lt;- &amp;quot;
data {
int&amp;lt;lower=0&amp;gt; N;
vector[N] X1;
vector[N] X2;
vector[N] Y;
}
parameters {
real beta0;
real beta1;
real beta2;
real beta12;
real&amp;lt;lower=0&amp;gt; sigma;
}
model {
beta12 ~ normal(0, 2);
Y ~ normal(beta0 + beta1*X1 + beta2*X2 + beta12*X1 .* X2, sigma);
}
&amp;quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;Now instead of one prediction for each point in feature space, we have a set of posterior samples. Each line represents the predictions for one posterior sample, at either &lt;code&gt;$X_1=0$&lt;/code&gt; or &lt;code&gt;$X_1=1$&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/interaction-or-not/unnamed-chunk-21.png&quot; alt=&quot;plot of chunk unnamed-chunk-21&quot;&gt; &lt;/p&gt;

&lt;p&gt;For points like the ones seen in the training data, there is very little uncertainty. But there is a lot of uncertainty about the predicted effect of &lt;code&gt;$X_2$&lt;/code&gt; when &lt;code&gt;$X_1 = 0$&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The posterior for the interaction term &lt;code&gt;$\beta_{12}$&lt;/code&gt; is actually very close to the prior (they would be identical with infinite data or no noise in Y), which makes sense because the data don&amp;#39;t tell you anything about whether there&amp;#39;s an interaction:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/interaction-or-not/unnamed-chunk-22.png&quot; alt=&quot;plot of chunk unnamed-chunk-22&quot;&gt; &lt;/p&gt;

&lt;p&gt;Looking at histograms of posterior samples for predictions is another way to see that there&amp;#39;s basically no variation at the points where we have training data:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/interaction-or-not/unnamed-chunk-23.png&quot; alt=&quot;plot of chunk unnamed-chunk-23&quot;&gt; &lt;/p&gt;

&lt;p&gt;Looking closer at the posterior samples for &lt;code&gt;$X_1 = 0$, $X_2 = 1$&lt;/code&gt;, the predictions are centered on 9 (the prediction from our model with no interaction), but has substantial variation in both directions:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/interaction-or-not/unnamed-chunk-24.png&quot; alt=&quot;plot of chunk unnamed-chunk-24&quot;&gt; &lt;/p&gt;

&lt;p&gt;The interaction term can be positive or negative. When the interaction term &lt;code&gt;$\beta_{12}$&lt;/code&gt; is high, &lt;code&gt;$\beta_2$&lt;/code&gt; makes up for it by being low (and vice versa):&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/interaction-or-not/unnamed-chunk-25.png&quot; alt=&quot;plot of chunk unnamed-chunk-25&quot;&gt; &lt;/p&gt;

&lt;p&gt;Note that if we were to regularize the main effects as well as the interaction term, the predictions at &lt;code&gt;$X_1 = 0$, $X_2 = 1$&lt;/code&gt; would shift to the left. Imagine a prior on &lt;code&gt;$\beta_2$&lt;/code&gt; centered on $0$ as well as the prior already on &lt;code&gt;$\beta_{12}$&lt;/code&gt;. In that case, parameters choices with a negative interaction term would be penalized twice: once for the negative &lt;code&gt;$\beta_{12}$&lt;/code&gt;, and again for forcing &lt;code&gt;$\beta_2$&lt;/code&gt; higher than it otherwise had to be.&lt;/p&gt;

&lt;p&gt;In summary, the Bayesian linear regression (with an interaction term) is appropriately uncertain about predictions in the unseen region of feature space. The particular details of the posterior would depend on how you feel about main effects as compared with to interaction terms: If only the interaction term is pushed toward 0, the predictions are centered around the &amp;quot;no interaction&amp;quot; case. If main effects are pushed toward zero as well, predictions are shifted toward the &amp;quot;positive interaction&amp;quot; case.&lt;/p&gt;

&lt;h1&gt;Bayesian Additive Regression Trees (BART)&lt;/h1&gt;

&lt;p&gt;BART is a Bayesian model that&amp;#39;s fit using MCMC, so just like with the previous example, we&amp;#39;ll get samples from a posterior. The BART model consists of a sum of trees, where we have a prior distribution over the depth of the splits, the values at the leaf nodes, and so on. I don&amp;#39;t want to fully describe BART in detail here, so if you&amp;#39;re interested have a look at &lt;a href=&quot;http://cran.r-project.org/web/packages/bartMachine/vignettes/bartMachine.pdf&quot;&gt;the vignette&lt;/a&gt; for the &lt;code&gt;bartMachine&lt;/code&gt; R package.&lt;/p&gt;

&lt;p&gt;For now, the important thing about BART is that it&amp;#39;s a &lt;em&gt;sum of trees&lt;/em&gt;, where each tree is fitted in the context of the rest. In the iterative algorithm, each tree is modified one by one based on the residuals from the other trees (unlike random forests, where each tree is independent). This allows BART to better capture additive effects. If the trees all had just one split, we would &lt;em&gt;only&lt;/em&gt; capture additive effects. &lt;/p&gt;

&lt;p&gt;For example, the linear model above (with no interaction) would be the same as a model that comes from two trees, each with one split: one splitting on &lt;code&gt;$X_1$&lt;/code&gt; and the other on &lt;code&gt;$X_2$&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Trees that are deeper than one split would allow BART to introduce interactions.&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-r&quot; data-lang=&quot;r&quot;&gt;library(bartMachine)
nIterAfterBurnIn &amp;lt;- 100000
bartFit &amp;lt;- bartMachine(train[c(&amp;quot;X1&amp;quot;,&amp;quot;X2&amp;quot;)], train$Y, 
                       num_burn_in=50000, 
                       num_trees=10, 
                       num_iterations_after_burn_in=nIterAfterBurnIn)
&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;&lt;img src=&quot;/images/posts/interaction-or-not/unnamed-chunk-28.png&quot; alt=&quot;plot of chunk unnamed-chunk-28&quot;&gt; &lt;/p&gt;

&lt;p&gt;As with all of the previous examples, the model is both correct and confident in the regions where there are training examples.&lt;/p&gt;

&lt;p&gt;The predictions in the new region of feature space are similar to the situation we had with the Bayesian linear model with a prior on the interaction term. There&amp;#39;s a fair amount of uncertainty, with the posterior distribution centered near  the no-interaction case (corresponding to predictions of 9) but allowing positive or negative interactions.&lt;/p&gt;

&lt;h2&gt;Controlling BART&amp;#39;s Settings&lt;/h2&gt;

&lt;p&gt;To get a sense for how BART&amp;#39;s settings affect the inference, consider that the tree depths are controlled by the prior probability of a split occurring at any given node, which is &lt;/p&gt;

&lt;p&gt;&lt;code&gt;$$\alpha(1+d)^{-\beta}.$$&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The default settings are $\alpha=.95$ and $\beta=2$. This means that BART can allow very deep trees, but deep trees need to overcome this prior against splitting when a node is already deep and so are less common unless the data require them.&lt;/p&gt;

&lt;p&gt;In this case, $\beta$ increases, there tend to be more trees with only one split (especially since more splits aren&amp;#39;t necessary to explain the training data), leading to a posterior that&amp;#39;s more like the no-interaction situation.&lt;/p&gt;

&lt;p&gt;BART has other settings that it&amp;#39;s good to understand and control them as appropriate, but it can also be used out-of-the-box without thinking too much about those at first.&lt;/p&gt;

&lt;h1&gt;Implications for Choosing a Model&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;It helps to be aware of what tendencies your algorithms have.&lt;/strong&gt; I used a trivial example to demonstrate some tendencies of bagged decision trees (random forests) and boosted decision trees.&lt;/p&gt;

&lt;p&gt;This example demonstrates &lt;strong&gt;the limits of bootstrapping as an approach to uncertainty&lt;/strong&gt;. Bootstrapping is a way to get at how your estimates would vary under new samples of the training data. It&amp;#39;s especially convenient for bagged estimators, since &lt;a href=&quot;http://arxiv.org/abs/1311.4555&quot;&gt;if you&amp;#39;re bagging, you&amp;#39;ve already done much of the computational work for bootstrapping&lt;/a&gt;. But the random forest (and the boosted trees, depending on the parameter settings) doesn&amp;#39;t vary with new samples of the training data. This shows that your uncertainty about the truth could be very different from the variation in your model under replicated samples of the training data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When possible, use methods that explicitly capture uncertainty.&lt;/strong&gt; I demonstrated adding an interaction term (with an informative prior distribution) to the linear model, as well Bayesian Additive Regression Trees. The former exemplifies a parametric approach where you carefully think about each parameter in the model. The latter is meant to support more &amp;quot;automated&amp;quot; model-building.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Thanks to &lt;a href=&quot;https://github.com/dansbecker&quot;&gt;Dan Becker&lt;/a&gt; for pushing me to include GBMs, and to &lt;a href=&quot;http://www.naftaliharris.com/&quot;&gt;Naftali Harris&lt;/a&gt; and &lt;a href=&quot;http://blog.untrod.com/&quot;&gt;Chris Clark&lt;/a&gt; for feedback on a draft.&lt;/em&gt;&lt;/p&gt;
</content>
 </entry>
 
 
     
 <entry>
   <title>Covariance As Signed Area Of Rectangles</title>
   <link href="http://www.davidchudzicki.com/posts/covariance-as-signed-area-of-rectangles/"/>
   <updated>2014-03-26T00:00:00+00:00</updated>
   <id>http://www.davidchudzicki.com/posts/covariance-as-signed-area-of-rectangles</id>
   <content type="html">&lt;p&gt;A colleague at work recently pointed me to a wonderful &lt;a href=&quot;https://stats.stackexchange.com/questions/18058/how-would-you-explain-covariance-to-someone-who-understands-only-the-mean&quot;&gt;stats.stackexchange&lt;/a&gt; answer with an intuitive explanation of covariance: For each pair of points, draw the rectangle with these points at opposite corners. Treat the rectangle&apos;s area as signed, with the same sign as the slope of the line between the two points. If you add up all of the areas, you have the (sample) covariance, up to a constant that depends only on the data set.&lt;/p&gt;
&lt;script charset=&quot;utf-8&quot;&gt;d3=function(){function n(n){return null!=n&amp;&amp;!isNaN(n)}function t(n){return n.length}function e(n){for(var t=1;n*t%1;)t*=10;return t}function r(n,t){try{for(var e in t)Object.defineProperty(n.prototype,e,{value:t[e],enumerable:!1})}catch(r){n.prototype=t}}function u(){}function i(){}function o(n,t,e){return function(){var r=e.apply(t,arguments);return r===t?n:r}}function a(n,t){if(t in n)return t;t=t.charAt(0).toUpperCase()+t.substring(1);for(var e=0,r=la.length;r&gt;e;++e){var u=la[e]+t;if(u in n)return u}}function c(){}function s(){}function l(n){function t(){for(var t,r=e,u=-1,i=r.length;++u&lt;i;)(t=r[u].on)&amp;&amp;t.apply(this,arguments);return n}var e=[],r=new u;return t.on=function(t,u){var i,o=r.get(t);return arguments.length&lt;2?o&amp;&amp;o.on:(o&amp;&amp;(o.on=null,e=e.slice(0,i=e.indexOf(o)).concat(e.slice(i+1)),r.remove(t)),u&amp;&amp;e.push(r.set(t,{on:u})),n)},t}function f(){$o.event.preventDefault()}function h(){for(var n,t=$o.event;n=t.sourceEvent;)t=n;return t}function g(n){for(var t=new s,e=0,r=arguments.length;++e&lt;r;)t[arguments[e]]=l(t);return t.of=function(e,r){return function(u){try{var i=u.sourceEvent=$o.event;u.target=n,$o.event=u,t[u.type].apply(e,r)}finally{$o.event=i}}},t}function p(n){return ha(n,ma),n}function v(n){return&quot;function&quot;==typeof n?n:function(){return ga(n,this)}}function d(n){return&quot;function&quot;==typeof n?n:function(){return pa(n,this)}}function m(n,t){function e(){this.removeAttribute(n)}function r(){this.removeAttributeNS(n.space,n.local)}function u(){this.setAttribute(n,t)}function i(){this.setAttributeNS(n.space,n.local,t)}function o(){var e=t.apply(this,arguments);null==e?this.removeAttribute(n):this.setAttribute(n,e)}function a(){var e=t.apply(this,arguments);null==e?this.removeAttributeNS(n.space,n.local):this.setAttributeNS(n.space,n.local,e)}return n=$o.ns.qualify(n),null==t?n.local?r:e:&quot;function&quot;==typeof t?n.local?a:o:n.local?i:u}function y(n){return n.trim().replace(/\s+/g,&quot; &quot;)}function x(n){return new RegExp(&quot;(?:^|\\s+)&quot;+$o.requote(n)+&quot;(?:\\s+|$)&quot;,&quot;g&quot;)}function M(n,t){function e(){for(var e=-1;++e&lt;u;)n[e](this,t)}function r(){for(var e=-1,r=t.apply(this,arguments);++e&lt;u;)n[e](this,r)}n=n.trim().split(/\s+/).map(_);var u=n.length;return&quot;function&quot;==typeof t?r:e}function _(n){var t=x(n);return function(e,r){if(u=e.classList)return r?u.add(n):u.remove(n);var u=e.getAttribute(&quot;class&quot;)||&quot;&quot;;r?(t.lastIndex=0,t.test(u)||e.setAttribute(&quot;class&quot;,y(u+&quot; &quot;+n))):e.setAttribute(&quot;class&quot;,y(u.replace(t,&quot; &quot;)))}}function b(n,t,e){function r(){this.style.removeProperty(n)}function u(){this.style.setProperty(n,t,e)}function i(){var r=t.apply(this,arguments);null==r?this.style.removeProperty(n):this.style.setProperty(n,r,e)}return null==t?r:&quot;function&quot;==typeof t?i:u}function w(n,t){function e(){delete this[n]}function r(){this[n]=t}function u(){var e=t.apply(this,arguments);null==e?delete this[n]:this[n]=e}return null==t?e:&quot;function&quot;==typeof t?u:r}function S(n){return&quot;function&quot;==typeof n?n:(n=$o.ns.qualify(n)).local?function(){return this.ownerDocument.createElementNS(n.space,n.local)}:function(){return this.ownerDocument.createElementNS(this.namespaceURI,n)}}function k(n){return{__data__:n}}function E(n){return function(){return da(this,n)}}function A(n){return arguments.length||(n=$o.ascending),function(t,e){return t&amp;&amp;e?n(t.__data__,e.__data__):!t-!e}}function C(n,t){for(var e=0,r=n.length;r&gt;e;e++)for(var u,i=n[e],o=0,a=i.length;a&gt;o;o++)(u=i[o])&amp;&amp;t(u,o,e);return n}function N(n){return ha(n,xa),n}function L(n){var t,e;return function(r,u,i){var o,a=n[i].update,c=a.length;for(i!=e&amp;&amp;(e=i,t=0),u&gt;=t&amp;&amp;(t=u+1);!(o=a[t])&amp;&amp;++t&lt;c;);return o}}function T(){var n=this.__transition__;n&amp;&amp;++n.active}function q(n,t,e){function r(){var t=this[o];t&amp;&amp;(this.removeEventListener(n,t,t.$),delete this[o])}function u(){var u=s(t,Wo(arguments));r.call(this),this.addEventListener(n,this[o]=u,u.$=e),u._=t}function i(){var t,e=new RegExp(&quot;^__on([^.]+)&quot;+$o.requote(n)+&quot;$&quot;);for(var r in this)if(t=r.match(e)){var u=this[r];this.removeEventListener(t[1],u,u.$),delete this[r]}}var o=&quot;__on&quot;+n,a=n.indexOf(&quot;.&quot;),s=z;a&gt;0&amp;&amp;(n=n.substring(0,a));var l=_a.get(n);return l&amp;&amp;(n=l,s=R),a?t?u:r:t?c:i}function z(n,t){return function(e){var r=$o.event;$o.event=e,t[0]=this.__data__;try{n.apply(this,t)}finally{$o.event=r}}}function R(n,t){var e=z(n,t);return function(n){var t=this,r=n.relatedTarget;r&amp;&amp;(r===t||8&amp;r.compareDocumentPosition(t))||e.call(t,n)}}function D(){var n=&quot;.dragsuppress-&quot;+ ++wa,t=&quot;click&quot;+n,e=$o.select(Ko).on(&quot;touchmove&quot;+n,f).on(&quot;dragstart&quot;+n,f).on(&quot;selectstart&quot;+n,f);if(ba){var r=Go.style,u=r[ba];r[ba]=&quot;none&quot;}return function(i){function o(){e.on(t,null)}e.on(n,null),ba&amp;&amp;(r[ba]=u),i&amp;&amp;(e.on(t,function(){f(),o()},!0),setTimeout(o,0))}}function P(n,t){t.changedTouches&amp;&amp;(t=t.changedTouches[0]);var e=n.ownerSVGElement||n;if(e.createSVGPoint){var r=e.createSVGPoint();if(0&gt;Sa&amp;&amp;(Ko.scrollX||Ko.scrollY)){e=$o.select(&quot;body&quot;).append(&quot;svg&quot;).style({position:&quot;absolute&quot;,top:0,left:0,margin:0,padding:0,border:&quot;none&quot;},&quot;important&quot;);var u=e[0][0].getScreenCTM();Sa=!(u.f||u.e),e.remove()}return Sa?(r.x=t.pageX,r.y=t.pageY):(r.x=t.clientX,r.y=t.clientY),r=r.matrixTransform(n.getScreenCTM().inverse()),[r.x,r.y]}var i=n.getBoundingClientRect();return[t.clientX-i.left-n.clientLeft,t.clientY-i.top-n.clientTop]}function U(n){return n&gt;0?1:0&gt;n?-1:0}function j(n){return n&gt;1?0:-1&gt;n?ka:Math.acos(n)}function H(n){return n&gt;1?Aa:-1&gt;n?-Aa:Math.asin(n)}function F(n){return((n=Math.exp(n))-1/n)/2}function O(n){return((n=Math.exp(n))+1/n)/2}function Y(n){return((n=Math.exp(2*n))-1)/(n+1)}function I(n){return(n=Math.sin(n/2))*n}function Z(){}function V(n,t,e){return new X(n,t,e)}function X(n,t,e){this.h=n,this.s=t,this.l=e}function $(n,t,e){function r(n){return n&gt;360?n-=360:0&gt;n&amp;&amp;(n+=360),60&gt;n?i+(o-i)*n/60:180&gt;n?o:240&gt;n?i+(o-i)*(240-n)/60:i}function u(n){return Math.round(255*r(n))}var i,o;return n=isNaN(n)?0:(n%=360)&lt;0?n+360:n,t=isNaN(t)?0:0&gt;t?0:t&gt;1?1:t,e=0&gt;e?0:e&gt;1?1:e,o=.5&gt;=e?e*(1+t):e+t-e*t,i=2*e-o,ot(u(n+120),u(n),u(n-120))}function B(n,t,e){return new W(n,t,e)}function W(n,t,e){this.h=n,this.c=t,this.l=e}function J(n,t,e){return isNaN(n)&amp;&amp;(n=0),isNaN(t)&amp;&amp;(t=0),G(e,Math.cos(n*=La)*t,Math.sin(n)*t)}function G(n,t,e){return new K(n,t,e)}function K(n,t,e){this.l=n,this.a=t,this.b=e}function Q(n,t,e){var r=(n+16)/116,u=r+t/500,i=r-e/200;return u=tt(u)*Oa,r=tt(r)*Ya,i=tt(i)*Ia,ot(rt(3.2404542*u-1.5371385*r-.4985314*i),rt(-.969266*u+1.8760108*r+.041556*i),rt(.0556434*u-.2040259*r+1.0572252*i))}function nt(n,t,e){return n&gt;0?B(Math.atan2(e,t)*Ta,Math.sqrt(t*t+e*e),n):B(0/0,0/0,n)}function tt(n){return n&gt;.206893034?n*n*n:(n-4/29)/7.787037}function et(n){return n&gt;.008856?Math.pow(n,1/3):7.787037*n+4/29}function rt(n){return Math.round(255*(.00304&gt;=n?12.92*n:1.055*Math.pow(n,1/2.4)-.055))}function ut(n){return ot(n&gt;&gt;16,255&amp;n&gt;&gt;8,255&amp;n)}function it(n){return ut(n)+&quot;&quot;}function ot(n,t,e){return new at(n,t,e)}function at(n,t,e){this.r=n,this.g=t,this.b=e}function ct(n){return 16&gt;n?&quot;0&quot;+Math.max(0,n).toString(16):Math.min(255,n).toString(16)}function st(n,t,e){var r,u,i,o=0,a=0,c=0;if(r=/([a-z]+)\((.*)\)/i.exec(n))switch(u=r[2].split(&quot;,&quot;),r[1]){case&quot;hsl&quot;:return e(parseFloat(u[0]),parseFloat(u[1])/100,parseFloat(u[2])/100);case&quot;rgb&quot;:return t(gt(u[0]),gt(u[1]),gt(u[2]))}return(i=Xa.get(n))?t(i.r,i.g,i.b):(null!=n&amp;&amp;&quot;#&quot;===n.charAt(0)&amp;&amp;(4===n.length?(o=n.charAt(1),o+=o,a=n.charAt(2),a+=a,c=n.charAt(3),c+=c):7===n.length&amp;&amp;(o=n.substring(1,3),a=n.substring(3,5),c=n.substring(5,7)),o=parseInt(o,16),a=parseInt(a,16),c=parseInt(c,16)),t(o,a,c))}function lt(n,t,e){var r,u,i=Math.min(n/=255,t/=255,e/=255),o=Math.max(n,t,e),a=o-i,c=(o+i)/2;return a?(u=.5&gt;c?a/(o+i):a/(2-o-i),r=n==o?(t-e)/a+(e&gt;t?6:0):t==o?(e-n)/a+2:(n-t)/a+4,r*=60):(r=0/0,u=c&gt;0&amp;&amp;1&gt;c?0:r),V(r,u,c)}function ft(n,t,e){n=ht(n),t=ht(t),e=ht(e);var r=et((.4124564*n+.3575761*t+.1804375*e)/Oa),u=et((.2126729*n+.7151522*t+.072175*e)/Ya),i=et((.0193339*n+.119192*t+.9503041*e)/Ia);return G(116*u-16,500*(r-u),200*(u-i))}function ht(n){return(n/=255)&lt;=.04045?n/12.92:Math.pow((n+.055)/1.055,2.4)}function gt(n){var t=parseFloat(n);return&quot;%&quot;===n.charAt(n.length-1)?Math.round(2.55*t):t}function pt(n){return&quot;function&quot;==typeof n?n:function(){return n}}function vt(n){return n}function dt(n){return function(t,e,r){return 2===arguments.length&amp;&amp;&quot;function&quot;==typeof e&amp;&amp;(r=e,e=null),mt(t,e,n,r)}}function mt(n,t,e,r){function u(){var n,t=c.status;if(!t&amp;&amp;c.responseText||t&gt;=200&amp;&amp;300&gt;t||304===t){try{n=e.call(i,c)}catch(r){return o.error.call(i,r),void 0}o.load.call(i,n)}else o.error.call(i,c)}var i={},o=$o.dispatch(&quot;beforesend&quot;,&quot;progress&quot;,&quot;load&quot;,&quot;error&quot;),a={},c=new XMLHttpRequest,s=null;return!Ko.XDomainRequest||&quot;withCredentials&quot;in c||!/^(http(s)?:)?\/\//.test(n)||(c=new XDomainRequest),&quot;onload&quot;in c?c.onload=c.onerror=u:c.onreadystatechange=function(){c.readyState&gt;3&amp;&amp;u()},c.onprogress=function(n){var t=$o.event;$o.event=n;try{o.progress.call(i,c)}finally{$o.event=t}},i.header=function(n,t){return n=(n+&quot;&quot;).toLowerCase(),arguments.length&lt;2?a[n]:(null==t?delete a[n]:a[n]=t+&quot;&quot;,i)},i.mimeType=function(n){return arguments.length?(t=null==n?null:n+&quot;&quot;,i):t},i.responseType=function(n){return arguments.length?(s=n,i):s},i.response=function(n){return e=n,i},[&quot;get&quot;,&quot;post&quot;].forEach(function(n){i[n]=function(){return i.send.apply(i,[n].concat(Wo(arguments)))}}),i.send=function(e,r,u){if(2===arguments.length&amp;&amp;&quot;function&quot;==typeof r&amp;&amp;(u=r,r=null),c.open(e,n,!0),null==t||&quot;accept&quot;in a||(a.accept=t+&quot;,*/*&quot;),c.setRequestHeader)for(var l in a)c.setRequestHeader(l,a[l]);return null!=t&amp;&amp;c.overrideMimeType&amp;&amp;c.overrideMimeType(t),null!=s&amp;&amp;(c.responseType=s),null!=u&amp;&amp;i.on(&quot;error&quot;,u).on(&quot;load&quot;,function(n){u(null,n)}),o.beforesend.call(i,c),c.send(null==r?null:r),i},i.abort=function(){return c.abort(),i},$o.rebind(i,o,&quot;on&quot;),null==r?i:i.get(yt(r))}function yt(n){return 1===n.length?function(t,e){n(null==t?e:null)}:n}function xt(){var n=Mt(),t=_t()-n;t&gt;24?(isFinite(t)&amp;&amp;(clearTimeout(Ja),Ja=setTimeout(xt,t)),Wa=0):(Wa=1,Ka(xt))}function Mt(){var n=Date.now();for(Ga=$a;Ga;)n&gt;=Ga.t&amp;&amp;(Ga.f=Ga.c(n-Ga.t)),Ga=Ga.n;return n}function _t(){for(var n,t=$a,e=1/0;t;)t.f?t=n?n.n=t.n:$a=t.n:(t.t&lt;e&amp;&amp;(e=t.t),t=(n=t).n);return Ba=n,e}function bt(n,t){var e=Math.pow(10,3*aa(8-t));return{scale:t&gt;8?function(n){return n/e}:function(n){return n*e},symbol:n}}function wt(n,t){return t-(n?Math.ceil(Math.log(n)/Math.LN10):1)}function St(n){return n+&quot;&quot;}function kt(){}function Et(n,t,e){var r=e.s=n+t,u=r-n,i=r-u;e.t=n-i+(t-u)}function At(n,t){n&amp;&amp;lc.hasOwnProperty(n.type)&amp;&amp;lc[n.type](n,t)}function Ct(n,t,e){var r,u=-1,i=n.length-e;for(t.lineStart();++u&lt;i;)r=n[u],t.point(r[0],r[1],r[2]);t.lineEnd()}function Nt(n,t){var e=-1,r=n.length;for(t.polygonStart();++e&lt;r;)Ct(n[e],t,1);t.polygonEnd()}function Lt(){function n(n,t){n*=La,t=t*La/2+ka/4;var e=n-r,o=Math.cos(t),a=Math.sin(t),c=i*a,s=u*o+c*Math.cos(e),l=c*Math.sin(e);hc.add(Math.atan2(l,s)),r=n,u=o,i=a}var t,e,r,u,i;gc.point=function(o,a){gc.point=n,r=(t=o)*La,u=Math.cos(a=(e=a)*La/2+ka/4),i=Math.sin(a)},gc.lineEnd=function(){n(t,e)}}function Tt(n){var t=n[0],e=n[1],r=Math.cos(e);return[r*Math.cos(t),r*Math.sin(t),Math.sin(e)]}function qt(n,t){return n[0]*t[0]+n[1]*t[1]+n[2]*t[2]}function zt(n,t){return[n[1]*t[2]-n[2]*t[1],n[2]*t[0]-n[0]*t[2],n[0]*t[1]-n[1]*t[0]]}function Rt(n,t){n[0]+=t[0],n[1]+=t[1],n[2]+=t[2]}function Dt(n,t){return[n[0]*t,n[1]*t,n[2]*t]}function Pt(n){var t=Math.sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]);n[0]/=t,n[1]/=t,n[2]/=t}function Ut(n){return[Math.atan2(n[1],n[0]),H(n[2])]}function jt(n,t){return aa(n[0]-t[0])&lt;Ca&amp;&amp;aa(n[1]-t[1])&lt;Ca}function Ht(n,t){n*=La;var e=Math.cos(t*=La);Ft(e*Math.cos(n),e*Math.sin(n),Math.sin(t))}function Ft(n,t,e){++pc,dc+=(n-dc)/pc,mc+=(t-mc)/pc,yc+=(e-yc)/pc}function Ot(){function n(n,u){n*=La;var i=Math.cos(u*=La),o=i*Math.cos(n),a=i*Math.sin(n),c=Math.sin(u),s=Math.atan2(Math.sqrt((s=e*c-r*a)*s+(s=r*o-t*c)*s+(s=t*a-e*o)*s),t*o+e*a+r*c);vc+=s,xc+=s*(t+(t=o)),Mc+=s*(e+(e=a)),_c+=s*(r+(r=c)),Ft(t,e,r)}var t,e,r;kc.point=function(u,i){u*=La;var o=Math.cos(i*=La);t=o*Math.cos(u),e=o*Math.sin(u),r=Math.sin(i),kc.point=n,Ft(t,e,r)}}function Yt(){kc.point=Ht}function It(){function n(n,t){n*=La;var e=Math.cos(t*=La),o=e*Math.cos(n),a=e*Math.sin(n),c=Math.sin(t),s=u*c-i*a,l=i*o-r*c,f=r*a-u*o,h=Math.sqrt(s*s+l*l+f*f),g=r*o+u*a+i*c,p=h&amp;&amp;-j(g)/h,v=Math.atan2(h,g);bc+=p*s,wc+=p*l,Sc+=p*f,vc+=v,xc+=v*(r+(r=o)),Mc+=v*(u+(u=a)),_c+=v*(i+(i=c)),Ft(r,u,i)}var t,e,r,u,i;kc.point=function(o,a){t=o,e=a,kc.point=n,o*=La;var c=Math.cos(a*=La);r=c*Math.cos(o),u=c*Math.sin(o),i=Math.sin(a),Ft(r,u,i)},kc.lineEnd=function(){n(t,e),kc.lineEnd=Yt,kc.point=Ht}}function Zt(){return!0}function Vt(n,t,e,r,u){var i=[],o=[];if(n.forEach(function(n){if(!((t=n.length-1)&lt;=0)){var t,e=n[0],r=n[t];if(jt(e,r)){u.lineStart();for(var a=0;t&gt;a;++a)u.point((e=n[a])[0],e[1]);return u.lineEnd(),void 0}var c=new $t(e,n,null,!0),s=new $t(e,null,c,!1);c.o=s,i.push(c),o.push(s),c=new $t(r,n,null,!1),s=new $t(r,null,c,!0),c.o=s,i.push(c),o.push(s)}}),o.sort(t),Xt(i),Xt(o),i.length){for(var a=0,c=e,s=o.length;s&gt;a;++a)o[a].e=c=!c;for(var l,f,h=i[0];;){for(var g=h,p=!0;g.v;)if((g=g.n)===h)return;l=g.z,u.lineStart();do{if(g.v=g.o.v=!0,g.e){if(p)for(var a=0,s=l.length;s&gt;a;++a)u.point((f=l[a])[0],f[1]);else r(g.x,g.n.x,1,u);g=g.n}else{if(p){l=g.p.z;for(var a=l.length-1;a&gt;=0;--a)u.point((f=l[a])[0],f[1])}else r(g.x,g.p.x,-1,u);g=g.p}g=g.o,l=g.z,p=!p}while(!g.v);u.lineEnd()}}}function Xt(n){if(t=n.length){for(var t,e,r=0,u=n[0];++r&lt;t;)u.n=e=n[r],e.p=u,u=e;u.n=e=n[0],e.p=u}}function $t(n,t,e,r){this.x=n,this.z=t,this.o=e,this.e=r,this.v=!1,this.n=this.p=null}function Bt(n,t,e,r){return function(u,i){function o(t,e){var r=u(t,e);n(t=r[0],e=r[1])&amp;&amp;i.point(t,e)}function a(n,t){var e=u(n,t);d.point(e[0],e[1])}function c(){y.point=a,d.lineStart()}function s(){y.point=o,d.lineEnd()}function l(n,t){v.push([n,t]);var e=u(n,t);M.point(e[0],e[1])}function f(){M.lineStart(),v=[]}function h(){l(v[0][0],v[0][1]),M.lineEnd();var n,t=M.clean(),e=x.buffer(),r=e.length;if(v.pop(),p.push(v),v=null,r){if(1&amp;t){n=e[0];var u,r=n.length-1,o=-1;for(i.lineStart();++o&lt;r;)i.point((u=n[o])[0],u[1]);return i.lineEnd(),void 0}r&gt;1&amp;&amp;2&amp;t&amp;&amp;e.push(e.pop().concat(e.shift())),g.push(e.filter(Wt))}}var g,p,v,d=t(i),m=u.invert(r[0],r[1]),y={point:o,lineStart:c,lineEnd:s,polygonStart:function(){y.point=l,y.lineStart=f,y.lineEnd=h,g=[],p=[],i.polygonStart()},polygonEnd:function(){y.point=o,y.lineStart=c,y.lineEnd=s,g=$o.merge(g);var n=Kt(m,p);g.length?Vt(g,Gt,n,e,i):n&amp;&amp;(i.lineStart(),e(null,null,1,i),i.lineEnd()),i.polygonEnd(),g=p=null},sphere:function(){i.polygonStart(),i.lineStart(),e(null,null,1,i),i.lineEnd(),i.polygonEnd()}},x=Jt(),M=t(x);return y}}function Wt(n){return n.length&gt;1}function Jt(){var n,t=[];return{lineStart:function(){t.push(n=[])},point:function(t,e){n.push([t,e])},lineEnd:c,buffer:function(){var e=t;return t=[],n=null,e},rejoin:function(){t.length&gt;1&amp;&amp;t.push(t.pop().concat(t.shift()))}}}function Gt(n,t){return((n=n.x)[0]&lt;0?n[1]-Aa-Ca:Aa-n[1])-((t=t.x)[0]&lt;0?t[1]-Aa-Ca:Aa-t[1])}function Kt(n,t){var e=n[0],r=n[1],u=[Math.sin(e),-Math.cos(e),0],i=0,o=0;hc.reset();for(var a=0,c=t.length;c&gt;a;++a){var s=t[a],l=s.length;if(l)for(var f=s[0],h=f[0],g=f[1]/2+ka/4,p=Math.sin(g),v=Math.cos(g),d=1;;){d===l&amp;&amp;(d=0),n=s[d];var m=n[0],y=n[1]/2+ka/4,x=Math.sin(y),M=Math.cos(y),_=m-h,b=aa(_)&gt;ka,w=p*x;if(hc.add(Math.atan2(w*Math.sin(_),v*M+w*Math.cos(_))),i+=b?_+(_&gt;=0?Ea:-Ea):_,b^h&gt;=e^m&gt;=e){var S=zt(Tt(f),Tt(n));Pt(S);var k=zt(u,S);Pt(k);var E=(b^_&gt;=0?-1:1)*H(k[2]);(r&gt;E||r===E&amp;&amp;(S[0]||S[1]))&amp;&amp;(o+=b^_&gt;=0?1:-1)}if(!d++)break;h=m,p=x,v=M,f=n}}return(-Ca&gt;i||Ca&gt;i&amp;&amp;0&gt;hc)^1&amp;o}function Qt(n){var t,e=0/0,r=0/0,u=0/0;return{lineStart:function(){n.lineStart(),t=1},point:function(i,o){var a=i&gt;0?ka:-ka,c=aa(i-e);aa(c-ka)&lt;Ca?(n.point(e,r=(r+o)/2&gt;0?Aa:-Aa),n.point(u,r),n.lineEnd(),n.lineStart(),n.point(a,r),n.point(i,r),t=0):u!==a&amp;&amp;c&gt;=ka&amp;&amp;(aa(e-u)&lt;Ca&amp;&amp;(e-=u*Ca),aa(i-a)&lt;Ca&amp;&amp;(i-=a*Ca),r=ne(e,r,i,o),n.point(u,r),n.lineEnd(),n.lineStart(),n.point(a,r),t=0),n.point(e=i,r=o),u=a},lineEnd:function(){n.lineEnd(),e=r=0/0},clean:function(){return 2-t}}}function ne(n,t,e,r){var u,i,o=Math.sin(n-e);return aa(o)&gt;Ca?Math.atan((Math.sin(t)*(i=Math.cos(r))*Math.sin(e)-Math.sin(r)*(u=Math.cos(t))*Math.sin(n))/(u*i*o)):(t+r)/2}function te(n,t,e,r){var u;if(null==n)u=e*Aa,r.point(-ka,u),r.point(0,u),r.point(ka,u),r.point(ka,0),r.point(ka,-u),r.point(0,-u),r.point(-ka,-u),r.point(-ka,0),r.point(-ka,u);else if(aa(n[0]-t[0])&gt;Ca){var i=n[0]&lt;t[0]?ka:-ka;u=e*i/2,r.point(-i,u),r.point(0,u),r.point(i,u)}else r.point(t[0],t[1])}function ee(n){function t(n,t){return Math.cos(n)*Math.cos(t)&gt;i}function e(n){var e,i,c,s,l;return{lineStart:function(){s=c=!1,l=1},point:function(f,h){var g,p=[f,h],v=t(f,h),d=o?v?0:u(f,h):v?u(f+(0&gt;f?ka:-ka),h):0;if(!e&amp;&amp;(s=c=v)&amp;&amp;n.lineStart(),v!==c&amp;&amp;(g=r(e,p),(jt(e,g)||jt(p,g))&amp;&amp;(p[0]+=Ca,p[1]+=Ca,v=t(p[0],p[1]))),v!==c)l=0,v?(n.lineStart(),g=r(p,e),n.point(g[0],g[1])):(g=r(e,p),n.point(g[0],g[1]),n.lineEnd()),e=g;else if(a&amp;&amp;e&amp;&amp;o^v){var m;d&amp;i||!(m=r(p,e,!0))||(l=0,o?(n.lineStart(),n.point(m[0][0],m[0][1]),n.point(m[1][0],m[1][1]),n.lineEnd()):(n.point(m[1][0],m[1][1]),n.lineEnd(),n.lineStart(),n.point(m[0][0],m[0][1])))}!v||e&amp;&amp;jt(e,p)||n.point(p[0],p[1]),e=p,c=v,i=d},lineEnd:function(){c&amp;&amp;n.lineEnd(),e=null},clean:function(){return l|(s&amp;&amp;c)&lt;&lt;1}}}function r(n,t,e){var r=Tt(n),u=Tt(t),o=[1,0,0],a=zt(r,u),c=qt(a,a),s=a[0],l=c-s*s;if(!l)return!e&amp;&amp;n;var f=i*c/l,h=-i*s/l,g=zt(o,a),p=Dt(o,f),v=Dt(a,h);Rt(p,v);var d=g,m=qt(p,d),y=qt(d,d),x=m*m-y*(qt(p,p)-1);if(!(0&gt;x)){var M=Math.sqrt(x),_=Dt(d,(-m-M)/y);if(Rt(_,p),_=Ut(_),!e)return _;var b,w=n[0],S=t[0],k=n[1],E=t[1];w&gt;S&amp;&amp;(b=w,w=S,S=b);var A=S-w,C=aa(A-ka)&lt;Ca,N=C||Ca&gt;A;if(!C&amp;&amp;k&gt;E&amp;&amp;(b=k,k=E,E=b),N?C?k+E&gt;0^_[1]&lt;(aa(_[0]-w)&lt;Ca?k:E):k&lt;=_[1]&amp;&amp;_[1]&lt;=E:A&gt;ka^(w&lt;=_[0]&amp;&amp;_[0]&lt;=S)){var L=Dt(d,(-m+M)/y);return Rt(L,p),[_,Ut(L)]}}}function u(t,e){var r=o?n:ka-n,u=0;return-r&gt;t?u|=1:t&gt;r&amp;&amp;(u|=2),-r&gt;e?u|=4:e&gt;r&amp;&amp;(u|=8),u}var i=Math.cos(n),o=i&gt;0,a=aa(i)&gt;Ca,c=Le(n,6*La);return Bt(t,e,c,o?[0,-n]:[-ka,n-ka])}function re(n,t,e,r){return function(u){var i,o=u.a,a=u.b,c=o.x,s=o.y,l=a.x,f=a.y,h=0,g=1,p=l-c,v=f-s;if(i=n-c,p||!(i&gt;0)){if(i/=p,0&gt;p){if(h&gt;i)return;g&gt;i&amp;&amp;(g=i)}else if(p&gt;0){if(i&gt;g)return;i&gt;h&amp;&amp;(h=i)}if(i=e-c,p||!(0&gt;i)){if(i/=p,0&gt;p){if(i&gt;g)return;i&gt;h&amp;&amp;(h=i)}else if(p&gt;0){if(h&gt;i)return;g&gt;i&amp;&amp;(g=i)}if(i=t-s,v||!(i&gt;0)){if(i/=v,0&gt;v){if(h&gt;i)return;g&gt;i&amp;&amp;(g=i)}else if(v&gt;0){if(i&gt;g)return;i&gt;h&amp;&amp;(h=i)}if(i=r-s,v||!(0&gt;i)){if(i/=v,0&gt;v){if(i&gt;g)return;i&gt;h&amp;&amp;(h=i)}else if(v&gt;0){if(h&gt;i)return;g&gt;i&amp;&amp;(g=i)}return h&gt;0&amp;&amp;(u.a={x:c+h*p,y:s+h*v}),1&gt;g&amp;&amp;(u.b={x:c+g*p,y:s+g*v}),u}}}}}}function ue(n,t,e,r){function u(r,u){return aa(r[0]-n)&lt;Ca?u&gt;0?0:3:aa(r[0]-e)&lt;Ca?u&gt;0?2:1:aa(r[1]-t)&lt;Ca?u&gt;0?1:0:u&gt;0?3:2}function i(n,t){return o(n.x,t.x)}function o(n,t){var e=u(n,1),r=u(t,1);return e!==r?e-r:0===e?t[1]-n[1]:1===e?n[0]-t[0]:2===e?n[1]-t[1]:t[0]-n[0]}return function(a){function c(n){for(var t=0,e=m.length,r=n[1],u=0;e&gt;u;++u)for(var i,o=1,a=m[u],c=a.length,l=a[0];c&gt;o;++o)i=a[o],l[1]&lt;=r?i[1]&gt;r&amp;&amp;s(l,i,n)&gt;0&amp;&amp;++t:i[1]&lt;=r&amp;&amp;s(l,i,n)&lt;0&amp;&amp;--t,l=i;return 0!==t}function s(n,t,e){return(t[0]-n[0])*(e[1]-n[1])-(e[0]-n[0])*(t[1]-n[1])}function l(i,a,c,s){var l=0,f=0;if(null==i||(l=u(i,c))!==(f=u(a,c))||o(i,a)&lt;0^c&gt;0){do s.point(0===l||3===l?n:e,l&gt;1?r:t);while((l=(l+c+4)%4)!==f)}else s.point(a[0],a[1])}function f(u,i){return u&gt;=n&amp;&amp;e&gt;=u&amp;&amp;i&gt;=t&amp;&amp;r&gt;=i}function h(n,t){f(n,t)&amp;&amp;a.point(n,t)}function g(){L.point=v,m&amp;&amp;m.push(y=[]),k=!0,S=!1,b=w=0/0}function p(){d&amp;&amp;(v(x,M),_&amp;&amp;S&amp;&amp;C.rejoin(),d.push(C.buffer())),L.point=h,S&amp;&amp;a.lineEnd()}function v(n,t){n=Math.max(-Ac,Math.min(Ac,n)),t=Math.max(-Ac,Math.min(Ac,t));var e=f(n,t);if(m&amp;&amp;y.push([n,t]),k)x=n,M=t,_=e,k=!1,e&amp;&amp;(a.lineStart(),a.point(n,t));else if(e&amp;&amp;S)a.point(n,t);else{var r={a:{x:b,y:w},b:{x:n,y:t}};N(r)?(S||(a.lineStart(),a.point(r.a.x,r.a.y)),a.point(r.b.x,r.b.y),e||a.lineEnd(),E=!1):e&amp;&amp;(a.lineStart(),a.point(n,t),E=!1)}b=n,w=t,S=e}var d,m,y,x,M,_,b,w,S,k,E,A=a,C=Jt(),N=re(n,t,e,r),L={point:h,lineStart:g,lineEnd:p,polygonStart:function(){a=C,d=[],m=[],E=!0},polygonEnd:function(){a=A,d=$o.merge(d);var t=c([n,r]),e=E&amp;&amp;t,u=d.length;(e||u)&amp;&amp;(a.polygonStart(),e&amp;&amp;(a.lineStart(),l(null,null,1,a),a.lineEnd()),u&amp;&amp;Vt(d,i,t,l,a),a.polygonEnd()),d=m=y=null}};return L}}function ie(n,t){function e(e,r){return e=n(e,r),t(e[0],e[1])}return n.invert&amp;&amp;t.invert&amp;&amp;(e.invert=function(e,r){return e=t.invert(e,r),e&amp;&amp;n.invert(e[0],e[1])}),e}function oe(n){var t=0,e=ka/3,r=be(n),u=r(t,e);return u.parallels=function(n){return arguments.length?r(t=n[0]*ka/180,e=n[1]*ka/180):[180*(t/ka),180*(e/ka)]},u}function ae(n,t){function e(n,t){var e=Math.sqrt(i-2*u*Math.sin(t))/u;return[e*Math.sin(n*=u),o-e*Math.cos(n)]}var r=Math.sin(n),u=(r+Math.sin(t))/2,i=1+r*(2*u-r),o=Math.sqrt(i)/u;return e.invert=function(n,t){var e=o-t;return[Math.atan2(n,e)/u,H((i-(n*n+e*e)*u*u)/(2*u))]},e}function ce(){function n(n,t){Nc+=u*n-r*t,r=n,u=t}var t,e,r,u;Rc.point=function(i,o){Rc.point=n,t=r=i,e=u=o},Rc.lineEnd=function(){n(t,e)}}function se(n,t){Lc&gt;n&amp;&amp;(Lc=n),n&gt;qc&amp;&amp;(qc=n),Tc&gt;t&amp;&amp;(Tc=t),t&gt;zc&amp;&amp;(zc=t)}function le(){function n(n,t){o.push(&quot;M&quot;,n,&quot;,&quot;,t,i)}function t(n,t){o.push(&quot;M&quot;,n,&quot;,&quot;,t),a.point=e}function e(n,t){o.push(&quot;L&quot;,n,&quot;,&quot;,t)}function r(){a.point=n}function u(){o.push(&quot;Z&quot;)}var i=fe(4.5),o=[],a={point:n,lineStart:function(){a.point=t},lineEnd:r,polygonStart:function(){a.lineEnd=u},polygonEnd:function(){a.lineEnd=r,a.point=n},pointRadius:function(n){return i=fe(n),a},result:function(){if(o.length){var n=o.join(&quot;&quot;);return o=[],n}}};return a}function fe(n){return&quot;m0,&quot;+n+&quot;a&quot;+n+&quot;,&quot;+n+&quot; 0 1,1 0,&quot;+-2*n+&quot;a&quot;+n+&quot;,&quot;+n+&quot; 0 1,1 0,&quot;+2*n+&quot;z&quot;}function he(n,t){dc+=n,mc+=t,++yc}function ge(){function n(n,r){var u=n-t,i=r-e,o=Math.sqrt(u*u+i*i);xc+=o*(t+n)/2,Mc+=o*(e+r)/2,_c+=o,he(t=n,e=r)}var t,e;Pc.point=function(r,u){Pc.point=n,he(t=r,e=u)}}function pe(){Pc.point=he}function ve(){function n(n,t){var e=n-r,i=t-u,o=Math.sqrt(e*e+i*i);xc+=o*(r+n)/2,Mc+=o*(u+t)/2,_c+=o,o=u*n-r*t,bc+=o*(r+n),wc+=o*(u+t),Sc+=3*o,he(r=n,u=t)}var t,e,r,u;Pc.point=function(i,o){Pc.point=n,he(t=r=i,e=u=o)},Pc.lineEnd=function(){n(t,e)}}function de(n){function t(t,e){n.moveTo(t,e),n.arc(t,e,o,0,Ea)}function e(t,e){n.moveTo(t,e),a.point=r}function r(t,e){n.lineTo(t,e)}function u(){a.point=t}function i(){n.closePath()}var o=4.5,a={point:t,lineStart:function(){a.point=e},lineEnd:u,polygonStart:function(){a.lineEnd=i},polygonEnd:function(){a.lineEnd=u,a.point=t},pointRadius:function(n){return o=n,a},result:c};return a}function me(n){function t(n){return(a?r:e)(n)}function e(t){return Me(t,function(e,r){e=n(e,r),t.point(e[0],e[1])})}function r(t){function e(e,r){e=n(e,r),t.point(e[0],e[1])}function r(){x=0/0,S.point=i,t.lineStart()}function i(e,r){var i=Tt([e,r]),o=n(e,r);u(x,M,y,_,b,w,x=o[0],M=o[1],y=e,_=i[0],b=i[1],w=i[2],a,t),t.point(x,M)}function o(){S.point=e,t.lineEnd()}function c(){r(),S.point=s,S.lineEnd=l}function s(n,t){i(f=n,h=t),g=x,p=M,v=_,d=b,m=w,S.point=i}function l(){u(x,M,y,_,b,w,g,p,f,v,d,m,a,t),S.lineEnd=o,o()}var f,h,g,p,v,d,m,y,x,M,_,b,w,S={point:e,lineStart:r,lineEnd:o,polygonStart:function(){t.polygonStart(),S.lineStart=c},polygonEnd:function(){t.polygonEnd(),S.lineStart=r}};return S}function u(t,e,r,a,c,s,l,f,h,g,p,v,d,m){var y=l-t,x=f-e,M=y*y+x*x;if(M&gt;4*i&amp;&amp;d--){var _=a+g,b=c+p,w=s+v,S=Math.sqrt(_*_+b*b+w*w),k=Math.asin(w/=S),E=aa(aa(w)-1)&lt;Ca||aa(r-h)&lt;Ca?(r+h)/2:Math.atan2(b,_),A=n(E,k),C=A[0],N=A[1],L=C-t,T=N-e,q=x*L-y*T;(q*q/M&gt;i||aa((y*L+x*T)/M-.5)&gt;.3||o&gt;a*g+c*p+s*v)&amp;&amp;(u(t,e,r,a,c,s,C,N,E,_/=S,b/=S,w,d,m),m.point(C,N),u(C,N,E,_,b,w,l,f,h,g,p,v,d,m))}}var i=.5,o=Math.cos(30*La),a=16;return t.precision=function(n){return arguments.length?(a=(i=n*n)&gt;0&amp;&amp;16,t):Math.sqrt(i)},t}function ye(n){var t=me(function(t,e){return n([t*Ta,e*Ta])});return function(n){return we(t(n))}}function xe(n){this.stream=n}function Me(n,t){return{point:t,sphere:function(){n.sphere()},lineStart:function(){n.lineStart()},lineEnd:function(){n.lineEnd()},polygonStart:function(){n.polygonStart()},polygonEnd:function(){n.polygonEnd()}}}function _e(n){return be(function(){return n})()}function be(n){function t(n){return n=a(n[0]*La,n[1]*La),[n[0]*h+c,s-n[1]*h]}function e(n){return n=a.invert((n[0]-c)/h,(s-n[1])/h),n&amp;&amp;[n[0]*Ta,n[1]*Ta]}function r(){a=ie(o=Ee(m,y,x),i);var n=i(v,d);return c=g-n[0]*h,s=p+n[1]*h,u()}function u(){return l&amp;&amp;(l.valid=!1,l=null),t}var i,o,a,c,s,l,f=me(function(n,t){return n=i(n,t),[n[0]*h+c,s-n[1]*h]}),h=150,g=480,p=250,v=0,d=0,m=0,y=0,x=0,M=Ec,_=vt,b=null,w=null;return t.stream=function(n){return l&amp;&amp;(l.valid=!1),l=we(M(o,f(_(n)))),l.valid=!0,l},t.clipAngle=function(n){return arguments.length?(M=null==n?(b=n,Ec):ee((b=+n)*La),u()):b},t.clipExtent=function(n){return arguments.length?(w=n,_=n?ue(n[0][0],n[0][1],n[1][0],n[1][1]):vt,u()):w},t.scale=function(n){return arguments.length?(h=+n,r()):h},t.translate=function(n){return arguments.length?(g=+n[0],p=+n[1],r()):[g,p]},t.center=function(n){return arguments.length?(v=n[0]%360*La,d=n[1]%360*La,r()):[v*Ta,d*Ta]},t.rotate=function(n){return arguments.length?(m=n[0]%360*La,y=n[1]%360*La,x=n.length&gt;2?n[2]%360*La:0,r()):[m*Ta,y*Ta,x*Ta]},$o.rebind(t,f,&quot;precision&quot;),function(){return i=n.apply(this,arguments),t.invert=i.invert&amp;&amp;e,r()}}function we(n){return Me(n,function(t,e){n.point(t*La,e*La)})}function Se(n,t){return[n,t]}function ke(n,t){return[n&gt;ka?n-Ea:-ka&gt;n?n+Ea:n,t]}function Ee(n,t,e){return n?t||e?ie(Ce(n),Ne(t,e)):Ce(n):t||e?Ne(t,e):ke}function Ae(n){return function(t,e){return t+=n,[t&gt;ka?t-Ea:-ka&gt;t?t+Ea:t,e]}}function Ce(n){var t=Ae(n);return t.invert=Ae(-n),t}function Ne(n,t){function e(n,t){var e=Math.cos(t),a=Math.cos(n)*e,c=Math.sin(n)*e,s=Math.sin(t),l=s*r+a*u;return[Math.atan2(c*i-l*o,a*r-s*u),H(l*i+c*o)]}var r=Math.cos(n),u=Math.sin(n),i=Math.cos(t),o=Math.sin(t);return e.invert=function(n,t){var e=Math.cos(t),a=Math.cos(n)*e,c=Math.sin(n)*e,s=Math.sin(t),l=s*i-c*o;return[Math.atan2(c*i+s*o,a*r+l*u),H(l*r-a*u)]},e}function Le(n,t){var e=Math.cos(n),r=Math.sin(n);return function(u,i,o,a){var c=o*t;null!=u?(u=Te(e,u),i=Te(e,i),(o&gt;0?i&gt;u:u&gt;i)&amp;&amp;(u+=o*Ea)):(u=n+o*Ea,i=n-.5*c);for(var s,l=u;o&gt;0?l&gt;i:i&gt;l;l-=c)a.point((s=Ut([e,-r*Math.cos(l),-r*Math.sin(l)]))[0],s[1])}}function Te(n,t){var e=Tt(t);e[0]-=n,Pt(e);var r=j(-e[1]);return((-e[2]&lt;0?-r:r)+2*Math.PI-Ca)%(2*Math.PI)}function qe(n,t,e){var r=$o.range(n,t-Ca,e).concat(t);return function(n){return r.map(function(t){return[n,t]})}}function ze(n,t,e){var r=$o.range(n,t-Ca,e).concat(t);return function(n){return r.map(function(t){return[t,n]})}}function Re(n){return n.source}function De(n){return n.target}function Pe(n,t,e,r){var u=Math.cos(t),i=Math.sin(t),o=Math.cos(r),a=Math.sin(r),c=u*Math.cos(n),s=u*Math.sin(n),l=o*Math.cos(e),f=o*Math.sin(e),h=2*Math.asin(Math.sqrt(I(r-t)+u*o*I(e-n))),g=1/Math.sin(h),p=h?function(n){var t=Math.sin(n*=h)*g,e=Math.sin(h-n)*g,r=e*c+t*l,u=e*s+t*f,o=e*i+t*a;return[Math.atan2(u,r)*Ta,Math.atan2(o,Math.sqrt(r*r+u*u))*Ta]}:function(){return[n*Ta,t*Ta]};return p.distance=h,p}function Ue(){function n(n,u){var i=Math.sin(u*=La),o=Math.cos(u),a=aa((n*=La)-t),c=Math.cos(a);Uc+=Math.atan2(Math.sqrt((a=o*Math.sin(a))*a+(a=r*i-e*o*c)*a),e*i+r*o*c),t=n,e=i,r=o}var t,e,r;jc.point=function(u,i){t=u*La,e=Math.sin(i*=La),r=Math.cos(i),jc.point=n},jc.lineEnd=function(){jc.point=jc.lineEnd=c}}function je(n,t){function e(t,e){var r=Math.cos(t),u=Math.cos(e),i=n(r*u);return[i*u*Math.sin(t),i*Math.sin(e)]}return e.invert=function(n,e){var r=Math.sqrt(n*n+e*e),u=t(r),i=Math.sin(u),o=Math.cos(u);return[Math.atan2(n*i,r*o),Math.asin(r&amp;&amp;e*i/r)]},e}function He(n,t){function e(n,t){var e=aa(aa(t)-Aa)&lt;Ca?0:o/Math.pow(u(t),i);return[e*Math.sin(i*n),o-e*Math.cos(i*n)]}var r=Math.cos(n),u=function(n){return Math.tan(ka/4+n/2)},i=n===t?Math.sin(n):Math.log(r/Math.cos(t))/Math.log(u(t)/u(n)),o=r*Math.pow(u(n),i)/i;return i?(e.invert=function(n,t){var e=o-t,r=U(i)*Math.sqrt(n*n+e*e);return[Math.atan2(n,e)/i,2*Math.atan(Math.pow(o/r,1/i))-Aa]},e):Oe}function Fe(n,t){function e(n,t){var e=i-t;return[e*Math.sin(u*n),i-e*Math.cos(u*n)]}var r=Math.cos(n),u=n===t?Math.sin(n):(r-Math.cos(t))/(t-n),i=r/u+n;return aa(u)&lt;Ca?Se:(e.invert=function(n,t){var e=i-t;return[Math.atan2(n,e)/u,i-U(u)*Math.sqrt(n*n+e*e)]},e)}function Oe(n,t){return[n,Math.log(Math.tan(ka/4+t/2))]}function Ye(n){var t,e=_e(n),r=e.scale,u=e.translate,i=e.clipExtent;return e.scale=function(){var n=r.apply(e,arguments);return n===e?t?e.clipExtent(null):e:n},e.translate=function(){var n=u.apply(e,arguments);return n===e?t?e.clipExtent(null):e:n},e.clipExtent=function(n){var o=i.apply(e,arguments);if(o===e){if(t=null==n){var a=ka*r(),c=u();i([[c[0]-a,c[1]-a],[c[0]+a,c[1]+a]])}}else t&amp;&amp;(o=null);return o},e.clipExtent(null)}function Ie(n,t){var e=Math.cos(t)*Math.sin(n);return[Math.log((1+e)/(1-e))/2,Math.atan2(Math.tan(t),Math.cos(n))]}function Ze(n){return n[0]}function Ve(n){return n[1]}function Xe(n,t,e,r){var u,i,o,a,c,s,l;return u=r[n],i=u[0],o=u[1],u=r[t],a=u[0],c=u[1],u=r[e],s=u[0],l=u[1],(l-o)*(a-i)-(c-o)*(s-i)&gt;0}function $e(n,t,e){return(e[0]-t[0])*(n[1]-t[1])&lt;(e[1]-t[1])*(n[0]-t[0])}function Be(n,t,e,r){var u=n[0],i=e[0],o=t[0]-u,a=r[0]-i,c=n[1],s=e[1],l=t[1]-c,f=r[1]-s,h=(a*(c-s)-f*(u-i))/(f*o-a*l);return[u+h*o,c+h*l]}function We(n){var t=n[0],e=n[n.length-1];return!(t[0]-e[0]||t[1]-e[1])}function Je(){mr(this),this.edge=this.site=this.circle=null}function Ge(n){var t=Jc.pop()||new Je;return t.site=n,t}function Ke(n){cr(n),$c.remove(n),Jc.push(n),mr(n)}function Qe(n){var t=n.circle,e=t.x,r=t.cy,u={x:e,y:r},i=n.P,o=n.N,a=[n];Ke(n);for(var c=i;c.circle&amp;&amp;aa(e-c.circle.x)&lt;Ca&amp;&amp;aa(r-c.circle.cy)&lt;Ca;)i=c.P,a.unshift(c),Ke(c),c=i;a.unshift(c),cr(c);for(var s=o;s.circle&amp;&amp;aa(e-s.circle.x)&lt;Ca&amp;&amp;aa(r-s.circle.cy)&lt;Ca;)o=s.N,a.push(s),Ke(s),s=o;a.push(s),cr(s);var l,f=a.length;for(l=1;f&gt;l;++l)s=a[l],c=a[l-1],pr(s.edge,c.site,s.site,u);c=a[0],s=a[f-1],s.edge=hr(c.site,s.site,null,u),ar(c),ar(s)}function nr(n){for(var t,e,r,u,i=n.x,o=n.y,a=$c._;a;)if(r=tr(a,o)-i,r&gt;Ca)a=a.L;else{if(u=i-er(a,o),!(u&gt;Ca)){r&gt;-Ca?(t=a.P,e=a):u&gt;-Ca?(t=a,e=a.N):t=e=a;break}if(!a.R){t=a;break}a=a.R}var c=Ge(n);if($c.insert(t,c),t||e){if(t===e)return cr(t),e=Ge(t.site),$c.insert(c,e),c.edge=e.edge=hr(t.site,c.site),ar(t),ar(e),void 0;if(!e)return c.edge=hr(t.site,c.site),void 0;cr(t),cr(e);var s=t.site,l=s.x,f=s.y,h=n.x-l,g=n.y-f,p=e.site,v=p.x-l,d=p.y-f,m=2*(h*d-g*v),y=h*h+g*g,x=v*v+d*d,M={x:(d*y-g*x)/m+l,y:(h*x-v*y)/m+f};pr(e.edge,s,p,M),c.edge=hr(s,n,null,M),e.edge=hr(n,p,null,M),ar(t),ar(e)}}function tr(n,t){var e=n.site,r=e.x,u=e.y,i=u-t;if(!i)return r;var o=n.P;if(!o)return-1/0;e=o.site;var a=e.x,c=e.y,s=c-t;if(!s)return a;var l=a-r,f=1/i-1/s,h=l/s;return f?(-h+Math.sqrt(h*h-2*f*(l*l/(-2*s)-c+s/2+u-i/2)))/f+r:(r+a)/2}function er(n,t){var e=n.N;if(e)return tr(e,t);var r=n.site;return r.y===t?r.x:1/0}function rr(n){this.site=n,this.edges=[]}function ur(n){for(var t,e,r,u,i,o,a,c,s,l,f=n[0][0],h=n[1][0],g=n[0][1],p=n[1][1],v=Xc,d=v.length;d--;)if(i=v[d],i&amp;&amp;i.prepare())for(a=i.edges,c=a.length,o=0;c&gt;o;)l=a[o].end(),r=l.x,u=l.y,s=a[++o%c].start(),t=s.x,e=s.y,(aa(r-t)&gt;Ca||aa(u-e)&gt;Ca)&amp;&amp;(a.splice(o,0,new vr(gr(i.site,l,aa(r-f)&lt;Ca&amp;&amp;p-u&gt;Ca?{x:f,y:aa(t-f)&lt;Ca?e:p}:aa(u-p)&lt;Ca&amp;&amp;h-r&gt;Ca?{x:aa(e-p)&lt;Ca?t:h,y:p}:aa(r-h)&lt;Ca&amp;&amp;u-g&gt;Ca?{x:h,y:aa(t-h)&lt;Ca?e:g}:aa(u-g)&lt;Ca&amp;&amp;r-f&gt;Ca?{x:aa(e-g)&lt;Ca?t:f,y:g}:null),i.site,null)),++c)}function ir(n,t){return t.angle-n.angle}function or(){mr(this),this.x=this.y=this.arc=this.site=this.cy=null}function ar(n){var t=n.P,e=n.N;if(t&amp;&amp;e){var r=t.site,u=n.site,i=e.site;if(r!==i){var o=u.x,a=u.y,c=r.x-o,s=r.y-a,l=i.x-o,f=i.y-a,h=2*(c*f-s*l);if(!(h&gt;=-Na)){var g=c*c+s*s,p=l*l+f*f,v=(f*g-s*p)/h,d=(c*p-l*g)/h,f=d+a,m=Gc.pop()||new or;m.arc=n,m.site=u,m.x=v+o,m.y=f+Math.sqrt(v*v+d*d),m.cy=f,n.circle=m;for(var y=null,x=Wc._;x;)if(m.y&lt;x.y||m.y===x.y&amp;&amp;m.x&lt;=x.x){if(!x.L){y=x.P;break}x=x.L}else{if(!x.R){y=x;break}x=x.R}Wc.insert(y,m),y||(Bc=m)}}}}function cr(n){var t=n.circle;t&amp;&amp;(t.P||(Bc=t.N),Wc.remove(t),Gc.push(t),mr(t),n.circle=null)}function sr(n){for(var t,e=Vc,r=re(n[0][0],n[0][1],n[1][0],n[1][1]),u=e.length;u--;)t=e[u],(!lr(t,n)||!r(t)||aa(t.a.x-t.b.x)&lt;Ca&amp;&amp;aa(t.a.y-t.b.y)&lt;Ca)&amp;&amp;(t.a=t.b=null,e.splice(u,1))}function lr(n,t){var e=n.b;if(e)return!0;var r,u,i=n.a,o=t[0][0],a=t[1][0],c=t[0][1],s=t[1][1],l=n.l,f=n.r,h=l.x,g=l.y,p=f.x,v=f.y,d=(h+p)/2,m=(g+v)/2;
if(v===g){if(o&gt;d||d&gt;=a)return;if(h&gt;p){if(i){if(i.y&gt;=s)return}else i={x:d,y:c};e={x:d,y:s}}else{if(i){if(i.y&lt;c)return}else i={x:d,y:s};e={x:d,y:c}}}else if(r=(h-p)/(v-g),u=m-r*d,-1&gt;r||r&gt;1)if(h&gt;p){if(i){if(i.y&gt;=s)return}else i={x:(c-u)/r,y:c};e={x:(s-u)/r,y:s}}else{if(i){if(i.y&lt;c)return}else i={x:(s-u)/r,y:s};e={x:(c-u)/r,y:c}}else if(v&gt;g){if(i){if(i.x&gt;=a)return}else i={x:o,y:r*o+u};e={x:a,y:r*a+u}}else{if(i){if(i.x&lt;o)return}else i={x:a,y:r*a+u};e={x:o,y:r*o+u}}return n.a=i,n.b=e,!0}function fr(n,t){this.l=n,this.r=t,this.a=this.b=null}function hr(n,t,e,r){var u=new fr(n,t);return Vc.push(u),e&amp;&amp;pr(u,n,t,e),r&amp;&amp;pr(u,t,n,r),Xc[n.i].edges.push(new vr(u,n,t)),Xc[t.i].edges.push(new vr(u,t,n)),u}function gr(n,t,e){var r=new fr(n,null);return r.a=t,r.b=e,Vc.push(r),r}function pr(n,t,e,r){n.a||n.b?n.l===e?n.b=r:n.a=r:(n.a=r,n.l=t,n.r=e)}function vr(n,t,e){var r=n.a,u=n.b;this.edge=n,this.site=t,this.angle=e?Math.atan2(e.y-t.y,e.x-t.x):n.l===t?Math.atan2(u.x-r.x,r.y-u.y):Math.atan2(r.x-u.x,u.y-r.y)}function dr(){this._=null}function mr(n){n.U=n.C=n.L=n.R=n.P=n.N=null}function yr(n,t){var e=t,r=t.R,u=e.U;u?u.L===e?u.L=r:u.R=r:n._=r,r.U=u,e.U=r,e.R=r.L,e.R&amp;&amp;(e.R.U=e),r.L=e}function xr(n,t){var e=t,r=t.L,u=e.U;u?u.L===e?u.L=r:u.R=r:n._=r,r.U=u,e.U=r,e.L=r.R,e.L&amp;&amp;(e.L.U=e),r.R=e}function Mr(n){for(;n.L;)n=n.L;return n}function _r(n,t){var e,r,u,i=n.sort(br).pop();for(Vc=[],Xc=new Array(n.length),$c=new dr,Wc=new dr;;)if(u=Bc,i&amp;&amp;(!u||i.y&lt;u.y||i.y===u.y&amp;&amp;i.x&lt;u.x))(i.x!==e||i.y!==r)&amp;&amp;(Xc[i.i]=new rr(i),nr(i),e=i.x,r=i.y),i=n.pop();else{if(!u)break;Qe(u.arc)}t&amp;&amp;(sr(t),ur(t));var o={cells:Xc,edges:Vc};return $c=Wc=Vc=Xc=null,o}function br(n,t){return t.y-n.y||t.x-n.x}function wr(n,t,e){return(n.x-e.x)*(t.y-n.y)-(n.x-t.x)*(e.y-n.y)}function Sr(n){return n.x}function kr(n){return n.y}function Er(){return{leaf:!0,nodes:[],point:null,x:null,y:null}}function Ar(n,t,e,r,u,i){if(!n(t,e,r,u,i)){var o=.5*(e+u),a=.5*(r+i),c=t.nodes;c[0]&amp;&amp;Ar(n,c[0],e,r,o,a),c[1]&amp;&amp;Ar(n,c[1],o,r,u,a),c[2]&amp;&amp;Ar(n,c[2],e,a,o,i),c[3]&amp;&amp;Ar(n,c[3],o,a,u,i)}}function Cr(n,t){n=$o.rgb(n),t=$o.rgb(t);var e=n.r,r=n.g,u=n.b,i=t.r-e,o=t.g-r,a=t.b-u;return function(n){return&quot;#&quot;+ct(Math.round(e+i*n))+ct(Math.round(r+o*n))+ct(Math.round(u+a*n))}}function Nr(n,t){var e,r={},u={};for(e in n)e in t?r[e]=qr(n[e],t[e]):u[e]=n[e];for(e in t)e in n||(u[e]=t[e]);return function(n){for(e in r)u[e]=r[e](n);return u}}function Lr(n,t){return t-=n=+n,function(e){return n+t*e}}function Tr(n,t){var e,r,u,i,o,a=0,c=0,s=[],l=[];for(n+=&quot;&quot;,t+=&quot;&quot;,Qc.lastIndex=0,r=0;e=Qc.exec(t);++r)e.index&amp;&amp;s.push(t.substring(a,c=e.index)),l.push({i:s.length,x:e[0]}),s.push(null),a=Qc.lastIndex;for(a&lt;t.length&amp;&amp;s.push(t.substring(a)),r=0,i=l.length;(e=Qc.exec(n))&amp;&amp;i&gt;r;++r)if(o=l[r],o.x==e[0]){if(o.i)if(null==s[o.i+1])for(s[o.i-1]+=o.x,s.splice(o.i,1),u=r+1;i&gt;u;++u)l[u].i--;else for(s[o.i-1]+=o.x+s[o.i+1],s.splice(o.i,2),u=r+1;i&gt;u;++u)l[u].i-=2;else if(null==s[o.i+1])s[o.i]=o.x;else for(s[o.i]=o.x+s[o.i+1],s.splice(o.i+1,1),u=r+1;i&gt;u;++u)l[u].i--;l.splice(r,1),i--,r--}else o.x=Lr(parseFloat(e[0]),parseFloat(o.x));for(;i&gt;r;)o=l.pop(),null==s[o.i+1]?s[o.i]=o.x:(s[o.i]=o.x+s[o.i+1],s.splice(o.i+1,1)),i--;return 1===s.length?null==s[0]?(o=l[0].x,function(n){return o(n)+&quot;&quot;}):function(){return t}:function(n){for(r=0;i&gt;r;++r)s[(o=l[r]).i]=o.x(n);return s.join(&quot;&quot;)}}function qr(n,t){for(var e,r=$o.interpolators.length;--r&gt;=0&amp;&amp;!(e=$o.interpolators[r](n,t)););return e}function zr(n,t){var e,r=[],u=[],i=n.length,o=t.length,a=Math.min(n.length,t.length);for(e=0;a&gt;e;++e)r.push(qr(n[e],t[e]));for(;i&gt;e;++e)u[e]=n[e];for(;o&gt;e;++e)u[e]=t[e];return function(n){for(e=0;a&gt;e;++e)u[e]=r[e](n);return u}}function Rr(n){return function(t){return 0&gt;=t?0:t&gt;=1?1:n(t)}}function Dr(n){return function(t){return 1-n(1-t)}}function Pr(n){return function(t){return.5*(.5&gt;t?n(2*t):2-n(2-2*t))}}function Ur(n){return n*n}function jr(n){return n*n*n}function Hr(n){if(0&gt;=n)return 0;if(n&gt;=1)return 1;var t=n*n,e=t*n;return 4*(.5&gt;n?e:3*(n-t)+e-.75)}function Fr(n){return function(t){return Math.pow(t,n)}}function Or(n){return 1-Math.cos(n*Aa)}function Yr(n){return Math.pow(2,10*(n-1))}function Ir(n){return 1-Math.sqrt(1-n*n)}function Zr(n,t){var e;return arguments.length&lt;2&amp;&amp;(t=.45),arguments.length?e=t/Ea*Math.asin(1/n):(n=1,e=t/4),function(r){return 1+n*Math.pow(2,-10*r)*Math.sin((r-e)*Ea/t)}}function Vr(n){return n||(n=1.70158),function(t){return t*t*((n+1)*t-n)}}function Xr(n){return 1/2.75&gt;n?7.5625*n*n:2/2.75&gt;n?7.5625*(n-=1.5/2.75)*n+.75:2.5/2.75&gt;n?7.5625*(n-=2.25/2.75)*n+.9375:7.5625*(n-=2.625/2.75)*n+.984375}function $r(n,t){n=$o.hcl(n),t=$o.hcl(t);var e=n.h,r=n.c,u=n.l,i=t.h-e,o=t.c-r,a=t.l-u;return isNaN(o)&amp;&amp;(o=0,r=isNaN(r)?t.c:r),isNaN(i)?(i=0,e=isNaN(e)?t.h:e):i&gt;180?i-=360:-180&gt;i&amp;&amp;(i+=360),function(n){return J(e+i*n,r+o*n,u+a*n)+&quot;&quot;}}function Br(n,t){n=$o.hsl(n),t=$o.hsl(t);var e=n.h,r=n.s,u=n.l,i=t.h-e,o=t.s-r,a=t.l-u;return isNaN(o)&amp;&amp;(o=0,r=isNaN(r)?t.s:r),isNaN(i)?(i=0,e=isNaN(e)?t.h:e):i&gt;180?i-=360:-180&gt;i&amp;&amp;(i+=360),function(n){return $(e+i*n,r+o*n,u+a*n)+&quot;&quot;}}function Wr(n,t){n=$o.lab(n),t=$o.lab(t);var e=n.l,r=n.a,u=n.b,i=t.l-e,o=t.a-r,a=t.b-u;return function(n){return Q(e+i*n,r+o*n,u+a*n)+&quot;&quot;}}function Jr(n,t){return t-=n,function(e){return Math.round(n+t*e)}}function Gr(n){var t=[n.a,n.b],e=[n.c,n.d],r=Qr(t),u=Kr(t,e),i=Qr(nu(e,t,-u))||0;t[0]*e[1]&lt;e[0]*t[1]&amp;&amp;(t[0]*=-1,t[1]*=-1,r*=-1,u*=-1),this.rotate=(r?Math.atan2(t[1],t[0]):Math.atan2(-e[0],e[1]))*Ta,this.translate=[n.e,n.f],this.scale=[r,i],this.skew=i?Math.atan2(u,i)*Ta:0}function Kr(n,t){return n[0]*t[0]+n[1]*t[1]}function Qr(n){var t=Math.sqrt(Kr(n,n));return t&amp;&amp;(n[0]/=t,n[1]/=t),t}function nu(n,t,e){return n[0]+=e*t[0],n[1]+=e*t[1],n}function tu(n,t){var e,r=[],u=[],i=$o.transform(n),o=$o.transform(t),a=i.translate,c=o.translate,s=i.rotate,l=o.rotate,f=i.skew,h=o.skew,g=i.scale,p=o.scale;return a[0]!=c[0]||a[1]!=c[1]?(r.push(&quot;translate(&quot;,null,&quot;,&quot;,null,&quot;)&quot;),u.push({i:1,x:Lr(a[0],c[0])},{i:3,x:Lr(a[1],c[1])})):c[0]||c[1]?r.push(&quot;translate(&quot;+c+&quot;)&quot;):r.push(&quot;&quot;),s!=l?(s-l&gt;180?l+=360:l-s&gt;180&amp;&amp;(s+=360),u.push({i:r.push(r.pop()+&quot;rotate(&quot;,null,&quot;)&quot;)-2,x:Lr(s,l)})):l&amp;&amp;r.push(r.pop()+&quot;rotate(&quot;+l+&quot;)&quot;),f!=h?u.push({i:r.push(r.pop()+&quot;skewX(&quot;,null,&quot;)&quot;)-2,x:Lr(f,h)}):h&amp;&amp;r.push(r.pop()+&quot;skewX(&quot;+h+&quot;)&quot;),g[0]!=p[0]||g[1]!=p[1]?(e=r.push(r.pop()+&quot;scale(&quot;,null,&quot;,&quot;,null,&quot;)&quot;),u.push({i:e-4,x:Lr(g[0],p[0])},{i:e-2,x:Lr(g[1],p[1])})):(1!=p[0]||1!=p[1])&amp;&amp;r.push(r.pop()+&quot;scale(&quot;+p+&quot;)&quot;),e=u.length,function(n){for(var t,i=-1;++i&lt;e;)r[(t=u[i]).i]=t.x(n);return r.join(&quot;&quot;)}}function eu(n,t){return t=t-(n=+n)?1/(t-n):0,function(e){return(e-n)*t}}function ru(n,t){return t=t-(n=+n)?1/(t-n):0,function(e){return Math.max(0,Math.min(1,(e-n)*t))}}function uu(n){for(var t=n.source,e=n.target,r=ou(t,e),u=[t];t!==r;)t=t.parent,u.push(t);for(var i=u.length;e!==r;)u.splice(i,0,e),e=e.parent;return u}function iu(n){for(var t=[],e=n.parent;null!=e;)t.push(n),n=e,e=e.parent;return t.push(n),t}function ou(n,t){if(n===t)return n;for(var e=iu(n),r=iu(t),u=e.pop(),i=r.pop(),o=null;u===i;)o=u,u=e.pop(),i=r.pop();return o}function au(n){n.fixed|=2}function cu(n){n.fixed&amp;=-7}function su(n){n.fixed|=4,n.px=n.x,n.py=n.y}function lu(n){n.fixed&amp;=-5}function fu(n,t,e){var r=0,u=0;if(n.charge=0,!n.leaf)for(var i,o=n.nodes,a=o.length,c=-1;++c&lt;a;)i=o[c],null!=i&amp;&amp;(fu(i,t,e),n.charge+=i.charge,r+=i.charge*i.cx,u+=i.charge*i.cy);if(n.point){n.leaf||(n.point.x+=Math.random()-.5,n.point.y+=Math.random()-.5);var s=t*e[n.point.index];n.charge+=n.pointCharge=s,r+=s*n.point.x,u+=s*n.point.y}n.cx=r/n.charge,n.cy=u/n.charge}function hu(n,t){return $o.rebind(n,t,&quot;sort&quot;,&quot;children&quot;,&quot;value&quot;),n.nodes=n,n.links=du,n}function gu(n){return n.children}function pu(n){return n.value}function vu(n,t){return t.value-n.value}function du(n){return $o.merge(n.map(function(n){return(n.children||[]).map(function(t){return{source:n,target:t}})}))}function mu(n){return n.x}function yu(n){return n.y}function xu(n,t,e){n.y0=t,n.y=e}function Mu(n){return $o.range(n.length)}function _u(n){for(var t=-1,e=n[0].length,r=[];++t&lt;e;)r[t]=0;return r}function bu(n){for(var t,e=1,r=0,u=n[0][1],i=n.length;i&gt;e;++e)(t=n[e][1])&gt;u&amp;&amp;(r=e,u=t);return r}function wu(n){return n.reduce(Su,0)}function Su(n,t){return n+t[1]}function ku(n,t){return Eu(n,Math.ceil(Math.log(t.length)/Math.LN2+1))}function Eu(n,t){for(var e=-1,r=+n[0],u=(n[1]-r)/t,i=[];++e&lt;=t;)i[e]=u*e+r;return i}function Au(n){return[$o.min(n),$o.max(n)]}function Cu(n,t){return n.parent==t.parent?1:2}function Nu(n){var t=n.children;return t&amp;&amp;t.length?t[0]:n._tree.thread}function Lu(n){var t,e=n.children;return e&amp;&amp;(t=e.length)?e[t-1]:n._tree.thread}function Tu(n,t){var e=n.children;if(e&amp;&amp;(u=e.length))for(var r,u,i=-1;++i&lt;u;)t(r=Tu(e[i],t),n)&gt;0&amp;&amp;(n=r);return n}function qu(n,t){return n.x-t.x}function zu(n,t){return t.x-n.x}function Ru(n,t){return n.depth-t.depth}function Du(n,t){function e(n,r){var u=n.children;if(u&amp;&amp;(o=u.length))for(var i,o,a=null,c=-1;++c&lt;o;)i=u[c],e(i,a),a=i;t(n,r)}e(n,null)}function Pu(n){for(var t,e=0,r=0,u=n.children,i=u.length;--i&gt;=0;)t=u[i]._tree,t.prelim+=e,t.mod+=e,e+=t.shift+(r+=t.change)}function Uu(n,t,e){n=n._tree,t=t._tree;var r=e/(t.number-n.number);n.change+=r,t.change-=r,t.shift+=e,t.prelim+=e,t.mod+=e}function ju(n,t,e){return n._tree.ancestor.parent==t.parent?n._tree.ancestor:e}function Hu(n,t){return n.value-t.value}function Fu(n,t){var e=n._pack_next;n._pack_next=t,t._pack_prev=n,t._pack_next=e,e._pack_prev=t}function Ou(n,t){n._pack_next=t,t._pack_prev=n}function Yu(n,t){var e=t.x-n.x,r=t.y-n.y,u=n.r+t.r;return.999*u*u&gt;e*e+r*r}function Iu(n){function t(n){l=Math.min(n.x-n.r,l),f=Math.max(n.x+n.r,f),h=Math.min(n.y-n.r,h),g=Math.max(n.y+n.r,g)}if((e=n.children)&amp;&amp;(s=e.length)){var e,r,u,i,o,a,c,s,l=1/0,f=-1/0,h=1/0,g=-1/0;if(e.forEach(Zu),r=e[0],r.x=-r.r,r.y=0,t(r),s&gt;1&amp;&amp;(u=e[1],u.x=u.r,u.y=0,t(u),s&gt;2))for(i=e[2],$u(r,u,i),t(i),Fu(r,i),r._pack_prev=i,Fu(i,u),u=r._pack_next,o=3;s&gt;o;o++){$u(r,u,i=e[o]);var p=0,v=1,d=1;for(a=u._pack_next;a!==u;a=a._pack_next,v++)if(Yu(a,i)){p=1;break}if(1==p)for(c=r._pack_prev;c!==a._pack_prev&amp;&amp;!Yu(c,i);c=c._pack_prev,d++);p?(d&gt;v||v==d&amp;&amp;u.r&lt;r.r?Ou(r,u=a):Ou(r=c,u),o--):(Fu(r,i),u=i,t(i))}var m=(l+f)/2,y=(h+g)/2,x=0;for(o=0;s&gt;o;o++)i=e[o],i.x-=m,i.y-=y,x=Math.max(x,i.r+Math.sqrt(i.x*i.x+i.y*i.y));n.r=x,e.forEach(Vu)}}function Zu(n){n._pack_next=n._pack_prev=n}function Vu(n){delete n._pack_next,delete n._pack_prev}function Xu(n,t,e,r){var u=n.children;if(n.x=t+=r*n.x,n.y=e+=r*n.y,n.r*=r,u)for(var i=-1,o=u.length;++i&lt;o;)Xu(u[i],t,e,r)}function $u(n,t,e){var r=n.r+e.r,u=t.x-n.x,i=t.y-n.y;if(r&amp;&amp;(u||i)){var o=t.r+e.r,a=u*u+i*i;o*=o,r*=r;var c=.5+(r-o)/(2*a),s=Math.sqrt(Math.max(0,2*o*(r+a)-(r-=a)*r-o*o))/(2*a);e.x=n.x+c*u+s*i,e.y=n.y+c*i-s*u}else e.x=n.x+r,e.y=n.y}function Bu(n){return 1+$o.max(n,function(n){return n.y})}function Wu(n){return n.reduce(function(n,t){return n+t.x},0)/n.length}function Ju(n){var t=n.children;return t&amp;&amp;t.length?Ju(t[0]):n}function Gu(n){var t,e=n.children;return e&amp;&amp;(t=e.length)?Gu(e[t-1]):n}function Ku(n){return{x:n.x,y:n.y,dx:n.dx,dy:n.dy}}function Qu(n,t){var e=n.x+t[3],r=n.y+t[0],u=n.dx-t[1]-t[3],i=n.dy-t[0]-t[2];return 0&gt;u&amp;&amp;(e+=u/2,u=0),0&gt;i&amp;&amp;(r+=i/2,i=0),{x:e,y:r,dx:u,dy:i}}function ni(n){var t=n[0],e=n[n.length-1];return e&gt;t?[t,e]:[e,t]}function ti(n){return n.rangeExtent?n.rangeExtent():ni(n.range())}function ei(n,t,e,r){var u=e(n[0],n[1]),i=r(t[0],t[1]);return function(n){return i(u(n))}}function ri(n,t){var e,r=0,u=n.length-1,i=n[r],o=n[u];return i&gt;o&amp;&amp;(e=r,r=u,u=e,e=i,i=o,o=e),n[r]=t.floor(i),n[u]=t.ceil(o),n}function ui(n){return n?{floor:function(t){return Math.floor(t/n)*n},ceil:function(t){return Math.ceil(t/n)*n}}:ss}function ii(n,t,e,r){var u=[],i=[],o=0,a=Math.min(n.length,t.length)-1;for(n[a]&lt;n[0]&amp;&amp;(n=n.slice().reverse(),t=t.slice().reverse());++o&lt;=a;)u.push(e(n[o-1],n[o])),i.push(r(t[o-1],t[o]));return function(t){var e=$o.bisect(n,t,1,a)-1;return i[e](u[e](t))}}function oi(n,t,e,r){function u(){var u=Math.min(n.length,t.length)&gt;2?ii:ei,c=r?ru:eu;return o=u(n,t,c,e),a=u(t,n,c,qr),i}function i(n){return o(n)}var o,a;return i.invert=function(n){return a(n)},i.domain=function(t){return arguments.length?(n=t.map(Number),u()):n},i.range=function(n){return arguments.length?(t=n,u()):t},i.rangeRound=function(n){return i.range(n).interpolate(Jr)},i.clamp=function(n){return arguments.length?(r=n,u()):r},i.interpolate=function(n){return arguments.length?(e=n,u()):e},i.ticks=function(t){return li(n,t)},i.tickFormat=function(t,e){return fi(n,t,e)},i.nice=function(t){return ci(n,t),u()},i.copy=function(){return oi(n,t,e,r)},u()}function ai(n,t){return $o.rebind(n,t,&quot;range&quot;,&quot;rangeRound&quot;,&quot;interpolate&quot;,&quot;clamp&quot;)}function ci(n,t){return ri(n,ui(si(n,t)[2]))}function si(n,t){null==t&amp;&amp;(t=10);var e=ni(n),r=e[1]-e[0],u=Math.pow(10,Math.floor(Math.log(r/t)/Math.LN10)),i=t/r*u;return.15&gt;=i?u*=10:.35&gt;=i?u*=5:.75&gt;=i&amp;&amp;(u*=2),e[0]=Math.ceil(e[0]/u)*u,e[1]=Math.floor(e[1]/u)*u+.5*u,e[2]=u,e}function li(n,t){return $o.range.apply($o,si(n,t))}function fi(n,t,e){var r=si(n,t);return $o.format(e?e.replace(uc,function(n,t,e,u,i,o,a,c,s,l){return[t,e,u,i,o,a,c,s||&quot;.&quot;+gi(l,r),l].join(&quot;&quot;)}):&quot;,.&quot;+hi(r[2])+&quot;f&quot;)}function hi(n){return-Math.floor(Math.log(n)/Math.LN10+.01)}function gi(n,t){var e=hi(t[2]);return n in ls?Math.abs(e-hi(Math.max(Math.abs(t[0]),Math.abs(t[1]))))+ +(&quot;e&quot;!==n):e-2*(&quot;%&quot;===n)}function pi(n,t,e,r){function u(n){return(e?Math.log(0&gt;n?0:n):-Math.log(n&gt;0?0:-n))/Math.log(t)}function i(n){return e?Math.pow(t,n):-Math.pow(t,-n)}function o(t){return n(u(t))}return o.invert=function(t){return i(n.invert(t))},o.domain=function(t){return arguments.length?(e=t[0]&gt;=0,n.domain((r=t.map(Number)).map(u)),o):r},o.base=function(e){return arguments.length?(t=+e,n.domain(r.map(u)),o):t},o.nice=function(){var t=ri(r.map(u),e?Math:hs);return n.domain(t),r=t.map(i),o},o.ticks=function(){var n=ni(r),o=[],a=n[0],c=n[1],s=Math.floor(u(a)),l=Math.ceil(u(c)),f=t%1?2:t;if(isFinite(l-s)){if(e){for(;l&gt;s;s++)for(var h=1;f&gt;h;h++)o.push(i(s)*h);o.push(i(s))}else for(o.push(i(s));s++&lt;l;)for(var h=f-1;h&gt;0;h--)o.push(i(s)*h);for(s=0;o[s]&lt;a;s++);for(l=o.length;o[l-1]&gt;c;l--);o=o.slice(s,l)}return o},o.tickFormat=function(n,t){if(!arguments.length)return fs;arguments.length&lt;2?t=fs:&quot;function&quot;!=typeof t&amp;&amp;(t=$o.format(t));var r,a=Math.max(.1,n/o.ticks().length),c=e?(r=1e-12,Math.ceil):(r=-1e-12,Math.floor);return function(n){return n/i(c(u(n)+r))&lt;=a?t(n):&quot;&quot;}},o.copy=function(){return pi(n.copy(),t,e,r)},ai(o,n)}function vi(n,t,e){function r(t){return n(u(t))}var u=di(t),i=di(1/t);return r.invert=function(t){return i(n.invert(t))},r.domain=function(t){return arguments.length?(n.domain((e=t.map(Number)).map(u)),r):e},r.ticks=function(n){return li(e,n)},r.tickFormat=function(n,t){return fi(e,n,t)},r.nice=function(n){return r.domain(ci(e,n))},r.exponent=function(o){return arguments.length?(u=di(t=o),i=di(1/t),n.domain(e.map(u)),r):t},r.copy=function(){return vi(n.copy(),t,e)},ai(r,n)}function di(n){return function(t){return 0&gt;t?-Math.pow(-t,n):Math.pow(t,n)}}function mi(n,t){function e(e){return o[((i.get(e)||&quot;range&quot;===t.t&amp;&amp;i.set(e,n.push(e)))-1)%o.length]}function r(t,e){return $o.range(n.length).map(function(n){return t+e*n})}var i,o,a;return e.domain=function(r){if(!arguments.length)return n;n=[],i=new u;for(var o,a=-1,c=r.length;++a&lt;c;)i.has(o=r[a])||i.set(o,n.push(o));return e[t.t].apply(e,t.a)},e.range=function(n){return arguments.length?(o=n,a=0,t={t:&quot;range&quot;,a:arguments},e):o},e.rangePoints=function(u,i){arguments.length&lt;2&amp;&amp;(i=0);var c=u[0],s=u[1],l=(s-c)/(Math.max(1,n.length-1)+i);return o=r(n.length&lt;2?(c+s)/2:c+l*i/2,l),a=0,t={t:&quot;rangePoints&quot;,a:arguments},e},e.rangeBands=function(u,i,c){arguments.length&lt;2&amp;&amp;(i=0),arguments.length&lt;3&amp;&amp;(c=i);var s=u[1]&lt;u[0],l=u[s-0],f=u[1-s],h=(f-l)/(n.length-i+2*c);return o=r(l+h*c,h),s&amp;&amp;o.reverse(),a=h*(1-i),t={t:&quot;rangeBands&quot;,a:arguments},e},e.rangeRoundBands=function(u,i,c){arguments.length&lt;2&amp;&amp;(i=0),arguments.length&lt;3&amp;&amp;(c=i);var s=u[1]&lt;u[0],l=u[s-0],f=u[1-s],h=Math.floor((f-l)/(n.length-i+2*c)),g=f-l-(n.length-i)*h;return o=r(l+Math.round(g/2),h),s&amp;&amp;o.reverse(),a=Math.round(h*(1-i)),t={t:&quot;rangeRoundBands&quot;,a:arguments},e},e.rangeBand=function(){return a},e.rangeExtent=function(){return ni(t.a[0])},e.copy=function(){return mi(n,t)},e.domain(n)}function yi(n,t){function e(){var e=0,i=t.length;for(u=[];++e&lt;i;)u[e-1]=$o.quantile(n,e/i);return r}function r(n){return isNaN(n=+n)?void 0:t[$o.bisect(u,n)]}var u;return r.domain=function(t){return arguments.length?(n=t.filter(function(n){return!isNaN(n)}).sort($o.ascending),e()):n},r.range=function(n){return arguments.length?(t=n,e()):t},r.quantiles=function(){return u},r.invertExtent=function(e){return e=t.indexOf(e),0&gt;e?[0/0,0/0]:[e&gt;0?u[e-1]:n[0],e&lt;u.length?u[e]:n[n.length-1]]},r.copy=function(){return yi(n,t)},e()}function xi(n,t,e){function r(t){return e[Math.max(0,Math.min(o,Math.floor(i*(t-n))))]}function u(){return i=e.length/(t-n),o=e.length-1,r}var i,o;return r.domain=function(e){return arguments.length?(n=+e[0],t=+e[e.length-1],u()):[n,t]},r.range=function(n){return arguments.length?(e=n,u()):e},r.invertExtent=function(t){return t=e.indexOf(t),t=0&gt;t?0/0:t/i+n,[t,t+1/i]},r.copy=function(){return xi(n,t,e)},u()}function Mi(n,t){function e(e){return e&gt;=e?t[$o.bisect(n,e)]:void 0}return e.domain=function(t){return arguments.length?(n=t,e):n},e.range=function(n){return arguments.length?(t=n,e):t},e.invertExtent=function(e){return e=t.indexOf(e),[n[e-1],n[e]]},e.copy=function(){return Mi(n,t)},e}function _i(n){function t(n){return+n}return t.invert=t,t.domain=t.range=function(e){return arguments.length?(n=e.map(t),t):n},t.ticks=function(t){return li(n,t)},t.tickFormat=function(t,e){return fi(n,t,e)},t.copy=function(){return _i(n)},t}function bi(n){return n.innerRadius}function wi(n){return n.outerRadius}function Si(n){return n.startAngle}function ki(n){return n.endAngle}function Ei(n){function t(t){function o(){s.push(&quot;M&quot;,i(n(l),a))}for(var c,s=[],l=[],f=-1,h=t.length,g=pt(e),p=pt(r);++f&lt;h;)u.call(this,c=t[f],f)?l.push([+g.call(this,c,f),+p.call(this,c,f)]):l.length&amp;&amp;(o(),l=[]);return l.length&amp;&amp;o(),s.length?s.join(&quot;&quot;):null}var e=Ze,r=Ve,u=Zt,i=Ai,o=i.key,a=.7;return t.x=function(n){return arguments.length?(e=n,t):e},t.y=function(n){return arguments.length?(r=n,t):r},t.defined=function(n){return arguments.length?(u=n,t):u},t.interpolate=function(n){return arguments.length?(o=&quot;function&quot;==typeof n?i=n:(i=xs.get(n)||Ai).key,t):o},t.tension=function(n){return arguments.length?(a=n,t):a},t}function Ai(n){return n.join(&quot;L&quot;)}function Ci(n){return Ai(n)+&quot;Z&quot;}function Ni(n){for(var t=0,e=n.length,r=n[0],u=[r[0],&quot;,&quot;,r[1]];++t&lt;e;)u.push(&quot;H&quot;,(r[0]+(r=n[t])[0])/2,&quot;V&quot;,r[1]);return e&gt;1&amp;&amp;u.push(&quot;H&quot;,r[0]),u.join(&quot;&quot;)}function Li(n){for(var t=0,e=n.length,r=n[0],u=[r[0],&quot;,&quot;,r[1]];++t&lt;e;)u.push(&quot;V&quot;,(r=n[t])[1],&quot;H&quot;,r[0]);return u.join(&quot;&quot;)}function Ti(n){for(var t=0,e=n.length,r=n[0],u=[r[0],&quot;,&quot;,r[1]];++t&lt;e;)u.push(&quot;H&quot;,(r=n[t])[0],&quot;V&quot;,r[1]);return u.join(&quot;&quot;)}function qi(n,t){return n.length&lt;4?Ai(n):n[1]+Di(n.slice(1,n.length-1),Pi(n,t))}function zi(n,t){return n.length&lt;3?Ai(n):n[0]+Di((n.push(n[0]),n),Pi([n[n.length-2]].concat(n,[n[1]]),t))}function Ri(n,t){return n.length&lt;3?Ai(n):n[0]+Di(n,Pi(n,t))}function Di(n,t){if(t.length&lt;1||n.length!=t.length&amp;&amp;n.length!=t.length+2)return Ai(n);var e=n.length!=t.length,r=&quot;&quot;,u=n[0],i=n[1],o=t[0],a=o,c=1;if(e&amp;&amp;(r+=&quot;Q&quot;+(i[0]-2*o[0]/3)+&quot;,&quot;+(i[1]-2*o[1]/3)+&quot;,&quot;+i[0]+&quot;,&quot;+i[1],u=n[1],c=2),t.length&gt;1){a=t[1],i=n[c],c++,r+=&quot;C&quot;+(u[0]+o[0])+&quot;,&quot;+(u[1]+o[1])+&quot;,&quot;+(i[0]-a[0])+&quot;,&quot;+(i[1]-a[1])+&quot;,&quot;+i[0]+&quot;,&quot;+i[1];for(var s=2;s&lt;t.length;s++,c++)i=n[c],a=t[s],r+=&quot;S&quot;+(i[0]-a[0])+&quot;,&quot;+(i[1]-a[1])+&quot;,&quot;+i[0]+&quot;,&quot;+i[1]}if(e){var l=n[c];r+=&quot;Q&quot;+(i[0]+2*a[0]/3)+&quot;,&quot;+(i[1]+2*a[1]/3)+&quot;,&quot;+l[0]+&quot;,&quot;+l[1]}return r}function Pi(n,t){for(var e,r=[],u=(1-t)/2,i=n[0],o=n[1],a=1,c=n.length;++a&lt;c;)e=i,i=o,o=n[a],r.push([u*(o[0]-e[0]),u*(o[1]-e[1])]);return r}function Ui(n){if(n.length&lt;3)return Ai(n);var t=1,e=n.length,r=n[0],u=r[0],i=r[1],o=[u,u,u,(r=n[1])[0]],a=[i,i,i,r[1]],c=[u,&quot;,&quot;,i,&quot;L&quot;,Oi(bs,o),&quot;,&quot;,Oi(bs,a)];for(n.push(n[e-1]);++t&lt;=e;)r=n[t],o.shift(),o.push(r[0]),a.shift(),a.push(r[1]),Yi(c,o,a);return n.pop(),c.push(&quot;L&quot;,r),c.join(&quot;&quot;)}function ji(n){if(n.length&lt;4)return Ai(n);for(var t,e=[],r=-1,u=n.length,i=[0],o=[0];++r&lt;3;)t=n[r],i.push(t[0]),o.push(t[1]);for(e.push(Oi(bs,i)+&quot;,&quot;+Oi(bs,o)),--r;++r&lt;u;)t=n[r],i.shift(),i.push(t[0]),o.shift(),o.push(t[1]),Yi(e,i,o);return e.join(&quot;&quot;)}function Hi(n){for(var t,e,r=-1,u=n.length,i=u+4,o=[],a=[];++r&lt;4;)e=n[r%u],o.push(e[0]),a.push(e[1]);for(t=[Oi(bs,o),&quot;,&quot;,Oi(bs,a)],--r;++r&lt;i;)e=n[r%u],o.shift(),o.push(e[0]),a.shift(),a.push(e[1]),Yi(t,o,a);return t.join(&quot;&quot;)}function Fi(n,t){var e=n.length-1;if(e)for(var r,u,i=n[0][0],o=n[0][1],a=n[e][0]-i,c=n[e][1]-o,s=-1;++s&lt;=e;)r=n[s],u=s/e,r[0]=t*r[0]+(1-t)*(i+u*a),r[1]=t*r[1]+(1-t)*(o+u*c);return Ui(n)}function Oi(n,t){return n[0]*t[0]+n[1]*t[1]+n[2]*t[2]+n[3]*t[3]}function Yi(n,t,e){n.push(&quot;C&quot;,Oi(Ms,t),&quot;,&quot;,Oi(Ms,e),&quot;,&quot;,Oi(_s,t),&quot;,&quot;,Oi(_s,e),&quot;,&quot;,Oi(bs,t),&quot;,&quot;,Oi(bs,e))}function Ii(n,t){return(t[1]-n[1])/(t[0]-n[0])}function Zi(n){for(var t=0,e=n.length-1,r=[],u=n[0],i=n[1],o=r[0]=Ii(u,i);++t&lt;e;)r[t]=(o+(o=Ii(u=i,i=n[t+1])))/2;return r[t]=o,r}function Vi(n){for(var t,e,r,u,i=[],o=Zi(n),a=-1,c=n.length-1;++a&lt;c;)t=Ii(n[a],n[a+1]),aa(t)&lt;Ca?o[a]=o[a+1]=0:(e=o[a]/t,r=o[a+1]/t,u=e*e+r*r,u&gt;9&amp;&amp;(u=3*t/Math.sqrt(u),o[a]=u*e,o[a+1]=u*r));for(a=-1;++a&lt;=c;)u=(n[Math.min(c,a+1)][0]-n[Math.max(0,a-1)][0])/(6*(1+o[a]*o[a])),i.push([u||0,o[a]*u||0]);return i}function Xi(n){return n.length&lt;3?Ai(n):n[0]+Di(n,Vi(n))}function $i(n){for(var t,e,r,u=-1,i=n.length;++u&lt;i;)t=n[u],e=t[0],r=t[1]+ms,t[0]=e*Math.cos(r),t[1]=e*Math.sin(r);return n}function Bi(n){function t(t){function c(){v.push(&quot;M&quot;,a(n(m),f),l,s(n(d.reverse()),f),&quot;Z&quot;)}for(var h,g,p,v=[],d=[],m=[],y=-1,x=t.length,M=pt(e),_=pt(u),b=e===r?function(){return g}:pt(r),w=u===i?function(){return p}:pt(i);++y&lt;x;)o.call(this,h=t[y],y)?(d.push([g=+M.call(this,h,y),p=+_.call(this,h,y)]),m.push([+b.call(this,h,y),+w.call(this,h,y)])):d.length&amp;&amp;(c(),d=[],m=[]);return d.length&amp;&amp;c(),v.length?v.join(&quot;&quot;):null}var e=Ze,r=Ze,u=0,i=Ve,o=Zt,a=Ai,c=a.key,s=a,l=&quot;L&quot;,f=.7;return t.x=function(n){return arguments.length?(e=r=n,t):r},t.x0=function(n){return arguments.length?(e=n,t):e},t.x1=function(n){return arguments.length?(r=n,t):r},t.y=function(n){return arguments.length?(u=i=n,t):i},t.y0=function(n){return arguments.length?(u=n,t):u},t.y1=function(n){return arguments.length?(i=n,t):i},t.defined=function(n){return arguments.length?(o=n,t):o},t.interpolate=function(n){return arguments.length?(c=&quot;function&quot;==typeof n?a=n:(a=xs.get(n)||Ai).key,s=a.reverse||a,l=a.closed?&quot;M&quot;:&quot;L&quot;,t):c},t.tension=function(n){return arguments.length?(f=n,t):f},t}function Wi(n){return n.radius}function Ji(n){return[n.x,n.y]}function Gi(n){return function(){var t=n.apply(this,arguments),e=t[0],r=t[1]+ms;return[e*Math.cos(r),e*Math.sin(r)]}}function Ki(){return 64}function Qi(){return&quot;circle&quot;}function no(n){var t=Math.sqrt(n/ka);return&quot;M0,&quot;+t+&quot;A&quot;+t+&quot;,&quot;+t+&quot; 0 1,1 0,&quot;+-t+&quot;A&quot;+t+&quot;,&quot;+t+&quot; 0 1,1 0,&quot;+t+&quot;Z&quot;}function to(n,t){return ha(n,Cs),n.id=t,n}function eo(n,t,e,r){var u=n.id;return C(n,&quot;function&quot;==typeof e?function(n,i,o){n.__transition__[u].tween.set(t,r(e.call(n,n.__data__,i,o)))}:(e=r(e),function(n){n.__transition__[u].tween.set(t,e)}))}function ro(n){return null==n&amp;&amp;(n=&quot;&quot;),function(){this.textContent=n}}function uo(n,t,e,r){var i=n.__transition__||(n.__transition__={active:0,count:0}),o=i[e];if(!o){var a=r.time;o=i[e]={tween:new u,time:a,ease:r.ease,delay:r.delay,duration:r.duration},++i.count,$o.timer(function(r){function u(r){return i.active&gt;e?s():(i.active=e,o.event&amp;&amp;o.event.start.call(n,l,t),o.tween.forEach(function(e,r){(r=r.call(n,l,t))&amp;&amp;v.push(r)}),$o.timer(function(){return p.c=c(r||1)?Zt:c,1},0,a),void 0)}function c(r){if(i.active!==e)return s();for(var u=r/g,a=f(u),c=v.length;c&gt;0;)v[--c].call(n,a);return u&gt;=1?(o.event&amp;&amp;o.event.end.call(n,l,t),s()):void 0}function s(){return--i.count?delete i[e]:delete n.__transition__,1}var l=n.__data__,f=o.ease,h=o.delay,g=o.duration,p=Ga,v=[];return p.t=h+a,r&gt;=h?u(r-h):(p.c=u,void 0)},0,a)}}function io(n,t){n.attr(&quot;transform&quot;,function(n){return&quot;translate(&quot;+t(n)+&quot;,0)&quot;})}function oo(n,t){n.attr(&quot;transform&quot;,function(n){return&quot;translate(0,&quot;+t(n)+&quot;)&quot;})}function ao(){this._=new Date(arguments.length&gt;1?Date.UTC.apply(this,arguments):arguments[0])}function co(n,t,e){function r(t){var e=n(t),r=i(e,1);return r-t&gt;t-e?e:r}function u(e){return t(e=n(new Ds(e-1)),1),e}function i(n,e){return t(n=new Ds(+n),e),n}function o(n,r,i){var o=u(n),a=[];if(i&gt;1)for(;r&gt;o;)e(o)%i||a.push(new Date(+o)),t(o,1);else for(;r&gt;o;)a.push(new Date(+o)),t(o,1);return a}function a(n,t,e){try{Ds=ao;var r=new ao;return r._=n,o(r,t,e)}finally{Ds=Date}}n.floor=n,n.round=r,n.ceil=u,n.offset=i,n.range=o;var c=n.utc=so(n);return c.floor=c,c.round=so(r),c.ceil=so(u),c.offset=so(i),c.range=a,n}function so(n){return function(t,e){try{Ds=ao;var r=new ao;return r._=t,n(r,e)._}finally{Ds=Date}}}function lo(n){function t(t){for(var r,u,i,o=[],a=-1,c=0;++a&lt;e;)37===n.charCodeAt(a)&amp;&amp;(o.push(n.substring(c,a)),null!=(u=nl[r=n.charAt(++a)])&amp;&amp;(r=n.charAt(++a)),(i=tl[r])&amp;&amp;(r=i(t,null==u?&quot;e&quot;===r?&quot; &quot;:&quot;0&quot;:u)),o.push(r),c=a+1);return o.push(n.substring(c,a)),o.join(&quot;&quot;)}var e=n.length;return t.parse=function(t){var e={y:1900,m:0,d:1,H:0,M:0,S:0,L:0,Z:null},r=fo(e,n,t,0);if(r!=t.length)return null;&quot;p&quot;in e&amp;&amp;(e.H=e.H%12+12*e.p);var u=null!=e.Z&amp;&amp;Ds!==ao,i=new(u?ao:Ds);return&quot;j&quot;in e?i.setFullYear(e.y,0,e.j):&quot;w&quot;in e&amp;&amp;(&quot;W&quot;in e||&quot;U&quot;in e)?(i.setFullYear(e.y,0,1),i.setFullYear(e.y,0,&quot;W&quot;in e?(e.w+6)%7+7*e.W-(i.getDay()+5)%7:e.w+7*e.U-(i.getDay()+6)%7)):i.setFullYear(e.y,e.m,e.d),i.setHours(e.H+Math.floor(e.Z/100),e.M+e.Z%100,e.S,e.L),u?i._:i},t.toString=function(){return n},t}function fo(n,t,e,r){for(var u,i,o,a=0,c=t.length,s=e.length;c&gt;a;){if(r&gt;=s)return-1;if(u=t.charCodeAt(a++),37===u){if(o=t.charAt(a++),i=el[o in nl?t.charAt(a++):o],!i||(r=i(n,e,r))&lt;0)return-1}else if(u!=e.charCodeAt(r++))return-1}return r}function ho(n){return new RegExp(&quot;^(?:&quot;+n.map($o.requote).join(&quot;|&quot;)+&quot;)&quot;,&quot;i&quot;)}function go(n){for(var t=new u,e=-1,r=n.length;++e&lt;r;)t.set(n[e].toLowerCase(),e);return t}function po(n,t,e){var r=0&gt;n?&quot;-&quot;:&quot;&quot;,u=(r?-n:n)+&quot;&quot;,i=u.length;return r+(e&gt;i?new Array(e-i+1).join(t)+u:u)}function vo(n,t,e){$s.lastIndex=0;var r=$s.exec(t.substring(e));return r?(n.w=Bs.get(r[0].toLowerCase()),e+r[0].length):-1}function mo(n,t,e){Vs.lastIndex=0;var r=Vs.exec(t.substring(e));return r?(n.w=Xs.get(r[0].toLowerCase()),e+r[0].length):-1}function yo(n,t,e){rl.lastIndex=0;var r=rl.exec(t.substring(e,e+1));return r?(n.w=+r[0],e+r[0].length):-1}function xo(n,t,e){rl.lastIndex=0;var r=rl.exec(t.substring(e));return r?(n.U=+r[0],e+r[0].length):-1}function Mo(n,t,e){rl.lastIndex=0;var r=rl.exec(t.substring(e));return r?(n.W=+r[0],e+r[0].length):-1}function _o(n,t,e){Gs.lastIndex=0;var r=Gs.exec(t.substring(e));return r?(n.m=Ks.get(r[0].toLowerCase()),e+r[0].length):-1}function bo(n,t,e){Ws.lastIndex=0;var r=Ws.exec(t.substring(e));return r?(n.m=Js.get(r[0].toLowerCase()),e+r[0].length):-1}function wo(n,t,e){return fo(n,tl.c.toString(),t,e)}function So(n,t,e){return fo(n,tl.x.toString(),t,e)}function ko(n,t,e){return fo(n,tl.X.toString(),t,e)}function Eo(n,t,e){rl.lastIndex=0;var r=rl.exec(t.substring(e,e+4));return r?(n.y=+r[0],e+r[0].length):-1}function Ao(n,t,e){rl.lastIndex=0;var r=rl.exec(t.substring(e,e+2));return r?(n.y=No(+r[0]),e+r[0].length):-1}function Co(n,t,e){return/^[+-]\d{4}$/.test(t=t.substring(e,e+5))?(n.Z=+t,e+5):-1}function No(n){return n+(n&gt;68?1900:2e3)}function Lo(n,t,e){rl.lastIndex=0;var r=rl.exec(t.substring(e,e+2));return r?(n.m=r[0]-1,e+r[0].length):-1}function To(n,t,e){rl.lastIndex=0;var r=rl.exec(t.substring(e,e+2));return r?(n.d=+r[0],e+r[0].length):-1}function qo(n,t,e){rl.lastIndex=0;var r=rl.exec(t.substring(e,e+3));return r?(n.j=+r[0],e+r[0].length):-1}function zo(n,t,e){rl.lastIndex=0;var r=rl.exec(t.substring(e,e+2));return r?(n.H=+r[0],e+r[0].length):-1}function Ro(n,t,e){rl.lastIndex=0;var r=rl.exec(t.substring(e,e+2));return r?(n.M=+r[0],e+r[0].length):-1}function Do(n,t,e){rl.lastIndex=0;var r=rl.exec(t.substring(e,e+2));return r?(n.S=+r[0],e+r[0].length):-1}function Po(n,t,e){rl.lastIndex=0;var r=rl.exec(t.substring(e,e+3));return r?(n.L=+r[0],e+r[0].length):-1}function Uo(n,t,e){var r=ul.get(t.substring(e,e+=2).toLowerCase());return null==r?-1:(n.p=r,e)}function jo(n){var t=n.getTimezoneOffset(),e=t&gt;0?&quot;-&quot;:&quot;+&quot;,r=~~(aa(t)/60),u=aa(t)%60;return e+po(r,&quot;0&quot;,2)+po(u,&quot;0&quot;,2)}function Ho(n,t,e){Qs.lastIndex=0;var r=Qs.exec(t.substring(e,e+1));return r?e+r[0].length:-1}function Fo(n){function t(n){try{Ds=ao;var t=new Ds;return t._=n,e(t)}finally{Ds=Date}}var e=lo(n);return t.parse=function(n){try{Ds=ao;var t=e.parse(n);return t&amp;&amp;t._}finally{Ds=Date}},t.toString=e.toString,t}function Oo(n){return n.toISOString()}function Yo(n,t,e){function r(t){return n(t)}function u(n,e){var r=n[1]-n[0],u=r/e,i=$o.bisect(ol,u);return i==ol.length?[t.year,si(n.map(function(n){return n/31536e6}),e)[2]]:i?t[u/ol[i-1]&lt;ol[i]/u?i-1:i]:[ll,si(n,e)[2]]}return r.invert=function(t){return Io(n.invert(t))},r.domain=function(t){return arguments.length?(n.domain(t),r):n.domain().map(Io)},r.nice=function(n,t){function e(e){return!isNaN(e)&amp;&amp;!n.range(e,Io(+e+1),t).length}var i=r.domain(),o=ni(i),a=null==n?u(o,10):&quot;number&quot;==typeof n&amp;&amp;u(o,n);return a&amp;&amp;(n=a[0],t=a[1]),r.domain(ri(i,t&gt;1?{floor:function(t){for(;e(t=n.floor(t));)t=Io(t-1);return t},ceil:function(t){for(;e(t=n.ceil(t));)t=Io(+t+1);return t}}:n))},r.ticks=function(n,t){var e=ni(r.domain()),i=null==n?u(e,10):&quot;number&quot;==typeof n?u(e,n):!n.range&amp;&amp;[{range:n},t];return i&amp;&amp;(n=i[0],t=i[1]),n.range(e[0],Io(+e[1]+1),1&gt;t?1:t)},r.tickFormat=function(){return e},r.copy=function(){return Yo(n.copy(),t,e)},ai(r,n)}function Io(n){return new Date(n)}function Zo(n){return function(t){for(var e=n.length-1,r=n[e];!r[1](t);)r=n[--e];return r[0](t)}}function Vo(n){return JSON.parse(n.responseText)}function Xo(n){var t=Jo.createRange();return t.selectNode(Jo.body),t.createContextualFragment(n.responseText)}var $o={version:&quot;3.3.10&quot;};Date.now||(Date.now=function(){return+new Date});var Bo=[].slice,Wo=function(n){return Bo.call(n)},Jo=document,Go=Jo.documentElement,Ko=window;try{Wo(Go.childNodes)[0].nodeType}catch(Qo){Wo=function(n){for(var t=n.length,e=new Array(t);t--;)e[t]=n[t];return e}}try{Jo.createElement(&quot;div&quot;).style.setProperty(&quot;opacity&quot;,0,&quot;&quot;)}catch(na){var ta=Ko.Element.prototype,ea=ta.setAttribute,ra=ta.setAttributeNS,ua=Ko.CSSStyleDeclaration.prototype,ia=ua.setProperty;ta.setAttribute=function(n,t){ea.call(this,n,t+&quot;&quot;)},ta.setAttributeNS=function(n,t,e){ra.call(this,n,t,e+&quot;&quot;)},ua.setProperty=function(n,t,e){ia.call(this,n,t+&quot;&quot;,e)}}$o.ascending=function(n,t){return t&gt;n?-1:n&gt;t?1:n&gt;=t?0:0/0},$o.descending=function(n,t){return n&gt;t?-1:t&gt;n?1:t&gt;=n?0:0/0},$o.min=function(n,t){var e,r,u=-1,i=n.length;if(1===arguments.length){for(;++u&lt;i&amp;&amp;!(null!=(e=n[u])&amp;&amp;e&gt;=e);)e=void 0;for(;++u&lt;i;)null!=(r=n[u])&amp;&amp;e&gt;r&amp;&amp;(e=r)}else{for(;++u&lt;i&amp;&amp;!(null!=(e=t.call(n,n[u],u))&amp;&amp;e&gt;=e);)e=void 0;for(;++u&lt;i;)null!=(r=t.call(n,n[u],u))&amp;&amp;e&gt;r&amp;&amp;(e=r)}return e},$o.max=function(n,t){var e,r,u=-1,i=n.length;if(1===arguments.length){for(;++u&lt;i&amp;&amp;!(null!=(e=n[u])&amp;&amp;e&gt;=e);)e=void 0;for(;++u&lt;i;)null!=(r=n[u])&amp;&amp;r&gt;e&amp;&amp;(e=r)}else{for(;++u&lt;i&amp;&amp;!(null!=(e=t.call(n,n[u],u))&amp;&amp;e&gt;=e);)e=void 0;for(;++u&lt;i;)null!=(r=t.call(n,n[u],u))&amp;&amp;r&gt;e&amp;&amp;(e=r)}return e},$o.extent=function(n,t){var e,r,u,i=-1,o=n.length;if(1===arguments.length){for(;++i&lt;o&amp;&amp;!(null!=(e=u=n[i])&amp;&amp;e&gt;=e);)e=u=void 0;for(;++i&lt;o;)null!=(r=n[i])&amp;&amp;(e&gt;r&amp;&amp;(e=r),r&gt;u&amp;&amp;(u=r))}else{for(;++i&lt;o&amp;&amp;!(null!=(e=u=t.call(n,n[i],i))&amp;&amp;e&gt;=e);)e=void 0;for(;++i&lt;o;)null!=(r=t.call(n,n[i],i))&amp;&amp;(e&gt;r&amp;&amp;(e=r),r&gt;u&amp;&amp;(u=r))}return[e,u]},$o.sum=function(n,t){var e,r=0,u=n.length,i=-1;if(1===arguments.length)for(;++i&lt;u;)isNaN(e=+n[i])||(r+=e);else for(;++i&lt;u;)isNaN(e=+t.call(n,n[i],i))||(r+=e);return r},$o.mean=function(t,e){var r,u=t.length,i=0,o=-1,a=0;if(1===arguments.length)for(;++o&lt;u;)n(r=t[o])&amp;&amp;(i+=(r-i)/++a);else for(;++o&lt;u;)n(r=e.call(t,t[o],o))&amp;&amp;(i+=(r-i)/++a);return a?i:void 0},$o.quantile=function(n,t){var e=(n.length-1)*t+1,r=Math.floor(e),u=+n[r-1],i=e-r;
return i?u+i*(n[r]-u):u},$o.median=function(t,e){return arguments.length&gt;1&amp;&amp;(t=t.map(e)),t=t.filter(n),t.length?$o.quantile(t.sort($o.ascending),.5):void 0},$o.bisector=function(n){return{left:function(t,e,r,u){for(arguments.length&lt;3&amp;&amp;(r=0),arguments.length&lt;4&amp;&amp;(u=t.length);u&gt;r;){var i=r+u&gt;&gt;&gt;1;n.call(t,t[i],i)&lt;e?r=i+1:u=i}return r},right:function(t,e,r,u){for(arguments.length&lt;3&amp;&amp;(r=0),arguments.length&lt;4&amp;&amp;(u=t.length);u&gt;r;){var i=r+u&gt;&gt;&gt;1;e&lt;n.call(t,t[i],i)?u=i:r=i+1}return r}}};var oa=$o.bisector(function(n){return n});$o.bisectLeft=oa.left,$o.bisect=$o.bisectRight=oa.right,$o.shuffle=function(n){for(var t,e,r=n.length;r;)e=0|Math.random()*r--,t=n[r],n[r]=n[e],n[e]=t;return n},$o.permute=function(n,t){for(var e=t.length,r=new Array(e);e--;)r[e]=n[t[e]];return r},$o.pairs=function(n){for(var t,e=0,r=n.length-1,u=n[0],i=new Array(0&gt;r?0:r);r&gt;e;)i[e]=[t=u,u=n[++e]];return i},$o.zip=function(){if(!(u=arguments.length))return[];for(var n=-1,e=$o.min(arguments,t),r=new Array(e);++n&lt;e;)for(var u,i=-1,o=r[n]=new Array(u);++i&lt;u;)o[i]=arguments[i][n];return r},$o.transpose=function(n){return $o.zip.apply($o,n)},$o.keys=function(n){var t=[];for(var e in n)t.push(e);return t},$o.values=function(n){var t=[];for(var e in n)t.push(n[e]);return t},$o.entries=function(n){var t=[];for(var e in n)t.push({key:e,value:n[e]});return t},$o.merge=function(n){for(var t,e,r,u=n.length,i=-1,o=0;++i&lt;u;)o+=n[i].length;for(e=new Array(o);--u&gt;=0;)for(r=n[u],t=r.length;--t&gt;=0;)e[--o]=r[t];return e};var aa=Math.abs;$o.range=function(n,t,r){if(arguments.length&lt;3&amp;&amp;(r=1,arguments.length&lt;2&amp;&amp;(t=n,n=0)),1/0===(t-n)/r)throw new Error(&quot;infinite range&quot;);var u,i=[],o=e(aa(r)),a=-1;if(n*=o,t*=o,r*=o,0&gt;r)for(;(u=n+r*++a)&gt;t;)i.push(u/o);else for(;(u=n+r*++a)&lt;t;)i.push(u/o);return i},$o.map=function(n){var t=new u;if(n instanceof u)n.forEach(function(n,e){t.set(n,e)});else for(var e in n)t.set(e,n[e]);return t},r(u,{has:function(n){return ca+n in this},get:function(n){return this[ca+n]},set:function(n,t){return this[ca+n]=t},remove:function(n){return n=ca+n,n in this&amp;&amp;delete this[n]},keys:function(){var n=[];return this.forEach(function(t){n.push(t)}),n},values:function(){var n=[];return this.forEach(function(t,e){n.push(e)}),n},entries:function(){var n=[];return this.forEach(function(t,e){n.push({key:t,value:e})}),n},forEach:function(n){for(var t in this)t.charCodeAt(0)===sa&amp;&amp;n.call(this,t.substring(1),this[t])}});var ca=&quot;\x00&quot;,sa=ca.charCodeAt(0);$o.nest=function(){function n(t,a,c){if(c&gt;=o.length)return r?r.call(i,a):e?a.sort(e):a;for(var s,l,f,h,g=-1,p=a.length,v=o[c++],d=new u;++g&lt;p;)(h=d.get(s=v(l=a[g])))?h.push(l):d.set(s,[l]);return t?(l=t(),f=function(e,r){l.set(e,n(t,r,c))}):(l={},f=function(e,r){l[e]=n(t,r,c)}),d.forEach(f),l}function t(n,e){if(e&gt;=o.length)return n;var r=[],u=a[e++];return n.forEach(function(n,u){r.push({key:n,values:t(u,e)})}),u?r.sort(function(n,t){return u(n.key,t.key)}):r}var e,r,i={},o=[],a=[];return i.map=function(t,e){return n(e,t,0)},i.entries=function(e){return t(n($o.map,e,0),0)},i.key=function(n){return o.push(n),i},i.sortKeys=function(n){return a[o.length-1]=n,i},i.sortValues=function(n){return e=n,i},i.rollup=function(n){return r=n,i},i},$o.set=function(n){var t=new i;if(n)for(var e=0,r=n.length;r&gt;e;++e)t.add(n[e]);return t},r(i,{has:function(n){return ca+n in this},add:function(n){return this[ca+n]=!0,n},remove:function(n){return n=ca+n,n in this&amp;&amp;delete this[n]},values:function(){var n=[];return this.forEach(function(t){n.push(t)}),n},forEach:function(n){for(var t in this)t.charCodeAt(0)===sa&amp;&amp;n.call(this,t.substring(1))}}),$o.behavior={},$o.rebind=function(n,t){for(var e,r=1,u=arguments.length;++r&lt;u;)n[e=arguments[r]]=o(n,t,t[e]);return n};var la=[&quot;webkit&quot;,&quot;ms&quot;,&quot;moz&quot;,&quot;Moz&quot;,&quot;o&quot;,&quot;O&quot;];$o.dispatch=function(){for(var n=new s,t=-1,e=arguments.length;++t&lt;e;)n[arguments[t]]=l(n);return n},s.prototype.on=function(n,t){var e=n.indexOf(&quot;.&quot;),r=&quot;&quot;;if(e&gt;=0&amp;&amp;(r=n.substring(e+1),n=n.substring(0,e)),n)return arguments.length&lt;2?this[n].on(r):this[n].on(r,t);if(2===arguments.length){if(null==t)for(n in this)this.hasOwnProperty(n)&amp;&amp;this[n].on(r,null);return this}},$o.event=null,$o.requote=function(n){return n.replace(fa,&quot;\\$&amp;&quot;)};var fa=/[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g,ha={}.__proto__?function(n,t){n.__proto__=t}:function(n,t){for(var e in t)n[e]=t[e]},ga=function(n,t){return t.querySelector(n)},pa=function(n,t){return t.querySelectorAll(n)},va=Go[a(Go,&quot;matchesSelector&quot;)],da=function(n,t){return va.call(n,t)};&quot;function&quot;==typeof Sizzle&amp;&amp;(ga=function(n,t){return Sizzle(n,t)[0]||null},pa=function(n,t){return Sizzle.uniqueSort(Sizzle(n,t))},da=Sizzle.matchesSelector),$o.selection=function(){return Ma};var ma=$o.selection.prototype=[];ma.select=function(n){var t,e,r,u,i=[];n=v(n);for(var o=-1,a=this.length;++o&lt;a;){i.push(t=[]),t.parentNode=(r=this[o]).parentNode;for(var c=-1,s=r.length;++c&lt;s;)(u=r[c])?(t.push(e=n.call(u,u.__data__,c,o)),e&amp;&amp;&quot;__data__&quot;in u&amp;&amp;(e.__data__=u.__data__)):t.push(null)}return p(i)},ma.selectAll=function(n){var t,e,r=[];n=d(n);for(var u=-1,i=this.length;++u&lt;i;)for(var o=this[u],a=-1,c=o.length;++a&lt;c;)(e=o[a])&amp;&amp;(r.push(t=Wo(n.call(e,e.__data__,a,u))),t.parentNode=e);return p(r)};var ya={svg:&quot;http://www.w3.org/2000/svg&quot;,xhtml:&quot;http://www.w3.org/1999/xhtml&quot;,xlink:&quot;http://www.w3.org/1999/xlink&quot;,xml:&quot;http://www.w3.org/XML/1998/namespace&quot;,xmlns:&quot;http://www.w3.org/2000/xmlns/&quot;};$o.ns={prefix:ya,qualify:function(n){var t=n.indexOf(&quot;:&quot;),e=n;return t&gt;=0&amp;&amp;(e=n.substring(0,t),n=n.substring(t+1)),ya.hasOwnProperty(e)?{space:ya[e],local:n}:n}},ma.attr=function(n,t){if(arguments.length&lt;2){if(&quot;string&quot;==typeof n){var e=this.node();return n=$o.ns.qualify(n),n.local?e.getAttributeNS(n.space,n.local):e.getAttribute(n)}for(t in n)this.each(m(t,n[t]));return this}return this.each(m(n,t))},ma.classed=function(n,t){if(arguments.length&lt;2){if(&quot;string&quot;==typeof n){var e=this.node(),r=(n=n.trim().split(/^|\s+/g)).length,u=-1;if(t=e.classList){for(;++u&lt;r;)if(!t.contains(n[u]))return!1}else for(t=e.getAttribute(&quot;class&quot;);++u&lt;r;)if(!x(n[u]).test(t))return!1;return!0}for(t in n)this.each(M(t,n[t]));return this}return this.each(M(n,t))},ma.style=function(n,t,e){var r=arguments.length;if(3&gt;r){if(&quot;string&quot;!=typeof n){2&gt;r&amp;&amp;(t=&quot;&quot;);for(e in n)this.each(b(e,n[e],t));return this}if(2&gt;r)return Ko.getComputedStyle(this.node(),null).getPropertyValue(n);e=&quot;&quot;}return this.each(b(n,t,e))},ma.property=function(n,t){if(arguments.length&lt;2){if(&quot;string&quot;==typeof n)return this.node()[n];for(t in n)this.each(w(t,n[t]));return this}return this.each(w(n,t))},ma.text=function(n){return arguments.length?this.each(&quot;function&quot;==typeof n?function(){var t=n.apply(this,arguments);this.textContent=null==t?&quot;&quot;:t}:null==n?function(){this.textContent=&quot;&quot;}:function(){this.textContent=n}):this.node().textContent},ma.html=function(n){return arguments.length?this.each(&quot;function&quot;==typeof n?function(){var t=n.apply(this,arguments);this.innerHTML=null==t?&quot;&quot;:t}:null==n?function(){this.innerHTML=&quot;&quot;}:function(){this.innerHTML=n}):this.node().innerHTML},ma.append=function(n){return n=S(n),this.select(function(){return this.appendChild(n.apply(this,arguments))})},ma.insert=function(n,t){return n=S(n),t=v(t),this.select(function(){return this.insertBefore(n.apply(this,arguments),t.apply(this,arguments)||null)})},ma.remove=function(){return this.each(function(){var n=this.parentNode;n&amp;&amp;n.removeChild(this)})},ma.data=function(n,t){function e(n,e){var r,i,o,a=n.length,f=e.length,h=Math.min(a,f),g=new Array(f),p=new Array(f),v=new Array(a);if(t){var d,m=new u,y=new u,x=[];for(r=-1;++r&lt;a;)d=t.call(i=n[r],i.__data__,r),m.has(d)?v[r]=i:m.set(d,i),x.push(d);for(r=-1;++r&lt;f;)d=t.call(e,o=e[r],r),(i=m.get(d))?(g[r]=i,i.__data__=o):y.has(d)||(p[r]=k(o)),y.set(d,o),m.remove(d);for(r=-1;++r&lt;a;)m.has(x[r])&amp;&amp;(v[r]=n[r])}else{for(r=-1;++r&lt;h;)i=n[r],o=e[r],i?(i.__data__=o,g[r]=i):p[r]=k(o);for(;f&gt;r;++r)p[r]=k(e[r]);for(;a&gt;r;++r)v[r]=n[r]}p.update=g,p.parentNode=g.parentNode=v.parentNode=n.parentNode,c.push(p),s.push(g),l.push(v)}var r,i,o=-1,a=this.length;if(!arguments.length){for(n=new Array(a=(r=this[0]).length);++o&lt;a;)(i=r[o])&amp;&amp;(n[o]=i.__data__);return n}var c=N([]),s=p([]),l=p([]);if(&quot;function&quot;==typeof n)for(;++o&lt;a;)e(r=this[o],n.call(r,r.parentNode.__data__,o));else for(;++o&lt;a;)e(r=this[o],n);return s.enter=function(){return c},s.exit=function(){return l},s},ma.datum=function(n){return arguments.length?this.property(&quot;__data__&quot;,n):this.property(&quot;__data__&quot;)},ma.filter=function(n){var t,e,r,u=[];&quot;function&quot;!=typeof n&amp;&amp;(n=E(n));for(var i=0,o=this.length;o&gt;i;i++){u.push(t=[]),t.parentNode=(e=this[i]).parentNode;for(var a=0,c=e.length;c&gt;a;a++)(r=e[a])&amp;&amp;n.call(r,r.__data__,a,i)&amp;&amp;t.push(r)}return p(u)},ma.order=function(){for(var n=-1,t=this.length;++n&lt;t;)for(var e,r=this[n],u=r.length-1,i=r[u];--u&gt;=0;)(e=r[u])&amp;&amp;(i&amp;&amp;i!==e.nextSibling&amp;&amp;i.parentNode.insertBefore(e,i),i=e);return this},ma.sort=function(n){n=A.apply(this,arguments);for(var t=-1,e=this.length;++t&lt;e;)this[t].sort(n);return this.order()},ma.each=function(n){return C(this,function(t,e,r){n.call(t,t.__data__,e,r)})},ma.call=function(n){var t=Wo(arguments);return n.apply(t[0]=this,t),this},ma.empty=function(){return!this.node()},ma.node=function(){for(var n=0,t=this.length;t&gt;n;n++)for(var e=this[n],r=0,u=e.length;u&gt;r;r++){var i=e[r];if(i)return i}return null},ma.size=function(){var n=0;return this.each(function(){++n}),n};var xa=[];$o.selection.enter=N,$o.selection.enter.prototype=xa,xa.append=ma.append,xa.empty=ma.empty,xa.node=ma.node,xa.call=ma.call,xa.size=ma.size,xa.select=function(n){for(var t,e,r,u,i,o=[],a=-1,c=this.length;++a&lt;c;){r=(u=this[a]).update,o.push(t=[]),t.parentNode=u.parentNode;for(var s=-1,l=u.length;++s&lt;l;)(i=u[s])?(t.push(r[s]=e=n.call(u.parentNode,i.__data__,s,a)),e.__data__=i.__data__):t.push(null)}return p(o)},xa.insert=function(n,t){return arguments.length&lt;2&amp;&amp;(t=L(this)),ma.insert.call(this,n,t)},ma.transition=function(){for(var n,t,e=Ss||++Ns,r=[],u=ks||{time:Date.now(),ease:Hr,delay:0,duration:250},i=-1,o=this.length;++i&lt;o;){r.push(n=[]);for(var a=this[i],c=-1,s=a.length;++c&lt;s;)(t=a[c])&amp;&amp;uo(t,c,e,u),n.push(t)}return to(r,e)},ma.interrupt=function(){return this.each(T)},$o.select=function(n){var t=[&quot;string&quot;==typeof n?ga(n,Jo):n];return t.parentNode=Go,p([t])},$o.selectAll=function(n){var t=Wo(&quot;string&quot;==typeof n?pa(n,Jo):n);return t.parentNode=Go,p([t])};var Ma=$o.select(Go);ma.on=function(n,t,e){var r=arguments.length;if(3&gt;r){if(&quot;string&quot;!=typeof n){2&gt;r&amp;&amp;(t=!1);for(e in n)this.each(q(e,n[e],t));return this}if(2&gt;r)return(r=this.node()[&quot;__on&quot;+n])&amp;&amp;r._;e=!1}return this.each(q(n,t,e))};var _a=$o.map({mouseenter:&quot;mouseover&quot;,mouseleave:&quot;mouseout&quot;});_a.forEach(function(n){&quot;on&quot;+n in Jo&amp;&amp;_a.remove(n)});var ba=&quot;onselectstart&quot;in Jo?null:a(Go.style,&quot;userSelect&quot;),wa=0;$o.mouse=function(n){return P(n,h())};var Sa=/WebKit/.test(Ko.navigator.userAgent)?-1:0;$o.touches=function(n,t){return arguments.length&lt;2&amp;&amp;(t=h().touches),t?Wo(t).map(function(t){var e=P(n,t);return e.identifier=t.identifier,e}):[]},$o.behavior.drag=function(){function n(){this.on(&quot;mousedown.drag&quot;,o).on(&quot;touchstart.drag&quot;,a)}function t(){return $o.event.changedTouches[0].identifier}function e(n,t){return $o.touches(n).filter(function(n){return n.identifier===t})[0]}function r(n,t,e,r){return function(){function o(){var n=t(l,g),e=n[0]-v[0],r=n[1]-v[1];d|=e|r,v=n,f({type:&quot;drag&quot;,x:n[0]+c[0],y:n[1]+c[1],dx:e,dy:r})}function a(){m.on(e+&quot;.&quot;+p,null).on(r+&quot;.&quot;+p,null),y(d&amp;&amp;$o.event.target===h),f({type:&quot;dragend&quot;})}var c,s=this,l=s.parentNode,f=u.of(s,arguments),h=$o.event.target,g=n(),p=null==g?&quot;drag&quot;:&quot;drag-&quot;+g,v=t(l,g),d=0,m=$o.select(Ko).on(e+&quot;.&quot;+p,o).on(r+&quot;.&quot;+p,a),y=D();i?(c=i.apply(s,arguments),c=[c.x-v[0],c.y-v[1]]):c=[0,0],f({type:&quot;dragstart&quot;})}}var u=g(n,&quot;drag&quot;,&quot;dragstart&quot;,&quot;dragend&quot;),i=null,o=r(c,$o.mouse,&quot;mousemove&quot;,&quot;mouseup&quot;),a=r(t,e,&quot;touchmove&quot;,&quot;touchend&quot;);return n.origin=function(t){return arguments.length?(i=t,n):i},$o.rebind(n,u,&quot;on&quot;)};var ka=Math.PI,Ea=2*ka,Aa=ka/2,Ca=1e-6,Na=Ca*Ca,La=ka/180,Ta=180/ka,qa=Math.SQRT2,za=2,Ra=4;$o.interpolateZoom=function(n,t){function e(n){var t=n*y;if(m){var e=O(v),o=i/(za*h)*(e*Y(qa*t+v)-F(v));return[r+o*s,u+o*l,i*e/O(qa*t+v)]}return[r+n*s,u+n*l,i*Math.exp(qa*t)]}var r=n[0],u=n[1],i=n[2],o=t[0],a=t[1],c=t[2],s=o-r,l=a-u,f=s*s+l*l,h=Math.sqrt(f),g=(c*c-i*i+Ra*f)/(2*i*za*h),p=(c*c-i*i-Ra*f)/(2*c*za*h),v=Math.log(Math.sqrt(g*g+1)-g),d=Math.log(Math.sqrt(p*p+1)-p),m=d-v,y=(m||Math.log(c/i))/qa;return e.duration=1e3*y,e},$o.behavior.zoom=function(){function n(n){n.on(A,s).on(Ua+&quot;.zoom&quot;,h).on(C,p).on(&quot;dblclick.zoom&quot;,v).on(L,l)}function t(n){return[(n[0]-S.x)/S.k,(n[1]-S.y)/S.k]}function e(n){return[n[0]*S.k+S.x,n[1]*S.k+S.y]}function r(n){S.k=Math.max(E[0],Math.min(E[1],n))}function u(n,t){t=e(t),S.x+=n[0]-t[0],S.y+=n[1]-t[1]}function i(){_&amp;&amp;_.domain(M.range().map(function(n){return(n-S.x)/S.k}).map(M.invert)),w&amp;&amp;w.domain(b.range().map(function(n){return(n-S.y)/S.k}).map(b.invert))}function o(n){n({type:&quot;zoomstart&quot;})}function a(n){i(),n({type:&quot;zoom&quot;,scale:S.k,translate:[S.x,S.y]})}function c(n){n({type:&quot;zoomend&quot;})}function s(){function n(){l=1,u($o.mouse(r),h),a(i)}function e(){f.on(C,Ko===r?p:null).on(N,null),g(l&amp;&amp;$o.event.target===s),c(i)}var r=this,i=q.of(r,arguments),s=$o.event.target,l=0,f=$o.select(Ko).on(C,n).on(N,e),h=t($o.mouse(r)),g=D();T.call(r),o(i)}function l(){function n(){var n=$o.touches(p);return g=S.k,n.forEach(function(n){n.identifier in d&amp;&amp;(d[n.identifier]=t(n))}),n}function e(){for(var t=$o.event.changedTouches,e=0,i=t.length;i&gt;e;++e)d[t[e].identifier]=null;var o=n(),c=Date.now();if(1===o.length){if(500&gt;c-x){var s=o[0],l=d[s.identifier];r(2*S.k),u(s,l),f(),a(v)}x=c}else if(o.length&gt;1){var s=o[0],h=o[1],g=s[0]-h[0],p=s[1]-h[1];m=g*g+p*p}}function i(){for(var n,t,e,i,o=$o.touches(p),c=0,s=o.length;s&gt;c;++c,i=null)if(e=o[c],i=d[e.identifier]){if(t)break;n=e,t=i}if(i){var l=(l=e[0]-n[0])*l+(l=e[1]-n[1])*l,f=m&amp;&amp;Math.sqrt(l/m);n=[(n[0]+e[0])/2,(n[1]+e[1])/2],t=[(t[0]+i[0])/2,(t[1]+i[1])/2],r(f*g)}x=null,u(n,t),a(v)}function h(){if($o.event.touches.length){for(var t=$o.event.changedTouches,e=0,r=t.length;r&gt;e;++e)delete d[t[e].identifier];for(var u in d)return void n()}b.on(M,null).on(_,null),w.on(A,s).on(L,l),k(),c(v)}var g,p=this,v=q.of(p,arguments),d={},m=0,y=$o.event.changedTouches[0].identifier,M=&quot;touchmove.zoom-&quot;+y,_=&quot;touchend.zoom-&quot;+y,b=$o.select(Ko).on(M,i).on(_,h),w=$o.select(p).on(A,null).on(L,e),k=D();T.call(p),e(),o(v)}function h(){var n=q.of(this,arguments);y?clearTimeout(y):(T.call(this),o(n)),y=setTimeout(function(){y=null,c(n)},50),f();var e=m||$o.mouse(this);d||(d=t(e)),r(Math.pow(2,.002*Da())*S.k),u(e,d),a(n)}function p(){d=null}function v(){var n=q.of(this,arguments),e=$o.mouse(this),i=t(e),s=Math.log(S.k)/Math.LN2;o(n),r(Math.pow(2,$o.event.shiftKey?Math.ceil(s)-1:Math.floor(s)+1)),u(e,i),a(n),c(n)}var d,m,y,x,M,_,b,w,S={x:0,y:0,k:1},k=[960,500],E=Pa,A=&quot;mousedown.zoom&quot;,C=&quot;mousemove.zoom&quot;,N=&quot;mouseup.zoom&quot;,L=&quot;touchstart.zoom&quot;,q=g(n,&quot;zoomstart&quot;,&quot;zoom&quot;,&quot;zoomend&quot;);return n.event=function(n){n.each(function(){var n=q.of(this,arguments),t=S;Ss?$o.select(this).transition().each(&quot;start.zoom&quot;,function(){S=this.__chart__||{x:0,y:0,k:1},o(n)}).tween(&quot;zoom:zoom&quot;,function(){var e=k[0],r=k[1],u=e/2,i=r/2,o=$o.interpolateZoom([(u-S.x)/S.k,(i-S.y)/S.k,e/S.k],[(u-t.x)/t.k,(i-t.y)/t.k,e/t.k]);return function(t){var r=o(t),c=e/r[2];this.__chart__=S={x:u-r[0]*c,y:i-r[1]*c,k:c},a(n)}}).each(&quot;end.zoom&quot;,function(){c(n)}):(this.__chart__=S,o(n),a(n),c(n))})},n.translate=function(t){return arguments.length?(S={x:+t[0],y:+t[1],k:S.k},i(),n):[S.x,S.y]},n.scale=function(t){return arguments.length?(S={x:S.x,y:S.y,k:+t},i(),n):S.k},n.scaleExtent=function(t){return arguments.length?(E=null==t?Pa:[+t[0],+t[1]],n):E},n.center=function(t){return arguments.length?(m=t&amp;&amp;[+t[0],+t[1]],n):m},n.size=function(t){return arguments.length?(k=t&amp;&amp;[+t[0],+t[1]],n):k},n.x=function(t){return arguments.length?(_=t,M=t.copy(),S={x:0,y:0,k:1},n):_},n.y=function(t){return arguments.length?(w=t,b=t.copy(),S={x:0,y:0,k:1},n):w},$o.rebind(n,q,&quot;on&quot;)};var Da,Pa=[0,1/0],Ua=&quot;onwheel&quot;in Jo?(Da=function(){return-$o.event.deltaY*($o.event.deltaMode?120:1)},&quot;wheel&quot;):&quot;onmousewheel&quot;in Jo?(Da=function(){return $o.event.wheelDelta},&quot;mousewheel&quot;):(Da=function(){return-$o.event.detail},&quot;MozMousePixelScroll&quot;);Z.prototype.toString=function(){return this.rgb()+&quot;&quot;},$o.hsl=function(n,t,e){return 1===arguments.length?n instanceof X?V(n.h,n.s,n.l):st(&quot;&quot;+n,lt,V):V(+n,+t,+e)};var ja=X.prototype=new Z;ja.brighter=function(n){return n=Math.pow(.7,arguments.length?n:1),V(this.h,this.s,this.l/n)},ja.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),V(this.h,this.s,n*this.l)},ja.rgb=function(){return $(this.h,this.s,this.l)},$o.hcl=function(n,t,e){return 1===arguments.length?n instanceof W?B(n.h,n.c,n.l):n instanceof K?nt(n.l,n.a,n.b):nt((n=ft((n=$o.rgb(n)).r,n.g,n.b)).l,n.a,n.b):B(+n,+t,+e)};var Ha=W.prototype=new Z;Ha.brighter=function(n){return B(this.h,this.c,Math.min(100,this.l+Fa*(arguments.length?n:1)))},Ha.darker=function(n){return B(this.h,this.c,Math.max(0,this.l-Fa*(arguments.length?n:1)))},Ha.rgb=function(){return J(this.h,this.c,this.l).rgb()},$o.lab=function(n,t,e){return 1===arguments.length?n instanceof K?G(n.l,n.a,n.b):n instanceof W?J(n.l,n.c,n.h):ft((n=$o.rgb(n)).r,n.g,n.b):G(+n,+t,+e)};var Fa=18,Oa=.95047,Ya=1,Ia=1.08883,Za=K.prototype=new Z;Za.brighter=function(n){return G(Math.min(100,this.l+Fa*(arguments.length?n:1)),this.a,this.b)},Za.darker=function(n){return G(Math.max(0,this.l-Fa*(arguments.length?n:1)),this.a,this.b)},Za.rgb=function(){return Q(this.l,this.a,this.b)},$o.rgb=function(n,t,e){return 1===arguments.length?n instanceof at?ot(n.r,n.g,n.b):st(&quot;&quot;+n,ot,$):ot(~~n,~~t,~~e)};var Va=at.prototype=new Z;Va.brighter=function(n){n=Math.pow(.7,arguments.length?n:1);var t=this.r,e=this.g,r=this.b,u=30;return t||e||r?(t&amp;&amp;u&gt;t&amp;&amp;(t=u),e&amp;&amp;u&gt;e&amp;&amp;(e=u),r&amp;&amp;u&gt;r&amp;&amp;(r=u),ot(Math.min(255,~~(t/n)),Math.min(255,~~(e/n)),Math.min(255,~~(r/n)))):ot(u,u,u)},Va.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),ot(~~(n*this.r),~~(n*this.g),~~(n*this.b))},Va.hsl=function(){return lt(this.r,this.g,this.b)},Va.toString=function(){return&quot;#&quot;+ct(this.r)+ct(this.g)+ct(this.b)};var Xa=$o.map({aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074});Xa.forEach(function(n,t){Xa.set(n,ut(t))}),$o.functor=pt,$o.xhr=dt(vt),$o.dsv=function(n,t){function e(n,e,i){arguments.length&lt;3&amp;&amp;(i=e,e=null);var o=$o.xhr(n,t,i);return o.row=function(n){return arguments.length?o.response(null==(e=n)?r:u(n)):e},o.row(e)}function r(n){return e.parse(n.responseText)}function u(n){return function(t){return e.parse(t.responseText,n)}}function o(t){return t.map(a).join(n)}function a(n){return c.test(n)?&apos;&quot;&apos;+n.replace(/\&quot;/g,&apos;&quot;&quot;&apos;)+&apos;&quot;&apos;:n}var c=new RegExp(&apos;[&quot;&apos;+n+&quot;\n]&quot;),s=n.charCodeAt(0);return e.parse=function(n,t){var r;return e.parseRows(n,function(n,e){if(r)return r(n,e-1);var u=new Function(&quot;d&quot;,&quot;return {&quot;+n.map(function(n,t){return JSON.stringify(n)+&quot;: d[&quot;+t+&quot;]&quot;}).join(&quot;,&quot;)+&quot;}&quot;);r=t?function(n,e){return t(u(n),e)}:u})},e.parseRows=function(n,t){function e(){if(l&gt;=c)return o;if(u)return u=!1,i;var t=l;if(34===n.charCodeAt(t)){for(var e=t;e++&lt;c;)if(34===n.charCodeAt(e)){if(34!==n.charCodeAt(e+1))break;++e}l=e+2;var r=n.charCodeAt(e+1);return 13===r?(u=!0,10===n.charCodeAt(e+2)&amp;&amp;++l):10===r&amp;&amp;(u=!0),n.substring(t+1,e).replace(/&quot;&quot;/g,&apos;&quot;&apos;)}for(;c&gt;l;){var r=n.charCodeAt(l++),a=1;if(10===r)u=!0;else if(13===r)u=!0,10===n.charCodeAt(l)&amp;&amp;(++l,++a);else if(r!==s)continue;return n.substring(t,l-a)}return n.substring(t)}for(var r,u,i={},o={},a=[],c=n.length,l=0,f=0;(r=e())!==o;){for(var h=[];r!==i&amp;&amp;r!==o;)h.push(r),r=e();(!t||(h=t(h,f++)))&amp;&amp;a.push(h)}return a},e.format=function(t){if(Array.isArray(t[0]))return e.formatRows(t);var r=new i,u=[];return t.forEach(function(n){for(var t in n)r.has(t)||u.push(r.add(t))}),[u.map(a).join(n)].concat(t.map(function(t){return u.map(function(n){return a(t[n])}).join(n)})).join(&quot;\n&quot;)},e.formatRows=function(n){return n.map(o).join(&quot;\n&quot;)},e},$o.csv=$o.dsv(&quot;,&quot;,&quot;text/csv&quot;),$o.tsv=$o.dsv(&quot;	&quot;,&quot;text/tab-separated-values&quot;);var $a,Ba,Wa,Ja,Ga,Ka=Ko[a(Ko,&quot;requestAnimationFrame&quot;)]||function(n){setTimeout(n,17)};$o.timer=function(n,t,e){var r=arguments.length;2&gt;r&amp;&amp;(t=0),3&gt;r&amp;&amp;(e=Date.now());var u=e+t,i={c:n,t:u,f:!1,n:null};Ba?Ba.n=i:$a=i,Ba=i,Wa||(Ja=clearTimeout(Ja),Wa=1,Ka(xt))},$o.timer.flush=function(){Mt(),_t()};var Qa=&quot;.&quot;,nc=&quot;,&quot;,tc=[3,3],ec=&quot;$&quot;,rc=[&quot;y&quot;,&quot;z&quot;,&quot;a&quot;,&quot;f&quot;,&quot;p&quot;,&quot;n&quot;,&quot;\xb5&quot;,&quot;m&quot;,&quot;&quot;,&quot;k&quot;,&quot;M&quot;,&quot;G&quot;,&quot;T&quot;,&quot;P&quot;,&quot;E&quot;,&quot;Z&quot;,&quot;Y&quot;].map(bt);$o.formatPrefix=function(n,t){var e=0;return n&amp;&amp;(0&gt;n&amp;&amp;(n*=-1),t&amp;&amp;(n=$o.round(n,wt(n,t))),e=1+Math.floor(1e-12+Math.log(n)/Math.LN10),e=Math.max(-24,Math.min(24,3*Math.floor((0&gt;=e?e+1:e-1)/3)))),rc[8+e/3]},$o.round=function(n,t){return t?Math.round(n*(t=Math.pow(10,t)))/t:Math.round(n)},$o.format=function(n){var t=uc.exec(n),e=t[1]||&quot; &quot;,r=t[2]||&quot;&gt;&quot;,u=t[3]||&quot;&quot;,i=t[4]||&quot;&quot;,o=t[5],a=+t[6],c=t[7],s=t[8],l=t[9],f=1,h=&quot;&quot;,g=!1;switch(s&amp;&amp;(s=+s.substring(1)),(o||&quot;0&quot;===e&amp;&amp;&quot;=&quot;===r)&amp;&amp;(o=e=&quot;0&quot;,r=&quot;=&quot;,c&amp;&amp;(a-=Math.floor((a-1)/4))),l){case&quot;n&quot;:c=!0,l=&quot;g&quot;;break;case&quot;%&quot;:f=100,h=&quot;%&quot;,l=&quot;f&quot;;break;case&quot;p&quot;:f=100,h=&quot;%&quot;,l=&quot;r&quot;;break;case&quot;b&quot;:case&quot;o&quot;:case&quot;x&quot;:case&quot;X&quot;:&quot;#&quot;===i&amp;&amp;(i=&quot;0&quot;+l.toLowerCase());case&quot;c&quot;:case&quot;d&quot;:g=!0,s=0;break;case&quot;s&quot;:f=-1,l=&quot;r&quot;}&quot;#&quot;===i?i=&quot;&quot;:&quot;$&quot;===i&amp;&amp;(i=ec),&quot;r&quot;!=l||s||(l=&quot;g&quot;),null!=s&amp;&amp;(&quot;g&quot;==l?s=Math.max(1,Math.min(21,s)):(&quot;e&quot;==l||&quot;f&quot;==l)&amp;&amp;(s=Math.max(0,Math.min(20,s)))),l=ic.get(l)||St;var p=o&amp;&amp;c;return function(n){if(g&amp;&amp;n%1)return&quot;&quot;;var t=0&gt;n||0===n&amp;&amp;0&gt;1/n?(n=-n,&quot;-&quot;):u;if(0&gt;f){var v=$o.formatPrefix(n,s);n=v.scale(n),h=v.symbol}else n*=f;n=l(n,s);var d=n.lastIndexOf(&quot;.&quot;),m=0&gt;d?n:n.substring(0,d),y=0&gt;d?&quot;&quot;:Qa+n.substring(d+1);!o&amp;&amp;c&amp;&amp;(m=oc(m));var x=i.length+m.length+y.length+(p?0:t.length),M=a&gt;x?new Array(x=a-x+1).join(e):&quot;&quot;;return p&amp;&amp;(m=oc(M+m)),t+=i,n=m+y,(&quot;&lt;&quot;===r?t+n+M:&quot;&gt;&quot;===r?M+t+n:&quot;^&quot;===r?M.substring(0,x&gt;&gt;=1)+t+n+M.substring(x):t+(p?n:M+n))+h}};var uc=/(?:([^{])?([&lt;&gt;=^]))?([+\- ])?([$#])?(0)?(\d+)?(,)?(\.-?\d+)?([a-z%])?/i,ic=$o.map({b:function(n){return n.toString(2)},c:function(n){return String.fromCharCode(n)},o:function(n){return n.toString(8)},x:function(n){return n.toString(16)},X:function(n){return n.toString(16).toUpperCase()},g:function(n,t){return n.toPrecision(t)},e:function(n,t){return n.toExponential(t)},f:function(n,t){return n.toFixed(t)},r:function(n,t){return(n=$o.round(n,wt(n,t))).toFixed(Math.max(0,Math.min(20,wt(n*(1+1e-15),t))))}}),oc=vt;if(tc){var ac=tc.length;oc=function(n){for(var t=n.length,e=[],r=0,u=tc[0];t&gt;0&amp;&amp;u&gt;0;)e.push(n.substring(t-=u,t+u)),u=tc[r=(r+1)%ac];return e.reverse().join(nc)}}$o.geo={},kt.prototype={s:0,t:0,add:function(n){Et(n,this.t,cc),Et(cc.s,this.s,this),this.s?this.t+=cc.t:this.s=cc.t},reset:function(){this.s=this.t=0},valueOf:function(){return this.s}};var cc=new kt;$o.geo.stream=function(n,t){n&amp;&amp;sc.hasOwnProperty(n.type)?sc[n.type](n,t):At(n,t)};var sc={Feature:function(n,t){At(n.geometry,t)},FeatureCollection:function(n,t){for(var e=n.features,r=-1,u=e.length;++r&lt;u;)At(e[r].geometry,t)}},lc={Sphere:function(n,t){t.sphere()},Point:function(n,t){n=n.coordinates,t.point(n[0],n[1],n[2])},MultiPoint:function(n,t){for(var e=n.coordinates,r=-1,u=e.length;++r&lt;u;)n=e[r],t.point(n[0],n[1],n[2])},LineString:function(n,t){Ct(n.coordinates,t,0)},MultiLineString:function(n,t){for(var e=n.coordinates,r=-1,u=e.length;++r&lt;u;)Ct(e[r],t,0)},Polygon:function(n,t){Nt(n.coordinates,t)},MultiPolygon:function(n,t){for(var e=n.coordinates,r=-1,u=e.length;++r&lt;u;)Nt(e[r],t)},GeometryCollection:function(n,t){for(var e=n.geometries,r=-1,u=e.length;++r&lt;u;)At(e[r],t)}};$o.geo.area=function(n){return fc=0,$o.geo.stream(n,gc),fc};var fc,hc=new kt,gc={sphere:function(){fc+=4*ka},point:c,lineStart:c,lineEnd:c,polygonStart:function(){hc.reset(),gc.lineStart=Lt},polygonEnd:function(){var n=2*hc;fc+=0&gt;n?4*ka+n:n,gc.lineStart=gc.lineEnd=gc.point=c}};$o.geo.bounds=function(){function n(n,t){x.push(M=[l=n,h=n]),f&gt;t&amp;&amp;(f=t),t&gt;g&amp;&amp;(g=t)}function t(t,e){var r=Tt([t*La,e*La]);if(m){var u=zt(m,r),i=[u[1],-u[0],0],o=zt(i,u);Pt(o),o=Ut(o);var c=t-p,s=c&gt;0?1:-1,v=o[0]*Ta*s,d=aa(c)&gt;180;if(d^(v&gt;s*p&amp;&amp;s*t&gt;v)){var y=o[1]*Ta;y&gt;g&amp;&amp;(g=y)}else if(v=(v+360)%360-180,d^(v&gt;s*p&amp;&amp;s*t&gt;v)){var y=-o[1]*Ta;f&gt;y&amp;&amp;(f=y)}else f&gt;e&amp;&amp;(f=e),e&gt;g&amp;&amp;(g=e);d?p&gt;t?a(l,t)&gt;a(l,h)&amp;&amp;(h=t):a(t,h)&gt;a(l,h)&amp;&amp;(l=t):h&gt;=l?(l&gt;t&amp;&amp;(l=t),t&gt;h&amp;&amp;(h=t)):t&gt;p?a(l,t)&gt;a(l,h)&amp;&amp;(h=t):a(t,h)&gt;a(l,h)&amp;&amp;(l=t)}else n(t,e);m=r,p=t}function e(){_.point=t}function r(){M[0]=l,M[1]=h,_.point=n,m=null}function u(n,e){if(m){var r=n-p;y+=aa(r)&gt;180?r+(r&gt;0?360:-360):r}else v=n,d=e;gc.point(n,e),t(n,e)}function i(){gc.lineStart()}function o(){u(v,d),gc.lineEnd(),aa(y)&gt;Ca&amp;&amp;(l=-(h=180)),M[0]=l,M[1]=h,m=null}function a(n,t){return(t-=n)&lt;0?t+360:t}function c(n,t){return n[0]-t[0]}function s(n,t){return t[0]&lt;=t[1]?t[0]&lt;=n&amp;&amp;n&lt;=t[1]:n&lt;t[0]||t[1]&lt;n}var l,f,h,g,p,v,d,m,y,x,M,_={point:n,lineStart:e,lineEnd:r,polygonStart:function(){_.point=u,_.lineStart=i,_.lineEnd=o,y=0,gc.polygonStart()},polygonEnd:function(){gc.polygonEnd(),_.point=n,_.lineStart=e,_.lineEnd=r,0&gt;hc?(l=-(h=180),f=-(g=90)):y&gt;Ca?g=90:-Ca&gt;y&amp;&amp;(f=-90),M[0]=l,M[1]=h}};return function(n){g=h=-(l=f=1/0),x=[],$o.geo.stream(n,_);var t=x.length;if(t){x.sort(c);for(var e,r=1,u=x[0],i=[u];t&gt;r;++r)e=x[r],s(e[0],u)||s(e[1],u)?(a(u[0],e[1])&gt;a(u[0],u[1])&amp;&amp;(u[1]=e[1]),a(e[0],u[1])&gt;a(u[0],u[1])&amp;&amp;(u[0]=e[0])):i.push(u=e);for(var o,e,p=-1/0,t=i.length-1,r=0,u=i[t];t&gt;=r;u=e,++r)e=i[r],(o=a(u[1],e[0]))&gt;p&amp;&amp;(p=o,l=e[0],h=u[1])}return x=M=null,1/0===l||1/0===f?[[0/0,0/0],[0/0,0/0]]:[[l,f],[h,g]]}}(),$o.geo.centroid=function(n){pc=vc=dc=mc=yc=xc=Mc=_c=bc=wc=Sc=0,$o.geo.stream(n,kc);var t=bc,e=wc,r=Sc,u=t*t+e*e+r*r;return Na&gt;u&amp;&amp;(t=xc,e=Mc,r=_c,Ca&gt;vc&amp;&amp;(t=dc,e=mc,r=yc),u=t*t+e*e+r*r,Na&gt;u)?[0/0,0/0]:[Math.atan2(e,t)*Ta,H(r/Math.sqrt(u))*Ta]};var pc,vc,dc,mc,yc,xc,Mc,_c,bc,wc,Sc,kc={sphere:c,point:Ht,lineStart:Ot,lineEnd:Yt,polygonStart:function(){kc.lineStart=It},polygonEnd:function(){kc.lineStart=Ot}},Ec=Bt(Zt,Qt,te,[-ka,-ka/2]),Ac=1e9;$o.geo.clipExtent=function(){var n,t,e,r,u,i,o={stream:function(n){return u&amp;&amp;(u.valid=!1),u=i(n),u.valid=!0,u},extent:function(a){return arguments.length?(i=ue(n=+a[0][0],t=+a[0][1],e=+a[1][0],r=+a[1][1]),u&amp;&amp;(u.valid=!1,u=null),o):[[n,t],[e,r]]}};return o.extent([[0,0],[960,500]])},($o.geo.conicEqualArea=function(){return oe(ae)}).raw=ae,$o.geo.albers=function(){return $o.geo.conicEqualArea().rotate([96,0]).center([-.6,38.7]).parallels([29.5,45.5]).scale(1070)},$o.geo.albersUsa=function(){function n(n){var i=n[0],o=n[1];return t=null,e(i,o),t||(r(i,o),t)||u(i,o),t}var t,e,r,u,i=$o.geo.albers(),o=$o.geo.conicEqualArea().rotate([154,0]).center([-2,58.5]).parallels([55,65]),a=$o.geo.conicEqualArea().rotate([157,0]).center([-3,19.9]).parallels([8,18]),c={point:function(n,e){t=[n,e]}};return n.invert=function(n){var t=i.scale(),e=i.translate(),r=(n[0]-e[0])/t,u=(n[1]-e[1])/t;return(u&gt;=.12&amp;&amp;.234&gt;u&amp;&amp;r&gt;=-.425&amp;&amp;-.214&gt;r?o:u&gt;=.166&amp;&amp;.234&gt;u&amp;&amp;r&gt;=-.214&amp;&amp;-.115&gt;r?a:i).invert(n)},n.stream=function(n){var t=i.stream(n),e=o.stream(n),r=a.stream(n);return{point:function(n,u){t.point(n,u),e.point(n,u),r.point(n,u)},sphere:function(){t.sphere(),e.sphere(),r.sphere()},lineStart:function(){t.lineStart(),e.lineStart(),r.lineStart()},lineEnd:function(){t.lineEnd(),e.lineEnd(),r.lineEnd()},polygonStart:function(){t.polygonStart(),e.polygonStart(),r.polygonStart()},polygonEnd:function(){t.polygonEnd(),e.polygonEnd(),r.polygonEnd()}}},n.precision=function(t){return arguments.length?(i.precision(t),o.precision(t),a.precision(t),n):i.precision()},n.scale=function(t){return arguments.length?(i.scale(t),o.scale(.35*t),a.scale(t),n.translate(i.translate())):i.scale()},n.translate=function(t){if(!arguments.length)return i.translate();var s=i.scale(),l=+t[0],f=+t[1];return e=i.translate(t).clipExtent([[l-.455*s,f-.238*s],[l+.455*s,f+.238*s]]).stream(c).point,r=o.translate([l-.307*s,f+.201*s]).clipExtent([[l-.425*s+Ca,f+.12*s+Ca],[l-.214*s-Ca,f+.234*s-Ca]]).stream(c).point,u=a.translate([l-.205*s,f+.212*s]).clipExtent([[l-.214*s+Ca,f+.166*s+Ca],[l-.115*s-Ca,f+.234*s-Ca]]).stream(c).point,n},n.scale(1070)};var Cc,Nc,Lc,Tc,qc,zc,Rc={point:c,lineStart:c,lineEnd:c,polygonStart:function(){Nc=0,Rc.lineStart=ce},polygonEnd:function(){Rc.lineStart=Rc.lineEnd=Rc.point=c,Cc+=aa(Nc/2)}},Dc={point:se,lineStart:c,lineEnd:c,polygonStart:c,polygonEnd:c},Pc={point:he,lineStart:ge,lineEnd:pe,polygonStart:function(){Pc.lineStart=ve},polygonEnd:function(){Pc.point=he,Pc.lineStart=ge,Pc.lineEnd=pe}};$o.geo.path=function(){function n(n){return n&amp;&amp;(&quot;function&quot;==typeof a&amp;&amp;i.pointRadius(+a.apply(this,arguments)),o&amp;&amp;o.valid||(o=u(i)),$o.geo.stream(n,o)),i.result()}function t(){return o=null,n}var e,r,u,i,o,a=4.5;return n.area=function(n){return Cc=0,$o.geo.stream(n,u(Rc)),Cc},n.centroid=function(n){return dc=mc=yc=xc=Mc=_c=bc=wc=Sc=0,$o.geo.stream(n,u(Pc)),Sc?[bc/Sc,wc/Sc]:_c?[xc/_c,Mc/_c]:yc?[dc/yc,mc/yc]:[0/0,0/0]},n.bounds=function(n){return qc=zc=-(Lc=Tc=1/0),$o.geo.stream(n,u(Dc)),[[Lc,Tc],[qc,zc]]},n.projection=function(n){return arguments.length?(u=(e=n)?n.stream||ye(n):vt,t()):e},n.context=function(n){return arguments.length?(i=null==(r=n)?new le:new de(n),&quot;function&quot;!=typeof a&amp;&amp;i.pointRadius(a),t()):r},n.pointRadius=function(t){return arguments.length?(a=&quot;function&quot;==typeof t?t:(i.pointRadius(+t),+t),n):a},n.projection($o.geo.albersUsa()).context(null)},$o.geo.transform=function(n){return{stream:function(t){var e=new xe(t);for(var r in n)e[r]=n[r];return e}}},xe.prototype={point:function(n,t){this.stream.point(n,t)},sphere:function(){this.stream.sphere()},lineStart:function(){this.stream.lineStart()
},lineEnd:function(){this.stream.lineEnd()},polygonStart:function(){this.stream.polygonStart()},polygonEnd:function(){this.stream.polygonEnd()}},$o.geo.projection=_e,$o.geo.projectionMutator=be,($o.geo.equirectangular=function(){return _e(Se)}).raw=Se.invert=Se,$o.geo.rotation=function(n){function t(t){return t=n(t[0]*La,t[1]*La),t[0]*=Ta,t[1]*=Ta,t}return n=Ee(n[0]%360*La,n[1]*La,n.length&gt;2?n[2]*La:0),t.invert=function(t){return t=n.invert(t[0]*La,t[1]*La),t[0]*=Ta,t[1]*=Ta,t},t},ke.invert=Se,$o.geo.circle=function(){function n(){var n=&quot;function&quot;==typeof r?r.apply(this,arguments):r,t=Ee(-n[0]*La,-n[1]*La,0).invert,u=[];return e(null,null,1,{point:function(n,e){u.push(n=t(n,e)),n[0]*=Ta,n[1]*=Ta}}),{type:&quot;Polygon&quot;,coordinates:[u]}}var t,e,r=[0,0],u=6;return n.origin=function(t){return arguments.length?(r=t,n):r},n.angle=function(r){return arguments.length?(e=Le((t=+r)*La,u*La),n):t},n.precision=function(r){return arguments.length?(e=Le(t*La,(u=+r)*La),n):u},n.angle(90)},$o.geo.distance=function(n,t){var e,r=(t[0]-n[0])*La,u=n[1]*La,i=t[1]*La,o=Math.sin(r),a=Math.cos(r),c=Math.sin(u),s=Math.cos(u),l=Math.sin(i),f=Math.cos(i);return Math.atan2(Math.sqrt((e=f*o)*e+(e=s*l-c*f*a)*e),c*l+s*f*a)},$o.geo.graticule=function(){function n(){return{type:&quot;MultiLineString&quot;,coordinates:t()}}function t(){return $o.range(Math.ceil(i/d)*d,u,d).map(h).concat($o.range(Math.ceil(s/m)*m,c,m).map(g)).concat($o.range(Math.ceil(r/p)*p,e,p).filter(function(n){return aa(n%d)&gt;Ca}).map(l)).concat($o.range(Math.ceil(a/v)*v,o,v).filter(function(n){return aa(n%m)&gt;Ca}).map(f))}var e,r,u,i,o,a,c,s,l,f,h,g,p=10,v=p,d=90,m=360,y=2.5;return n.lines=function(){return t().map(function(n){return{type:&quot;LineString&quot;,coordinates:n}})},n.outline=function(){return{type:&quot;Polygon&quot;,coordinates:[h(i).concat(g(c).slice(1),h(u).reverse().slice(1),g(s).reverse().slice(1))]}},n.extent=function(t){return arguments.length?n.majorExtent(t).minorExtent(t):n.minorExtent()},n.majorExtent=function(t){return arguments.length?(i=+t[0][0],u=+t[1][0],s=+t[0][1],c=+t[1][1],i&gt;u&amp;&amp;(t=i,i=u,u=t),s&gt;c&amp;&amp;(t=s,s=c,c=t),n.precision(y)):[[i,s],[u,c]]},n.minorExtent=function(t){return arguments.length?(r=+t[0][0],e=+t[1][0],a=+t[0][1],o=+t[1][1],r&gt;e&amp;&amp;(t=r,r=e,e=t),a&gt;o&amp;&amp;(t=a,a=o,o=t),n.precision(y)):[[r,a],[e,o]]},n.step=function(t){return arguments.length?n.majorStep(t).minorStep(t):n.minorStep()},n.majorStep=function(t){return arguments.length?(d=+t[0],m=+t[1],n):[d,m]},n.minorStep=function(t){return arguments.length?(p=+t[0],v=+t[1],n):[p,v]},n.precision=function(t){return arguments.length?(y=+t,l=qe(a,o,90),f=ze(r,e,y),h=qe(s,c,90),g=ze(i,u,y),n):y},n.majorExtent([[-180,-90+Ca],[180,90-Ca]]).minorExtent([[-180,-80-Ca],[180,80+Ca]])},$o.geo.greatArc=function(){function n(){return{type:&quot;LineString&quot;,coordinates:[t||r.apply(this,arguments),e||u.apply(this,arguments)]}}var t,e,r=Re,u=De;return n.distance=function(){return $o.geo.distance(t||r.apply(this,arguments),e||u.apply(this,arguments))},n.source=function(e){return arguments.length?(r=e,t=&quot;function&quot;==typeof e?null:e,n):r},n.target=function(t){return arguments.length?(u=t,e=&quot;function&quot;==typeof t?null:t,n):u},n.precision=function(){return arguments.length?n:0},n},$o.geo.interpolate=function(n,t){return Pe(n[0]*La,n[1]*La,t[0]*La,t[1]*La)},$o.geo.length=function(n){return Uc=0,$o.geo.stream(n,jc),Uc};var Uc,jc={sphere:c,point:c,lineStart:Ue,lineEnd:c,polygonStart:c,polygonEnd:c},Hc=je(function(n){return Math.sqrt(2/(1+n))},function(n){return 2*Math.asin(n/2)});($o.geo.azimuthalEqualArea=function(){return _e(Hc)}).raw=Hc;var Fc=je(function(n){var t=Math.acos(n);return t&amp;&amp;t/Math.sin(t)},vt);($o.geo.azimuthalEquidistant=function(){return _e(Fc)}).raw=Fc,($o.geo.conicConformal=function(){return oe(He)}).raw=He,($o.geo.conicEquidistant=function(){return oe(Fe)}).raw=Fe;var Oc=je(function(n){return 1/n},Math.atan);($o.geo.gnomonic=function(){return _e(Oc)}).raw=Oc,Oe.invert=function(n,t){return[n,2*Math.atan(Math.exp(t))-Aa]},($o.geo.mercator=function(){return Ye(Oe)}).raw=Oe;var Yc=je(function(){return 1},Math.asin);($o.geo.orthographic=function(){return _e(Yc)}).raw=Yc;var Ic=je(function(n){return 1/(1+n)},function(n){return 2*Math.atan(n)});($o.geo.stereographic=function(){return _e(Ic)}).raw=Ic,Ie.invert=function(n,t){return[Math.atan2(F(n),Math.cos(t)),H(Math.sin(t)/O(n))]},($o.geo.transverseMercator=function(){return Ye(Ie)}).raw=Ie,$o.geom={},$o.geom.hull=function(n){function t(n){if(n.length&lt;3)return[];var t,u,i,o,a,c,s,l,f,h,g,p,v=pt(e),d=pt(r),m=n.length,y=m-1,x=[],M=[],_=0;if(v===Ze&amp;&amp;r===Ve)t=n;else for(i=0,t=[];m&gt;i;++i)t.push([+v.call(this,u=n[i],i),+d.call(this,u,i)]);for(i=1;m&gt;i;++i)(t[i][1]&lt;t[_][1]||t[i][1]==t[_][1]&amp;&amp;t[i][0]&lt;t[_][0])&amp;&amp;(_=i);for(i=0;m&gt;i;++i)i!==_&amp;&amp;(c=t[i][1]-t[_][1],a=t[i][0]-t[_][0],x.push({angle:Math.atan2(c,a),index:i}));for(x.sort(function(n,t){return n.angle-t.angle}),g=x[0].angle,h=x[0].index,f=0,i=1;y&gt;i;++i){if(o=x[i].index,g==x[i].angle){if(a=t[h][0]-t[_][0],c=t[h][1]-t[_][1],s=t[o][0]-t[_][0],l=t[o][1]-t[_][1],a*a+c*c&gt;=s*s+l*l){x[i].index=-1;continue}x[f].index=-1}g=x[i].angle,f=i,h=o}for(M.push(_),i=0,o=0;2&gt;i;++o)x[o].index&gt;-1&amp;&amp;(M.push(x[o].index),i++);for(p=M.length;y&gt;o;++o)if(!(x[o].index&lt;0)){for(;!Xe(M[p-2],M[p-1],x[o].index,t);)--p;M[p++]=x[o].index}var b=[];for(i=p-1;i&gt;=0;--i)b.push(n[M[i]]);return b}var e=Ze,r=Ve;return arguments.length?t(n):(t.x=function(n){return arguments.length?(e=n,t):e},t.y=function(n){return arguments.length?(r=n,t):r},t)},$o.geom.polygon=function(n){return ha(n,Zc),n};var Zc=$o.geom.polygon.prototype=[];Zc.area=function(){for(var n,t=-1,e=this.length,r=this[e-1],u=0;++t&lt;e;)n=r,r=this[t],u+=n[1]*r[0]-n[0]*r[1];return.5*u},Zc.centroid=function(n){var t,e,r=-1,u=this.length,i=0,o=0,a=this[u-1];for(arguments.length||(n=-1/(6*this.area()));++r&lt;u;)t=a,a=this[r],e=t[0]*a[1]-a[0]*t[1],i+=(t[0]+a[0])*e,o+=(t[1]+a[1])*e;return[i*n,o*n]},Zc.clip=function(n){for(var t,e,r,u,i,o,a=We(n),c=-1,s=this.length-We(this),l=this[s-1];++c&lt;s;){for(t=n.slice(),n.length=0,u=this[c],i=t[(r=t.length-a)-1],e=-1;++e&lt;r;)o=t[e],$e(o,l,u)?($e(i,l,u)||n.push(Be(i,o,l,u)),n.push(o)):$e(i,l,u)&amp;&amp;n.push(Be(i,o,l,u)),i=o;a&amp;&amp;n.push(n[0]),l=u}return n};var Vc,Xc,$c,Bc,Wc,Jc=[],Gc=[];rr.prototype.prepare=function(){for(var n,t=this.edges,e=t.length;e--;)n=t[e].edge,n.b&amp;&amp;n.a||t.splice(e,1);return t.sort(ir),t.length},vr.prototype={start:function(){return this.edge.l===this.site?this.edge.a:this.edge.b},end:function(){return this.edge.l===this.site?this.edge.b:this.edge.a}},dr.prototype={insert:function(n,t){var e,r,u;if(n){if(t.P=n,t.N=n.N,n.N&amp;&amp;(n.N.P=t),n.N=t,n.R){for(n=n.R;n.L;)n=n.L;n.L=t}else n.R=t;e=n}else this._?(n=Mr(this._),t.P=null,t.N=n,n.P=n.L=t,e=n):(t.P=t.N=null,this._=t,e=null);for(t.L=t.R=null,t.U=e,t.C=!0,n=t;e&amp;&amp;e.C;)r=e.U,e===r.L?(u=r.R,u&amp;&amp;u.C?(e.C=u.C=!1,r.C=!0,n=r):(n===e.R&amp;&amp;(yr(this,e),n=e,e=n.U),e.C=!1,r.C=!0,xr(this,r))):(u=r.L,u&amp;&amp;u.C?(e.C=u.C=!1,r.C=!0,n=r):(n===e.L&amp;&amp;(xr(this,e),n=e,e=n.U),e.C=!1,r.C=!0,yr(this,r))),e=n.U;this._.C=!1},remove:function(n){n.N&amp;&amp;(n.N.P=n.P),n.P&amp;&amp;(n.P.N=n.N),n.N=n.P=null;var t,e,r,u=n.U,i=n.L,o=n.R;if(e=i?o?Mr(o):i:o,u?u.L===n?u.L=e:u.R=e:this._=e,i&amp;&amp;o?(r=e.C,e.C=n.C,e.L=i,i.U=e,e!==o?(u=e.U,e.U=n.U,n=e.R,u.L=n,e.R=o,o.U=e):(e.U=u,u=e,n=e.R)):(r=n.C,n=e),n&amp;&amp;(n.U=u),!r){if(n&amp;&amp;n.C)return n.C=!1,void 0;do{if(n===this._)break;if(n===u.L){if(t=u.R,t.C&amp;&amp;(t.C=!1,u.C=!0,yr(this,u),t=u.R),t.L&amp;&amp;t.L.C||t.R&amp;&amp;t.R.C){t.R&amp;&amp;t.R.C||(t.L.C=!1,t.C=!0,xr(this,t),t=u.R),t.C=u.C,u.C=t.R.C=!1,yr(this,u),n=this._;break}}else if(t=u.L,t.C&amp;&amp;(t.C=!1,u.C=!0,xr(this,u),t=u.L),t.L&amp;&amp;t.L.C||t.R&amp;&amp;t.R.C){t.L&amp;&amp;t.L.C||(t.R.C=!1,t.C=!0,yr(this,t),t=u.L),t.C=u.C,u.C=t.L.C=!1,xr(this,u),n=this._;break}t.C=!0,n=u,u=u.U}while(!n.C);n&amp;&amp;(n.C=!1)}}},$o.geom.voronoi=function(n){function t(n){var t=new Array(n.length),r=a[0][0],u=a[0][1],i=a[1][0],o=a[1][1];return _r(e(n),a).cells.forEach(function(e,a){var c=e.edges,s=e.site,l=t[a]=c.length?c.map(function(n){var t=n.start();return[t.x,t.y]}):s.x&gt;=r&amp;&amp;s.x&lt;=i&amp;&amp;s.y&gt;=u&amp;&amp;s.y&lt;=o?[[r,o],[i,o],[i,u],[r,u]]:[];l.point=n[a]}),t}function e(n){return n.map(function(n,t){return{x:Math.round(i(n,t)/Ca)*Ca,y:Math.round(o(n,t)/Ca)*Ca,i:t}})}var r=Ze,u=Ve,i=r,o=u,a=Kc;return n?t(n):(t.links=function(n){return _r(e(n)).edges.filter(function(n){return n.l&amp;&amp;n.r}).map(function(t){return{source:n[t.l.i],target:n[t.r.i]}})},t.triangles=function(n){var t=[];return _r(e(n)).cells.forEach(function(e,r){for(var u,i,o=e.site,a=e.edges.sort(ir),c=-1,s=a.length,l=a[s-1].edge,f=l.l===o?l.r:l.l;++c&lt;s;)u=l,i=f,l=a[c].edge,f=l.l===o?l.r:l.l,r&lt;i.i&amp;&amp;r&lt;f.i&amp;&amp;wr(o,i,f)&lt;0&amp;&amp;t.push([n[r],n[i.i],n[f.i]])}),t},t.x=function(n){return arguments.length?(i=pt(r=n),t):r},t.y=function(n){return arguments.length?(o=pt(u=n),t):u},t.clipExtent=function(n){return arguments.length?(a=null==n?Kc:n,t):a===Kc?null:a},t.size=function(n){return arguments.length?t.clipExtent(n&amp;&amp;[[0,0],n]):a===Kc?null:a&amp;&amp;a[1]},t)};var Kc=[[-1e6,-1e6],[1e6,1e6]];$o.geom.delaunay=function(n){return $o.geom.voronoi().triangles(n)},$o.geom.quadtree=function(n,t,e,r,u){function i(n){function i(n,t,e,r,u,i,o,a){if(!isNaN(e)&amp;&amp;!isNaN(r))if(n.leaf){var c=n.x,l=n.y;if(null!=c)if(aa(c-e)+aa(l-r)&lt;.01)s(n,t,e,r,u,i,o,a);else{var f=n.point;n.x=n.y=n.point=null,s(n,f,c,l,u,i,o,a),s(n,t,e,r,u,i,o,a)}else n.x=e,n.y=r,n.point=t}else s(n,t,e,r,u,i,o,a)}function s(n,t,e,r,u,o,a,c){var s=.5*(u+a),l=.5*(o+c),f=e&gt;=s,h=r&gt;=l,g=(h&lt;&lt;1)+f;n.leaf=!1,n=n.nodes[g]||(n.nodes[g]=Er()),f?u=s:a=s,h?o=l:c=l,i(n,t,e,r,u,o,a,c)}var l,f,h,g,p,v,d,m,y,x=pt(a),M=pt(c);if(null!=t)v=t,d=e,m=r,y=u;else if(m=y=-(v=d=1/0),f=[],h=[],p=n.length,o)for(g=0;p&gt;g;++g)l=n[g],l.x&lt;v&amp;&amp;(v=l.x),l.y&lt;d&amp;&amp;(d=l.y),l.x&gt;m&amp;&amp;(m=l.x),l.y&gt;y&amp;&amp;(y=l.y),f.push(l.x),h.push(l.y);else for(g=0;p&gt;g;++g){var _=+x(l=n[g],g),b=+M(l,g);v&gt;_&amp;&amp;(v=_),d&gt;b&amp;&amp;(d=b),_&gt;m&amp;&amp;(m=_),b&gt;y&amp;&amp;(y=b),f.push(_),h.push(b)}var w=m-v,S=y-d;w&gt;S?y=d+w:m=v+S;var k=Er();if(k.add=function(n){i(k,n,+x(n,++g),+M(n,g),v,d,m,y)},k.visit=function(n){Ar(n,k,v,d,m,y)},g=-1,null==t){for(;++g&lt;p;)i(k,n[g],f[g],h[g],v,d,m,y);--g}else n.forEach(k.add);return f=h=n=l=null,k}var o,a=Ze,c=Ve;return(o=arguments.length)?(a=Sr,c=kr,3===o&amp;&amp;(u=e,r=t,e=t=0),i(n)):(i.x=function(n){return arguments.length?(a=n,i):a},i.y=function(n){return arguments.length?(c=n,i):c},i.extent=function(n){return arguments.length?(null==n?t=e=r=u=null:(t=+n[0][0],e=+n[0][1],r=+n[1][0],u=+n[1][1]),i):null==t?null:[[t,e],[r,u]]},i.size=function(n){return arguments.length?(null==n?t=e=r=u=null:(t=e=0,r=+n[0],u=+n[1]),i):null==t?null:[r-t,u-e]},i)},$o.interpolateRgb=Cr,$o.interpolateObject=Nr,$o.interpolateNumber=Lr,$o.interpolateString=Tr;var Qc=/[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g;$o.interpolate=qr,$o.interpolators=[function(n,t){var e=typeof t;return(&quot;string&quot;===e?Xa.has(t)||/^(#|rgb\(|hsl\()/.test(t)?Cr:Tr:t instanceof Z?Cr:&quot;object&quot;===e?Array.isArray(t)?zr:Nr:Lr)(n,t)}],$o.interpolateArray=zr;var ns=function(){return vt},ts=$o.map({linear:ns,poly:Fr,quad:function(){return Ur},cubic:function(){return jr},sin:function(){return Or},exp:function(){return Yr},circle:function(){return Ir},elastic:Zr,back:Vr,bounce:function(){return Xr}}),es=$o.map({&quot;in&quot;:vt,out:Dr,&quot;in-out&quot;:Pr,&quot;out-in&quot;:function(n){return Pr(Dr(n))}});$o.ease=function(n){var t=n.indexOf(&quot;-&quot;),e=t&gt;=0?n.substring(0,t):n,r=t&gt;=0?n.substring(t+1):&quot;in&quot;;return e=ts.get(e)||ns,r=es.get(r)||vt,Rr(r(e.apply(null,Bo.call(arguments,1))))},$o.interpolateHcl=$r,$o.interpolateHsl=Br,$o.interpolateLab=Wr,$o.interpolateRound=Jr,$o.transform=function(n){var t=Jo.createElementNS($o.ns.prefix.svg,&quot;g&quot;);return($o.transform=function(n){if(null!=n){t.setAttribute(&quot;transform&quot;,n);var e=t.transform.baseVal.consolidate()}return new Gr(e?e.matrix:rs)})(n)},Gr.prototype.toString=function(){return&quot;translate(&quot;+this.translate+&quot;)rotate(&quot;+this.rotate+&quot;)skewX(&quot;+this.skew+&quot;)scale(&quot;+this.scale+&quot;)&quot;};var rs={a:1,b:0,c:0,d:1,e:0,f:0};$o.interpolateTransform=tu,$o.layout={},$o.layout.bundle=function(){return function(n){for(var t=[],e=-1,r=n.length;++e&lt;r;)t.push(uu(n[e]));return t}},$o.layout.chord=function(){function n(){var n,s,f,h,g,p={},v=[],d=$o.range(i),m=[];for(e=[],r=[],n=0,h=-1;++h&lt;i;){for(s=0,g=-1;++g&lt;i;)s+=u[h][g];v.push(s),m.push($o.range(i)),n+=s}for(o&amp;&amp;d.sort(function(n,t){return o(v[n],v[t])}),a&amp;&amp;m.forEach(function(n,t){n.sort(function(n,e){return a(u[t][n],u[t][e])})}),n=(Ea-l*i)/n,s=0,h=-1;++h&lt;i;){for(f=s,g=-1;++g&lt;i;){var y=d[h],x=m[y][g],M=u[y][x],_=s,b=s+=M*n;p[y+&quot;-&quot;+x]={index:y,subindex:x,startAngle:_,endAngle:b,value:M}}r[y]={index:y,startAngle:f,endAngle:s,value:(s-f)/n},s+=l}for(h=-1;++h&lt;i;)for(g=h-1;++g&lt;i;){var w=p[h+&quot;-&quot;+g],S=p[g+&quot;-&quot;+h];(w.value||S.value)&amp;&amp;e.push(w.value&lt;S.value?{source:S,target:w}:{source:w,target:S})}c&amp;&amp;t()}function t(){e.sort(function(n,t){return c((n.source.value+n.target.value)/2,(t.source.value+t.target.value)/2)})}var e,r,u,i,o,a,c,s={},l=0;return s.matrix=function(n){return arguments.length?(i=(u=n)&amp;&amp;u.length,e=r=null,s):u},s.padding=function(n){return arguments.length?(l=n,e=r=null,s):l},s.sortGroups=function(n){return arguments.length?(o=n,e=r=null,s):o},s.sortSubgroups=function(n){return arguments.length?(a=n,e=null,s):a},s.sortChords=function(n){return arguments.length?(c=n,e&amp;&amp;t(),s):c},s.chords=function(){return e||n(),e},s.groups=function(){return r||n(),r},s},$o.layout.force=function(){function n(n){return function(t,e,r,u){if(t.point!==n){var i=t.cx-n.x,o=t.cy-n.y,a=1/Math.sqrt(i*i+o*o);if(v&gt;(u-e)*a){var c=t.charge*a*a;return n.px-=i*c,n.py-=o*c,!0}if(t.point&amp;&amp;isFinite(a)){var c=t.pointCharge*a*a;n.px-=i*c,n.py-=o*c}}return!t.charge}}function t(n){n.px=$o.event.x,n.py=$o.event.y,a.resume()}var e,r,u,i,o,a={},c=$o.dispatch(&quot;start&quot;,&quot;tick&quot;,&quot;end&quot;),s=[1,1],l=.9,f=us,h=is,g=-30,p=.1,v=.8,d=[],m=[];return a.tick=function(){if((r*=.99)&lt;.005)return c.end({type:&quot;end&quot;,alpha:r=0}),!0;var t,e,a,f,h,v,y,x,M,_=d.length,b=m.length;for(e=0;b&gt;e;++e)a=m[e],f=a.source,h=a.target,x=h.x-f.x,M=h.y-f.y,(v=x*x+M*M)&amp;&amp;(v=r*i[e]*((v=Math.sqrt(v))-u[e])/v,x*=v,M*=v,h.x-=x*(y=f.weight/(h.weight+f.weight)),h.y-=M*y,f.x+=x*(y=1-y),f.y+=M*y);if((y=r*p)&amp;&amp;(x=s[0]/2,M=s[1]/2,e=-1,y))for(;++e&lt;_;)a=d[e],a.x+=(x-a.x)*y,a.y+=(M-a.y)*y;if(g)for(fu(t=$o.geom.quadtree(d),r,o),e=-1;++e&lt;_;)(a=d[e]).fixed||t.visit(n(a));for(e=-1;++e&lt;_;)a=d[e],a.fixed?(a.x=a.px,a.y=a.py):(a.x-=(a.px-(a.px=a.x))*l,a.y-=(a.py-(a.py=a.y))*l);c.tick({type:&quot;tick&quot;,alpha:r})},a.nodes=function(n){return arguments.length?(d=n,a):d},a.links=function(n){return arguments.length?(m=n,a):m},a.size=function(n){return arguments.length?(s=n,a):s},a.linkDistance=function(n){return arguments.length?(f=&quot;function&quot;==typeof n?n:+n,a):f},a.distance=a.linkDistance,a.linkStrength=function(n){return arguments.length?(h=&quot;function&quot;==typeof n?n:+n,a):h},a.friction=function(n){return arguments.length?(l=+n,a):l},a.charge=function(n){return arguments.length?(g=&quot;function&quot;==typeof n?n:+n,a):g},a.gravity=function(n){return arguments.length?(p=+n,a):p},a.theta=function(n){return arguments.length?(v=+n,a):v},a.alpha=function(n){return arguments.length?(n=+n,r?r=n&gt;0?n:0:n&gt;0&amp;&amp;(c.start({type:&quot;start&quot;,alpha:r=n}),$o.timer(a.tick)),a):r},a.start=function(){function n(n,r){if(!e){for(e=new Array(c),a=0;c&gt;a;++a)e[a]=[];for(a=0;s&gt;a;++a){var u=m[a];e[u.source.index].push(u.target),e[u.target.index].push(u.source)}}for(var i,o=e[t],a=-1,s=o.length;++a&lt;s;)if(!isNaN(i=o[a][n]))return i;return Math.random()*r}var t,e,r,c=d.length,l=m.length,p=s[0],v=s[1];for(t=0;c&gt;t;++t)(r=d[t]).index=t,r.weight=0;for(t=0;l&gt;t;++t)r=m[t],&quot;number&quot;==typeof r.source&amp;&amp;(r.source=d[r.source]),&quot;number&quot;==typeof r.target&amp;&amp;(r.target=d[r.target]),++r.source.weight,++r.target.weight;for(t=0;c&gt;t;++t)r=d[t],isNaN(r.x)&amp;&amp;(r.x=n(&quot;x&quot;,p)),isNaN(r.y)&amp;&amp;(r.y=n(&quot;y&quot;,v)),isNaN(r.px)&amp;&amp;(r.px=r.x),isNaN(r.py)&amp;&amp;(r.py=r.y);if(u=[],&quot;function&quot;==typeof f)for(t=0;l&gt;t;++t)u[t]=+f.call(this,m[t],t);else for(t=0;l&gt;t;++t)u[t]=f;if(i=[],&quot;function&quot;==typeof h)for(t=0;l&gt;t;++t)i[t]=+h.call(this,m[t],t);else for(t=0;l&gt;t;++t)i[t]=h;if(o=[],&quot;function&quot;==typeof g)for(t=0;c&gt;t;++t)o[t]=+g.call(this,d[t],t);else for(t=0;c&gt;t;++t)o[t]=g;return a.resume()},a.resume=function(){return a.alpha(.1)},a.stop=function(){return a.alpha(0)},a.drag=function(){return e||(e=$o.behavior.drag().origin(vt).on(&quot;dragstart.force&quot;,au).on(&quot;drag.force&quot;,t).on(&quot;dragend.force&quot;,cu)),arguments.length?(this.on(&quot;mouseover.force&quot;,su).on(&quot;mouseout.force&quot;,lu).call(e),void 0):e},$o.rebind(a,c,&quot;on&quot;)};var us=20,is=1;$o.layout.hierarchy=function(){function n(t,o,a){var c=u.call(e,t,o);if(t.depth=o,a.push(t),c&amp;&amp;(s=c.length)){for(var s,l,f=-1,h=t.children=new Array(s),g=0,p=o+1;++f&lt;s;)l=h[f]=n(c[f],p,a),l.parent=t,g+=l.value;r&amp;&amp;h.sort(r),i&amp;&amp;(t.value=g)}else delete t.children,i&amp;&amp;(t.value=+i.call(e,t,o)||0);return t}function t(n,r){var u=n.children,o=0;if(u&amp;&amp;(a=u.length))for(var a,c=-1,s=r+1;++c&lt;a;)o+=t(u[c],s);else i&amp;&amp;(o=+i.call(e,n,r)||0);return i&amp;&amp;(n.value=o),o}function e(t){var e=[];return n(t,0,e),e}var r=vu,u=gu,i=pu;return e.sort=function(n){return arguments.length?(r=n,e):r},e.children=function(n){return arguments.length?(u=n,e):u},e.value=function(n){return arguments.length?(i=n,e):i},e.revalue=function(n){return t(n,0),n},e},$o.layout.partition=function(){function n(t,e,r,u){var i=t.children;if(t.x=e,t.y=t.depth*u,t.dx=r,t.dy=u,i&amp;&amp;(o=i.length)){var o,a,c,s=-1;for(r=t.value?r/t.value:0;++s&lt;o;)n(a=i[s],e,c=a.value*r,u),e+=c}}function t(n){var e=n.children,r=0;if(e&amp;&amp;(u=e.length))for(var u,i=-1;++i&lt;u;)r=Math.max(r,t(e[i]));return 1+r}function e(e,i){var o=r.call(this,e,i);return n(o[0],0,u[0],u[1]/t(o[0])),o}var r=$o.layout.hierarchy(),u=[1,1];return e.size=function(n){return arguments.length?(u=n,e):u},hu(e,r)},$o.layout.pie=function(){function n(i){var o=i.map(function(e,r){return+t.call(n,e,r)}),a=+(&quot;function&quot;==typeof r?r.apply(this,arguments):r),c=((&quot;function&quot;==typeof u?u.apply(this,arguments):u)-a)/$o.sum(o),s=$o.range(i.length);null!=e&amp;&amp;s.sort(e===os?function(n,t){return o[t]-o[n]}:function(n,t){return e(i[n],i[t])});var l=[];return s.forEach(function(n){var t;l[n]={data:i[n],value:t=o[n],startAngle:a,endAngle:a+=t*c}}),l}var t=Number,e=os,r=0,u=Ea;return n.value=function(e){return arguments.length?(t=e,n):t},n.sort=function(t){return arguments.length?(e=t,n):e},n.startAngle=function(t){return arguments.length?(r=t,n):r},n.endAngle=function(t){return arguments.length?(u=t,n):u},n};var os={};$o.layout.stack=function(){function n(a,c){var s=a.map(function(e,r){return t.call(n,e,r)}),l=s.map(function(t){return t.map(function(t,e){return[i.call(n,t,e),o.call(n,t,e)]})}),f=e.call(n,l,c);s=$o.permute(s,f),l=$o.permute(l,f);var h,g,p,v=r.call(n,l,c),d=s.length,m=s[0].length;for(g=0;m&gt;g;++g)for(u.call(n,s[0][g],p=v[g],l[0][g][1]),h=1;d&gt;h;++h)u.call(n,s[h][g],p+=l[h-1][g][1],l[h][g][1]);return a}var t=vt,e=Mu,r=_u,u=xu,i=mu,o=yu;return n.values=function(e){return arguments.length?(t=e,n):t},n.order=function(t){return arguments.length?(e=&quot;function&quot;==typeof t?t:as.get(t)||Mu,n):e},n.offset=function(t){return arguments.length?(r=&quot;function&quot;==typeof t?t:cs.get(t)||_u,n):r},n.x=function(t){return arguments.length?(i=t,n):i},n.y=function(t){return arguments.length?(o=t,n):o},n.out=function(t){return arguments.length?(u=t,n):u},n};var as=$o.map({&quot;inside-out&quot;:function(n){var t,e,r=n.length,u=n.map(bu),i=n.map(wu),o=$o.range(r).sort(function(n,t){return u[n]-u[t]}),a=0,c=0,s=[],l=[];for(t=0;r&gt;t;++t)e=o[t],c&gt;a?(a+=i[e],s.push(e)):(c+=i[e],l.push(e));return l.reverse().concat(s)},reverse:function(n){return $o.range(n.length).reverse()},&quot;default&quot;:Mu}),cs=$o.map({silhouette:function(n){var t,e,r,u=n.length,i=n[0].length,o=[],a=0,c=[];for(e=0;i&gt;e;++e){for(t=0,r=0;u&gt;t;t++)r+=n[t][e][1];r&gt;a&amp;&amp;(a=r),o.push(r)}for(e=0;i&gt;e;++e)c[e]=(a-o[e])/2;return c},wiggle:function(n){var t,e,r,u,i,o,a,c,s,l=n.length,f=n[0],h=f.length,g=[];for(g[0]=c=s=0,e=1;h&gt;e;++e){for(t=0,u=0;l&gt;t;++t)u+=n[t][e][1];for(t=0,i=0,a=f[e][0]-f[e-1][0];l&gt;t;++t){for(r=0,o=(n[t][e][1]-n[t][e-1][1])/(2*a);t&gt;r;++r)o+=(n[r][e][1]-n[r][e-1][1])/a;i+=o*n[t][e][1]}g[e]=c-=u?i/u*a:0,s&gt;c&amp;&amp;(s=c)}for(e=0;h&gt;e;++e)g[e]-=s;return g},expand:function(n){var t,e,r,u=n.length,i=n[0].length,o=1/u,a=[];for(e=0;i&gt;e;++e){for(t=0,r=0;u&gt;t;t++)r+=n[t][e][1];if(r)for(t=0;u&gt;t;t++)n[t][e][1]/=r;else for(t=0;u&gt;t;t++)n[t][e][1]=o}for(e=0;i&gt;e;++e)a[e]=0;return a},zero:_u});$o.layout.histogram=function(){function n(n,i){for(var o,a,c=[],s=n.map(e,this),l=r.call(this,s,i),f=u.call(this,l,s,i),i=-1,h=s.length,g=f.length-1,p=t?1:1/h;++i&lt;g;)o=c[i]=[],o.dx=f[i+1]-(o.x=f[i]),o.y=0;if(g&gt;0)for(i=-1;++i&lt;h;)a=s[i],a&gt;=l[0]&amp;&amp;a&lt;=l[1]&amp;&amp;(o=c[$o.bisect(f,a,1,g)-1],o.y+=p,o.push(n[i]));return c}var t=!0,e=Number,r=Au,u=ku;return n.value=function(t){return arguments.length?(e=t,n):e},n.range=function(t){return arguments.length?(r=pt(t),n):r},n.bins=function(t){return arguments.length?(u=&quot;number&quot;==typeof t?function(n){return Eu(n,t)}:pt(t),n):u},n.frequency=function(e){return arguments.length?(t=!!e,n):t},n},$o.layout.tree=function(){function n(n,i){function o(n,t){var r=n.children,u=n._tree;if(r&amp;&amp;(i=r.length)){for(var i,a,s,l=r[0],f=l,h=-1;++h&lt;i;)s=r[h],o(s,a),f=c(s,a,f),a=s;Pu(n);var g=.5*(l._tree.prelim+s._tree.prelim);t?(u.prelim=t._tree.prelim+e(n,t),u.mod=u.prelim-g):u.prelim=g}else t&amp;&amp;(u.prelim=t._tree.prelim+e(n,t))}function a(n,t){n.x=n._tree.prelim+t;var e=n.children;if(e&amp;&amp;(r=e.length)){var r,u=-1;for(t+=n._tree.mod;++u&lt;r;)a(e[u],t)}}function c(n,t,r){if(t){for(var u,i=n,o=n,a=t,c=n.parent.children[0],s=i._tree.mod,l=o._tree.mod,f=a._tree.mod,h=c._tree.mod;a=Lu(a),i=Nu(i),a&amp;&amp;i;)c=Nu(c),o=Lu(o),o._tree.ancestor=n,u=a._tree.prelim+f-i._tree.prelim-s+e(a,i),u&gt;0&amp;&amp;(Uu(ju(a,n,r),n,u),s+=u,l+=u),f+=a._tree.mod,s+=i._tree.mod,h+=c._tree.mod,l+=o._tree.mod;a&amp;&amp;!Lu(o)&amp;&amp;(o._tree.thread=a,o._tree.mod+=f-l),i&amp;&amp;!Nu(c)&amp;&amp;(c._tree.thread=i,c._tree.mod+=s-h,r=n)}return r}var s=t.call(this,n,i),l=s[0];Du(l,function(n,t){n._tree={ancestor:n,prelim:0,mod:0,change:0,shift:0,number:t?t._tree.number+1:0}}),o(l),a(l,-l._tree.prelim);var f=Tu(l,zu),h=Tu(l,qu),g=Tu(l,Ru),p=f.x-e(f,h)/2,v=h.x+e(h,f)/2,d=g.depth||1;return Du(l,u?function(n){n.x*=r[0],n.y=n.depth*r[1],delete n._tree}:function(n){n.x=(n.x-p)/(v-p)*r[0],n.y=n.depth/d*r[1],delete n._tree}),s}var t=$o.layout.hierarchy().sort(null).value(null),e=Cu,r=[1,1],u=!1;return n.separation=function(t){return arguments.length?(e=t,n):e},n.size=function(t){return arguments.length?(u=null==(r=t),n):u?null:r},n.nodeSize=function(t){return arguments.length?(u=null!=(r=t),n):u?r:null},hu(n,t)},$o.layout.pack=function(){function n(n,i){var o=e.call(this,n,i),a=o[0],c=u[0],s=u[1],l=null==t?Math.sqrt:&quot;function&quot;==typeof t?t:function(){return t};if(a.x=a.y=0,Du(a,function(n){n.r=+l(n.value)}),Du(a,Iu),r){var f=r*(t?1:Math.max(2*a.r/c,2*a.r/s))/2;Du(a,function(n){n.r+=f}),Du(a,Iu),Du(a,function(n){n.r-=f})}return Xu(a,c/2,s/2,t?1:1/Math.max(2*a.r/c,2*a.r/s)),o}var t,e=$o.layout.hierarchy().sort(Hu),r=0,u=[1,1];return n.size=function(t){return arguments.length?(u=t,n):u},n.radius=function(e){return arguments.length?(t=null==e||&quot;function&quot;==typeof e?e:+e,n):t},n.padding=function(t){return arguments.length?(r=+t,n):r},hu(n,e)},$o.layout.cluster=function(){function n(n,i){var o,a=t.call(this,n,i),c=a[0],s=0;Du(c,function(n){var t=n.children;t&amp;&amp;t.length?(n.x=Wu(t),n.y=Bu(t)):(n.x=o?s+=e(n,o):0,n.y=0,o=n)});var l=Ju(c),f=Gu(c),h=l.x-e(l,f)/2,g=f.x+e(f,l)/2;return Du(c,u?function(n){n.x=(n.x-c.x)*r[0],n.y=(c.y-n.y)*r[1]}:function(n){n.x=(n.x-h)/(g-h)*r[0],n.y=(1-(c.y?n.y/c.y:1))*r[1]}),a}var t=$o.layout.hierarchy().sort(null).value(null),e=Cu,r=[1,1],u=!1;return n.separation=function(t){return arguments.length?(e=t,n):e},n.size=function(t){return arguments.length?(u=null==(r=t),n):u?null:r},n.nodeSize=function(t){return arguments.length?(u=null!=(r=t),n):u?r:null},hu(n,t)},$o.layout.treemap=function(){function n(n,t){for(var e,r,u=-1,i=n.length;++u&lt;i;)r=(e=n[u]).value*(0&gt;t?0:t),e.area=isNaN(r)||0&gt;=r?0:r}function t(e){var i=e.children;if(i&amp;&amp;i.length){var o,a,c,s=f(e),l=[],h=i.slice(),p=1/0,v=&quot;slice&quot;===g?s.dx:&quot;dice&quot;===g?s.dy:&quot;slice-dice&quot;===g?1&amp;e.depth?s.dy:s.dx:Math.min(s.dx,s.dy);for(n(h,s.dx*s.dy/e.value),l.area=0;(c=h.length)&gt;0;)l.push(o=h[c-1]),l.area+=o.area,&quot;squarify&quot;!==g||(a=r(l,v))&lt;=p?(h.pop(),p=a):(l.area-=l.pop().area,u(l,v,s,!1),v=Math.min(s.dx,s.dy),l.length=l.area=0,p=1/0);l.length&amp;&amp;(u(l,v,s,!0),l.length=l.area=0),i.forEach(t)}}function e(t){var r=t.children;if(r&amp;&amp;r.length){var i,o=f(t),a=r.slice(),c=[];for(n(a,o.dx*o.dy/t.value),c.area=0;i=a.pop();)c.push(i),c.area+=i.area,null!=i.z&amp;&amp;(u(c,i.z?o.dx:o.dy,o,!a.length),c.length=c.area=0);r.forEach(e)}}function r(n,t){for(var e,r=n.area,u=0,i=1/0,o=-1,a=n.length;++o&lt;a;)(e=n[o].area)&amp;&amp;(i&gt;e&amp;&amp;(i=e),e&gt;u&amp;&amp;(u=e));return r*=r,t*=t,r?Math.max(t*u*p/r,r/(t*i*p)):1/0}function u(n,t,e,r){var u,i=-1,o=n.length,a=e.x,s=e.y,l=t?c(n.area/t):0;if(t==e.dx){for((r||l&gt;e.dy)&amp;&amp;(l=e.dy);++i&lt;o;)u=n[i],u.x=a,u.y=s,u.dy=l,a+=u.dx=Math.min(e.x+e.dx-a,l?c(u.area/l):0);u.z=!0,u.dx+=e.x+e.dx-a,e.y+=l,e.dy-=l}else{for((r||l&gt;e.dx)&amp;&amp;(l=e.dx);++i&lt;o;)u=n[i],u.x=a,u.y=s,u.dx=l,s+=u.dy=Math.min(e.y+e.dy-s,l?c(u.area/l):0);u.z=!1,u.dy+=e.y+e.dy-s,e.x+=l,e.dx-=l}}function i(r){var u=o||a(r),i=u[0];return i.x=0,i.y=0,i.dx=s[0],i.dy=s[1],o&amp;&amp;a.revalue(i),n([i],i.dx*i.dy/i.value),(o?e:t)(i),h&amp;&amp;(o=u),u}var o,a=$o.layout.hierarchy(),c=Math.round,s=[1,1],l=null,f=Ku,h=!1,g=&quot;squarify&quot;,p=.5*(1+Math.sqrt(5));return i.size=function(n){return arguments.length?(s=n,i):s},i.padding=function(n){function t(t){var e=n.call(i,t,t.depth);return null==e?Ku(t):Qu(t,&quot;number&quot;==typeof e?[e,e,e,e]:e)}function e(t){return Qu(t,n)}if(!arguments.length)return l;var r;return f=null==(l=n)?Ku:&quot;function&quot;==(r=typeof n)?t:&quot;number&quot;===r?(n=[n,n,n,n],e):e,i},i.round=function(n){return arguments.length?(c=n?Math.round:Number,i):c!=Number},i.sticky=function(n){return arguments.length?(h=n,o=null,i):h},i.ratio=function(n){return arguments.length?(p=n,i):p},i.mode=function(n){return arguments.length?(g=n+&quot;&quot;,i):g},hu(i,a)},$o.random={normal:function(n,t){var e=arguments.length;return 2&gt;e&amp;&amp;(t=1),1&gt;e&amp;&amp;(n=0),function(){var e,r,u;do e=2*Math.random()-1,r=2*Math.random()-1,u=e*e+r*r;while(!u||u&gt;1);return n+t*e*Math.sqrt(-2*Math.log(u)/u)}},logNormal:function(){var n=$o.random.normal.apply($o,arguments);return function(){return Math.exp(n())}},irwinHall:function(n){return function(){for(var t=0,e=0;n&gt;e;e++)t+=Math.random();return t/n}}},$o.scale={};var ss={floor:vt,ceil:vt};$o.scale.linear=function(){return oi([0,1],[0,1],qr,!1)};var ls={s:1,g:1,p:1,r:1,e:1};$o.scale.log=function(){return pi($o.scale.linear().domain([0,1]),10,!0,[1,10])};var fs=$o.format(&quot;.0e&quot;),hs={floor:function(n){return-Math.ceil(-n)},ceil:function(n){return-Math.floor(-n)}};$o.scale.pow=function(){return vi($o.scale.linear(),1,[0,1])},$o.scale.sqrt=function(){return $o.scale.pow().exponent(.5)},$o.scale.ordinal=function(){return mi([],{t:&quot;range&quot;,a:[[]]})},$o.scale.category10=function(){return $o.scale.ordinal().range(gs)},$o.scale.category20=function(){return $o.scale.ordinal().range(ps)},$o.scale.category20b=function(){return $o.scale.ordinal().range(vs)},$o.scale.category20c=function(){return $o.scale.ordinal().range(ds)};var gs=[2062260,16744206,2924588,14034728,9725885,9197131,14907330,8355711,12369186,1556175].map(it),ps=[2062260,11454440,16744206,16759672,2924588,10018698,14034728,16750742,9725885,12955861,9197131,12885140,14907330,16234194,8355711,13092807,12369186,14408589,1556175,10410725].map(it),vs=[3750777,5395619,7040719,10264286,6519097,9216594,11915115,13556636,9202993,12426809,15186514,15190932,8666169,11356490,14049643,15177372,8077683,10834324,13528509,14589654].map(it),ds=[3244733,7057110,10406625,13032431,15095053,16616764,16625259,16634018,3253076,7652470,10607003,13101504,7695281,10394312,12369372,14342891,6513507,9868950,12434877,14277081].map(it);$o.scale.quantile=function(){return yi([],[])},$o.scale.quantize=function(){return xi(0,1,[0,1])},$o.scale.threshold=function(){return Mi([.5],[0,1])},$o.scale.identity=function(){return _i([0,1])},$o.svg={},$o.svg.arc=function(){function n(){var n=t.apply(this,arguments),i=e.apply(this,arguments),o=r.apply(this,arguments)+ms,a=u.apply(this,arguments)+ms,c=(o&gt;a&amp;&amp;(c=o,o=a,a=c),a-o),s=ka&gt;c?&quot;0&quot;:&quot;1&quot;,l=Math.cos(o),f=Math.sin(o),h=Math.cos(a),g=Math.sin(a);return c&gt;=ys?n?&quot;M0,&quot;+i+&quot;A&quot;+i+&quot;,&quot;+i+&quot; 0 1,1 0,&quot;+-i+&quot;A&quot;+i+&quot;,&quot;+i+&quot; 0 1,1 0,&quot;+i+&quot;M0,&quot;+n+&quot;A&quot;+n+&quot;,&quot;+n+&quot; 0 1,0 0,&quot;+-n+&quot;A&quot;+n+&quot;,&quot;+n+&quot; 0 1,0 0,&quot;+n+&quot;Z&quot;:&quot;M0,&quot;+i+&quot;A&quot;+i+&quot;,&quot;+i+&quot; 0 1,1 0,&quot;+-i+&quot;A&quot;+i+&quot;,&quot;+i+&quot; 0 1,1 0,&quot;+i+&quot;Z&quot;:n?&quot;M&quot;+i*l+&quot;,&quot;+i*f+&quot;A&quot;+i+&quot;,&quot;+i+&quot; 0 &quot;+s+&quot;,1 &quot;+i*h+&quot;,&quot;+i*g+&quot;L&quot;+n*h+&quot;,&quot;+n*g+&quot;A&quot;+n+&quot;,&quot;+n+&quot; 0 &quot;+s+&quot;,0 &quot;+n*l+&quot;,&quot;+n*f+&quot;Z&quot;:&quot;M&quot;+i*l+&quot;,&quot;+i*f+&quot;A&quot;+i+&quot;,&quot;+i+&quot; 0 &quot;+s+&quot;,1 &quot;+i*h+&quot;,&quot;+i*g+&quot;L0,0&quot;+&quot;Z&quot;}var t=bi,e=wi,r=Si,u=ki;return n.innerRadius=function(e){return arguments.length?(t=pt(e),n):t},n.outerRadius=function(t){return arguments.length?(e=pt(t),n):e},n.startAngle=function(t){return arguments.length?(r=pt(t),n):r},n.endAngle=function(t){return arguments.length?(u=pt(t),n):u},n.centroid=function(){var n=(t.apply(this,arguments)+e.apply(this,arguments))/2,i=(r.apply(this,arguments)+u.apply(this,arguments))/2+ms;return[Math.cos(i)*n,Math.sin(i)*n]},n};var ms=-Aa,ys=Ea-Ca;$o.svg.line=function(){return Ei(vt)};var xs=$o.map({linear:Ai,&quot;linear-closed&quot;:Ci,step:Ni,&quot;step-before&quot;:Li,&quot;step-after&quot;:Ti,basis:Ui,&quot;basis-open&quot;:ji,&quot;basis-closed&quot;:Hi,bundle:Fi,cardinal:Ri,&quot;cardinal-open&quot;:qi,&quot;cardinal-closed&quot;:zi,monotone:Xi});xs.forEach(function(n,t){t.key=n,t.closed=/-closed$/.test(n)});var Ms=[0,2/3,1/3,0],_s=[0,1/3,2/3,0],bs=[0,1/6,2/3,1/6];$o.svg.line.radial=function(){var n=Ei($i);return n.radius=n.x,delete n.x,n.angle=n.y,delete n.y,n},Li.reverse=Ti,Ti.reverse=Li,$o.svg.area=function(){return Bi(vt)},$o.svg.area.radial=function(){var n=Bi($i);return n.radius=n.x,delete n.x,n.innerRadius=n.x0,delete n.x0,n.outerRadius=n.x1,delete n.x1,n.angle=n.y,delete n.y,n.startAngle=n.y0,delete n.y0,n.endAngle=n.y1,delete n.y1,n},$o.svg.chord=function(){function n(n,a){var c=t(this,i,n,a),s=t(this,o,n,a);return&quot;M&quot;+c.p0+r(c.r,c.p1,c.a1-c.a0)+(e(c,s)?u(c.r,c.p1,c.r,c.p0):u(c.r,c.p1,s.r,s.p0)+r(s.r,s.p1,s.a1-s.a0)+u(s.r,s.p1,c.r,c.p0))+&quot;Z&quot;}function t(n,t,e,r){var u=t.call(n,e,r),i=a.call(n,u,r),o=c.call(n,u,r)+ms,l=s.call(n,u,r)+ms;return{r:i,a0:o,a1:l,p0:[i*Math.cos(o),i*Math.sin(o)],p1:[i*Math.cos(l),i*Math.sin(l)]}}function e(n,t){return n.a0==t.a0&amp;&amp;n.a1==t.a1}function r(n,t,e){return&quot;A&quot;+n+&quot;,&quot;+n+&quot; 0 &quot;+ +(e&gt;ka)+&quot;,1 &quot;+t}function u(n,t,e,r){return&quot;Q 0,0 &quot;+r}var i=Re,o=De,a=Wi,c=Si,s=ki;return n.radius=function(t){return arguments.length?(a=pt(t),n):a},n.source=function(t){return arguments.length?(i=pt(t),n):i},n.target=function(t){return arguments.length?(o=pt(t),n):o},n.startAngle=function(t){return arguments.length?(c=pt(t),n):c},n.endAngle=function(t){return arguments.length?(s=pt(t),n):s},n},$o.svg.diagonal=function(){function n(n,u){var i=t.call(this,n,u),o=e.call(this,n,u),a=(i.y+o.y)/2,c=[i,{x:i.x,y:a},{x:o.x,y:a},o];return c=c.map(r),&quot;M&quot;+c[0]+&quot;C&quot;+c[1]+&quot; &quot;+c[2]+&quot; &quot;+c[3]}var t=Re,e=De,r=Ji;return n.source=function(e){return arguments.length?(t=pt(e),n):t},n.target=function(t){return arguments.length?(e=pt(t),n):e},n.projection=function(t){return arguments.length?(r=t,n):r},n},$o.svg.diagonal.radial=function(){var n=$o.svg.diagonal(),t=Ji,e=n.projection;return n.projection=function(n){return arguments.length?e(Gi(t=n)):t},n},$o.svg.symbol=function(){function n(n,r){return(ws.get(t.call(this,n,r))||no)(e.call(this,n,r))}var t=Qi,e=Ki;return n.type=function(e){return arguments.length?(t=pt(e),n):t},n.size=function(t){return arguments.length?(e=pt(t),n):e},n};var ws=$o.map({circle:no,cross:function(n){var t=Math.sqrt(n/5)/2;return&quot;M&quot;+-3*t+&quot;,&quot;+-t+&quot;H&quot;+-t+&quot;V&quot;+-3*t+&quot;H&quot;+t+&quot;V&quot;+-t+&quot;H&quot;+3*t+&quot;V&quot;+t+&quot;H&quot;+t+&quot;V&quot;+3*t+&quot;H&quot;+-t+&quot;V&quot;+t+&quot;H&quot;+-3*t+&quot;Z&quot;},diamond:function(n){var t=Math.sqrt(n/(2*As)),e=t*As;return&quot;M0,&quot;+-t+&quot;L&quot;+e+&quot;,0&quot;+&quot; 0,&quot;+t+&quot; &quot;+-e+&quot;,0&quot;+&quot;Z&quot;},square:function(n){var t=Math.sqrt(n)/2;return&quot;M&quot;+-t+&quot;,&quot;+-t+&quot;L&quot;+t+&quot;,&quot;+-t+&quot; &quot;+t+&quot;,&quot;+t+&quot; &quot;+-t+&quot;,&quot;+t+&quot;Z&quot;},&quot;triangle-down&quot;:function(n){var t=Math.sqrt(n/Es),e=t*Es/2;return&quot;M0,&quot;+e+&quot;L&quot;+t+&quot;,&quot;+-e+&quot; &quot;+-t+&quot;,&quot;+-e+&quot;Z&quot;},&quot;triangle-up&quot;:function(n){var t=Math.sqrt(n/Es),e=t*Es/2;return&quot;M0,&quot;+-e+&quot;L&quot;+t+&quot;,&quot;+e+&quot; &quot;+-t+&quot;,&quot;+e+&quot;Z&quot;}});$o.svg.symbolTypes=ws.keys();var Ss,ks,Es=Math.sqrt(3),As=Math.tan(30*La),Cs=[],Ns=0;
Cs.call=ma.call,Cs.empty=ma.empty,Cs.node=ma.node,Cs.size=ma.size,$o.transition=function(n){return arguments.length?Ss?n.transition():n:Ma.transition()},$o.transition.prototype=Cs,Cs.select=function(n){var t,e,r,u=this.id,i=[];n=v(n);for(var o=-1,a=this.length;++o&lt;a;){i.push(t=[]);for(var c=this[o],s=-1,l=c.length;++s&lt;l;)(r=c[s])&amp;&amp;(e=n.call(r,r.__data__,s,o))?(&quot;__data__&quot;in r&amp;&amp;(e.__data__=r.__data__),uo(e,s,u,r.__transition__[u]),t.push(e)):t.push(null)}return to(i,u)},Cs.selectAll=function(n){var t,e,r,u,i,o=this.id,a=[];n=d(n);for(var c=-1,s=this.length;++c&lt;s;)for(var l=this[c],f=-1,h=l.length;++f&lt;h;)if(r=l[f]){i=r.__transition__[o],e=n.call(r,r.__data__,f,c),a.push(t=[]);for(var g=-1,p=e.length;++g&lt;p;)(u=e[g])&amp;&amp;uo(u,g,o,i),t.push(u)}return to(a,o)},Cs.filter=function(n){var t,e,r,u=[];&quot;function&quot;!=typeof n&amp;&amp;(n=E(n));for(var i=0,o=this.length;o&gt;i;i++){u.push(t=[]);for(var e=this[i],a=0,c=e.length;c&gt;a;a++)(r=e[a])&amp;&amp;n.call(r,r.__data__,a,i)&amp;&amp;t.push(r)}return to(u,this.id)},Cs.tween=function(n,t){var e=this.id;return arguments.length&lt;2?this.node().__transition__[e].tween.get(n):C(this,null==t?function(t){t.__transition__[e].tween.remove(n)}:function(r){r.__transition__[e].tween.set(n,t)})},Cs.attr=function(n,t){function e(){this.removeAttribute(a)}function r(){this.removeAttributeNS(a.space,a.local)}function u(n){return null==n?e:(n+=&quot;&quot;,function(){var t,e=this.getAttribute(a);return e!==n&amp;&amp;(t=o(e,n),function(n){this.setAttribute(a,t(n))})})}function i(n){return null==n?r:(n+=&quot;&quot;,function(){var t,e=this.getAttributeNS(a.space,a.local);return e!==n&amp;&amp;(t=o(e,n),function(n){this.setAttributeNS(a.space,a.local,t(n))})})}if(arguments.length&lt;2){for(t in n)this.attr(t,n[t]);return this}var o=&quot;transform&quot;==n?tu:qr,a=$o.ns.qualify(n);return eo(this,&quot;attr.&quot;+n,t,a.local?i:u)},Cs.attrTween=function(n,t){function e(n,e){var r=t.call(this,n,e,this.getAttribute(u));return r&amp;&amp;function(n){this.setAttribute(u,r(n))}}function r(n,e){var r=t.call(this,n,e,this.getAttributeNS(u.space,u.local));return r&amp;&amp;function(n){this.setAttributeNS(u.space,u.local,r(n))}}var u=$o.ns.qualify(n);return this.tween(&quot;attr.&quot;+n,u.local?r:e)},Cs.style=function(n,t,e){function r(){this.style.removeProperty(n)}function u(t){return null==t?r:(t+=&quot;&quot;,function(){var r,u=Ko.getComputedStyle(this,null).getPropertyValue(n);return u!==t&amp;&amp;(r=qr(u,t),function(t){this.style.setProperty(n,r(t),e)})})}var i=arguments.length;if(3&gt;i){if(&quot;string&quot;!=typeof n){2&gt;i&amp;&amp;(t=&quot;&quot;);for(e in n)this.style(e,n[e],t);return this}e=&quot;&quot;}return eo(this,&quot;style.&quot;+n,t,u)},Cs.styleTween=function(n,t,e){function r(r,u){var i=t.call(this,r,u,Ko.getComputedStyle(this,null).getPropertyValue(n));return i&amp;&amp;function(t){this.style.setProperty(n,i(t),e)}}return arguments.length&lt;3&amp;&amp;(e=&quot;&quot;),this.tween(&quot;style.&quot;+n,r)},Cs.text=function(n){return eo(this,&quot;text&quot;,n,ro)},Cs.remove=function(){return this.each(&quot;end.transition&quot;,function(){var n;this.__transition__.count&lt;2&amp;&amp;(n=this.parentNode)&amp;&amp;n.removeChild(this)})},Cs.ease=function(n){var t=this.id;return arguments.length&lt;1?this.node().__transition__[t].ease:(&quot;function&quot;!=typeof n&amp;&amp;(n=$o.ease.apply($o,arguments)),C(this,function(e){e.__transition__[t].ease=n}))},Cs.delay=function(n){var t=this.id;return C(this,&quot;function&quot;==typeof n?function(e,r,u){e.__transition__[t].delay=+n.call(e,e.__data__,r,u)}:(n=+n,function(e){e.__transition__[t].delay=n}))},Cs.duration=function(n){var t=this.id;return C(this,&quot;function&quot;==typeof n?function(e,r,u){e.__transition__[t].duration=Math.max(1,n.call(e,e.__data__,r,u))}:(n=Math.max(1,n),function(e){e.__transition__[t].duration=n}))},Cs.each=function(n,t){var e=this.id;if(arguments.length&lt;2){var r=ks,u=Ss;Ss=e,C(this,function(t,r,u){ks=t.__transition__[e],n.call(t,t.__data__,r,u)}),ks=r,Ss=u}else C(this,function(r){var u=r.__transition__[e];(u.event||(u.event=$o.dispatch(&quot;start&quot;,&quot;end&quot;))).on(n,t)});return this},Cs.transition=function(){for(var n,t,e,r,u=this.id,i=++Ns,o=[],a=0,c=this.length;c&gt;a;a++){o.push(n=[]);for(var t=this[a],s=0,l=t.length;l&gt;s;s++)(e=t[s])&amp;&amp;(r=Object.create(e.__transition__[u]),r.delay+=r.duration,uo(e,s,i,r)),n.push(e)}return to(o,i)},$o.svg.axis=function(){function n(n){n.each(function(){var n,s=$o.select(this),l=this.__chart__||e,f=this.__chart__=e.copy(),h=null==c?f.ticks?f.ticks.apply(f,a):f.domain():c,g=null==t?f.tickFormat?f.tickFormat.apply(f,a):vt:t,p=s.selectAll(&quot;.tick&quot;).data(h,f),v=p.enter().insert(&quot;g&quot;,&quot;.domain&quot;).attr(&quot;class&quot;,&quot;tick&quot;).style(&quot;opacity&quot;,Ca),d=$o.transition(p.exit()).style(&quot;opacity&quot;,Ca).remove(),m=$o.transition(p).style(&quot;opacity&quot;,1),y=ti(f),x=s.selectAll(&quot;.domain&quot;).data([0]),M=(x.enter().append(&quot;path&quot;).attr(&quot;class&quot;,&quot;domain&quot;),$o.transition(x));v.append(&quot;line&quot;),v.append(&quot;text&quot;);var _=v.select(&quot;line&quot;),b=m.select(&quot;line&quot;),w=p.select(&quot;text&quot;).text(g),S=v.select(&quot;text&quot;),k=m.select(&quot;text&quot;);switch(r){case&quot;bottom&quot;:n=io,_.attr(&quot;y2&quot;,u),S.attr(&quot;y&quot;,Math.max(u,0)+o),b.attr(&quot;x2&quot;,0).attr(&quot;y2&quot;,u),k.attr(&quot;x&quot;,0).attr(&quot;y&quot;,Math.max(u,0)+o),w.attr(&quot;dy&quot;,&quot;.71em&quot;).style(&quot;text-anchor&quot;,&quot;middle&quot;),M.attr(&quot;d&quot;,&quot;M&quot;+y[0]+&quot;,&quot;+i+&quot;V0H&quot;+y[1]+&quot;V&quot;+i);break;case&quot;top&quot;:n=io,_.attr(&quot;y2&quot;,-u),S.attr(&quot;y&quot;,-(Math.max(u,0)+o)),b.attr(&quot;x2&quot;,0).attr(&quot;y2&quot;,-u),k.attr(&quot;x&quot;,0).attr(&quot;y&quot;,-(Math.max(u,0)+o)),w.attr(&quot;dy&quot;,&quot;0em&quot;).style(&quot;text-anchor&quot;,&quot;middle&quot;),M.attr(&quot;d&quot;,&quot;M&quot;+y[0]+&quot;,&quot;+-i+&quot;V0H&quot;+y[1]+&quot;V&quot;+-i);break;case&quot;left&quot;:n=oo,_.attr(&quot;x2&quot;,-u),S.attr(&quot;x&quot;,-(Math.max(u,0)+o)),b.attr(&quot;x2&quot;,-u).attr(&quot;y2&quot;,0),k.attr(&quot;x&quot;,-(Math.max(u,0)+o)).attr(&quot;y&quot;,0),w.attr(&quot;dy&quot;,&quot;.32em&quot;).style(&quot;text-anchor&quot;,&quot;end&quot;),M.attr(&quot;d&quot;,&quot;M&quot;+-i+&quot;,&quot;+y[0]+&quot;H0V&quot;+y[1]+&quot;H&quot;+-i);break;case&quot;right&quot;:n=oo,_.attr(&quot;x2&quot;,u),S.attr(&quot;x&quot;,Math.max(u,0)+o),b.attr(&quot;x2&quot;,u).attr(&quot;y2&quot;,0),k.attr(&quot;x&quot;,Math.max(u,0)+o).attr(&quot;y&quot;,0),w.attr(&quot;dy&quot;,&quot;.32em&quot;).style(&quot;text-anchor&quot;,&quot;start&quot;),M.attr(&quot;d&quot;,&quot;M&quot;+i+&quot;,&quot;+y[0]+&quot;H0V&quot;+y[1]+&quot;H&quot;+i)}if(f.rangeBand){var E=f,A=E.rangeBand()/2;l=f=function(n){return E(n)+A}}else l.rangeBand?l=f:d.call(n,f);v.call(n,l),m.call(n,f)})}var t,e=$o.scale.linear(),r=Ls,u=6,i=6,o=3,a=[10],c=null;return n.scale=function(t){return arguments.length?(e=t,n):e},n.orient=function(t){return arguments.length?(r=t in Ts?t+&quot;&quot;:Ls,n):r},n.ticks=function(){return arguments.length?(a=arguments,n):a},n.tickValues=function(t){return arguments.length?(c=t,n):c},n.tickFormat=function(e){return arguments.length?(t=e,n):t},n.tickSize=function(t){var e=arguments.length;return e?(u=+t,i=+arguments[e-1],n):u},n.innerTickSize=function(t){return arguments.length?(u=+t,n):u},n.outerTickSize=function(t){return arguments.length?(i=+t,n):i},n.tickPadding=function(t){return arguments.length?(o=+t,n):o},n.tickSubdivide=function(){return arguments.length&amp;&amp;n},n};var Ls=&quot;bottom&quot;,Ts={top:1,right:1,bottom:1,left:1};$o.svg.brush=function(){function n(i){i.each(function(){var i=$o.select(this).style(&quot;pointer-events&quot;,&quot;all&quot;).style(&quot;-webkit-tap-highlight-color&quot;,&quot;rgba(0,0,0,0)&quot;).on(&quot;mousedown.brush&quot;,u).on(&quot;touchstart.brush&quot;,u),o=i.selectAll(&quot;.background&quot;).data([0]);o.enter().append(&quot;rect&quot;).attr(&quot;class&quot;,&quot;background&quot;).style(&quot;visibility&quot;,&quot;hidden&quot;).style(&quot;cursor&quot;,&quot;crosshair&quot;),i.selectAll(&quot;.extent&quot;).data([0]).enter().append(&quot;rect&quot;).attr(&quot;class&quot;,&quot;extent&quot;).style(&quot;cursor&quot;,&quot;move&quot;);var a=i.selectAll(&quot;.resize&quot;).data(d,vt);a.exit().remove(),a.enter().append(&quot;g&quot;).attr(&quot;class&quot;,function(n){return&quot;resize &quot;+n}).style(&quot;cursor&quot;,function(n){return qs[n]}).append(&quot;rect&quot;).attr(&quot;x&quot;,function(n){return/[ew]$/.test(n)?-3:null}).attr(&quot;y&quot;,function(n){return/^[ns]/.test(n)?-3:null}).attr(&quot;width&quot;,6).attr(&quot;height&quot;,6).style(&quot;visibility&quot;,&quot;hidden&quot;),a.style(&quot;display&quot;,n.empty()?&quot;none&quot;:null);var l,f=$o.transition(i),h=$o.transition(o);c&amp;&amp;(l=ti(c),h.attr(&quot;x&quot;,l[0]).attr(&quot;width&quot;,l[1]-l[0]),e(f)),s&amp;&amp;(l=ti(s),h.attr(&quot;y&quot;,l[0]).attr(&quot;height&quot;,l[1]-l[0]),r(f)),t(f)})}function t(n){n.selectAll(&quot;.resize&quot;).attr(&quot;transform&quot;,function(n){return&quot;translate(&quot;+l[+/e$/.test(n)]+&quot;,&quot;+h[+/^s/.test(n)]+&quot;)&quot;})}function e(n){n.select(&quot;.extent&quot;).attr(&quot;x&quot;,l[0]),n.selectAll(&quot;.extent,.n&gt;rect,.s&gt;rect&quot;).attr(&quot;width&quot;,l[1]-l[0])}function r(n){n.select(&quot;.extent&quot;).attr(&quot;y&quot;,h[0]),n.selectAll(&quot;.extent,.e&gt;rect,.w&gt;rect&quot;).attr(&quot;height&quot;,h[1]-h[0])}function u(){function u(){32==$o.event.keyCode&amp;&amp;(C||(x=null,L[0]-=l[1],L[1]-=h[1],C=2),f())}function g(){32==$o.event.keyCode&amp;&amp;2==C&amp;&amp;(L[0]+=l[1],L[1]+=h[1],C=0,f())}function d(){var n=$o.mouse(_),u=!1;M&amp;&amp;(n[0]+=M[0],n[1]+=M[1]),C||($o.event.altKey?(x||(x=[(l[0]+l[1])/2,(h[0]+h[1])/2]),L[0]=l[+(n[0]&lt;x[0])],L[1]=h[+(n[1]&lt;x[1])]):x=null),E&amp;&amp;m(n,c,0)&amp;&amp;(e(S),u=!0),A&amp;&amp;m(n,s,1)&amp;&amp;(r(S),u=!0),u&amp;&amp;(t(S),w({type:&quot;brush&quot;,mode:C?&quot;move&quot;:&quot;resize&quot;}))}function m(n,t,e){var r,u,a=ti(t),c=a[0],s=a[1],f=L[e],g=e?h:l,d=g[1]-g[0];return C&amp;&amp;(c-=f,s-=d+f),r=(e?v:p)?Math.max(c,Math.min(s,n[e])):n[e],C?u=(r+=f)+d:(x&amp;&amp;(f=Math.max(c,Math.min(s,2*x[e]-r))),r&gt;f?(u=r,r=f):u=f),g[0]!=r||g[1]!=u?(e?o=null:i=null,g[0]=r,g[1]=u,!0):void 0}function y(){d(),S.style(&quot;pointer-events&quot;,&quot;all&quot;).selectAll(&quot;.resize&quot;).style(&quot;display&quot;,n.empty()?&quot;none&quot;:null),$o.select(&quot;body&quot;).style(&quot;cursor&quot;,null),T.on(&quot;mousemove.brush&quot;,null).on(&quot;mouseup.brush&quot;,null).on(&quot;touchmove.brush&quot;,null).on(&quot;touchend.brush&quot;,null).on(&quot;keydown.brush&quot;,null).on(&quot;keyup.brush&quot;,null),N(),w({type:&quot;brushend&quot;})}var x,M,_=this,b=$o.select($o.event.target),w=a.of(_,arguments),S=$o.select(_),k=b.datum(),E=!/^(n|s)$/.test(k)&amp;&amp;c,A=!/^(e|w)$/.test(k)&amp;&amp;s,C=b.classed(&quot;extent&quot;),N=D(),L=$o.mouse(_),T=$o.select(Ko).on(&quot;keydown.brush&quot;,u).on(&quot;keyup.brush&quot;,g);if($o.event.changedTouches?T.on(&quot;touchmove.brush&quot;,d).on(&quot;touchend.brush&quot;,y):T.on(&quot;mousemove.brush&quot;,d).on(&quot;mouseup.brush&quot;,y),S.interrupt().selectAll(&quot;*&quot;).interrupt(),C)L[0]=l[0]-L[0],L[1]=h[0]-L[1];else if(k){var q=+/w$/.test(k),z=+/^n/.test(k);M=[l[1-q]-L[0],h[1-z]-L[1]],L[0]=l[q],L[1]=h[z]}else $o.event.altKey&amp;&amp;(x=L.slice());S.style(&quot;pointer-events&quot;,&quot;none&quot;).selectAll(&quot;.resize&quot;).style(&quot;display&quot;,null),$o.select(&quot;body&quot;).style(&quot;cursor&quot;,b.style(&quot;cursor&quot;)),w({type:&quot;brushstart&quot;}),d()}var i,o,a=g(n,&quot;brushstart&quot;,&quot;brush&quot;,&quot;brushend&quot;),c=null,s=null,l=[0,0],h=[0,0],p=!0,v=!0,d=zs[0];return n.event=function(n){n.each(function(){var n=a.of(this,arguments),t={x:l,y:h,i:i,j:o},e=this.__chart__||t;this.__chart__=t,Ss?$o.select(this).transition().each(&quot;start.brush&quot;,function(){i=e.i,o=e.j,l=e.x,h=e.y,n({type:&quot;brushstart&quot;})}).tween(&quot;brush:brush&quot;,function(){var e=zr(l,t.x),r=zr(h,t.y);return i=o=null,function(u){l=t.x=e(u),h=t.y=r(u),n({type:&quot;brush&quot;,mode:&quot;resize&quot;})}}).each(&quot;end.brush&quot;,function(){i=t.i,o=t.j,n({type:&quot;brush&quot;,mode:&quot;resize&quot;}),n({type:&quot;brushend&quot;})}):(n({type:&quot;brushstart&quot;}),n({type:&quot;brush&quot;,mode:&quot;resize&quot;}),n({type:&quot;brushend&quot;}))})},n.x=function(t){return arguments.length?(c=t,d=zs[!c&lt;&lt;1|!s],n):c},n.y=function(t){return arguments.length?(s=t,d=zs[!c&lt;&lt;1|!s],n):s},n.clamp=function(t){return arguments.length?(c&amp;&amp;s?(p=!!t[0],v=!!t[1]):c?p=!!t:s&amp;&amp;(v=!!t),n):c&amp;&amp;s?[p,v]:c?p:s?v:null},n.extent=function(t){var e,r,u,a,f;return arguments.length?(c&amp;&amp;(e=t[0],r=t[1],s&amp;&amp;(e=e[0],r=r[0]),i=[e,r],c.invert&amp;&amp;(e=c(e),r=c(r)),e&gt;r&amp;&amp;(f=e,e=r,r=f),(e!=l[0]||r!=l[1])&amp;&amp;(l=[e,r])),s&amp;&amp;(u=t[0],a=t[1],c&amp;&amp;(u=u[1],a=a[1]),o=[u,a],s.invert&amp;&amp;(u=s(u),a=s(a)),u&gt;a&amp;&amp;(f=u,u=a,a=f),(u!=h[0]||a!=h[1])&amp;&amp;(h=[u,a])),n):(c&amp;&amp;(i?(e=i[0],r=i[1]):(e=l[0],r=l[1],c.invert&amp;&amp;(e=c.invert(e),r=c.invert(r)),e&gt;r&amp;&amp;(f=e,e=r,r=f))),s&amp;&amp;(o?(u=o[0],a=o[1]):(u=h[0],a=h[1],s.invert&amp;&amp;(u=s.invert(u),a=s.invert(a)),u&gt;a&amp;&amp;(f=u,u=a,a=f))),c&amp;&amp;s?[[e,u],[r,a]]:c?[e,r]:s&amp;&amp;[u,a])},n.clear=function(){return n.empty()||(l=[0,0],h=[0,0],i=o=null),n},n.empty=function(){return!!c&amp;&amp;l[0]==l[1]||!!s&amp;&amp;h[0]==h[1]},$o.rebind(n,a,&quot;on&quot;)};var qs={n:&quot;ns-resize&quot;,e:&quot;ew-resize&quot;,s:&quot;ns-resize&quot;,w:&quot;ew-resize&quot;,nw:&quot;nwse-resize&quot;,ne:&quot;nesw-resize&quot;,se:&quot;nwse-resize&quot;,sw:&quot;nesw-resize&quot;},zs=[[&quot;n&quot;,&quot;e&quot;,&quot;s&quot;,&quot;w&quot;,&quot;nw&quot;,&quot;ne&quot;,&quot;se&quot;,&quot;sw&quot;],[&quot;e&quot;,&quot;w&quot;],[&quot;n&quot;,&quot;s&quot;],[]],Rs=$o.time={},Ds=Date,Ps=[&quot;Sunday&quot;,&quot;Monday&quot;,&quot;Tuesday&quot;,&quot;Wednesday&quot;,&quot;Thursday&quot;,&quot;Friday&quot;,&quot;Saturday&quot;];ao.prototype={getDate:function(){return this._.getUTCDate()},getDay:function(){return this._.getUTCDay()},getFullYear:function(){return this._.getUTCFullYear()},getHours:function(){return this._.getUTCHours()},getMilliseconds:function(){return this._.getUTCMilliseconds()},getMinutes:function(){return this._.getUTCMinutes()},getMonth:function(){return this._.getUTCMonth()},getSeconds:function(){return this._.getUTCSeconds()},getTime:function(){return this._.getTime()},getTimezoneOffset:function(){return 0},valueOf:function(){return this._.valueOf()},setDate:function(){Us.setUTCDate.apply(this._,arguments)},setDay:function(){Us.setUTCDay.apply(this._,arguments)},setFullYear:function(){Us.setUTCFullYear.apply(this._,arguments)},setHours:function(){Us.setUTCHours.apply(this._,arguments)},setMilliseconds:function(){Us.setUTCMilliseconds.apply(this._,arguments)},setMinutes:function(){Us.setUTCMinutes.apply(this._,arguments)},setMonth:function(){Us.setUTCMonth.apply(this._,arguments)},setSeconds:function(){Us.setUTCSeconds.apply(this._,arguments)},setTime:function(){Us.setTime.apply(this._,arguments)}};var Us=Date.prototype,js=&quot;%a %b %e %X %Y&quot;,Hs=&quot;%m/%d/%Y&quot;,Fs=&quot;%H:%M:%S&quot;,Os=[&quot;Sunday&quot;,&quot;Monday&quot;,&quot;Tuesday&quot;,&quot;Wednesday&quot;,&quot;Thursday&quot;,&quot;Friday&quot;,&quot;Saturday&quot;],Ys=[&quot;Sun&quot;,&quot;Mon&quot;,&quot;Tue&quot;,&quot;Wed&quot;,&quot;Thu&quot;,&quot;Fri&quot;,&quot;Sat&quot;],Is=[&quot;January&quot;,&quot;February&quot;,&quot;March&quot;,&quot;April&quot;,&quot;May&quot;,&quot;June&quot;,&quot;July&quot;,&quot;August&quot;,&quot;September&quot;,&quot;October&quot;,&quot;November&quot;,&quot;December&quot;],Zs=[&quot;Jan&quot;,&quot;Feb&quot;,&quot;Mar&quot;,&quot;Apr&quot;,&quot;May&quot;,&quot;Jun&quot;,&quot;Jul&quot;,&quot;Aug&quot;,&quot;Sep&quot;,&quot;Oct&quot;,&quot;Nov&quot;,&quot;Dec&quot;];Rs.year=co(function(n){return n=Rs.day(n),n.setMonth(0,1),n},function(n,t){n.setFullYear(n.getFullYear()+t)},function(n){return n.getFullYear()}),Rs.years=Rs.year.range,Rs.years.utc=Rs.year.utc.range,Rs.day=co(function(n){var t=new Ds(2e3,0);return t.setFullYear(n.getFullYear(),n.getMonth(),n.getDate()),t},function(n,t){n.setDate(n.getDate()+t)},function(n){return n.getDate()-1}),Rs.days=Rs.day.range,Rs.days.utc=Rs.day.utc.range,Rs.dayOfYear=function(n){var t=Rs.year(n);return Math.floor((n-t-6e4*(n.getTimezoneOffset()-t.getTimezoneOffset()))/864e5)},Ps.forEach(function(n,t){n=n.toLowerCase(),t=7-t;var e=Rs[n]=co(function(n){return(n=Rs.day(n)).setDate(n.getDate()-(n.getDay()+t)%7),n},function(n,t){n.setDate(n.getDate()+7*Math.floor(t))},function(n){var e=Rs.year(n).getDay();return Math.floor((Rs.dayOfYear(n)+(e+t)%7)/7)-(e!==t)});Rs[n+&quot;s&quot;]=e.range,Rs[n+&quot;s&quot;].utc=e.utc.range,Rs[n+&quot;OfYear&quot;]=function(n){var e=Rs.year(n).getDay();return Math.floor((Rs.dayOfYear(n)+(e+t)%7)/7)}}),Rs.week=Rs.sunday,Rs.weeks=Rs.sunday.range,Rs.weeks.utc=Rs.sunday.utc.range,Rs.weekOfYear=Rs.sundayOfYear,Rs.format=lo;var Vs=ho(Os),Xs=go(Os),$s=ho(Ys),Bs=go(Ys),Ws=ho(Is),Js=go(Is),Gs=ho(Zs),Ks=go(Zs),Qs=/^%/,nl={&quot;-&quot;:&quot;&quot;,_:&quot; &quot;,0:&quot;0&quot;},tl={a:function(n){return Ys[n.getDay()]},A:function(n){return Os[n.getDay()]},b:function(n){return Zs[n.getMonth()]},B:function(n){return Is[n.getMonth()]},c:lo(js),d:function(n,t){return po(n.getDate(),t,2)},e:function(n,t){return po(n.getDate(),t,2)},H:function(n,t){return po(n.getHours(),t,2)},I:function(n,t){return po(n.getHours()%12||12,t,2)},j:function(n,t){return po(1+Rs.dayOfYear(n),t,3)},L:function(n,t){return po(n.getMilliseconds(),t,3)},m:function(n,t){return po(n.getMonth()+1,t,2)},M:function(n,t){return po(n.getMinutes(),t,2)},p:function(n){return n.getHours()&gt;=12?&quot;PM&quot;:&quot;AM&quot;},S:function(n,t){return po(n.getSeconds(),t,2)},U:function(n,t){return po(Rs.sundayOfYear(n),t,2)},w:function(n){return n.getDay()},W:function(n,t){return po(Rs.mondayOfYear(n),t,2)},x:lo(Hs),X:lo(Fs),y:function(n,t){return po(n.getFullYear()%100,t,2)},Y:function(n,t){return po(n.getFullYear()%1e4,t,4)},Z:jo,&quot;%&quot;:function(){return&quot;%&quot;}},el={a:vo,A:mo,b:_o,B:bo,c:wo,d:To,e:To,H:zo,I:zo,j:qo,L:Po,m:Lo,M:Ro,p:Uo,S:Do,U:xo,w:yo,W:Mo,x:So,X:ko,y:Ao,Y:Eo,Z:Co,&quot;%&quot;:Ho},rl=/^\s*\d+/,ul=$o.map({am:0,pm:1});lo.utc=Fo;var il=Fo(&quot;%Y-%m-%dT%H:%M:%S.%LZ&quot;);lo.iso=Date.prototype.toISOString&amp;&amp;+new Date(&quot;2000-01-01T00:00:00.000Z&quot;)?Oo:il,Oo.parse=function(n){var t=new Date(n);return isNaN(t)?null:t},Oo.toString=il.toString,Rs.second=co(function(n){return new Ds(1e3*Math.floor(n/1e3))},function(n,t){n.setTime(n.getTime()+1e3*Math.floor(t))},function(n){return n.getSeconds()}),Rs.seconds=Rs.second.range,Rs.seconds.utc=Rs.second.utc.range,Rs.minute=co(function(n){return new Ds(6e4*Math.floor(n/6e4))},function(n,t){n.setTime(n.getTime()+6e4*Math.floor(t))},function(n){return n.getMinutes()}),Rs.minutes=Rs.minute.range,Rs.minutes.utc=Rs.minute.utc.range,Rs.hour=co(function(n){var t=n.getTimezoneOffset()/60;return new Ds(36e5*(Math.floor(n/36e5-t)+t))},function(n,t){n.setTime(n.getTime()+36e5*Math.floor(t))},function(n){return n.getHours()}),Rs.hours=Rs.hour.range,Rs.hours.utc=Rs.hour.utc.range,Rs.month=co(function(n){return n=Rs.day(n),n.setDate(1),n},function(n,t){n.setMonth(n.getMonth()+t)},function(n){return n.getMonth()}),Rs.months=Rs.month.range,Rs.months.utc=Rs.month.utc.range;var ol=[1e3,5e3,15e3,3e4,6e4,3e5,9e5,18e5,36e5,108e5,216e5,432e5,864e5,1728e5,6048e5,2592e6,7776e6,31536e6],al=[[Rs.second,1],[Rs.second,5],[Rs.second,15],[Rs.second,30],[Rs.minute,1],[Rs.minute,5],[Rs.minute,15],[Rs.minute,30],[Rs.hour,1],[Rs.hour,3],[Rs.hour,6],[Rs.hour,12],[Rs.day,1],[Rs.day,2],[Rs.week,1],[Rs.month,1],[Rs.month,3],[Rs.year,1]],cl=[[lo(&quot;%Y&quot;),Zt],[lo(&quot;%B&quot;),function(n){return n.getMonth()}],[lo(&quot;%b %d&quot;),function(n){return 1!=n.getDate()}],[lo(&quot;%a %d&quot;),function(n){return n.getDay()&amp;&amp;1!=n.getDate()}],[lo(&quot;%I %p&quot;),function(n){return n.getHours()}],[lo(&quot;%I:%M&quot;),function(n){return n.getMinutes()}],[lo(&quot;:%S&quot;),function(n){return n.getSeconds()}],[lo(&quot;.%L&quot;),function(n){return n.getMilliseconds()}]],sl=Zo(cl);al.year=Rs.year,Rs.scale=function(){return Yo($o.scale.linear(),al,sl)};var ll={range:function(n,t,e){return $o.range(+n,+t,e).map(Io)}},fl=al.map(function(n){return[n[0].utc,n[1]]}),hl=[[Fo(&quot;%Y&quot;),Zt],[Fo(&quot;%B&quot;),function(n){return n.getUTCMonth()}],[Fo(&quot;%b %d&quot;),function(n){return 1!=n.getUTCDate()}],[Fo(&quot;%a %d&quot;),function(n){return n.getUTCDay()&amp;&amp;1!=n.getUTCDate()}],[Fo(&quot;%I %p&quot;),function(n){return n.getUTCHours()}],[Fo(&quot;%I:%M&quot;),function(n){return n.getUTCMinutes()}],[Fo(&quot;:%S&quot;),function(n){return n.getUTCSeconds()}],[Fo(&quot;.%L&quot;),function(n){return n.getUTCMilliseconds()}]],gl=Zo(hl);return fl.year=Rs.year.utc,Rs.scale.utc=function(){return Yo($o.scale.linear(),fl,gl)},$o.text=dt(function(n){return n.responseText}),$o.json=function(n,t){return mt(n,&quot;application/json&quot;,Vo,t)},$o.html=function(n,t){return mt(n,&quot;text/html&quot;,Xo,t)},$o.xml=dt(function(n){return n.responseXML}),$o}();&lt;/script&gt;
&lt;script charset=&quot;utf-8&quot;&gt;

// Minimum and maximum scale extents
var MIN_SCALE = 1.0/3.0;
var MAX_SCALE = 10.0;


// Traverse upwards from a d3 selection to find and return the first
// node with &quot;plotroot&quot; class.
var getplotroot = function(selection)  {
    var node = selection.node();
    while (node &amp;&amp; node.classList &amp;&amp; !node.classList.contains(&quot;plotroot&quot;)) {
        node = node.parentNode;
    }
    return d3.select(node);
};


// Construct a callback for toggling geometries on/off using color groupings.
//
// Args:
//   colorclass: class names assigned to geometries belonging to a paricular
//               color group.
//
// Returns:
//   A callback function.
//
var guide_toggle_color = function(colorclass) {
    var visible = true;
    return (function() {
        var root = getplotroot(d3.select(this));
        if (visible) {
            d3.select(this)
              .transition()
              .duration(250)
              .style(&quot;opacity&quot;, 0.5);
            root.selectAll(&quot;.geometry.&quot; + colorclass)
                .transition()
                .duration(250)
                .style(&quot;opacity&quot;, 0);
            visible = false;
        } else {
            d3.select(this)
              .transition()
              .duration(250)
              .style(&quot;opacity&quot;, 1.0);
            root.selectAll(&quot;.geometry.&quot; + colorclass)
                .transition()
                .duration(250)
                .style(&quot;opacity&quot;, 1.0);
            visible = true;
        }
    });
};


// Construct a callback used to toggle highly-visibility grid lines.
//
// Args:
//   color: Faded-in/faded-out color, respectively.
//
// Returns:
//   Callback function.
//
var guide_background_mouseover = function(color) {
    return (function () {
        var root = getplotroot(d3.select(this));
        root.selectAll(&quot;.xgridlines, .ygridlines&quot;)
            .transition()
            .duration(250)
            .attr(&quot;stroke&quot;, color);

        root.selectAll(&quot;.zoomslider&quot;)
            .transition()
            .duration(250)
            .attr(&quot;opacity&quot;, 1.0);
    });
};

var guide_background_mouseout = function(color) {
    return (function () {
        var root = getplotroot(d3.select(this));
        root.selectAll(&quot;.xgridlines, .ygridlines&quot;)
            .transition()
            .duration(250)
            .attr(&quot;stroke&quot;, color);

        root.selectAll(&quot;.zoomslider&quot;)
            .transition()
            .duration(250)
            .attr(&quot;opacity&quot;, 0.0);
    });
};


// Construct a call back used for mouseover effects in the point geometry.
//
// Args:
//   scale: Scale for expanded width
//   ratio: radius / line-width. This is necessary to maintain relative width
//          at arbitraty levels of zoom
//
// Returns:
//  Callback function.
//
var geom_point_mouseover = function(scale, ratio) {
    return (function() {
        var lw = this.getAttribute(&apos;r&apos;) * ratio * scale
        d3.select(this)
          .transition()
          .duration(100)
          .style(&quot;stroke-width&quot;, lw + &apos;px&apos;, &apos;important&apos;);
    });
};

// Construct a call back used for mouseout effects in the point geometry.
//
// Args:
//   scale: Scale for expanded width
//   ratio: radius / line-width. This is necessary to maintain relative width
//          at arbitraty levels of zoom
//
// Returns:
//  Callback function.
//
var geom_point_mouseout = function(scale, ratio) {
    return (function() {
        var lw = this.getAttribute(&apos;r&apos;) * ratio
        d3.select(this)
          .transition()
          .duration(100)
          .style(&quot;stroke-width&quot;, lw + &apos;px&apos;, &apos;important&apos;);
    });
};

// Translate and scale geometry while trying to maintain scale invariance for
// certain ellements.
//
// Args:
//   root: d3 selection of the root plot group node.
//   t: A transform of the form {&quot;scale&quot;: scale}
//   old_scale: The scaling factor applied prior to t.scale.
//
var set_geometry_transform = function(root, ctx, old_scale) {
    var xscalable = root.node().classList.contains(&quot;xscalable&quot;);
    var yscalable = root.node().classList.contains(&quot;yscalable&quot;);

    var xscale = 1.0;
    var tx = 0.0;
    if (xscalable) {
        xscale = ctx.scale;
        tx = ctx.tx;
    }

    var yscale = 1.0;
    var ty = 0.0;
    if (yscalable) {
        yscale = ctx.scale;
        ty = ctx.ty;
    }

    root.selectAll(&quot;.geometry&quot;)
        .attr(&quot;transform&quot;,
          &quot;translate(&quot; + tx + &quot; &quot; + ty + &quot;) &quot; +
              &quot;scale(&quot; + xscale + &quot; &quot; + yscale + &quot;)&quot;);

    var unscale_factor = old_scale / ctx.scale;

    // unscale geometry widths, radiuses, etc.
    var size_attribs = [&quot;r&quot;];
    var size_styles = [&quot;font-size&quot;, &quot;stroke-width&quot;];
    root.select(&quot;.plotpanel&quot;)
        .selectAll(&quot;g, .geometry&quot;)
        .each(function() {
          sel = d3.select(this);
          var i;
          var key;
          var val;
          for (i in size_styles) {
              key = size_styles[i];
              val = sel.style(key);
              if (val !== null) {
                  // For some reason d3 rounds things like font-sizes to the
                  // nearest integer, so we are setting styles directly instead.
                  val = parseFloat(val);
                  sel.node().style.setProperty(key, unscale_factor * val + &quot;px&quot;, &quot;important&quot;);
              }
          }

          for (i in size_attribs) {
              key = size_attribs[i];
              val = sel.attr(key);
              if (val !== null) {
                  sel.attr(key, unscale_factor * val);
              }
          }
      });

    // TODO:
    // Is this going to work when we do things other than circles. Suppose we
    // have plots where we have a path drawing some sort of symbol which we want
    // to remain size-invariant. Should we be trying to place things using
    // translate?

    // move axis labels and grid lines around
    if (xscalable) {
        root.selectAll(&quot;.yfixed&quot;)
            .attr(&quot;transform&quot;, function() {
                return &quot;translate(&quot; + [ctx.tx, 0.0] + &quot;) &quot; +
                       &quot;scale(&quot; + [ctx.scale, 1.0] + &quot;)&quot;;
          });

        root.selectAll(&quot;.xlabels&quot;)
            .attr(&quot;transform&quot;, function() {
              return &quot;translate(&quot; + [ctx.tx, 0.0] + &quot;)&quot;;
          })
          .selectAll(&quot;text&quot;)
            .each(function() {
                d3.select(this).attr(&quot;x&quot;,
                    ctx.scale / old_scale * d3.select(this).attr(&quot;x&quot;));
            });
    }

    if (yscalable) {
        root.selectAll(&quot;.xfixed&quot;)
            .attr(&quot;transform&quot;, function() {
              return &quot;translate(&quot; + [0.0, ctx.ty] + &quot;) &quot; +
                     &quot;scale(&quot; + [1.0, ctx.scale] + &quot;)&quot;;
            });

        root.selectAll(&quot;.ylabels&quot;)
            .attr(&quot;transform&quot;, function() {
              return &quot;translate(&quot; + [0.0, ctx.ty] + &quot;)&quot;;
            })
            .selectAll(&quot;text&quot;)
              .each(function() {
                  d3.select(this).attr(&quot;y&quot;,
                      ctx.scale / old_scale * d3.select(this).attr(&quot;y&quot;));
            });
    }

    var bbox = root.select(&quot;.guide.background&quot;)
                   .select(&quot;path&quot;).node().getBBox();

    // hide/show ticks labels based on their position
    root.selectAll(&quot;.xlabels&quot;)
        .selectAll(&quot;text&quot;)
        .attr(&quot;visibility&quot;, function() {
            var x = parseInt(d3.select(this).attr(&quot;x&quot;), 10) + ctx.tx;
            return bbox.x &lt;= x &amp;&amp; x &lt;= bbox.x + bbox.width ? &quot;visible&quot; : &quot;hidden&quot;;
        });

    root.selectAll(&quot;.ylabels&quot;)
        .selectAll(&quot;text&quot;)
        .attr(&quot;visibility&quot;, function() {
            var y = parseInt(d3.select(this).attr(&quot;y&quot;), 10) + ctx.ty;
            return bbox.y &lt;= y &amp;&amp; y &lt;= bbox.y + bbox.height ? &quot;visible&quot; : &quot;hidden&quot;;
        });
};


// Construct a callback used for zoombehavior.
//
// Args:
//   t: A transform of the form {&quot;scale&quot;: scale} to close arround.
//
// Returns:
//   A zoom behavior.
//
var zoom_behavior = function(ctx) {
    var zm = d3.behavior.zoom();
    ctx.zoom_behavior = zm;

    zm.scaleExtent([MIN_SCALE, MAX_SCALE])
      .on(&quot;zoom&quot;, function(d, i) {
        var root = getplotroot(d3.select(this));
        old_scale = ctx.scale;
        ctx.scale = d3.event.scale;
        var bbox = root.select(&quot;.guide.background&quot;)
                       .select(&quot;path&quot;).node().getBBox();

        var x_min = -bbox.width * ctx.scale - (ctx.scale * bbox.width - bbox.width);
        var x_max = bbox.width * ctx.scale;
        var y_min = -bbox.height * ctx.scale - (ctx.scale * bbox.height - bbox.height);
        var y_max = bbox.height * ctx.scale;

        var x0 = bbox.x - ctx.scale * bbox.x;
        var y0 = bbox.y - ctx.scale * bbox.y;

        var tx = Math.max(Math.min(d3.event.translate[0] - x0, x_max), x_min);
        var ty = Math.max(Math.min(d3.event.translate[1] - y0, y_max), y_min);

        tx += x0;
        ty += y0;

        ctx.tx = tx;
        ctx.ty = ty;

        set_geometry_transform(
            root,
            {&quot;tx&quot;: tx,
             &quot;ty&quot;: ty,
             &quot;scale&quot;: ctx.scale}, old_scale);
        zm.translate([tx, ty]);

        update_zoomslider(root, ctx);
      });


    return (function (g) {
        zm(g);
        default_handler = g.on(&quot;wheel.zoom&quot;);
        function wheelhandler() {
        if (d3.event.shiftKey) {
                default_handler.call(this);
                d3.event.stopPropagation();
            }
        }
        g.on(&quot;wheel.zoom&quot;, wheelhandler)
         .on(&quot;mousewheel.zoom&quot;, wheelhandler)
         .on(&quot;DOMMouseScroll.zoom&quot;, wheelhandler);
    });
};


var slider_position_from_scale = function(scale) {
    if (scale &gt;= 1.0) {
        return 0.5 + 0.5 * (Math.log(scale) / Math.log(MAX_SCALE));
    }
    else {
        return 0.5 * (Math.log(scale) - Math.log(MIN_SCALE)) / (0 - Math.log(MIN_SCALE));
    }
};


// Construct a call
var zoomslider_behavior = function(ctx, min_extent, max_extent) {
    var drag = d3.behavior.drag();
    ctx.zoomslider_behavior = drag;
    ctx.min_zoomslider_extent = min_extent;
    ctx.max_zoomslider_extent = max_extent;

    drag.on(&quot;drag&quot;, function() {
        var xmid = (min_extent + max_extent) / 2;
        var new_scale;

        // current slider posisition
        var xpos = slider_position_from_scale(ctx.scale) +
            (d3.event.dx / (max_extent - min_extent));

        // new scale
        if (xpos &gt;= 0.5) {
            new_scale = Math.exp(2.0 * (xpos - 0.5) * Math.log(MAX_SCALE));
        }
        else {
            new_scale = Math.exp(2.0 * xpos * (0 - Math.log(MIN_SCALE)) +
                Math.log(MIN_SCALE));
        }
        new_scale = Math.min(MAX_SCALE, Math.max(MIN_SCALE, new_scale));

        // update scale
        var root = getplotroot(d3.select(this));
        var new_trans = scale_centered_translation(root, ctx, new_scale);

        ctx.zoom_behavior.scale(new_scale);
        ctx.zoom_behavior.translate(new_trans);
        ctx.zoom_behavior.event(root);

        // Note: the zoom event will take care of repositioning the slider thumb
    });

    drag.on(&quot;dragstart&quot;, function() {
        d3.event.sourceEvent.stopPropagation();
    });

    return drag;
};


// Reposition the zoom slider thumb based on the current scale
var update_zoomslider = function(root, ctx) {
    var xmid = (ctx.min_zoomslider_extent + ctx.max_zoomslider_extent) / 2;
    var xpos = ctx.min_zoomslider_extent +
        ((ctx.max_zoomslider_extent - ctx.min_zoomslider_extent) *
            slider_position_from_scale(ctx.scale));
    root.select(&quot;.zoomslider_thumb&quot;)
        .attr(&quot;transform&quot;, &quot;translate(&quot; + (xpos - xmid) + &quot; &quot; + 0 + &quot;)&quot;);
};


// Compute the translation needed to change the scale when keeping the plot
// centered.
scale_centered_translation = function(root, ctx, new_scale) {
    var bbox = root.select(&quot;.guide.background&quot;)
                   .select(&quot;path&quot;).node().getBBox();

    // how off from center the current view is
    var xoff = ctx.zoom_behavior.translate()[0] -
              (bbox.x * (1 - ctx.scale) + (bbox.width * (1 - ctx.scale)) / 2);
    var yoff = ctx.zoom_behavior.translate()[1] -
              (bbox.y * (1 - ctx.scale) + (bbox.height * (1 - ctx.scale)) / 2);

    // rescale offsets
    xoff = xoff * new_scale / ctx.scale;
    yoff = yoff * new_scale / ctx.scale;

    // adjust for the panel position being scaled
    var x_edge_adjust = bbox.x * (1 - new_scale);
    var y_edge_adjust = bbox.y * (1 - new_scale);

    return [xoff + x_edge_adjust + (bbox.width - bbox.width * new_scale) / 2,
            yoff + y_edge_adjust + (bbox.height - bbox.height * new_scale) / 2];
};


// jump to a new scale with a nice transition
var zoom_step = function(root, ctx, new_scale) {
    var bbox = root.select(&quot;.guide.background&quot;)
                   .select(&quot;path&quot;).node().getBBox();
    ctx.zoom_behavior.size([bbox.width, bbox.height]);
    new_trans = scale_centered_translation(root, ctx, new_scale);

    root.transition()
        .duration(250)
        .tween(&quot;zoom&quot;, function()  {
            var trans_interp = d3.interpolate(ctx.zoom_behavior.translate(), new_trans);
            var scale_interp = d3.interpolate(ctx.zoom_behavior.scale(), new_scale);
            return function (t) {
                ctx.zoom_behavior.translate(trans_interp(t))
                                 .scale(scale_interp(t));
                ctx.zoom_behavior.event(root);
            };
        });
};


// Handlers for clicking the zoom in or zoom out buttons.
var zoomout_behavior = function(ctx) {
    return (function() {
        var new_scale = Math.max(MIN_SCALE, ctx.scale / 1.5);
        var root = getplotroot(d3.select(this));
        zoom_step(root, ctx, new_scale);
        d3.event.stopPropagation();
    });
};


var zoomin_behavior = function(ctx) {
    return (function() {
        var new_scale = Math.min(MAX_SCALE, ctx.scale * 1.5);
        var root = getplotroot(d3.select(this));
        zoom_step(root, ctx, new_scale);
        d3.event.stopPropagation();
    });
};


var zoomslider_track_behavior = function(ctx, min_extent, max_extent) {
    return (function() {
        var xpos = slider_position_from_scale(ctx.scale);
        var bbox = this.getBBox();
        var xclick = (d3.mouse(this)[0] - bbox.x) / bbox.width;
        var root = getplotroot(d3.select(this));
        var new_scale;
        if (xclick &lt; xpos) {
            new_scale = Math.max(MIN_SCALE, ctx.scale / 1.5);
            zoom_step(root, ctx, new_scale);
        }
        else {
            new_scale = Math.min(MAX_SCALE, ctx.scale * 1.5);
            zoom_step(root, ctx, new_scale);
        }
        d3.event.stopPropagation();
    });
};


// Mouseover effects for zoom slider
var zoomslider_button_mouseover = function(destcolor) {
    return (function() {
        d3.select(this)
          .selectAll(&quot;.button_logo&quot;)
          .transition()
          .duration(150)
          .attr(&quot;fill&quot;, destcolor);
    });
};


var zoomslider_thumb_mouseover = function(destcolor) {
    return (function() {
        d3.select(this)
          .transition()
          .duration(150)
          .attr(&quot;fill&quot;, destcolor);
    });
};

//@ sourceURL=gadfly.js
&lt;/script&gt;
&lt;p&gt;Here&apos;s an example with 4 points. Each spot on the plot is colored by the sum corresponding to that point. For example, the dark space in the lower left has three &amp;quot;positively&amp;quot; signed rectangles going through it, but for the white space in the middle, one positive and one negative rectangle cancel out.&lt;/p&gt;
&lt;div id=&quot;gadflyplot-Z2hpiN9yfQZI62vqLsbN&quot;&gt;&lt;/div&gt;
&lt;script&gt;
(function (module) {
function draw_with_data(data, parent_id) {
  var g = d3.select(parent_id)
            .append(&quot;svg&quot;)
              .attr(&quot;width&quot;, &quot;120mm&quot;)
              .attr(&quot;height&quot;, &quot;80mm&quot;)
              .attr(&quot;viewBox&quot;, &quot;0 0 120 80&quot;)
              .attr(&quot;stroke-width&quot;, &quot;0.5&quot;)
              .attr(&quot;style&quot;, &quot;stroke:black;fill:black&quot;);
  g.append(&quot;defs&quot;);
  var ctx = {
      &quot;scale&quot;: 1.0,
      &quot;tx&quot;: 0.0,
      &quot;ty&quot;: 0.0
  };
(function (g) {
  g.attr(&quot;stroke&quot;, &quot;none&quot;)
   .attr(&quot;fill&quot;, &quot;#000000&quot;)
   .attr(&quot;stroke-width&quot;, 0.3)
   .attr(&quot;font-family&quot;, &quot;Helvetic,Arial,sans&quot;)
   .style(&quot;font-size&quot;, &quot;3.88px&quot;);
  (function (g) {
    g.attr(&quot;class&quot;, &quot;plotroot xscalable yscalable&quot;);
    (function (g) {
      g.attr(&quot;stroke&quot;, &quot;none&quot;)
       .attr(&quot;fill&quot;, &quot;#4C404B&quot;)
       .attr(&quot;font-family&quot;, &quot;&apos;PT Sans&apos;,&apos;Helvetica Neue&apos;,&apos;Helvetica&apos;,sans-serif&quot;)
       .style(&quot;font-size&quot;, &quot;3.18px&quot;)
       .attr(&quot;class&quot;, &quot;guide ylabels&quot;);
      (function (g) {
        g.attr(&quot;visibility&quot;, &quot;hidden&quot;);
        g.append(&quot;svg:text&quot;)
           .attr(&quot;x&quot;, 11.22)
           .attr(&quot;y&quot;, 126.99)
           .attr(&quot;text-anchor&quot;, &quot;end&quot;)
           .style(&quot;dominant-baseline&quot;, &quot;central&quot;)
            .call(function(text) {
      text.text(&quot;-5&quot;);
    })
;
      }(g.append(&quot;g&quot;)));
      g.append(&quot;svg:text&quot;)
         .attr(&quot;x&quot;, 11.22)
         .attr(&quot;y&quot;, 54.88)
         .attr(&quot;text-anchor&quot;, &quot;end&quot;)
         .style(&quot;dominant-baseline&quot;, &quot;central&quot;)
         .call(function(text) {
     text.text(&quot;1&quot;);
   })
;
      g.append(&quot;svg:text&quot;)
         .attr(&quot;x&quot;, 11.22)
         .attr(&quot;y&quot;, 42.86)
         .attr(&quot;text-anchor&quot;, &quot;end&quot;)
         .style(&quot;dominant-baseline&quot;, &quot;central&quot;)
         .call(function(text) {
     text.text(&quot;2&quot;);
   })
;
      g.append(&quot;svg:text&quot;)
         .attr(&quot;x&quot;, 11.22)
         .attr(&quot;y&quot;, 6.8)
         .attr(&quot;text-anchor&quot;, &quot;end&quot;)
         .style(&quot;dominant-baseline&quot;, &quot;central&quot;)
         .call(function(text) {
     text.text(&quot;5&quot;);
   })
;
      (function (g) {
        g.attr(&quot;visibility&quot;, &quot;hidden&quot;);
        g.append(&quot;svg:text&quot;)
           .attr(&quot;x&quot;, 11.22)
           .attr(&quot;y&quot;, 114.97)
           .attr(&quot;text-anchor&quot;, &quot;end&quot;)
           .style(&quot;dominant-baseline&quot;, &quot;central&quot;)
            .call(function(text) {
      text.text(&quot;-4&quot;);
    })
;
      }(g.append(&quot;g&quot;)));
      (function (g) {
        g.attr(&quot;visibility&quot;, &quot;hidden&quot;);
        g.append(&quot;svg:text&quot;)
           .attr(&quot;x&quot;, 11.22)
           .attr(&quot;y&quot;, -53.29)
           .attr(&quot;text-anchor&quot;, &quot;end&quot;)
           .style(&quot;dominant-baseline&quot;, &quot;central&quot;)
            .call(function(text) {
      text.text(&quot;10&quot;);
    })
;
      }(g.append(&quot;g&quot;)));
      (function (g) {
        g.attr(&quot;visibility&quot;, &quot;hidden&quot;);
        g.append(&quot;svg:text&quot;)
           .attr(&quot;x&quot;, 11.22)
           .attr(&quot;y&quot;, 90.93)
           .attr(&quot;text-anchor&quot;, &quot;end&quot;)
           .style(&quot;dominant-baseline&quot;, &quot;central&quot;)
            .call(function(text) {
      text.text(&quot;-2&quot;);
    })
;
      }(g.append(&quot;g&quot;)));
      g.append(&quot;svg:text&quot;)
         .attr(&quot;x&quot;, 11.22)
         .attr(&quot;y&quot;, 30.84)
         .attr(&quot;text-anchor&quot;, &quot;end&quot;)
         .style(&quot;dominant-baseline&quot;, &quot;central&quot;)
         .call(function(text) {
     text.text(&quot;3&quot;);
   })
;
      (function (g) {
        g.attr(&quot;visibility&quot;, &quot;hidden&quot;);
        g.append(&quot;svg:text&quot;)
           .attr(&quot;x&quot;, 11.22)
           .attr(&quot;y&quot;, -17.23)
           .attr(&quot;text-anchor&quot;, &quot;end&quot;)
           .style(&quot;dominant-baseline&quot;, &quot;central&quot;)
            .call(function(text) {
      text.text(&quot;7&quot;);
    })
;
      }(g.append(&quot;g&quot;)));
      (function (g) {
        g.attr(&quot;visibility&quot;, &quot;hidden&quot;);
        g.append(&quot;svg:text&quot;)
           .attr(&quot;x&quot;, 11.22)
           .attr(&quot;y&quot;, 139.01)
           .attr(&quot;text-anchor&quot;, &quot;end&quot;)
           .style(&quot;dominant-baseline&quot;, &quot;central&quot;)
            .call(function(text) {
      text.text(&quot;-6&quot;);
    })
;
      }(g.append(&quot;g&quot;)));
      (function (g) {
        g.attr(&quot;visibility&quot;, &quot;hidden&quot;);
        g.append(&quot;svg:text&quot;)
           .attr(&quot;x&quot;, 11.22)
           .attr(&quot;y&quot;, -65.31)
           .attr(&quot;text-anchor&quot;, &quot;end&quot;)
           .style(&quot;dominant-baseline&quot;, &quot;central&quot;)
            .call(function(text) {
      text.text(&quot;11&quot;);
    })
;
      }(g.append(&quot;g&quot;)));
      (function (g) {
        g.attr(&quot;visibility&quot;, &quot;hidden&quot;);
        g.append(&quot;svg:text&quot;)
           .attr(&quot;x&quot;, 11.22)
           .attr(&quot;y&quot;, 102.95)
           .attr(&quot;text-anchor&quot;, &quot;end&quot;)
           .style(&quot;dominant-baseline&quot;, &quot;central&quot;)
            .call(function(text) {
      text.text(&quot;-3&quot;);
    })
;
      }(g.append(&quot;g&quot;)));
      g.append(&quot;svg:text&quot;)
         .attr(&quot;x&quot;, 11.22)
         .attr(&quot;y&quot;, 18.82)
         .attr(&quot;text-anchor&quot;, &quot;end&quot;)
         .style(&quot;dominant-baseline&quot;, &quot;central&quot;)
         .call(function(text) {
     text.text(&quot;4&quot;);
   })
;
      (function (g) {
        g.attr(&quot;visibility&quot;, &quot;hidden&quot;);
        g.append(&quot;svg:text&quot;)
           .attr(&quot;x&quot;, 11.22)
           .attr(&quot;y&quot;, -29.25)
           .attr(&quot;text-anchor&quot;, &quot;end&quot;)
           .style(&quot;dominant-baseline&quot;, &quot;central&quot;)
            .call(function(text) {
      text.text(&quot;8&quot;);
    })
;
      }(g.append(&quot;g&quot;)));
      (function (g) {
        g.attr(&quot;visibility&quot;, &quot;hidden&quot;);
        g.append(&quot;svg:text&quot;)
           .attr(&quot;x&quot;, 11.22)
           .attr(&quot;y&quot;, -5.22)
           .attr(&quot;text-anchor&quot;, &quot;end&quot;)
           .style(&quot;dominant-baseline&quot;, &quot;central&quot;)
            .call(function(text) {
      text.text(&quot;6&quot;);
    })
;
      }(g.append(&quot;g&quot;)));
      g.append(&quot;svg:text&quot;)
         .attr(&quot;x&quot;, 11.22)
         .attr(&quot;y&quot;, 66.9)
         .attr(&quot;text-anchor&quot;, &quot;end&quot;)
         .style(&quot;dominant-baseline&quot;, &quot;central&quot;)
         .call(function(text) {
     text.text(&quot;0&quot;);
   })
;
      (function (g) {
        g.attr(&quot;visibility&quot;, &quot;hidden&quot;);
        g.append(&quot;svg:text&quot;)
           .attr(&quot;x&quot;, 11.22)
           .attr(&quot;y&quot;, -41.27)
           .attr(&quot;text-anchor&quot;, &quot;end&quot;)
           .style(&quot;dominant-baseline&quot;, &quot;central&quot;)
            .call(function(text) {
      text.text(&quot;9&quot;);
    })
;
      }(g.append(&quot;g&quot;)));
      (function (g) {
        g.attr(&quot;visibility&quot;, &quot;hidden&quot;);
        g.append(&quot;svg:text&quot;)
           .attr(&quot;x&quot;, 11.22)
           .attr(&quot;y&quot;, 78.91)
           .attr(&quot;text-anchor&quot;, &quot;end&quot;)
           .style(&quot;dominant-baseline&quot;, &quot;central&quot;)
            .call(function(text) {
      text.text(&quot;-1&quot;);
    })
;
      }(g.append(&quot;g&quot;)));
    }(g.append(&quot;g&quot;)));
    (function (g) {
      g.attr(&quot;stroke&quot;, &quot;none&quot;)
       .attr(&quot;fill&quot;, &quot;#4C404B&quot;)
       .attr(&quot;font-family&quot;, &quot;&apos;PT Sans&apos;,&apos;Helvetica Neue&apos;,&apos;Helvetica&apos;,sans-serif&quot;)
       .style(&quot;font-size&quot;, &quot;3.18px&quot;)
       .attr(&quot;class&quot;, &quot;guide xlabels&quot;);
      (function (g) {
        g.attr(&quot;visibility&quot;, &quot;hidden&quot;);
        g.append(&quot;svg:text&quot;)
           .attr(&quot;x&quot;, -76.92)
           .attr(&quot;y&quot;, 74)
           .attr(&quot;text-anchor&quot;, &quot;middle&quot;)
            .call(function(text) {
      text.text(&quot;-5&quot;);
    })
;
      }(g.append(&quot;g&quot;)));
      g.append(&quot;svg:text&quot;)
         .attr(&quot;x&quot;, 32.68)
         .attr(&quot;y&quot;, 74)
         .attr(&quot;text-anchor&quot;, &quot;middle&quot;)
         .call(function(text) {
     text.text(&quot;1&quot;);
   })
;
      g.append(&quot;svg:text&quot;)
         .attr(&quot;x&quot;, 50.95)
         .attr(&quot;y&quot;, 74)
         .attr(&quot;text-anchor&quot;, &quot;middle&quot;)
         .call(function(text) {
     text.text(&quot;2&quot;);
   })
;
      (function (g) {
        g.attr(&quot;visibility&quot;, &quot;hidden&quot;);
        g.append(&quot;svg:text&quot;)
           .attr(&quot;x&quot;, 105.74)
           .attr(&quot;y&quot;, 74)
           .attr(&quot;text-anchor&quot;, &quot;middle&quot;)
            .call(function(text) {
      text.text(&quot;5&quot;);
    })
;
      }(g.append(&quot;g&quot;)));
      (function (g) {
        g.attr(&quot;visibility&quot;, &quot;hidden&quot;);
        g.append(&quot;svg:text&quot;)
           .attr(&quot;x&quot;, -58.65)
           .attr(&quot;y&quot;, 74)
           .attr(&quot;text-anchor&quot;, &quot;middle&quot;)
            .call(function(text) {
      text.text(&quot;-4&quot;);
    })
;
      }(g.append(&quot;g&quot;)));
      (function (g) {
        g.attr(&quot;visibility&quot;, &quot;hidden&quot;);
        g.append(&quot;svg:text&quot;)
           .attr(&quot;x&quot;, -22.12)
           .attr(&quot;y&quot;, 74)
           .attr(&quot;text-anchor&quot;, &quot;middle&quot;)
            .call(function(text) {
      text.text(&quot;-2&quot;);
    })
;
      }(g.append(&quot;g&quot;)));
      g.append(&quot;svg:text&quot;)
         .attr(&quot;x&quot;, 69.21)
         .attr(&quot;y&quot;, 74)
         .attr(&quot;text-anchor&quot;, &quot;middle&quot;)
         .call(function(text) {
     text.text(&quot;3&quot;);
   })
;
      (function (g) {
        g.attr(&quot;visibility&quot;, &quot;hidden&quot;);
        g.append(&quot;svg:text&quot;)
           .attr(&quot;x&quot;, 142.28)
           .attr(&quot;y&quot;, 74)
           .attr(&quot;text-anchor&quot;, &quot;middle&quot;)
            .call(function(text) {
      text.text(&quot;7&quot;);
    })
;
      }(g.append(&quot;g&quot;)));
      (function (g) {
        g.attr(&quot;visibility&quot;, &quot;hidden&quot;);
        g.append(&quot;svg:text&quot;)
           .attr(&quot;x&quot;, -40.39)
           .attr(&quot;y&quot;, 74)
           .attr(&quot;text-anchor&quot;, &quot;middle&quot;)
            .call(function(text) {
      text.text(&quot;-3&quot;);
    })
;
      }(g.append(&quot;g&quot;)));
      g.append(&quot;svg:text&quot;)
         .attr(&quot;x&quot;, 87.48)
         .attr(&quot;y&quot;, 74)
         .attr(&quot;text-anchor&quot;, &quot;middle&quot;)
         .call(function(text) {
     text.text(&quot;4&quot;);
   })
;
      (function (g) {
        g.attr(&quot;visibility&quot;, &quot;hidden&quot;);
        g.append(&quot;svg:text&quot;)
           .attr(&quot;x&quot;, 160.54)
           .attr(&quot;y&quot;, 74)
           .attr(&quot;text-anchor&quot;, &quot;middle&quot;)
            .call(function(text) {
      text.text(&quot;8&quot;);
    })
;
      }(g.append(&quot;g&quot;)));
      (function (g) {
        g.attr(&quot;visibility&quot;, &quot;hidden&quot;);
        g.append(&quot;svg:text&quot;)
           .attr(&quot;x&quot;, 124.01)
           .attr(&quot;y&quot;, 74)
           .attr(&quot;text-anchor&quot;, &quot;middle&quot;)
            .call(function(text) {
      text.text(&quot;6&quot;);
    })
;
      }(g.append(&quot;g&quot;)));
      g.append(&quot;svg:text&quot;)
         .attr(&quot;x&quot;, 14.41)
         .attr(&quot;y&quot;, 74)
         .attr(&quot;text-anchor&quot;, &quot;middle&quot;)
         .call(function(text) {
     text.text(&quot;0&quot;);
   })
;
      (function (g) {
        g.attr(&quot;visibility&quot;, &quot;hidden&quot;);
        g.append(&quot;svg:text&quot;)
           .attr(&quot;x&quot;, 178.81)
           .attr(&quot;y&quot;, 74)
           .attr(&quot;text-anchor&quot;, &quot;middle&quot;)
            .call(function(text) {
      text.text(&quot;9&quot;);
    })
;
      }(g.append(&quot;g&quot;)));
      (function (g) {
        g.attr(&quot;visibility&quot;, &quot;hidden&quot;);
        g.append(&quot;svg:text&quot;)
           .attr(&quot;x&quot;, -3.85)
           .attr(&quot;y&quot;, 74)
           .attr(&quot;text-anchor&quot;, &quot;middle&quot;)
            .call(function(text) {
      text.text(&quot;-1&quot;);
    })
;
      }(g.append(&quot;g&quot;)));
    }(g.append(&quot;g&quot;)));
    (function (g) {
      g.attr(&quot;stroke&quot;, &quot;none&quot;)
       .attr(&quot;font-family&quot;, &quot;&apos;PT Sans&apos;,&apos;Helvetica Neue&apos;,&apos;Helvetica&apos;,sans-serif&quot;)
       .style(&quot;font-size&quot;, &quot;3.88px&quot;)
       .attr(&quot;fill&quot;, &quot;#362A35&quot;);
      g.append(&quot;svg:text&quot;)
         .attr(&quot;x&quot;, 104.34)
         .attr(&quot;y&quot;, 22.42)
         .attr(&quot;text-anchor&quot;, &quot;middle&quot;)
         .call(function(text) {
     text.text(&quot;areasum&quot;);
   })
;
    }(g.append(&quot;g&quot;)));
    (function (g) {
      g.attr(&quot;font-family&quot;, &quot;&apos;PT Sans&apos;,&apos;Helvetica Neue&apos;,&apos;Helvetica&apos;,sans-serif&quot;)
       .style(&quot;font-size&quot;, &quot;3.18px&quot;)
       .attr(&quot;stroke&quot;, &quot;none&quot;);
      (function (g) {
        g.attr(&quot;fill&quot;, &quot;#008000&quot;)
         .attr(&quot;stroke-width&quot;, 0.3);
        g.append(&quot;svg:path&quot;)
           .attr(&quot;d&quot;, &quot;M91.67,56.23 L 95.97 56.23 95.97 60.64 91.67 60.64 z&quot;);
      }(g.append(&quot;g&quot;)));
      (function (g) {
        g.attr(&quot;fill&quot;, &quot;#4C404B&quot;);
        g.append(&quot;svg:text&quot;)
           .attr(&quot;x&quot;, 96.97)
           .attr(&quot;y&quot;, 53.08)
           .style(&quot;dominant-baseline&quot;, &quot;central&quot;)
            .call(function(text) {
      text.text(&quot;-2&quot;);
    })
;
      }(g.append(&quot;g&quot;)));
      (function (g) {
        g.attr(&quot;fill&quot;, &quot;#93BF85&quot;)
         .attr(&quot;stroke-width&quot;, 0.3);
        g.append(&quot;svg:path&quot;)
           .attr(&quot;d&quot;, &quot;M91.67,49.93 L 95.97 49.93 95.97 51.03 91.67 51.03 z&quot;);
      }(g.append(&quot;g&quot;)));
      (function (g) {
        g.attr(&quot;fill&quot;, &quot;#B7D5AC&quot;)
         .attr(&quot;stroke-width&quot;, 0.3);
        g.append(&quot;svg:path&quot;)
           .attr(&quot;d&quot;, &quot;M91.67,45.63 L 95.97 45.63 95.97 50.03 91.67 50.03 z&quot;);
      }(g.append(&quot;g&quot;)));
      (function (g) {
        g.attr(&quot;fill&quot;, &quot;#4C404B&quot;);
        g.append(&quot;svg:text&quot;)
           .attr(&quot;x&quot;, 96.97)
           .attr(&quot;y&quot;, 42.48)
           .style(&quot;dominant-baseline&quot;, &quot;central&quot;)
            .call(function(text) {
      text.text(&quot;0&quot;);
    })
;
      }(g.append(&quot;g&quot;)));
      (function (g) {
        g.attr(&quot;fill&quot;, &quot;#FFDFD4&quot;)
         .attr(&quot;stroke-width&quot;, 0.3);
        g.append(&quot;svg:path&quot;)
           .attr(&quot;d&quot;, &quot;M91.67,39.33 L 95.97 39.33 95.97 40.43 91.67 40.43 z&quot;);
      }(g.append(&quot;g&quot;)));
      (function (g) {
        g.attr(&quot;fill&quot;, &quot;#FFBFAA&quot;)
         .attr(&quot;stroke-width&quot;, 0.3);
        g.append(&quot;svg:path&quot;)
           .attr(&quot;d&quot;, &quot;M91.67,35.03 L 95.97 35.03 95.97 39.43 91.67 39.43 z&quot;);
      }(g.append(&quot;g&quot;)));
      (function (g) {
        g.attr(&quot;fill&quot;, &quot;#4C404B&quot;);
        g.append(&quot;svg:text&quot;)
           .attr(&quot;x&quot;, 96.97)
           .attr(&quot;y&quot;, 31.87)
           .style(&quot;dominant-baseline&quot;, &quot;central&quot;)
            .call(function(text) {
      text.text(&quot;2&quot;);
    })
;
      }(g.append(&quot;g&quot;)));
      (function (g) {
        g.attr(&quot;fill&quot;, &quot;#FF5232&quot;)
         .attr(&quot;stroke-width&quot;, 0.3);
        g.append(&quot;svg:path&quot;)
           .attr(&quot;d&quot;, &quot;M91.67,28.72 L 95.97 28.72 95.97 29.82 91.67 29.82 z&quot;);
      }(g.append(&quot;g&quot;)));
      (function (g) {
        g.attr(&quot;fill&quot;, &quot;#FF0000&quot;)
         .attr(&quot;stroke-width&quot;, 0.3);
        g.append(&quot;svg:path&quot;)
           .attr(&quot;d&quot;, &quot;M91.67,24.42 L 95.97 24.42 95.97 28.82 91.67 28.82 z&quot;);
      }(g.append(&quot;g&quot;)));
      (function (g) {
        g.attr(&quot;fill&quot;, &quot;#4C404B&quot;);
        g.append(&quot;svg:text&quot;)
           .attr(&quot;x&quot;, 96.97)
           .attr(&quot;y&quot;, 26.57)
           .style(&quot;dominant-baseline&quot;, &quot;central&quot;)
            .call(function(text) {
      text.text(&quot;3&quot;);
    })
;
      }(g.append(&quot;g&quot;)));
      (function (g) {
        g.attr(&quot;fill&quot;, &quot;#FF7B5A&quot;)
         .attr(&quot;stroke-width&quot;, 0.3);
        g.append(&quot;svg:path&quot;)
           .attr(&quot;d&quot;, &quot;M91.67,29.72 L 95.97 29.72 95.97 34.13 91.67 34.13 z&quot;);
      }(g.append(&quot;g&quot;)));
      (function (g) {
        g.attr(&quot;fill&quot;, &quot;#FF9E81&quot;)
         .attr(&quot;stroke-width&quot;, 0.3);
        g.append(&quot;svg:path&quot;)
           .attr(&quot;d&quot;, &quot;M91.67,34.03 L 95.97 34.03 95.97 35.13 91.67 35.13 z&quot;);
      }(g.append(&quot;g&quot;)));
      (function (g) {
        g.attr(&quot;fill&quot;, &quot;#4C404B&quot;);
        g.append(&quot;svg:text&quot;)
           .attr(&quot;x&quot;, 96.97)
           .attr(&quot;y&quot;, 37.18)
           .style(&quot;dominant-baseline&quot;, &quot;central&quot;)
            .call(function(text) {
      text.text(&quot;1&quot;);
    })
;
      }(g.append(&quot;g&quot;)));
      (function (g) {
        g.attr(&quot;fill&quot;, &quot;#FFFFFF&quot;)
         .attr(&quot;stroke-width&quot;, 0.3);
        g.append(&quot;svg:path&quot;)
           .attr(&quot;d&quot;, &quot;M91.67,40.33 L 95.97 40.33 95.97 44.73 91.67 44.73 z&quot;);
      }(g.append(&quot;g&quot;)));
      (function (g) {
        g.attr(&quot;fill&quot;, &quot;#DBEAD5&quot;)
         .attr(&quot;stroke-width&quot;, 0.3);
        g.append(&quot;svg:path&quot;)
           .attr(&quot;d&quot;, &quot;M91.67,44.63 L 95.97 44.63 95.97 45.73 91.67 45.73 z&quot;);
      }(g.append(&quot;g&quot;)));
      (function (g) {
        g.attr(&quot;fill&quot;, &quot;#4C404B&quot;);
        g.append(&quot;svg:text&quot;)
           .attr(&quot;x&quot;, 96.97)
           .attr(&quot;y&quot;, 47.78)
           .style(&quot;dominant-baseline&quot;, &quot;central&quot;)
            .call(function(text) {
      text.text(&quot;-1&quot;);
    })
;
      }(g.append(&quot;g&quot;)));
      (function (g) {
        g.attr(&quot;fill&quot;, &quot;#6EAA5E&quot;)
         .attr(&quot;stroke-width&quot;, 0.3);
        g.append(&quot;svg:path&quot;)
           .attr(&quot;d&quot;, &quot;M91.67,50.93 L 95.97 50.93 95.97 55.33 91.67 55.33 z&quot;);
      }(g.append(&quot;g&quot;)));
      (function (g) {
        g.attr(&quot;fill&quot;, &quot;#469536&quot;)
         .attr(&quot;stroke-width&quot;, 0.3);
        g.append(&quot;svg:path&quot;)
           .attr(&quot;d&quot;, &quot;M91.67,55.23 L 95.97 55.23 95.97 56.33 91.67 56.33 z&quot;);
      }(g.append(&quot;g&quot;)));
      (function (g) {
        g.attr(&quot;fill&quot;, &quot;#4C404B&quot;);
        g.append(&quot;svg:text&quot;)
           .attr(&quot;x&quot;, 96.97)
           .attr(&quot;y&quot;, 58.38)
           .style(&quot;dominant-baseline&quot;, &quot;central&quot;)
            .call(function(text) {
      text.text(&quot;-3&quot;);
    })
;
      }(g.append(&quot;g&quot;)));
    }(g.append(&quot;g&quot;)));
    (function (g) {
      g.on(&quot;mouseover&quot;, guide_background_mouseover(&quot;#C6C6C9&quot;))
       .on(&quot;mouseout&quot;, guide_background_mouseout(&quot;#F0F0F3&quot;))
       .call(zoom_behavior(ctx))
;
      (function (g) {
        d3.select(&quot;defs&quot;)
  .append(&quot;svg:clipPath&quot;)
    .attr(&quot;id&quot;, parent_id + &quot;_clippath0&quot;)
    .append(&quot;svg:path&quot;)
      .attr(&quot;d&quot;, &quot; M12.22,5 L 89.67 5 89.67 68.7 12.22 68.7 z&quot;);g.attr(&quot;clip-path&quot;, &quot;url(#&quot; + parent_id + &quot;_clippath0)&quot;);
        (function (g) {
          g.attr(&quot;class&quot;, &quot;guide background&quot;)
           .attr(&quot;stroke&quot;, &quot;#F1F1F5&quot;)
           .attr(&quot;fill&quot;, &quot;#FFFFFF&quot;)
           .attr(&quot;opacity&quot;, 1.00);
          g.append(&quot;svg:path&quot;)
             .attr(&quot;d&quot;, &quot;M12.22,5 L 89.67 5 89.67 68.7 12.22 68.7 z&quot;);
        }(g.append(&quot;g&quot;)));
        (function (g) {
          g.attr(&quot;stroke&quot;, &quot;#F0F0F3&quot;)
           .attr(&quot;stroke-width&quot;, 0.2)
           .attr(&quot;class&quot;, &quot;guide ygridlines xfixed&quot;);
          g.append(&quot;svg:path&quot;)
             .attr(&quot;d&quot;, &quot;M12.22,54.88 L 89.67 54.88&quot;);
          g.append(&quot;svg:path&quot;)
             .attr(&quot;d&quot;, &quot;M12.22,6.8 L 89.67 6.8&quot;);
          g.append(&quot;svg:path&quot;)
             .attr(&quot;d&quot;, &quot;M12.22,-53.29 L 89.67 -53.29&quot;);
          g.append(&quot;svg:path&quot;)
             .attr(&quot;d&quot;, &quot;M12.22,30.84 L 89.67 30.84&quot;);
          g.append(&quot;svg:path&quot;)
             .attr(&quot;d&quot;, &quot;M12.22,139.01 L 89.67 139.01&quot;);
          g.append(&quot;svg:path&quot;)
             .attr(&quot;d&quot;, &quot;M12.22,102.95 L 89.67 102.95&quot;);
          g.append(&quot;svg:path&quot;)
             .attr(&quot;d&quot;, &quot;M12.22,-29.25 L 89.67 -29.25&quot;);
          g.append(&quot;svg:path&quot;)
             .attr(&quot;d&quot;, &quot;M12.22,66.9 L 89.67 66.9&quot;);
          g.append(&quot;svg:path&quot;)
             .attr(&quot;d&quot;, &quot;M12.22,78.91 L 89.67 78.91&quot;);
          g.append(&quot;svg:path&quot;)
             .attr(&quot;d&quot;, &quot;M12.22,-41.27 L 89.67 -41.27&quot;);
          g.append(&quot;svg:path&quot;)
             .attr(&quot;d&quot;, &quot;M12.22,-5.22 L 89.67 -5.22&quot;);
          g.append(&quot;svg:path&quot;)
             .attr(&quot;d&quot;, &quot;M12.22,18.82 L 89.67 18.82&quot;);
          g.append(&quot;svg:path&quot;)
             .attr(&quot;d&quot;, &quot;M12.22,-65.31 L 89.67 -65.31&quot;);
          g.append(&quot;svg:path&quot;)
             .attr(&quot;d&quot;, &quot;M12.22,-17.23 L 89.67 -17.23&quot;);
          g.append(&quot;svg:path&quot;)
             .attr(&quot;d&quot;, &quot;M12.22,90.93 L 89.67 90.93&quot;);
          g.append(&quot;svg:path&quot;)
             .attr(&quot;d&quot;, &quot;M12.22,114.97 L 89.67 114.97&quot;);
          g.append(&quot;svg:path&quot;)
             .attr(&quot;d&quot;, &quot;M12.22,42.86 L 89.67 42.86&quot;);
          g.append(&quot;svg:path&quot;)
             .attr(&quot;d&quot;, &quot;M12.22,126.99 L 89.67 126.99&quot;);
        }(g.append(&quot;g&quot;)));
        (function (g) {
          g.attr(&quot;stroke&quot;, &quot;#F0F0F3&quot;)
           .attr(&quot;stroke-width&quot;, 0.2)
           .attr(&quot;class&quot;, &quot;guide xgridlines yfixed&quot;);
          g.append(&quot;svg:path&quot;)
             .attr(&quot;d&quot;, &quot;M32.68,5 L 32.68 68.7&quot;);
          g.append(&quot;svg:path&quot;)
             .attr(&quot;d&quot;, &quot;M105.74,5 L 105.74 68.7&quot;);
          g.append(&quot;svg:path&quot;)
             .attr(&quot;d&quot;, &quot;M-22.12,5 L -22.12 68.7&quot;);
          g.append(&quot;svg:path&quot;)
             .attr(&quot;d&quot;, &quot;M142.28,5 L 142.28 68.7&quot;);
          g.append(&quot;svg:path&quot;)
             .attr(&quot;d&quot;, &quot;M87.48,5 L 87.48 68.7&quot;);
          g.append(&quot;svg:path&quot;)
             .attr(&quot;d&quot;, &quot;M124.01,5 L 124.01 68.7&quot;);
          g.append(&quot;svg:path&quot;)
             .attr(&quot;d&quot;, &quot;M178.81,5 L 178.81 68.7&quot;);
          g.append(&quot;svg:path&quot;)
             .attr(&quot;d&quot;, &quot;M-3.85,5 L -3.85 68.7&quot;);
          g.append(&quot;svg:path&quot;)
             .attr(&quot;d&quot;, &quot;M14.41,5 L 14.41 68.7&quot;);
          g.append(&quot;svg:path&quot;)
             .attr(&quot;d&quot;, &quot;M160.54,5 L 160.54 68.7&quot;);
          g.append(&quot;svg:path&quot;)
             .attr(&quot;d&quot;, &quot;M-40.39,5 L -40.39 68.7&quot;);
          g.append(&quot;svg:path&quot;)
             .attr(&quot;d&quot;, &quot;M69.21,5 L 69.21 68.7&quot;);
          g.append(&quot;svg:path&quot;)
             .attr(&quot;d&quot;, &quot;M-58.65,5 L -58.65 68.7&quot;);
          g.append(&quot;svg:path&quot;)
             .attr(&quot;d&quot;, &quot;M50.95,5 L 50.95 68.7&quot;);
          g.append(&quot;svg:path&quot;)
             .attr(&quot;d&quot;, &quot;M-76.92,5 L -76.92 68.7&quot;);
        }(g.append(&quot;g&quot;)));
      }(g.append(&quot;g&quot;)));
      (function (g) {
        d3.select(&quot;defs&quot;)
  .append(&quot;svg:clipPath&quot;)
    .attr(&quot;id&quot;, parent_id + &quot;_clippath1&quot;)
    .append(&quot;svg:path&quot;)
      .attr(&quot;d&quot;, &quot; M12.22,5 L 89.67 5 89.67 68.7 12.22 68.7 z&quot;);g.attr(&quot;clip-path&quot;, &quot;url(#&quot; + parent_id + &quot;_clippath1)&quot;);
        (function (g) {
          g.attr(&quot;class&quot;, &quot;plotpanel&quot;);
          (function (g) {
            g.attr(&quot;stroke&quot;, &quot;none&quot;)
             .attr(&quot;shape-rendering&quot;, &quot;crispEdges&quot;);
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FF0000&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M32.68,54.88 L 50.95 54.88 50.95 42.86 32.68 42.86 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FF7B5A&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M32.68,42.86 L 50.95 42.86 50.95 18.82 32.68 18.82 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFBFAA&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M32.68,18.82 L 50.95 18.82 50.95 6.8 32.68 6.8 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FF7B5A&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M50.95,54.88 L 69.21 54.88 69.21 42.86 50.95 42.86 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFFFFF&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M50.95,42.86 L 69.21 42.86 69.21 18.82 50.95 18.82 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FF7B5A&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M50.95,18.82 L 69.21 18.82 69.21 6.8 50.95 6.8 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFBFAA&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M69.21,54.88 L 87.48 54.88 87.48 42.86 69.21 42.86 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FF7B5A&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M69.21,42.86 L 87.48 42.86 87.48 18.82 69.21 18.82 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FF0000&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M69.21,18.82 L 87.48 18.82 87.48 6.8 69.21 6.8 z&quot;);
            }(g.append(&quot;g&quot;)));
          }(g.append(&quot;g&quot;)));
          (function (g) {
            g.attr(&quot;stroke-width&quot;, 1);
            (function (g) {
              g.attr(&quot;stroke-width&quot;, 1);
g.selectAll(&quot;form0&quot;)
                  .data(d3.zip(data[0],data[1]))
                  .enter()
                  .append(&quot;circle&quot;)
.attr(&quot;cx&quot;, function(d) { return d[0]; })
.attr(&quot;cy&quot;, function(d) { return d[1]; })
.attr(&quot;r&quot;, 0.6)
.attr(&quot;class&quot;, &quot;geometry color_RGB(0.0,0.0,0.0)&quot;)
.on(&quot;mouseout&quot;, geom_point_mouseout(10.00, 1.67), false)
.on(&quot;mouseover&quot;, geom_point_mouseover(10.00, 1.67), false)
.attr(&quot;stroke&quot;, &quot;#000000&quot;)
.attr(&quot;fill&quot;, &quot;#000000&quot;)
;
            }(g.append(&quot;g&quot;)));
          }(g.append(&quot;g&quot;)));
        }(g.append(&quot;g&quot;)));
      }(g.append(&quot;g&quot;)));
      (function (g) {
        d3.select(&quot;defs&quot;)
  .append(&quot;svg:clipPath&quot;)
    .attr(&quot;id&quot;, parent_id + &quot;_clippath2&quot;)
    .append(&quot;svg:path&quot;)
      .attr(&quot;d&quot;, &quot; M12.22,5 L 89.67 5 89.67 68.7 12.22 68.7 z&quot;);g.attr(&quot;clip-path&quot;, &quot;url(#&quot; + parent_id + &quot;_clippath2)&quot;);
        (function (g) {
          g.attr(&quot;stroke&quot;, &quot;none&quot;)
           .attr(&quot;class&quot;, &quot;guide zoomslider&quot;)
           .attr(&quot;opacity&quot;, 0.00);
          (function (g) {
            g.attr(&quot;stroke&quot;, &quot;#6A6A6A&quot;)
             .attr(&quot;stroke-opacity&quot;, 0.00)
             .attr(&quot;stroke-width&quot;, 0.3)
             .attr(&quot;fill&quot;, &quot;#EAEAEA&quot;)
             .on(&quot;click&quot;, zoomin_behavior(ctx))
.on(&quot;dblclick&quot;, function() { d3.event.stopPropagation(); })
.on(&quot;mouseover&quot;, zoomslider_button_mouseover(&quot;#cd5c5c&quot;))
.on(&quot;mouseout&quot;, zoomslider_button_mouseover(&quot;#6a6a6a&quot;))
;
            g.append(&quot;svg:path&quot;)
               .attr(&quot;d&quot;, &quot;M82.67,8 L 86.67 8 86.67 12 82.67 12 z&quot;);
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#6A6A6A&quot;)
               .attr(&quot;class&quot;, &quot;button_logo&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M83.47,9.6 L 84.27 9.6 84.27 8.8 85.07 8.8 85.07 9.6 85.87 9.6 85.87 10.4 85.07 10.4 85.07 11.2 84.27 11.2 84.27 10.4 83.47 10.4 z&quot;);
            }(g.append(&quot;g&quot;)));
          }(g.append(&quot;g&quot;)));
          (function (g) {
            g.attr(&quot;fill&quot;, &quot;#EAEAEA&quot;)
             .on(&quot;click&quot;, zoomslider_track_behavior(ctx, 56.67, 73.67));
            g.append(&quot;svg:path&quot;)
               .attr(&quot;d&quot;, &quot;M63.17,8 L 82.17 8 82.17 12 63.17 12 z&quot;);
          }(g.append(&quot;g&quot;)));
          (function (g) {
            g.attr(&quot;fill&quot;, &quot;#6A6A6A&quot;)
             .attr(&quot;class&quot;, &quot;zoomslider_thumb&quot;)
             .call(zoomslider_behavior(ctx, 56.67, 73.67))
.on(&quot;mouseover&quot;, zoomslider_thumb_mouseover(&quot;#cd5c5c&quot;))
.on(&quot;mouseout&quot;, zoomslider_thumb_mouseover(&quot;#6a6a6a&quot;))
;
            g.append(&quot;svg:path&quot;)
               .attr(&quot;d&quot;, &quot;M71.67,8 L 73.67 8 73.67 12 71.67 12 z&quot;);
          }(g.append(&quot;g&quot;)));
          (function (g) {
            g.attr(&quot;stroke&quot;, &quot;#6A6A6A&quot;)
             .attr(&quot;stroke-opacity&quot;, 0.00)
             .attr(&quot;stroke-width&quot;, 0.3)
             .attr(&quot;fill&quot;, &quot;#EAEAEA&quot;)
             .on(&quot;click&quot;, zoomout_behavior(ctx))
.on(&quot;dblclick&quot;, function() { d3.event.stopPropagation(); })
.on(&quot;mouseover&quot;, zoomslider_button_mouseover(&quot;#cd5c5c&quot;))
.on(&quot;mouseout&quot;, zoomslider_button_mouseover(&quot;#6a6a6a&quot;))
;
            g.append(&quot;svg:path&quot;)
               .attr(&quot;d&quot;, &quot;M58.67,8 L 62.67 8 62.67 12 58.67 12 z&quot;);
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#6A6A6A&quot;)
               .attr(&quot;class&quot;, &quot;button_logo&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M59.47,9.6 L 61.87 9.6 61.87 10.4 59.47 10.4 z&quot;);
            }(g.append(&quot;g&quot;)));
          }(g.append(&quot;g&quot;)));
        }(g.append(&quot;g&quot;)));
      }(g.append(&quot;g&quot;)));
    }(g.append(&quot;g&quot;)));
  }(g.append(&quot;g&quot;)));
}(g.append(&quot;g&quot;)));
    d3.select(parent_id)
      .selectAll(&quot;path&quot;)
      .each(function() {
          var sw = parseFloat(window.getComputedStyle(this).getPropertyValue(&quot;stroke-width&quot;));
          d3.select(this)
            .attr(&quot;vector-effect&quot;, &quot;non-scaling-stroke&quot;)
            .style(&quot;stroke-width&quot;, sw + &quot;mm&quot;);
      });
}

var data = [
  [32.67849056603774,87.47801886792453,69.21150943396226,50.945],
  [54.87673584905661,6.8027735849056645,42.858245283018874,18.8212641509434]];

var draw = function(parent_id) {
    draw_with_data(data, parent_id);
};

if (&apos;undefined&apos; !== typeof module) {
    module.exports = draw;
} else if (&apos;undefined&apos; !== typeof window) {
    window.draw = draw
}

return module;
})({}).exports(&quot;#gadflyplot-Z2hpiN9yfQZI62vqLsbN&quot;);
//@ sourceURL=gadflyplot-Z2hpiN9yfQZI62vqLsbN.js
&lt;/script&gt;


&lt;p&gt;In this next example, &lt;span class=&quot;math&quot;&gt;&lt;em&gt;x&lt;/em&gt;&lt;/span&gt; and &lt;span class=&quot;math&quot;&gt;&lt;em&gt;y&lt;/em&gt;&lt;/span&gt; are drawn from independent normals, so we have roughly an even amount of positive and negative:&lt;/p&gt;
&lt;div id=&quot;gadflyplot-nS1LWjECXKGfOxyhotr2&quot;&gt;&lt;/div&gt;
&lt;script&gt;
(function (module) {
function draw_with_data(data, parent_id) {
  var g = d3.select(parent_id)
            .append(&quot;svg&quot;)
              .attr(&quot;width&quot;, &quot;120mm&quot;)
              .attr(&quot;height&quot;, &quot;80mm&quot;)
              .attr(&quot;viewBox&quot;, &quot;0 0 120 80&quot;)
              .attr(&quot;stroke-width&quot;, &quot;0.5&quot;)
              .attr(&quot;style&quot;, &quot;stroke:black;fill:black&quot;);
  g.append(&quot;defs&quot;);
  var ctx = {
      &quot;scale&quot;: 1.0,
      &quot;tx&quot;: 0.0,
      &quot;ty&quot;: 0.0
  };
(function (g) {
  g.attr(&quot;stroke&quot;, &quot;none&quot;)
   .attr(&quot;fill&quot;, &quot;#000000&quot;)
   .attr(&quot;stroke-width&quot;, 0.3)
   .attr(&quot;font-family&quot;, &quot;Helvetic,Arial,sans&quot;)
   .style(&quot;font-size&quot;, &quot;3.88px&quot;);
  (function (g) {
    g.attr(&quot;class&quot;, &quot;plotroot xscalable yscalable&quot;);
    (function (g) {
      g.attr(&quot;stroke&quot;, &quot;none&quot;)
       .attr(&quot;fill&quot;, &quot;#4C404B&quot;)
       .attr(&quot;font-family&quot;, &quot;&apos;PT Sans&apos;,&apos;Helvetica Neue&apos;,&apos;Helvetica&apos;,sans-serif&quot;)
       .style(&quot;font-size&quot;, &quot;3.18px&quot;)
       .attr(&quot;class&quot;, &quot;guide ylabels&quot;);
      (function (g) {
        g.attr(&quot;visibility&quot;, &quot;hidden&quot;);
        g.append(&quot;svg:text&quot;)
           .attr(&quot;x&quot;, 11.22)
           .attr(&quot;y&quot;, 147.02)
           .attr(&quot;text-anchor&quot;, &quot;end&quot;)
           .style(&quot;dominant-baseline&quot;, &quot;central&quot;)
            .call(function(text) {
      text.text(&quot;-5&quot;);
    })
;
      }(g.append(&quot;g&quot;)));
      g.append(&quot;svg:text&quot;)
         .attr(&quot;x&quot;, 11.22)
         .attr(&quot;y&quot;, 26.83)
         .attr(&quot;text-anchor&quot;, &quot;end&quot;)
         .style(&quot;dominant-baseline&quot;, &quot;central&quot;)
         .call(function(text) {
     text.text(&quot;1&quot;);
   })
;
      g.append(&quot;svg:text&quot;)
         .attr(&quot;x&quot;, 11.22)
         .attr(&quot;y&quot;, 6.8)
         .attr(&quot;text-anchor&quot;, &quot;end&quot;)
         .style(&quot;dominant-baseline&quot;, &quot;central&quot;)
         .call(function(text) {
     text.text(&quot;2&quot;);
   })
;
      (function (g) {
        g.attr(&quot;visibility&quot;, &quot;hidden&quot;);
        g.append(&quot;svg:text&quot;)
           .attr(&quot;x&quot;, 11.22)
           .attr(&quot;y&quot;, -53.29)
           .attr(&quot;text-anchor&quot;, &quot;end&quot;)
           .style(&quot;dominant-baseline&quot;, &quot;central&quot;)
            .call(function(text) {
      text.text(&quot;5&quot;);
    })
;
      }(g.append(&quot;g&quot;)));
      (function (g) {
        g.attr(&quot;visibility&quot;, &quot;hidden&quot;);
        g.append(&quot;svg:text&quot;)
           .attr(&quot;x&quot;, 11.22)
           .attr(&quot;y&quot;, 126.99)
           .attr(&quot;text-anchor&quot;, &quot;end&quot;)
           .style(&quot;dominant-baseline&quot;, &quot;central&quot;)
            .call(function(text) {
      text.text(&quot;-4&quot;);
    })
;
      }(g.append(&quot;g&quot;)));
      (function (g) {
        g.attr(&quot;visibility&quot;, &quot;hidden&quot;);
        g.append(&quot;svg:text&quot;)
           .attr(&quot;x&quot;, 11.22)
           .attr(&quot;y&quot;, 86.93)
           .attr(&quot;text-anchor&quot;, &quot;end&quot;)
           .style(&quot;dominant-baseline&quot;, &quot;central&quot;)
            .call(function(text) {
      text.text(&quot;-2&quot;);
    })
;
      }(g.append(&quot;g&quot;)));
      (function (g) {
        g.attr(&quot;visibility&quot;, &quot;hidden&quot;);
        g.append(&quot;svg:text&quot;)
           .attr(&quot;x&quot;, 11.22)
           .attr(&quot;y&quot;, -13.23)
           .attr(&quot;text-anchor&quot;, &quot;end&quot;)
           .style(&quot;dominant-baseline&quot;, &quot;central&quot;)
            .call(function(text) {
      text.text(&quot;3&quot;);
    })
;
      }(g.append(&quot;g&quot;)));
      (function (g) {
        g.attr(&quot;visibility&quot;, &quot;hidden&quot;);
        g.append(&quot;svg:text&quot;)
           .attr(&quot;x&quot;, 11.22)
           .attr(&quot;y&quot;, 106.96)
           .attr(&quot;text-anchor&quot;, &quot;end&quot;)
           .style(&quot;dominant-baseline&quot;, &quot;central&quot;)
            .call(function(text) {
      text.text(&quot;-3&quot;);
    })
;
      }(g.append(&quot;g&quot;)));
      (function (g) {
        g.attr(&quot;visibility&quot;, &quot;hidden&quot;);
        g.append(&quot;svg:text&quot;)
           .attr(&quot;x&quot;, 11.22)
           .attr(&quot;y&quot;, -33.26)
           .attr(&quot;text-anchor&quot;, &quot;end&quot;)
           .style(&quot;dominant-baseline&quot;, &quot;central&quot;)
            .call(function(text) {
      text.text(&quot;4&quot;);
    })
;
      }(g.append(&quot;g&quot;)));
      (function (g) {
        g.attr(&quot;visibility&quot;, &quot;hidden&quot;);
        g.append(&quot;svg:text&quot;)
           .attr(&quot;x&quot;, 11.22)
           .attr(&quot;y&quot;, -73.32)
           .attr(&quot;text-anchor&quot;, &quot;end&quot;)
           .style(&quot;dominant-baseline&quot;, &quot;central&quot;)
            .call(function(text) {
      text.text(&quot;6&quot;);
    })
;
      }(g.append(&quot;g&quot;)));
      g.append(&quot;svg:text&quot;)
         .attr(&quot;x&quot;, 11.22)
         .attr(&quot;y&quot;, 46.86)
         .attr(&quot;text-anchor&quot;, &quot;end&quot;)
         .style(&quot;dominant-baseline&quot;, &quot;central&quot;)
         .call(function(text) {
     text.text(&quot;0&quot;);
   })
;
      g.append(&quot;svg:text&quot;)
         .attr(&quot;x&quot;, 11.22)
         .attr(&quot;y&quot;, 66.9)
         .attr(&quot;text-anchor&quot;, &quot;end&quot;)
         .style(&quot;dominant-baseline&quot;, &quot;central&quot;)
         .call(function(text) {
     text.text(&quot;-1&quot;);
   })
;
    }(g.append(&quot;g&quot;)));
    (function (g) {
      g.attr(&quot;stroke&quot;, &quot;none&quot;)
       .attr(&quot;fill&quot;, &quot;#4C404B&quot;)
       .attr(&quot;font-family&quot;, &quot;&apos;PT Sans&apos;,&apos;Helvetica Neue&apos;,&apos;Helvetica&apos;,sans-serif&quot;)
       .style(&quot;font-size&quot;, &quot;3.18px&quot;)
       .attr(&quot;class&quot;, &quot;guide xlabels&quot;);
      (function (g) {
        g.attr(&quot;visibility&quot;, &quot;hidden&quot;);
        g.append(&quot;svg:text&quot;)
           .attr(&quot;x&quot;, -58.65)
           .attr(&quot;y&quot;, 74)
           .attr(&quot;text-anchor&quot;, &quot;middle&quot;)
            .call(function(text) {
      text.text(&quot;-5&quot;);
    })
;
      }(g.append(&quot;g&quot;)));
      g.append(&quot;svg:text&quot;)
         .attr(&quot;x&quot;, 50.95)
         .attr(&quot;y&quot;, 74)
         .attr(&quot;text-anchor&quot;, &quot;middle&quot;)
         .call(function(text) {
     text.text(&quot;1&quot;);
   })
;
      g.append(&quot;svg:text&quot;)
         .attr(&quot;x&quot;, 69.21)
         .attr(&quot;y&quot;, 74)
         .attr(&quot;text-anchor&quot;, &quot;middle&quot;)
         .call(function(text) {
     text.text(&quot;2&quot;);
   })
;
      (function (g) {
        g.attr(&quot;visibility&quot;, &quot;hidden&quot;);
        g.append(&quot;svg:text&quot;)
           .attr(&quot;x&quot;, 124.01)
           .attr(&quot;y&quot;, 74)
           .attr(&quot;text-anchor&quot;, &quot;middle&quot;)
            .call(function(text) {
      text.text(&quot;5&quot;);
    })
;
      }(g.append(&quot;g&quot;)));
      (function (g) {
        g.attr(&quot;visibility&quot;, &quot;hidden&quot;);
        g.append(&quot;svg:text&quot;)
           .attr(&quot;x&quot;, -40.39)
           .attr(&quot;y&quot;, 74)
           .attr(&quot;text-anchor&quot;, &quot;middle&quot;)
            .call(function(text) {
      text.text(&quot;-4&quot;);
    })
;
      }(g.append(&quot;g&quot;)));
      (function (g) {
        g.attr(&quot;visibility&quot;, &quot;hidden&quot;);
        g.append(&quot;svg:text&quot;)
           .attr(&quot;x&quot;, -3.85)
           .attr(&quot;y&quot;, 74)
           .attr(&quot;text-anchor&quot;, &quot;middle&quot;)
            .call(function(text) {
      text.text(&quot;-2&quot;);
    })
;
      }(g.append(&quot;g&quot;)));
      g.append(&quot;svg:text&quot;)
         .attr(&quot;x&quot;, 87.48)
         .attr(&quot;y&quot;, 74)
         .attr(&quot;text-anchor&quot;, &quot;middle&quot;)
         .call(function(text) {
     text.text(&quot;3&quot;);
   })
;
      (function (g) {
        g.attr(&quot;visibility&quot;, &quot;hidden&quot;);
        g.append(&quot;svg:text&quot;)
           .attr(&quot;x&quot;, 160.54)
           .attr(&quot;y&quot;, 74)
           .attr(&quot;text-anchor&quot;, &quot;middle&quot;)
            .call(function(text) {
      text.text(&quot;7&quot;);
    })
;
      }(g.append(&quot;g&quot;)));
      (function (g) {
        g.attr(&quot;visibility&quot;, &quot;hidden&quot;);
        g.append(&quot;svg:text&quot;)
           .attr(&quot;x&quot;, -76.92)
           .attr(&quot;y&quot;, 74)
           .attr(&quot;text-anchor&quot;, &quot;middle&quot;)
            .call(function(text) {
      text.text(&quot;-6&quot;);
    })
;
      }(g.append(&quot;g&quot;)));
      (function (g) {
        g.attr(&quot;visibility&quot;, &quot;hidden&quot;);
        g.append(&quot;svg:text&quot;)
           .attr(&quot;x&quot;, -22.12)
           .attr(&quot;y&quot;, 74)
           .attr(&quot;text-anchor&quot;, &quot;middle&quot;)
            .call(function(text) {
      text.text(&quot;-3&quot;);
    })
;
      }(g.append(&quot;g&quot;)));
      (function (g) {
        g.attr(&quot;visibility&quot;, &quot;hidden&quot;);
        g.append(&quot;svg:text&quot;)
           .attr(&quot;x&quot;, 105.74)
           .attr(&quot;y&quot;, 74)
           .attr(&quot;text-anchor&quot;, &quot;middle&quot;)
            .call(function(text) {
      text.text(&quot;4&quot;);
    })
;
      }(g.append(&quot;g&quot;)));
      (function (g) {
        g.attr(&quot;visibility&quot;, &quot;hidden&quot;);
        g.append(&quot;svg:text&quot;)
           .attr(&quot;x&quot;, 178.81)
           .attr(&quot;y&quot;, 74)
           .attr(&quot;text-anchor&quot;, &quot;middle&quot;)
            .call(function(text) {
      text.text(&quot;8&quot;);
    })
;
      }(g.append(&quot;g&quot;)));
      (function (g) {
        g.attr(&quot;visibility&quot;, &quot;hidden&quot;);
        g.append(&quot;svg:text&quot;)
           .attr(&quot;x&quot;, 142.28)
           .attr(&quot;y&quot;, 74)
           .attr(&quot;text-anchor&quot;, &quot;middle&quot;)
            .call(function(text) {
      text.text(&quot;6&quot;);
    })
;
      }(g.append(&quot;g&quot;)));
      g.append(&quot;svg:text&quot;)
         .attr(&quot;x&quot;, 32.68)
         .attr(&quot;y&quot;, 74)
         .attr(&quot;text-anchor&quot;, &quot;middle&quot;)
         .call(function(text) {
     text.text(&quot;0&quot;);
   })
;
      g.append(&quot;svg:text&quot;)
         .attr(&quot;x&quot;, 14.41)
         .attr(&quot;y&quot;, 74)
         .attr(&quot;text-anchor&quot;, &quot;middle&quot;)
         .call(function(text) {
     text.text(&quot;-1&quot;);
   })
;
    }(g.append(&quot;g&quot;)));
    (function (g) {
      g.attr(&quot;stroke&quot;, &quot;none&quot;)
       .attr(&quot;font-family&quot;, &quot;&apos;PT Sans&apos;,&apos;Helvetica Neue&apos;,&apos;Helvetica&apos;,sans-serif&quot;)
       .style(&quot;font-size&quot;, &quot;3.88px&quot;)
       .attr(&quot;fill&quot;, &quot;#362A35&quot;);
      g.append(&quot;svg:text&quot;)
         .attr(&quot;x&quot;, 104.34)
         .attr(&quot;y&quot;, 33.03)
         .attr(&quot;text-anchor&quot;, &quot;middle&quot;)
         .call(function(text) {
     text.text(&quot;areasum&quot;);
   })
;
    }(g.append(&quot;g&quot;)));
    (function (g) {
      g.attr(&quot;font-family&quot;, &quot;&apos;PT Sans&apos;,&apos;Helvetica Neue&apos;,&apos;Helvetica&apos;,sans-serif&quot;)
       .style(&quot;font-size&quot;, &quot;3.18px&quot;)
       .attr(&quot;stroke&quot;, &quot;none&quot;);
      (function (g) {
        g.attr(&quot;fill&quot;, &quot;#008000&quot;)
         .attr(&quot;stroke-width&quot;, 0.3);
        g.append(&quot;svg:path&quot;)
           .attr(&quot;d&quot;, &quot;M91.67,45.63 L 95.97 45.63 95.97 50.03 91.67 50.03 z&quot;);
      }(g.append(&quot;g&quot;)));
      (function (g) {
        g.attr(&quot;fill&quot;, &quot;#4C404B&quot;);
        g.append(&quot;svg:text&quot;)
           .attr(&quot;x&quot;, 96.97)
           .attr(&quot;y&quot;, 42.48)
           .style(&quot;dominant-baseline&quot;, &quot;central&quot;)
            .call(function(text) {
      text.text(&quot;0&quot;);
    })
;
      }(g.append(&quot;g&quot;)));
      (function (g) {
        g.attr(&quot;fill&quot;, &quot;#FF9E81&quot;)
         .attr(&quot;stroke-width&quot;, 0.3);
        g.append(&quot;svg:path&quot;)
           .attr(&quot;d&quot;, &quot;M91.67,39.33 L 95.97 39.33 95.97 40.43 91.67 40.43 z&quot;);
      }(g.append(&quot;g&quot;)));
      (function (g) {
        g.attr(&quot;fill&quot;, &quot;#FF0000&quot;)
         .attr(&quot;stroke-width&quot;, 0.3);
        g.append(&quot;svg:path&quot;)
           .attr(&quot;d&quot;, &quot;M91.67,35.03 L 95.97 35.03 95.97 39.43 91.67 39.43 z&quot;);
      }(g.append(&quot;g&quot;)));
      (function (g) {
        g.attr(&quot;fill&quot;, &quot;#4C404B&quot;);
        g.append(&quot;svg:text&quot;)
           .attr(&quot;x&quot;, 96.97)
           .attr(&quot;y&quot;, 37.18)
           .style(&quot;dominant-baseline&quot;, &quot;central&quot;)
            .call(function(text) {
      text.text(&quot;50&quot;);
    })
;
      }(g.append(&quot;g&quot;)));
      (function (g) {
        g.attr(&quot;fill&quot;, &quot;#FFFFFF&quot;)
         .attr(&quot;stroke-width&quot;, 0.3);
        g.append(&quot;svg:path&quot;)
           .attr(&quot;d&quot;, &quot;M91.67,40.33 L 95.97 40.33 95.97 44.73 91.67 44.73 z&quot;);
      }(g.append(&quot;g&quot;)));
      (function (g) {
        g.attr(&quot;fill&quot;, &quot;#93BF85&quot;)
         .attr(&quot;stroke-width&quot;, 0.3);
        g.append(&quot;svg:path&quot;)
           .attr(&quot;d&quot;, &quot;M91.67,44.63 L 95.97 44.63 95.97 45.73 91.67 45.73 z&quot;);
      }(g.append(&quot;g&quot;)));
      (function (g) {
        g.attr(&quot;fill&quot;, &quot;#4C404B&quot;);
        g.append(&quot;svg:text&quot;)
           .attr(&quot;x&quot;, 96.97)
           .attr(&quot;y&quot;, 47.78)
           .style(&quot;dominant-baseline&quot;, &quot;central&quot;)
            .call(function(text) {
      text.text(&quot;-50&quot;);
    })
;
      }(g.append(&quot;g&quot;)));
    }(g.append(&quot;g&quot;)));
    (function (g) {
      g.on(&quot;mouseover&quot;, guide_background_mouseover(&quot;#C6C6C9&quot;))
       .on(&quot;mouseout&quot;, guide_background_mouseout(&quot;#F0F0F3&quot;))
       .call(zoom_behavior(ctx))
;
      (function (g) {
        d3.select(&quot;defs&quot;)
  .append(&quot;svg:clipPath&quot;)
    .attr(&quot;id&quot;, parent_id + &quot;_clippath0&quot;)
    .append(&quot;svg:path&quot;)
      .attr(&quot;d&quot;, &quot; M12.22,5 L 89.67 5 89.67 68.7 12.22 68.7 z&quot;);g.attr(&quot;clip-path&quot;, &quot;url(#&quot; + parent_id + &quot;_clippath0)&quot;);
        (function (g) {
          g.attr(&quot;class&quot;, &quot;guide background&quot;)
           .attr(&quot;stroke&quot;, &quot;#F1F1F5&quot;)
           .attr(&quot;fill&quot;, &quot;#FFFFFF&quot;)
           .attr(&quot;opacity&quot;, 1.00);
          g.append(&quot;svg:path&quot;)
             .attr(&quot;d&quot;, &quot;M12.22,5 L 89.67 5 89.67 68.7 12.22 68.7 z&quot;);
        }(g.append(&quot;g&quot;)));
        (function (g) {
          g.attr(&quot;stroke&quot;, &quot;#F0F0F3&quot;)
           .attr(&quot;stroke-width&quot;, 0.2)
           .attr(&quot;class&quot;, &quot;guide ygridlines xfixed&quot;);
          g.append(&quot;svg:path&quot;)
             .attr(&quot;d&quot;, &quot;M12.22,26.83 L 89.67 26.83&quot;);
          g.append(&quot;svg:path&quot;)
             .attr(&quot;d&quot;, &quot;M12.22,-53.29 L 89.67 -53.29&quot;);
          g.append(&quot;svg:path&quot;)
             .attr(&quot;d&quot;, &quot;M12.22,86.93 L 89.67 86.93&quot;);
          g.append(&quot;svg:path&quot;)
             .attr(&quot;d&quot;, &quot;M12.22,106.96 L 89.67 106.96&quot;);
          g.append(&quot;svg:path&quot;)
             .attr(&quot;d&quot;, &quot;M12.22,-73.32 L 89.67 -73.32&quot;);
          g.append(&quot;svg:path&quot;)
             .attr(&quot;d&quot;, &quot;M12.22,66.9 L 89.67 66.9&quot;);
          g.append(&quot;svg:path&quot;)
             .attr(&quot;d&quot;, &quot;M12.22,46.86 L 89.67 46.86&quot;);
          g.append(&quot;svg:path&quot;)
             .attr(&quot;d&quot;, &quot;M12.22,-33.26 L 89.67 -33.26&quot;);
          g.append(&quot;svg:path&quot;)
             .attr(&quot;d&quot;, &quot;M12.22,-13.23 L 89.67 -13.23&quot;);
          g.append(&quot;svg:path&quot;)
             .attr(&quot;d&quot;, &quot;M12.22,126.99 L 89.67 126.99&quot;);
          g.append(&quot;svg:path&quot;)
             .attr(&quot;d&quot;, &quot;M12.22,6.8 L 89.67 6.8&quot;);
          g.append(&quot;svg:path&quot;)
             .attr(&quot;d&quot;, &quot;M12.22,147.02 L 89.67 147.02&quot;);
        }(g.append(&quot;g&quot;)));
        (function (g) {
          g.attr(&quot;stroke&quot;, &quot;#F0F0F3&quot;)
           .attr(&quot;stroke-width&quot;, 0.2)
           .attr(&quot;class&quot;, &quot;guide xgridlines yfixed&quot;);
          g.append(&quot;svg:path&quot;)
             .attr(&quot;d&quot;, &quot;M50.95,5 L 50.95 68.7&quot;);
          g.append(&quot;svg:path&quot;)
             .attr(&quot;d&quot;, &quot;M124.01,5 L 124.01 68.7&quot;);
          g.append(&quot;svg:path&quot;)
             .attr(&quot;d&quot;, &quot;M-3.85,5 L -3.85 68.7&quot;);
          g.append(&quot;svg:path&quot;)
             .attr(&quot;d&quot;, &quot;M160.54,5 L 160.54 68.7&quot;);
          g.append(&quot;svg:path&quot;)
             .attr(&quot;d&quot;, &quot;M-22.12,5 L -22.12 68.7&quot;);
          g.append(&quot;svg:path&quot;)
             .attr(&quot;d&quot;, &quot;M178.81,5 L 178.81 68.7&quot;);
          g.append(&quot;svg:path&quot;)
             .attr(&quot;d&quot;, &quot;M32.68,5 L 32.68 68.7&quot;);
          g.append(&quot;svg:path&quot;)
             .attr(&quot;d&quot;, &quot;M14.41,5 L 14.41 68.7&quot;);
          g.append(&quot;svg:path&quot;)
             .attr(&quot;d&quot;, &quot;M142.28,5 L 142.28 68.7&quot;);
          g.append(&quot;svg:path&quot;)
             .attr(&quot;d&quot;, &quot;M105.74,5 L 105.74 68.7&quot;);
          g.append(&quot;svg:path&quot;)
             .attr(&quot;d&quot;, &quot;M-76.92,5 L -76.92 68.7&quot;);
          g.append(&quot;svg:path&quot;)
             .attr(&quot;d&quot;, &quot;M87.48,5 L 87.48 68.7&quot;);
          g.append(&quot;svg:path&quot;)
             .attr(&quot;d&quot;, &quot;M-40.39,5 L -40.39 68.7&quot;);
          g.append(&quot;svg:path&quot;)
             .attr(&quot;d&quot;, &quot;M69.21,5 L 69.21 68.7&quot;);
          g.append(&quot;svg:path&quot;)
             .attr(&quot;d&quot;, &quot;M-58.65,5 L -58.65 68.7&quot;);
        }(g.append(&quot;g&quot;)));
      }(g.append(&quot;g&quot;)));
      (function (g) {
        d3.select(&quot;defs&quot;)
  .append(&quot;svg:clipPath&quot;)
    .attr(&quot;id&quot;, parent_id + &quot;_clippath1&quot;)
    .append(&quot;svg:path&quot;)
      .attr(&quot;d&quot;, &quot; M12.22,5 L 89.67 5 89.67 68.7 12.22 68.7 z&quot;);g.attr(&quot;clip-path&quot;, &quot;url(#&quot; + parent_id + &quot;_clippath1)&quot;);
        (function (g) {
          g.attr(&quot;class&quot;, &quot;plotpanel&quot;);
          (function (g) {
            g.attr(&quot;stroke&quot;, &quot;none&quot;)
             .attr(&quot;shape-rendering&quot;, &quot;crispEdges&quot;);
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FBFCFA&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M16.77,66.38 L 19.79 66.38 19.79 59.49 16.77 59.49 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#F6FAF5&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M16.77,59.49 L 19.79 59.49 19.79 59.43 16.77 59.43 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#F2F7F0&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M16.77,59.43 L 19.79 59.43 19.79 57.2 16.77 57.2 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#EEF5EB&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M16.77,57.2 L 19.79 57.2 19.79 54.38 16.77 54.38 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#E9F2E6&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M16.77,54.38 L 19.79 54.38 19.79 51.27 16.77 51.27 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#E5F0E1&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M16.77,51.27 L 19.79 51.27 19.79 51.19 16.77 51.19 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#E1EDDC&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M16.77,51.19 L 19.79 51.19 19.79 48.31 16.77 48.31 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFD1C1&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M16.77,48.31 L 19.79 48.31 19.79 46.93 16.77 46.93 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFD5C6&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M16.77,46.93 L 19.79 46.93 19.79 46.34 16.77 46.34 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFD9CB&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M16.77,46.34 L 19.79 46.34 19.79 45 16.77 45 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFDDD0&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M16.77,45 L 19.79 45 19.79 43.75 16.77 43.75 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFE0D6&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M16.77,43.75 L 19.79 43.75 19.79 43.25 16.77 43.25 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFE4DB&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M16.77,43.25 L 19.79 43.25 19.79 38.09 16.77 38.09 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFE8E0&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M16.77,38.09 L 19.79 38.09 19.79 36.36 16.77 36.36 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFECE5&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M16.77,36.36 L 19.79 36.36 19.79 34.74 16.77 34.74 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFF0EA&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M16.77,34.74 L 19.79 34.74 19.79 34.3 16.77 34.3 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFF4EF&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M16.77,34.3 L 19.79 34.3 19.79 24.19 16.77 24.19 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFF7F5&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M16.77,24.19 L 19.79 24.19 19.79 23.4 16.77 23.4 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFFBFA&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M16.77,23.4 L 19.79 23.4 19.79 15.97 16.77 15.97 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#F6FAF5&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M19.79,66.38 L 20.66 66.38 20.66 59.49 19.79 59.49 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#EEF5EB&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M19.79,59.49 L 20.66 59.49 20.66 59.43 19.79 59.43 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#E5F0E1&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M19.79,59.43 L 20.66 59.43 20.66 57.2 19.79 57.2 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#DCEBD7&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M19.79,57.2 L 20.66 57.2 20.66 54.38 19.79 54.38 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#D4E6CD&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M19.79,54.38 L 20.66 54.38 20.66 51.27 19.79 51.27 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#CBE0C3&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M19.79,51.27 L 20.66 51.27 20.66 51.19 19.79 51.19 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#C2DBB9&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M19.79,51.19 L 20.66 51.19 20.66 48.31 19.79 48.31 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFF0EA&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M19.79,48.31 L 20.66 48.31 20.66 46.93 19.79 46.93 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFF7F5&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M19.79,46.93 L 20.66 46.93 20.66 46.34 19.79 46.34 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFFFFF&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M19.79,46.34 L 20.66 46.34 20.66 45 19.79 45 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#F6FAF5&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M19.79,45 L 20.66 45 20.66 43.75 19.79 43.75 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#EEF5EB&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M19.79,43.75 L 20.66 43.75 20.66 43.25 19.79 43.25 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFC9B7&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M19.79,43.25 L 20.66 43.25 20.66 38.09 19.79 38.09 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFD1C1&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M19.79,38.09 L 20.66 38.09 20.66 36.36 19.79 36.36 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFD9CB&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M19.79,36.36 L 20.66 36.36 20.66 34.74 19.79 34.74 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFE0D6&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M19.79,34.74 L 20.66 34.74 20.66 34.3 19.79 34.3 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFE8E0&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M19.79,34.3 L 20.66 34.3 20.66 24.19 19.79 24.19 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFF0EA&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M19.79,24.19 L 20.66 24.19 20.66 23.4 19.79 23.4 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFF7F5&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M19.79,23.4 L 20.66 23.4 20.66 15.97 19.79 15.97 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#F2F7F0&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M20.66,66.38 L 21.69 66.38 21.69 59.49 20.66 59.49 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#E5F0E1&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M20.66,59.49 L 21.69 59.49 21.69 59.43 20.66 59.43 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#D8E8D2&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M20.66,59.43 L 21.69 59.43 21.69 57.2 20.66 57.2 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#CBE0C3&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M20.66,57.2 L 21.69 57.2 21.69 54.38 20.66 54.38 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#BED9B4&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M20.66,54.38 L 21.69 54.38 21.69 51.27 20.66 51.27 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#B1D1A6&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M20.66,51.27 L 21.69 51.27 21.69 51.19 20.66 51.19 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FBFCFA&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M20.66,51.19 L 21.69 51.19 21.69 48.31 20.66 48.31 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFC2AD&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M20.66,48.31 L 21.69 48.31 21.69 46.93 20.66 46.93 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFCDBC&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M20.66,46.93 L 21.69 46.93 21.69 46.34 20.66 46.34 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFD9CB&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M20.66,46.34 L 21.69 46.34 21.69 45 20.66 45 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFE4DB&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M20.66,45 L 21.69 45 21.69 43.75 20.66 43.75 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFF0EA&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M20.66,43.75 L 21.69 43.75 21.69 43.25 20.66 43.25 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFAE95&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M20.66,43.25 L 21.69 43.25 21.69 38.09 20.66 38.09 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFBAA3&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M20.66,38.09 L 21.69 38.09 21.69 36.36 20.66 36.36 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFC6B2&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M20.66,36.36 L 21.69 36.36 21.69 34.74 20.66 34.74 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFD1C1&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M20.66,34.74 L 21.69 34.74 21.69 34.3 20.66 34.3 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFDDD0&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M20.66,34.3 L 21.69 34.3 21.69 24.19 20.66 24.19 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFE8E0&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M20.66,24.19 L 21.69 24.19 21.69 23.4 20.66 23.4 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFF4EF&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M20.66,23.4 L 21.69 23.4 21.69 15.97 20.66 15.97 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#EEF5EB&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M21.69,66.38 L 25.11 66.38 25.11 59.49 21.69 59.49 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#DCEBD7&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M21.69,59.49 L 25.11 59.49 25.11 59.43 21.69 59.43 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#CBE0C3&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M21.69,59.43 L 25.11 59.43 25.11 57.2 21.69 57.2 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#BAD6B0&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M21.69,57.2 L 25.11 57.2 25.11 54.38 21.69 54.38 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#A9CC9C&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M21.69,54.38 L 25.11 54.38 25.11 51.27 21.69 51.27 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#97C289&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M21.69,51.27 L 25.11 51.27 25.11 51.19 21.69 51.19 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#DCEBD7&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M21.69,51.19 L 25.11 51.19 25.11 48.31 21.69 48.31 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFE0D6&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M21.69,48.31 L 25.11 48.31 25.11 46.93 21.69 46.93 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFF0EA&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M21.69,46.93 L 25.11 46.93 25.11 46.34 21.69 46.34 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFFFFF&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M21.69,46.34 L 25.11 46.34 25.11 45 21.69 45 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#EEF5EB&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M21.69,45 L 25.11 45 25.11 43.75 21.69 43.75 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFD1C1&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M21.69,43.75 L 25.11 43.75 25.11 43.25 21.69 43.25 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FF9273&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M21.69,43.25 L 25.11 43.25 25.11 38.09 21.69 38.09 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFA286&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M21.69,38.09 L 25.11 38.09 25.11 36.36 21.69 36.36 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFB299&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M21.69,36.36 L 25.11 36.36 25.11 34.74 21.69 34.74 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFC2AD&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M21.69,34.74 L 25.11 34.74 25.11 34.3 21.69 34.3 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFD1C1&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M21.69,34.3 L 25.11 34.3 25.11 24.19 21.69 24.19 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFE0D6&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M21.69,24.19 L 25.11 24.19 25.11 23.4 21.69 23.4 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFF0EA&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M21.69,23.4 L 25.11 23.4 25.11 15.97 21.69 15.97 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#E9F2E6&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M25.11,66.38 L 25.46 66.38 25.46 59.49 25.11 59.49 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#D4E6CD&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M25.11,59.49 L 25.46 59.49 25.46 59.43 25.11 59.43 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFECE5&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M25.11,59.43 L 25.46 59.43 25.46 57.2 25.11 57.2 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFFFFF&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M25.11,57.2 L 25.46 57.2 25.46 54.38 25.11 54.38 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#E9F2E6&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M25.11,54.38 L 25.46 54.38 25.46 51.27 25.11 51.27 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#D4E6CD&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M25.11,51.27 L 25.46 51.27 25.46 51.19 25.11 51.19 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFECE5&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M25.11,51.19 L 25.46 51.19 25.46 48.31 25.11 48.31 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFB299&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M25.11,48.31 L 25.46 48.31 25.46 46.93 25.11 46.93 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFC6B2&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M25.11,46.93 L 25.46 46.93 25.46 46.34 25.11 46.34 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFD9CB&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M25.11,46.34 L 25.46 46.34 25.46 45 25.11 45 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFECE5&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M25.11,45 L 25.46 45 25.46 43.75 25.11 43.75 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFB299&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M25.11,43.75 L 25.46 43.75 25.46 43.25 25.11 43.25 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FF7352&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M25.11,43.25 L 25.46 43.25 25.46 38.09 25.11 38.09 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FF8969&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M25.11,38.09 L 25.46 38.09 25.46 36.36 25.11 36.36 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FF9E81&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M25.11,36.36 L 25.46 36.36 25.46 34.74 25.11 34.74 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFB299&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M25.11,34.74 L 25.46 34.74 25.46 34.3 25.11 34.3 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFC6B2&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M25.11,34.3 L 25.46 34.3 25.46 24.19 25.11 24.19 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFD9CB&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M25.11,24.19 L 25.46 24.19 25.46 23.4 25.11 23.4 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFECE5&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M25.11,23.4 L 25.46 23.4 25.46 15.97 25.11 15.97 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#E5F0E1&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M25.46,66.38 L 27.12 66.38 27.12 59.49 25.46 59.49 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#CBE0C3&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M25.46,59.49 L 27.12 59.49 27.12 59.43 25.46 59.43 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFF7F5&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M25.46,59.43 L 27.12 59.43 27.12 57.2 25.46 57.2 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#EEF5EB&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M25.46,57.2 L 27.12 57.2 27.12 54.38 25.46 54.38 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#D4E6CD&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M25.46,54.38 L 27.12 54.38 27.12 51.27 25.46 51.27 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#BAD6B0&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M25.46,51.27 L 27.12 51.27 27.12 51.19 25.46 51.19 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#F6FAF5&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M25.46,51.19 L 27.12 51.19 27.12 48.31 25.46 48.31 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFD1C1&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M25.46,48.31 L 27.12 48.31 27.12 46.93 25.46 46.93 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFE8E0&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M25.46,46.93 L 27.12 46.93 27.12 46.34 25.46 46.34 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFB299&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M25.46,46.34 L 27.12 46.34 27.12 45 25.46 45 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFC9B7&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M25.46,45 L 27.12 45 27.12 43.75 25.46 43.75 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FF9273&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M25.46,43.75 L 27.12 43.75 27.12 43.25 25.46 43.25 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FF5031&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M25.46,43.25 L 27.12 43.25 27.12 38.09 25.46 38.09 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FF6F4D&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M25.46,38.09 L 27.12 38.09 27.12 36.36 25.46 36.36 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FF8969&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M25.46,36.36 L 27.12 36.36 27.12 34.74 25.46 34.74 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFA286&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M25.46,34.74 L 27.12 34.74 27.12 34.3 25.46 34.3 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFBAA3&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M25.46,34.3 L 27.12 34.3 27.12 24.19 25.46 24.19 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFD1C1&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M25.46,24.19 L 27.12 24.19 27.12 23.4 25.46 23.4 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFE8E0&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M25.46,23.4 L 27.12 23.4 27.12 15.97 25.46 15.97 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#E1EDDC&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M27.12,66.38 L 28.77 66.38 28.77 59.49 27.12 59.49 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#C2DBB9&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M27.12,59.49 L 28.77 59.49 28.77 59.43 27.12 59.43 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FBFCFA&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M27.12,59.43 L 28.77 59.43 28.77 57.2 27.12 57.2 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#DCEBD7&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M27.12,57.2 L 28.77 57.2 28.77 54.38 27.12 54.38 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#BED9B4&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M27.12,54.38 L 28.77 54.38 28.77 51.27 27.12 51.27 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#F6FAF5&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M27.12,51.27 L 28.77 51.27 28.77 51.19 27.12 51.19 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFD5C6&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M27.12,51.19 L 28.77 51.19 28.77 48.31 27.12 48.31 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFA286&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M27.12,48.31 L 28.77 48.31 28.77 46.93 27.12 46.93 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFBEA8&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M27.12,46.93 L 28.77 46.93 28.77 46.34 27.12 46.34 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FF8969&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M27.12,46.34 L 28.77 46.34 28.77 45 27.12 45 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFA68B&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M27.12,45 L 28.77 45 28.77 43.75 27.12 43.75 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FF6F4D&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M27.12,43.75 L 28.77 43.75 28.77 43.25 27.12 43.25 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FF1708&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M27.12,43.25 L 28.77 43.25 28.77 38.09 27.12 38.09 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FF5031&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M27.12,38.09 L 28.77 38.09 28.77 36.36 27.12 36.36 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FF7352&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M27.12,36.36 L 28.77 36.36 28.77 34.74 27.12 34.74 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FF9273&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M27.12,34.74 L 28.77 34.74 28.77 34.3 27.12 34.3 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFAE95&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M27.12,34.3 L 28.77 34.3 28.77 24.19 27.12 24.19 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFC9B7&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M27.12,24.19 L 28.77 24.19 28.77 23.4 27.12 23.4 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFE4DB&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M27.12,23.4 L 28.77 23.4 28.77 15.97 27.12 15.97 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#DCEBD7&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M28.77,66.38 L 28.81 66.38 28.81 59.49 28.77 59.49 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#BAD6B0&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M28.77,59.49 L 28.81 59.49 28.81 59.43 28.77 59.43 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#EEF5EB&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M28.77,59.43 L 28.81 59.43 28.81 57.2 28.77 57.2 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#CBE0C3&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M28.77,57.2 L 28.81 57.2 28.81 54.38 28.77 54.38 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#A9CC9C&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M28.77,54.38 L 28.81 54.38 28.81 51.27 28.77 51.27 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#DCEBD7&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M28.77,51.27 L 28.81 51.27 28.81 51.19 28.77 51.19 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFF0EA&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M28.77,51.19 L 28.81 51.19 28.81 48.31 28.77 48.31 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFC2AD&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M28.77,48.31 L 28.81 48.31 28.81 46.93 28.77 46.93 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFE0D6&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M28.77,46.93 L 28.81 46.93 28.81 46.34 28.77 46.34 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFB299&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M28.77,46.34 L 28.81 46.34 28.81 45 28.77 45 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFD1C1&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M28.77,45 L 28.81 45 28.81 43.75 28.77 43.75 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFA286&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M28.77,43.75 L 28.81 43.75 28.81 43.25 28.77 43.25 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FF6F4D&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M28.77,43.25 L 28.81 43.25 28.81 38.09 28.77 38.09 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FF9273&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M28.77,38.09 L 28.81 38.09 28.81 36.36 28.77 36.36 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFB299&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M28.77,36.36 L 28.81 36.36 28.81 34.74 28.77 34.74 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFD1C1&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M28.77,34.74 L 28.81 34.74 28.81 34.3 28.77 34.3 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFA286&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M28.77,34.3 L 28.81 34.3 28.81 24.19 28.77 24.19 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFC2AD&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M28.77,24.19 L 28.81 24.19 28.81 23.4 28.77 23.4 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFE0D6&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M28.77,23.4 L 28.81 23.4 28.81 15.97 28.77 15.97 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#D8E8D2&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M28.81,66.38 L 30.22 66.38 30.22 59.49 28.81 59.49 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFF7F5&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M28.81,59.49 L 30.22 59.49 30.22 59.43 28.81 59.43 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFCDBC&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M28.81,59.43 L 30.22 59.43 30.22 57.2 28.81 57.2 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFF0EA&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M28.81,57.2 L 30.22 57.2 30.22 54.38 28.81 54.38 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#E9F2E6&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M28.81,54.38 L 30.22 54.38 30.22 51.27 28.81 51.27 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFE8E0&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M28.81,51.27 L 30.22 51.27 30.22 51.19 28.81 51.19 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFBEA8&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M28.81,51.19 L 30.22 51.19 30.22 48.31 28.81 48.31 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FF9273&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M28.81,48.31 L 30.22 48.31 30.22 46.93 28.81 46.93 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFB69E&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M28.81,46.93 L 30.22 46.93 30.22 46.34 28.81 46.34 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FF8969&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M28.81,46.34 L 30.22 46.34 30.22 45 28.81 45 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFAE95&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M28.81,45 L 30.22 45 30.22 43.75 28.81 43.75 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FF8160&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M28.81,43.75 L 30.22 43.75 30.22 43.25 28.81 43.25 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FF4A2C&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M28.81,43.25 L 30.22 43.25 30.22 38.09 28.81 38.09 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FF7857&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M28.81,38.09 L 30.22 38.09 30.22 36.36 28.81 36.36 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FF9E81&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M28.81,36.36 L 30.22 36.36 30.22 34.74 28.81 34.74 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFC2AD&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M28.81,34.74 L 30.22 34.74 30.22 34.3 28.81 34.3 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FF9678&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M28.81,34.3 L 30.22 34.3 30.22 24.19 28.81 24.19 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFBAA3&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M28.81,24.19 L 30.22 24.19 30.22 23.4 28.81 23.4 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFDDD0&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M28.81,23.4 L 30.22 23.4 30.22 15.97 28.81 15.97 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#D4E6CD&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M30.22,66.38 L 31.08 66.38 31.08 59.49 30.22 59.49 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFFFFF&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M30.22,59.49 L 31.08 59.49 31.08 59.43 30.22 59.43 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFD9CB&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M30.22,59.43 L 31.08 59.43 31.08 57.2 30.22 57.2 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFFFFF&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M30.22,57.2 L 31.08 57.2 31.08 54.38 30.22 54.38 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#D4E6CD&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M30.22,54.38 L 31.08 54.38 31.08 51.27 30.22 51.27 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFFFFF&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M30.22,51.27 L 31.08 51.27 31.08 51.19 30.22 51.19 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFD9CB&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M30.22,51.19 L 31.08 51.19 31.08 48.31 30.22 48.31 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFB299&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M30.22,48.31 L 31.08 48.31 31.08 46.93 30.22 46.93 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFD9CB&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M30.22,46.93 L 31.08 46.93 31.08 46.34 30.22 46.34 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFB299&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M30.22,46.34 L 31.08 46.34 31.08 45 30.22 45 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFD9CB&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M30.22,45 L 31.08 45 31.08 43.75 30.22 43.75 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFB299&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M30.22,43.75 L 31.08 43.75 31.08 43.25 30.22 43.25 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FF8969&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M30.22,43.25 L 31.08 43.25 31.08 38.09 30.22 38.09 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFB299&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M30.22,38.09 L 31.08 38.09 31.08 36.36 30.22 36.36 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFD9CB&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M30.22,36.36 L 31.08 36.36 31.08 34.74 30.22 34.74 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFFFFF&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M30.22,34.74 L 31.08 34.74 31.08 34.3 30.22 34.3 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFD9CB&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M30.22,34.3 L 31.08 34.3 31.08 24.19 30.22 24.19 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFFFFF&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M30.22,24.19 L 31.08 24.19 31.08 23.4 30.22 23.4 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#D4E6CD&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M30.22,23.4 L 31.08 23.4 31.08 15.97 30.22 15.97 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#CFE3C8&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M31.08,66.38 L 39.69 66.38 39.69 59.49 31.08 59.49 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#F6FAF5&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M31.08,59.49 L 39.69 59.49 39.69 59.43 31.08 59.43 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFE4DB&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M31.08,59.43 L 39.69 59.43 39.69 57.2 31.08 57.2 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#EEF5EB&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M31.08,57.2 L 39.69 57.2 39.69 54.38 31.08 54.38 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#BED9B4&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M31.08,54.38 L 39.69 54.38 39.69 51.27 31.08 51.27 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#E5F0E1&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M31.08,51.27 L 39.69 51.27 39.69 51.19 31.08 51.19 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFF4EF&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M31.08,51.19 L 39.69 51.19 39.69 48.31 31.08 48.31 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFD1C1&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M31.08,48.31 L 39.69 48.31 39.69 46.93 31.08 46.93 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFFBFA&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M31.08,46.93 L 39.69 46.93 39.69 46.34 31.08 46.34 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFD9CB&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M31.08,46.34 L 39.69 46.34 39.69 45 31.08 45 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FBFCFA&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M31.08,45 L 39.69 45 39.69 43.75 31.08 43.75 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFE0D6&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M31.08,43.75 L 39.69 43.75 39.69 43.25 31.08 43.25 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFBEA8&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M31.08,43.25 L 39.69 43.25 39.69 38.09 31.08 38.09 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFE8E0&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M31.08,38.09 L 39.69 38.09 39.69 36.36 31.08 36.36 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#E9F2E6&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M31.08,36.36 L 39.69 36.36 39.69 34.74 31.08 34.74 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFF0EA&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M31.08,34.74 L 39.69 34.74 39.69 34.3 31.08 34.3 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFCDBC&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M31.08,34.3 L 39.69 34.3 39.69 24.19 31.08 24.19 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFF7F5&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M31.08,24.19 L 39.69 24.19 39.69 23.4 31.08 23.4 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#D8E8D2&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M31.08,23.4 L 39.69 23.4 39.69 15.97 31.08 15.97 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#CBE0C3&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M39.69,66.38 L 39.91 66.38 39.91 59.49 39.69 59.49 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#EEF5EB&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M39.69,59.49 L 39.91 59.49 39.91 59.43 39.69 59.43 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFF0EA&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M39.69,59.43 L 39.91 59.43 39.91 57.2 39.69 57.2 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFD1C1&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M39.69,57.2 L 39.91 57.2 39.91 54.38 39.69 54.38 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFFFFF&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M39.69,54.38 L 39.91 54.38 39.91 51.27 39.69 51.27 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFE0D6&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M39.69,51.27 L 39.91 51.27 39.91 51.19 39.69 51.19 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFC2AD&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M39.69,51.19 L 39.91 51.19 39.91 48.31 39.69 48.31 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFA286&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M39.69,48.31 L 39.91 48.31 39.91 46.93 39.69 46.93 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFD1C1&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M39.69,46.93 L 39.91 46.93 39.91 46.34 39.69 46.34 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFB299&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M39.69,46.34 L 39.91 46.34 39.91 45 39.69 45 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFE0D6&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M39.69,45 L 39.91 45 39.91 43.75 39.69 43.75 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFC2AD&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M39.69,43.75 L 39.91 43.75 39.91 43.25 39.69 43.25 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFA286&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M39.69,43.25 L 39.91 43.25 39.91 38.09 39.69 38.09 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFD1C1&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M39.69,38.09 L 39.91 38.09 39.91 36.36 39.69 36.36 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFFFFF&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M39.69,36.36 L 39.91 36.36 39.91 34.74 39.69 34.74 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFE0D6&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M39.69,34.74 L 39.91 34.74 39.91 34.3 39.69 34.3 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFC2AD&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M39.69,34.3 L 39.91 34.3 39.91 24.19 39.69 24.19 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFF0EA&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M39.69,24.19 L 39.91 24.19 39.91 23.4 39.69 23.4 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#DCEBD7&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M39.69,23.4 L 39.91 23.4 39.91 15.97 39.69 15.97 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#C7DEBE&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M39.91,66.38 L 48.88 66.38 48.88 59.49 39.91 59.49 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#E5F0E1&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M39.91,59.49 L 48.88 59.49 48.88 59.43 39.91 59.43 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFFBFA&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M39.91,59.43 L 48.88 59.43 48.88 57.2 39.91 57.2 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFE0D6&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M39.91,57.2 L 48.88 57.2 48.88 54.38 39.91 54.38 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#E9F2E6&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M39.91,54.38 L 48.88 54.38 48.88 51.27 39.91 51.27 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFF7F5&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M39.91,51.27 L 48.88 51.27 48.88 51.19 39.91 51.19 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFDDD0&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M39.91,51.19 L 48.88 51.19 48.88 48.31 39.91 48.31 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFC2AD&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M39.91,48.31 L 48.88 48.31 48.88 46.93 39.91 46.93 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFF4EF&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M39.91,46.93 L 48.88 46.93 48.88 46.34 39.91 46.34 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFD9CB&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M39.91,46.34 L 48.88 46.34 48.88 45 39.91 45 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#F2F7F0&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M39.91,45 L 48.88 45 48.88 43.75 39.91 43.75 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFF0EA&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M39.91,43.75 L 48.88 43.75 48.88 43.25 39.91 43.25 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFD5C6&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M39.91,43.25 L 48.88 43.25 48.88 38.09 39.91 38.09 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#F6FAF5&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M39.91,38.09 L 48.88 38.09 48.88 36.36 39.91 36.36 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#BED9B4&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M39.91,36.36 L 48.88 36.36 48.88 34.74 39.91 34.74 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#DCEBD7&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M39.91,34.74 L 48.88 34.74 48.88 34.3 39.91 34.3 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FBFCFA&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M39.91,34.3 L 48.88 34.3 48.88 24.19 39.91 24.19 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFE8E0&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M39.91,24.19 L 48.88 24.19 48.88 23.4 39.91 23.4 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#E1EDDC&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M39.91,23.4 L 48.88 23.4 48.88 15.97 39.91 15.97 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#C2DBB9&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M48.88,66.38 L 56.61 66.38 56.61 59.49 48.88 59.49 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#DCEBD7&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M48.88,59.49 L 56.61 59.49 56.61 59.43 48.88 59.43 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#F6FAF5&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M48.88,59.43 L 56.61 59.43 56.61 57.2 48.88 57.2 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFF0EA&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M48.88,57.2 L 56.61 57.2 56.61 54.38 48.88 54.38 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#D4E6CD&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M48.88,54.38 L 56.61 54.38 56.61 51.27 48.88 51.27 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#EEF5EB&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M48.88,51.27 L 56.61 51.27 56.61 51.19 48.88 51.19 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFF7F5&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M48.88,51.19 L 56.61 51.19 56.61 48.31 48.88 48.31 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFE0D6&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M48.88,48.31 L 56.61 48.31 56.61 46.93 48.88 46.93 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#E5F0E1&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M48.88,46.93 L 56.61 46.93 56.61 46.34 48.88 46.34 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFFFFF&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M48.88,46.34 L 56.61 46.34 56.61 45 48.88 45 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#C2DBB9&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M48.88,45 L 56.61 45 56.61 43.75 48.88 43.75 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#DCEBD7&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M48.88,43.75 L 56.61 43.75 56.61 43.25 48.88 43.25 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#F6FAF5&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M48.88,43.25 L 56.61 43.25 56.61 38.09 48.88 38.09 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFF0EA&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M48.88,38.09 L 56.61 38.09 56.61 36.36 48.88 36.36 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#D4E6CD&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M48.88,36.36 L 56.61 36.36 56.61 34.74 48.88 34.74 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#EEF5EB&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M48.88,34.74 L 56.61 34.74 56.61 34.3 48.88 34.3 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFF7F5&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M48.88,34.3 L 56.61 34.3 56.61 24.19 48.88 24.19 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFE0D6&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M48.88,24.19 L 56.61 24.19 56.61 23.4 48.88 23.4 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#E5F0E1&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M48.88,23.4 L 56.61 23.4 56.61 15.97 48.88 15.97 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#BED9B4&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M56.61,66.38 L 60.81 66.38 60.81 59.49 56.61 59.49 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#D4E6CD&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M56.61,59.49 L 60.81 59.49 60.81 59.43 56.61 59.43 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#E9F2E6&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M56.61,59.43 L 60.81 59.43 60.81 57.2 56.61 57.2 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFFFFF&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M56.61,57.2 L 60.81 57.2 60.81 54.38 56.61 54.38 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#BED9B4&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M56.61,54.38 L 60.81 54.38 60.81 51.27 56.61 51.27 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#D4E6CD&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M56.61,51.27 L 60.81 51.27 60.81 51.19 56.61 51.19 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#E9F2E6&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M56.61,51.19 L 60.81 51.19 60.81 48.31 56.61 48.31 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFFFFF&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M56.61,48.31 L 60.81 48.31 60.81 46.93 56.61 46.93 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#BED9B4&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M56.61,46.93 L 60.81 46.93 60.81 46.34 56.61 46.34 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#D4E6CD&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M56.61,46.34 L 60.81 46.34 60.81 45 56.61 45 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#93BF85&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M56.61,45 L 60.81 45 60.81 43.75 56.61 43.75 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#A9CC9C&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M56.61,43.75 L 60.81 43.75 60.81 43.25 56.61 43.25 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#BED9B4&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M56.61,43.25 L 60.81 43.25 60.81 38.09 56.61 38.09 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#D4E6CD&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M56.61,38.09 L 60.81 38.09 60.81 36.36 56.61 36.36 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#93BF85&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M56.61,36.36 L 60.81 36.36 60.81 34.74 56.61 34.74 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#A9CC9C&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M56.61,34.74 L 60.81 34.74 60.81 34.3 56.61 34.3 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#BED9B4&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M56.61,34.3 L 60.81 34.3 60.81 24.19 56.61 24.19 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#D4E6CD&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M56.61,24.19 L 60.81 24.19 60.81 23.4 56.61 23.4 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#E9F2E6&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M56.61,23.4 L 60.81 23.4 60.81 15.97 56.61 15.97 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFF0EA&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M60.81,66.38 L 61.52 66.38 61.52 59.49 60.81 59.49 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFE0D6&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M60.81,59.49 L 61.52 59.49 61.52 59.43 60.81 59.43 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFD1C1&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M60.81,59.43 L 61.52 59.43 61.52 57.2 60.81 57.2 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFC2AD&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M60.81,57.2 L 61.52 57.2 61.52 54.38 60.81 54.38 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFFFFF&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M60.81,54.38 L 61.52 54.38 61.52 51.27 60.81 51.27 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFF0EA&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M60.81,51.27 L 61.52 51.27 61.52 51.19 60.81 51.19 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFE0D6&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M60.81,51.19 L 61.52 51.19 61.52 48.31 60.81 48.31 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFD1C1&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M60.81,48.31 L 61.52 48.31 61.52 46.93 60.81 46.93 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#EEF5EB&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M60.81,46.93 L 61.52 46.93 61.52 46.34 60.81 46.34 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFFFFF&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M60.81,46.34 L 61.52 46.34 61.52 45 60.81 45 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#BAD6B0&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M60.81,45 L 61.52 45 61.52 43.75 60.81 43.75 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#CBE0C3&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M60.81,43.75 L 61.52 43.75 61.52 43.25 60.81 43.25 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#DCEBD7&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M60.81,43.25 L 61.52 43.25 61.52 38.09 60.81 38.09 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#EEF5EB&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M60.81,38.09 L 61.52 38.09 61.52 36.36 60.81 36.36 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#A9CC9C&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M60.81,36.36 L 61.52 36.36 61.52 34.74 60.81 34.74 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#BAD6B0&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M60.81,34.74 L 61.52 34.74 61.52 34.3 60.81 34.3 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#CBE0C3&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M60.81,34.3 L 61.52 34.3 61.52 24.19 60.81 24.19 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#DCEBD7&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M60.81,24.19 L 61.52 24.19 61.52 23.4 60.81 23.4 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#EEF5EB&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M60.81,23.4 L 61.52 23.4 61.52 15.97 60.81 15.97 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFF4EF&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M61.52,66.38 L 62.59 66.38 62.59 59.49 61.52 59.49 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFE8E0&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M61.52,59.49 L 62.59 59.49 62.59 59.43 61.52 59.43 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFDDD0&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M61.52,59.43 L 62.59 59.43 62.59 57.2 61.52 57.2 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFD1C1&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M61.52,57.2 L 62.59 57.2 62.59 54.38 61.52 54.38 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFC6B2&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M61.52,54.38 L 62.59 54.38 62.59 51.27 61.52 51.27 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFBAA3&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M61.52,51.27 L 62.59 51.27 62.59 51.19 61.52 51.19 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFAE95&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M61.52,51.19 L 62.59 51.19 62.59 48.31 61.52 48.31 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFA286&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M61.52,48.31 L 62.59 48.31 62.59 46.93 61.52 46.93 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFE4DB&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M61.52,46.93 L 62.59 46.93 62.59 46.34 61.52 46.34 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFD9CB&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M61.52,46.34 L 62.59 46.34 62.59 45 61.52 45 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#E1EDDC&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M61.52,45 L 62.59 45 62.59 43.75 61.52 43.75 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#EEF5EB&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M61.52,43.75 L 62.59 43.75 62.59 43.25 61.52 43.25 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FBFCFA&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M61.52,43.25 L 62.59 43.25 62.59 38.09 61.52 38.09 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFF7F5&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M61.52,38.09 L 62.59 38.09 62.59 36.36 61.52 36.36 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#BED9B4&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M61.52,36.36 L 62.59 36.36 62.59 34.74 61.52 34.74 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#CBE0C3&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M61.52,34.74 L 62.59 34.74 62.59 34.3 61.52 34.3 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#D8E8D2&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M61.52,34.3 L 62.59 34.3 62.59 24.19 61.52 24.19 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#E5F0E1&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M61.52,24.19 L 62.59 24.19 62.59 23.4 61.52 23.4 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#F2F7F0&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M61.52,23.4 L 62.59 23.4 62.59 15.97 61.52 15.97 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFF7F5&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M62.59,66.38 L 64.28 66.38 64.28 59.49 62.59 59.49 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFF0EA&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M62.59,59.49 L 64.28 59.49 64.28 59.43 62.59 59.43 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFE8E0&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M62.59,59.43 L 64.28 59.43 64.28 57.2 62.59 57.2 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFE0D6&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M62.59,57.2 L 64.28 57.2 64.28 54.38 62.59 54.38 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFD9CB&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M62.59,54.38 L 64.28 54.38 64.28 51.27 62.59 51.27 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFD1C1&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M62.59,51.27 L 64.28 51.27 64.28 51.19 62.59 51.19 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFC9B7&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M62.59,51.19 L 64.28 51.19 64.28 48.31 62.59 48.31 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFC2AD&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M62.59,48.31 L 64.28 48.31 64.28 46.93 62.59 46.93 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#F6FAF5&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M62.59,46.93 L 64.28 46.93 64.28 46.34 62.59 46.34 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFFFFF&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M62.59,46.34 L 64.28 46.34 64.28 45 62.59 45 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#B1D1A6&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M62.59,45 L 64.28 45 64.28 43.75 62.59 43.75 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#BAD6B0&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M62.59,43.75 L 64.28 43.75 64.28 43.25 62.59 43.25 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#C2DBB9&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M62.59,43.25 L 64.28 43.25 64.28 38.09 62.59 38.09 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#CBE0C3&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M62.59,38.09 L 64.28 38.09 64.28 36.36 62.59 36.36 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#D4E6CD&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M62.59,36.36 L 64.28 36.36 64.28 34.74 62.59 34.74 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#DCEBD7&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M62.59,34.74 L 64.28 34.74 64.28 34.3 62.59 34.3 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#E5F0E1&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M62.59,34.3 L 64.28 34.3 64.28 24.19 62.59 24.19 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#EEF5EB&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M62.59,24.19 L 64.28 24.19 64.28 23.4 62.59 23.4 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#F6FAF5&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M62.59,23.4 L 64.28 23.4 64.28 15.97 62.59 15.97 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFFBFA&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M64.28,66.38 L 69.81 66.38 69.81 59.49 64.28 59.49 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFF7F5&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M64.28,59.49 L 69.81 59.49 69.81 59.43 64.28 59.43 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFF4EF&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M64.28,59.43 L 69.81 59.43 69.81 57.2 64.28 57.2 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFF0EA&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M64.28,57.2 L 69.81 57.2 69.81 54.38 64.28 54.38 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFECE5&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M64.28,54.38 L 69.81 54.38 69.81 51.27 64.28 51.27 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFE8E0&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M64.28,51.27 L 69.81 51.27 69.81 51.19 64.28 51.19 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFE4DB&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M64.28,51.19 L 69.81 51.19 69.81 48.31 64.28 48.31 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FFE0D6&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M64.28,48.31 L 69.81 48.31 69.81 46.93 64.28 46.93 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#CFE3C8&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M64.28,46.93 L 69.81 46.93 69.81 46.34 64.28 46.34 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#D4E6CD&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M64.28,46.34 L 69.81 46.34 69.81 45 64.28 45 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#D8E8D2&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M64.28,45 L 69.81 45 69.81 43.75 64.28 43.75 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#DCEBD7&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M64.28,43.75 L 69.81 43.75 69.81 43.25 64.28 43.25 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#E1EDDC&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M64.28,43.25 L 69.81 43.25 69.81 38.09 64.28 38.09 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#E5F0E1&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M64.28,38.09 L 69.81 38.09 69.81 36.36 64.28 36.36 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#E9F2E6&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M64.28,36.36 L 69.81 36.36 69.81 34.74 64.28 34.74 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#EEF5EB&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M64.28,34.74 L 69.81 34.74 69.81 34.3 64.28 34.3 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#F2F7F0&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M64.28,34.3 L 69.81 34.3 69.81 24.19 64.28 24.19 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#F6FAF5&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M64.28,24.19 L 69.81 24.19 69.81 23.4 64.28 23.4 z&quot;);
            }(g.append(&quot;g&quot;)));
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#FBFCFA&quot;)
               .attr(&quot;class&quot;, &quot;geometry&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M64.28,23.4 L 69.81 23.4 69.81 15.97 64.28 15.97 z&quot;);
            }(g.append(&quot;g&quot;)));
          }(g.append(&quot;g&quot;)));
          (function (g) {
            g.attr(&quot;stroke-width&quot;, 1);
            (function (g) {
              g.attr(&quot;stroke-width&quot;, 1);
g.selectAll(&quot;form0&quot;)
                  .data(d3.zip(data[0],data[1]))
                  .enter()
                  .append(&quot;circle&quot;)
.attr(&quot;cx&quot;, function(d) { return d[0]; })
.attr(&quot;cy&quot;, function(d) { return d[1]; })
.attr(&quot;r&quot;, 0.6)
.attr(&quot;class&quot;, &quot;geometry color_RGB(0.0,0.0,0.0)&quot;)
.on(&quot;mouseout&quot;, geom_point_mouseout(10.00, 1.67), false)
.on(&quot;mouseover&quot;, geom_point_mouseover(10.00, 1.67), false)
.attr(&quot;stroke&quot;, &quot;#000000&quot;)
.attr(&quot;fill&quot;, &quot;#000000&quot;)
;
            }(g.append(&quot;g&quot;)));
          }(g.append(&quot;g&quot;)));
        }(g.append(&quot;g&quot;)));
      }(g.append(&quot;g&quot;)));
      (function (g) {
        d3.select(&quot;defs&quot;)
  .append(&quot;svg:clipPath&quot;)
    .attr(&quot;id&quot;, parent_id + &quot;_clippath2&quot;)
    .append(&quot;svg:path&quot;)
      .attr(&quot;d&quot;, &quot; M12.22,5 L 89.67 5 89.67 68.7 12.22 68.7 z&quot;);g.attr(&quot;clip-path&quot;, &quot;url(#&quot; + parent_id + &quot;_clippath2)&quot;);
        (function (g) {
          g.attr(&quot;stroke&quot;, &quot;none&quot;)
           .attr(&quot;class&quot;, &quot;guide zoomslider&quot;)
           .attr(&quot;opacity&quot;, 0.00);
          (function (g) {
            g.attr(&quot;stroke&quot;, &quot;#6A6A6A&quot;)
             .attr(&quot;stroke-opacity&quot;, 0.00)
             .attr(&quot;stroke-width&quot;, 0.3)
             .attr(&quot;fill&quot;, &quot;#EAEAEA&quot;)
             .on(&quot;click&quot;, zoomin_behavior(ctx))
.on(&quot;dblclick&quot;, function() { d3.event.stopPropagation(); })
.on(&quot;mouseover&quot;, zoomslider_button_mouseover(&quot;#cd5c5c&quot;))
.on(&quot;mouseout&quot;, zoomslider_button_mouseover(&quot;#6a6a6a&quot;))
;
            g.append(&quot;svg:path&quot;)
               .attr(&quot;d&quot;, &quot;M82.67,8 L 86.67 8 86.67 12 82.67 12 z&quot;);
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#6A6A6A&quot;)
               .attr(&quot;class&quot;, &quot;button_logo&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M83.47,9.6 L 84.27 9.6 84.27 8.8 85.07 8.8 85.07 9.6 85.87 9.6 85.87 10.4 85.07 10.4 85.07 11.2 84.27 11.2 84.27 10.4 83.47 10.4 z&quot;);
            }(g.append(&quot;g&quot;)));
          }(g.append(&quot;g&quot;)));
          (function (g) {
            g.attr(&quot;fill&quot;, &quot;#EAEAEA&quot;)
             .on(&quot;click&quot;, zoomslider_track_behavior(ctx, 56.67, 73.67));
            g.append(&quot;svg:path&quot;)
               .attr(&quot;d&quot;, &quot;M63.17,8 L 82.17 8 82.17 12 63.17 12 z&quot;);
          }(g.append(&quot;g&quot;)));
          (function (g) {
            g.attr(&quot;fill&quot;, &quot;#6A6A6A&quot;)
             .attr(&quot;class&quot;, &quot;zoomslider_thumb&quot;)
             .call(zoomslider_behavior(ctx, 56.67, 73.67))
.on(&quot;mouseover&quot;, zoomslider_thumb_mouseover(&quot;#cd5c5c&quot;))
.on(&quot;mouseout&quot;, zoomslider_thumb_mouseover(&quot;#6a6a6a&quot;))
;
            g.append(&quot;svg:path&quot;)
               .attr(&quot;d&quot;, &quot;M71.67,8 L 73.67 8 73.67 12 71.67 12 z&quot;);
          }(g.append(&quot;g&quot;)));
          (function (g) {
            g.attr(&quot;stroke&quot;, &quot;#6A6A6A&quot;)
             .attr(&quot;stroke-opacity&quot;, 0.00)
             .attr(&quot;stroke-width&quot;, 0.3)
             .attr(&quot;fill&quot;, &quot;#EAEAEA&quot;)
             .on(&quot;click&quot;, zoomout_behavior(ctx))
.on(&quot;dblclick&quot;, function() { d3.event.stopPropagation(); })
.on(&quot;mouseover&quot;, zoomslider_button_mouseover(&quot;#cd5c5c&quot;))
.on(&quot;mouseout&quot;, zoomslider_button_mouseover(&quot;#6a6a6a&quot;))
;
            g.append(&quot;svg:path&quot;)
               .attr(&quot;d&quot;, &quot;M58.67,8 L 62.67 8 62.67 12 58.67 12 z&quot;);
            (function (g) {
              g.attr(&quot;fill&quot;, &quot;#6A6A6A&quot;)
               .attr(&quot;class&quot;, &quot;button_logo&quot;);
              g.append(&quot;svg:path&quot;)
                 .attr(&quot;d&quot;, &quot;M59.47,9.6 L 61.87 9.6 61.87 10.4 59.47 10.4 z&quot;);
            }(g.append(&quot;g&quot;)));
          }(g.append(&quot;g&quot;)));
        }(g.append(&quot;g&quot;)));
      }(g.append(&quot;g&quot;)));
    }(g.append(&quot;g&quot;)));
  }(g.append(&quot;g&quot;)));
}(g.append(&quot;g&quot;)));
    d3.select(parent_id)
      .selectAll(&quot;path&quot;)
      .each(function() {
          var sw = parseFloat(window.getComputedStyle(this).getPropertyValue(&quot;stroke-width&quot;));
          d3.select(this)
            .attr(&quot;vector-effect&quot;, &quot;non-scaling-stroke&quot;)
            .style(&quot;stroke-width&quot;, sw + &quot;mm&quot;);
      });
}

var data = [
  [20.656642177952378,39.68832166190209,21.692628310599908,28.814819442953983,61.51654579603376,69.80633857352464,39.91331651658065,16.773788726480326,19.788161886999376,62.59375292288877,27.12157821248408,28.7696065736812,48.879969785174026,60.8132262907311,30.22197067702094,31.080660321779952,25.112552463993374,25.462493030843007,56.609624927485065,64.27878103050128],
  [51.1871370355869,57.197942947178575,43.75381441145417,59.48897763284994,54.381597163845385,46.926183818822565,24.18745372394257,48.30712091087307,43.245299444813945,36.360190753579374,51.27208654349017,34.30027900645595,38.092106591031055,66.3847042896034,15.966560868921276,34.73817787035377,59.427115955306505,46.34470912940032,23.398253362906775,45.003675398778825]];

var draw = function(parent_id) {
    draw_with_data(data, parent_id);
};

if (&apos;undefined&apos; !== typeof module) {
    module.exports = draw;
} else if (&apos;undefined&apos; !== typeof window) {
    window.draw = draw
}

return module;
})({}).exports(&quot;#gadflyplot-nS1LWjECXKGfOxyhotr2&quot;);
//@ sourceURL=gadflyplot-nS1LWjECXKGfOxyhotr2.js
&lt;/script&gt;


&lt;h2 id=&quot;formal-explanation&quot;&gt;Formal Explanation&lt;/h2&gt;
&lt;p&gt;The formal way to speak about multiple draws from a distribution is with a set of independent and identically distributed (i.i.d.) random variables. If we have a random variable &lt;span class=&quot;math&quot;&gt;&lt;em&gt;X&lt;/em&gt;&lt;/span&gt;, saying that &lt;span class=&quot;math&quot;&gt;&lt;em&gt;X&lt;/em&gt;&lt;sub&gt;1&lt;/sub&gt;, &lt;em&gt;X&lt;/em&gt;&lt;sub&gt;2&lt;/sub&gt;, …&lt;/span&gt; are i.i.d means that they are all independent, but follow the same distribution.

&lt;!--more--&gt;

&lt;/p&gt;
&lt;p&gt;To consider covariance and these rectangles, we need to think of a random variable which is the ordered pair of random variables &lt;span class=&quot;math&quot;&gt;(&lt;em&gt;X&lt;/em&gt;, &lt;em&gt;Y&lt;/em&gt;)&lt;/span&gt;. Suppose that &lt;span class=&quot;math&quot;&gt;{(&lt;em&gt;X&lt;/em&gt;&lt;sub&gt;1&lt;/sub&gt;, &lt;em&gt;Y&lt;/em&gt;&lt;sub&gt;1&lt;/sub&gt;), (&lt;em&gt;X&lt;/em&gt;&lt;sub&gt;2&lt;/sub&gt;, &lt;em&gt;Y&lt;/em&gt;&lt;sub&gt;2&lt;/sub&gt;), …, (&lt;em&gt;X&lt;/em&gt;&lt;sub&gt;&lt;em&gt;n&lt;/em&gt;&lt;/sub&gt;, &lt;em&gt;Y&lt;/em&gt;&lt;sub&gt;&lt;em&gt;n&lt;/em&gt;&lt;/sub&gt;)}&lt;/span&gt; are i.i.d. random variables (each of which consists of a pair of random variables that are &lt;em&gt;not&lt;/em&gt; assumed to be independent). The (signed) area corresponding to the two corner points &lt;span class=&quot;math&quot;&gt;(&lt;em&gt;X&lt;/em&gt;&lt;sub&gt;&lt;em&gt;i&lt;/em&gt;&lt;/sub&gt;, &lt;em&gt;Y&lt;/em&gt;&lt;sub&gt;&lt;em&gt;i&lt;/em&gt;&lt;/sub&gt;)&lt;/span&gt; and &lt;span class=&quot;math&quot;&gt;(&lt;em&gt;X&lt;/em&gt;&lt;sub&gt;&lt;em&gt;j&lt;/em&gt;&lt;/sub&gt;, &lt;em&gt;Y&lt;/em&gt;&lt;sub&gt;&lt;em&gt;j&lt;/em&gt;&lt;/sub&gt;)&lt;/span&gt; is:&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;math&quot;&gt;(&lt;em&gt;X&lt;/em&gt;&lt;sub&gt;&lt;em&gt;j&lt;/em&gt;&lt;/sub&gt; − &lt;em&gt;X&lt;/em&gt;&lt;sub&gt;&lt;em&gt;i&lt;/em&gt;&lt;/sub&gt;)(&lt;em&gt;Y&lt;/em&gt;&lt;sub&gt;&lt;em&gt;j&lt;/em&gt;&lt;/sub&gt; − &lt;em&gt;Y&lt;/em&gt;&lt;sub&gt;&lt;em&gt;i&lt;/em&gt;&lt;/sub&gt;)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Before considering the sum of areas, let&apos;s examine the expected value of the signed area for just one rectangle, given just two different (i.e. &lt;span class=&quot;math&quot;&gt;&lt;em&gt;i&lt;/em&gt; ≠ &lt;em&gt;j&lt;/em&gt;&lt;/span&gt;) i.i.d. draws:&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;math&quot;&gt;(&lt;em&gt;X&lt;/em&gt;&lt;sub&gt;&lt;em&gt;j&lt;/em&gt;&lt;/sub&gt; − &lt;em&gt;X&lt;/em&gt;&lt;sub&gt;&lt;em&gt;i&lt;/em&gt;&lt;/sub&gt;)(&lt;em&gt;Y&lt;/em&gt;&lt;sub&gt;&lt;em&gt;j&lt;/em&gt;&lt;/sub&gt; − &lt;em&gt;Y&lt;/em&gt;&lt;sub&gt;&lt;em&gt;i&lt;/em&gt;&lt;/sub&gt;) = &lt;em&gt;X&lt;/em&gt;&lt;sub&gt;&lt;em&gt;j&lt;/em&gt;&lt;/sub&gt;&lt;em&gt;Y&lt;/em&gt;&lt;sub&gt;&lt;em&gt;j&lt;/em&gt;&lt;/sub&gt; − &lt;em&gt;X&lt;/em&gt;&lt;sub&gt;&lt;em&gt;j&lt;/em&gt;&lt;/sub&gt;&lt;em&gt;Y&lt;/em&gt;&lt;sub&gt;&lt;em&gt;i&lt;/em&gt;&lt;/sub&gt; + &lt;em&gt;X&lt;/em&gt;&lt;sub&gt;&lt;em&gt;i&lt;/em&gt;&lt;/sub&gt;&lt;em&gt;Y&lt;/em&gt;&lt;sub&gt;&lt;em&gt;j&lt;/em&gt;&lt;/sub&gt; − &lt;em&gt;X&lt;/em&gt;&lt;sub&gt;&lt;em&gt;i&lt;/em&gt;&lt;/sub&gt;&lt;em&gt;Y&lt;/em&gt;&lt;sub&gt;&lt;em&gt;i&lt;/em&gt;&lt;/sub&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Taking expected values of both sides gives usual:&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;math&quot;&gt;E[(&lt;em&gt;X&lt;/em&gt;&lt;sub&gt;&lt;em&gt;j&lt;/em&gt;&lt;/sub&gt; − &lt;em&gt;X&lt;/em&gt;&lt;sub&gt;&lt;em&gt;i&lt;/em&gt;&lt;/sub&gt;)(&lt;em&gt;Y&lt;/em&gt;&lt;sub&gt;&lt;em&gt;j&lt;/em&gt;&lt;/sub&gt; − &lt;em&gt;Y&lt;/em&gt;&lt;sub&gt;&lt;em&gt;i&lt;/em&gt;&lt;/sub&gt;)] = 2E[&lt;em&gt;X&lt;/em&gt;&lt;em&gt;Y&lt;/em&gt;] − 2E[&lt;em&gt;X&lt;/em&gt;]E[&lt;em&gt;Y&lt;/em&gt;] = 2Cov[&lt;em&gt;X&lt;/em&gt;, &lt;em&gt;Y&lt;/em&gt;]&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;This follows by:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;noting that when &lt;span class=&quot;math&quot;&gt;&lt;em&gt;i&lt;/em&gt; ≠ &lt;em&gt;j&lt;/em&gt;&lt;/span&gt;, &lt;span class=&quot;math&quot;&gt;&lt;em&gt;X&lt;/em&gt;&lt;sub&gt;&lt;em&gt;j&lt;/em&gt;&lt;/sub&gt;&lt;/span&gt; and &lt;span class=&quot;math&quot;&gt;&lt;em&gt;Y&lt;/em&gt;&lt;sub&gt;&lt;em&gt;i&lt;/em&gt;&lt;/sub&gt;&lt;/span&gt; are independent so the expected value of their product is the product of their expected values&lt;/li&gt;
&lt;li&gt;applying linearity of &lt;span class=&quot;math&quot;&gt;E&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;simplifying the notation by writing &lt;span class=&quot;math&quot;&gt;&lt;em&gt;X&lt;/em&gt;&lt;/span&gt; and &lt;span class=&quot;math&quot;&gt;&lt;em&gt;Y&lt;/em&gt;&lt;/span&gt; where we don&apos;t need to refer to a particular i.i.d copy&lt;/li&gt;
&lt;li&gt;applying the definition of covariance: &lt;span class=&quot;math&quot;&gt;Cov[&lt;em&gt;X&lt;/em&gt;, &lt;em&gt;Y&lt;/em&gt;] = E[&lt;em&gt;X&lt;/em&gt;&lt;em&gt;Y&lt;/em&gt;] − E[&lt;em&gt;X&lt;/em&gt;]E[&lt;em&gt;Y&lt;/em&gt;]&lt;/span&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;sum-across-pairs-as-an-approximation-of-single-pair-expected-value&quot;&gt;Sum Across Pairs as an Approximation of Single-Pair Expected Value&lt;/h2&gt;
&lt;p&gt;Since we&apos;ve seen that the expected signed area for a single pair of points is the covariance, it follows that the average signed area across all our pairs is an estimator for the covariance (in fact it&apos;s the usual sample covariance, but I haven&apos;t shown that). This means that to go from the sum of areas to the covariance, we need to divide by the number of pairs, &lt;span class=&quot;math&quot;&gt;&lt;em&gt;n&lt;/em&gt;(&lt;em&gt;n&lt;/em&gt; − 1)/2&lt;/span&gt;.&lt;/p&gt;
&lt;h2 id=&quot;making-these-plots-yourself&quot;&gt;Making These Plots Yourself&lt;/h2&gt;
&lt;p&gt;These plots were made using the &lt;a href=&quot;http://julialang.org/&quot;&gt;Julia&lt;/a&gt; language. If you want to make similar plots using my code, get the relevant function definitions &lt;a href=&quot;https://github.com/dchudz/dchudz.github.io/blob/master/post_source/src/covariance_rectangles.jl&quot;&gt;here&lt;/a&gt;, and use &lt;a href=&quot;https://github.com/dchudz/dchudz.github.io/blob/master/post_source/covariance-as-signed-area-of-rectangles.md&quot;&gt;the source for this blog post&lt;/a&gt; as an example. Note that the Julia ecosystem is rapidly developing (and changing), so it&apos;s possible that when you read this the packages used (e.g. &lt;a href=&quot;dcjones.github.io/Gadfly.jl/&quot;&gt;Gadfly&lt;/a&gt;, for plotting) work a little differently from when I wrote it.&lt;/p&gt;
</content>
 </entry>
 
 
     
 <entry>
   <title>Previous Posts</title>
   <link href="http://www.davidchudzicki.com/posts/previous-posts/"/>
   <updated>2014-02-16T00:00:00+00:00</updated>
   <id>http://www.davidchudzicki.com/posts/previous-posts</id>
   <content type="html">&lt;h3&gt;Simulated Knitting (&lt;a href=&quot;http://blog.davidchudzicki.com/2011/11/simulated-knitting.html&quot;&gt;post&lt;/a&gt;) &lt;a href=&quot;https://github.com/dchudz/Knit3d/blob/master/CreateGraph.py&quot;&gt;&lt;img src=&quot;/images/posts/gh.png&quot; alt=&quot;Knit3D&quot;&gt;&lt;/a&gt;&lt;/h3&gt;

&lt;p&gt;I created a &lt;code&gt;KnittedGraph&lt;/code&gt; class (subclassing of Python&amp;#39;s &lt;code&gt;igraph&lt;/code&gt; graph class) with methods corresponding to common operations performed while knitting:&lt;/p&gt;
&lt;figure class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-python&quot; data-lang=&quot;python&quot;&gt;g = KnittedGraph()
g.AddStitches(n)
g.ConnectToZero() # join with the first stitch for a circular shape 
g.NewRow() # start a new row of stitches
g.Increase() # two stitches in new row connect to one stitch in old
#(etc.)
&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;
&lt;p&gt;I then embed the graphs in 3D space. Here&amp;#39;s a hat I made this way:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/hat_100_20.png&quot; alt=&quot;hat&quot;&gt;&lt;/p&gt;

&lt;h3&gt;2D Embeddings from Unsupervised Random Forests (&lt;a href=&quot;http://blog.davidchudzicki.com/2012/08/random-forests-for-visualizing-data.html&quot;&gt;1&lt;/a&gt;, &lt;a href=&quot;http://blog.davidchudzicki.com/2012/08/visualize-random-forest-that-classifies.html&quot;&gt;2&lt;/a&gt;) &lt;a href=&quot;https://github.com/dchudz/misc/tree/master/random_forest_visualizations&quot;&gt;&lt;img src=&quot;/images/posts/gh.png&quot; alt=&quot;random_forest_visualizations&quot;&gt;&lt;/a&gt;&lt;/h3&gt;

&lt;p&gt;There are all sorts of ways to embed high-dimensional data in low dimensions for visualization. Here&amp;#39;s one:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Given some set of high dimensional examples, build a random forest to distinguish examples from non-examples.&lt;/li&gt;
&lt;li&gt;Assign similarities to pairs of examples based on how often they are in leaf nodes together.&lt;/li&gt;
&lt;li&gt;Map examples to 2D in such a way that similarity decreases decreases with Euclidean 2D distance (I used &lt;a href=&quot;https://en.wikipedia.org/wiki/Multidimensional_scaling&quot;&gt;multidimensional scaling&lt;/a&gt; for this).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Here&amp;#39;s the result of doing this on a set of diamond shapes I constructed. I like how it turned out:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/diamondsRF.png&quot; alt=&quot;hat&quot;&gt;&lt;/p&gt;

&lt;h3&gt;A Bayesian Model for a Function Increasing by Chi-Squared Jumps (in Stan) (&lt;a href=&quot;http://blog.davidchudzicki.com/2013/10/a-bayesian-model-for-function.html&quot;&gt;post&lt;/a&gt;) &lt;a href=&quot;https://github.com/dchudz/misc/tree/master/stan%20models/increasing%20by%20chi%20square%20increments&quot;&gt;&lt;img src=&quot;/images/posts/gh.png&quot; alt=&quot;stan_increasing_function&quot;&gt;&lt;/a&gt;&lt;/h3&gt;

&lt;p&gt;In &lt;a href=&quot;http://www.stat.columbia.edu/%7Egelman/research/published/deep.pdf&quot;&gt;this paper&lt;/a&gt;, Andrew Gelman mentions a neat example where there&amp;#39;s a big problem with a naive approach to putting a Bayesian prior on functions that are constrained to be increasing. So I thought about what sort of prior would make sense for such functions, and fit the models in Stan. &lt;/p&gt;

&lt;p&gt;I enjoyed &lt;a href=&quot;http://andrewgelman.com/2013/11/22/bayesian-model-increasing-function-stan/&quot;&gt;Andrew&amp;#39;s description of my attempt&lt;/a&gt;: &lt;em&gt;&amp;quot;... it has a charming DIY flavor that might make you feel that you too can patch together a model in Stan to do what you need.&amp;quot;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/increasing_uniform.png&quot; alt=&quot;increasing_uniform&quot;&gt;&lt;/p&gt;

&lt;h3&gt;Lissijous Curves &lt;a href=&quot;http://jsfiddle.net/dchudz/yYZZy/embedded/result/&quot;&gt;JSFiddle&lt;/a&gt;&lt;/h3&gt;

&lt;p&gt;Some JavaScript I wrote (using d3) to mimick what an oscilloscope I saw at the Exploratorium was doing:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://jsfiddle.net/dchudz/yYZZy/embedded/result/&quot;&gt;&lt;img src=&quot;/images/posts/lissijous.png&quot; alt=&quot;lissijous&quot;&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;Visualization of the Weirstrass Elliptic Function as a Sum of Terms&lt;/h3&gt;

&lt;p&gt;&lt;img src=&quot;/images/posts/weierstrass.gif&quot; alt=&quot;weierstrass&quot;&gt;&lt;/p&gt;

&lt;p&gt;John Baez used this in his AMS blog &lt;a href=&quot;http://blogs.ams.org/visualinsight/2014/01/15/weierstrass-elliptic-function/&quot;&gt;Visual Insight&lt;/a&gt;.&lt;/p&gt;
</content>
 </entry>
 
 
 
</feed>