Skip to content

Instantly share code, notes, and snippets.

@cornhundred
Last active November 20, 2019 19:35
Show Gist options
  • Save cornhundred/c56253a5f3579a63406f to your computer and use it in GitHub Desktop.
Save cornhundred/c56253a5f3579a63406f to your computer and use it in GitHub Desktop.
D3 Clustergram with zoom/panning, reordering, and search.
# Compiled source #
###################
*.com
*.class
*.dll
*.exe
*.o
*.so
# Packages #
############
# it's better to unpack these files and commit the raw source
# git has its own built in compression methods
*.7z
*.dmg
*.gz
*.iso
*.jar
*.rar
*.tar
*.zip
# Logs and databases #
######################
*.log
*.sql
*.sqlite
# OS generated files #
######################
.DS_Store
.DS_Store?
._*
.Spotlight-V100
.Trashes
ehthumbs.db
Thumbs.db
# cache files for sublime text
*.tmlanguage.cache
*.tmPreferences.cache
*.stTheme.cache
# workspace files are user-specific
*.sublime-workspace
# project files should be checked into the repository, unless a significant
# proportion of contributors will probably not be using SublimeText
# *.sublime-project
# sftp configuration file
sftp-config.json
# how to retroactively use
############################
# git rm -r --cached .
# git add .
# git commit -m "fixing .gitignore"

d3_clustergram

This is a clustergram implemented in D3.js. I started from the example http://bost.ocks.org/mike/miserables/ and added the following features

  • zooming/panning
  • more ordering options
  • row searching
  • dendrogram-like colorbar
  • row/column classification triangles
  • optional value bars for col/row nodes
  • user defined click callback functions
  • optional split tiles and highlighting tiles
  • optional resizing

The d3_clustergram repo is being hosted on github and gist and a live example of the visualization can be found on blocks.

d3_clustergram API

making a clustergram using d3_clustergram.make_clust

make_clust arguments

To make a clustergram pass in an object with your network (network_data) and other optinal arguments. An example is in load_network.js and shown below

// define arguments object 
var arguments_obj = {
  'network_data': network_data,
  'svg_div_id': 'svg_div',
  'row_label':'Row-Data-Name',
  'col_label':'Column-Data-Name',
  'outer_margins': outer_margins,
  'opacity_scale':'log',
  'input_domain':7,
  'title_tile': true,
  'click_tile': click_tile_callback,
  'click_group': click_group_callback
  'resize':false
  'order':'rank'
  'transpose':true,
  'zoom':false,
  'tile_colors':['#ED9124','#1C86EE'],
  'background_color':'white',
};

d3_clustergram.make_clust( arguments_obj );

network_data json

Your network (called network_data here) must be in the following json format - make_clust.py and d3_clustergram.py can be used to make a json of this format from a matrix given in tab separated format (see make_clust.py, which produces example_network.json from example_tsv_network.txt)

{
  "row_nodes":[
     {
      "name": "ATF7",
      "clust": 67,
      "value": 0.691,
      "rank": 66,
      "group": []
      "cl": "1.0"
    }
  ],
  "col_nodes":[
    {
      "name": "Col-0",
      "clust": 4,
      "value": 0.139,
      "rank": 10,
      "group": [],
      "cl": "1.0"
    }
  ],
  "links":[
    {
      "source": 0,
      "target": 0,
      "value": 0.023,
      "highlight":0
    }
  ]
}

There are three required properties: row_nodes, col_nodes, and links. Each of these properties is an array of objects with required and optional properties.

row_nodes and col_nodes properties

required properties: "name", "clust", "rank"

Both row_node and col_node objects are required to have the three properties: "name", "clust", "rank" . "name" specifies the name given to the row or column. "clust" and "rank" give the ordering of the row or column in the clustergram - these orderings have to be precalculated by the user and the python script make_clust.py can be used for this.

optional properties: "group", "cl", "value"

row_nodes and col_nodes have optional properties: "group" and "cl" (group is given as an array of group membership at different distance cutoffs and used for the dendrogram-like colorbar - see d3_clustergram.py). If row_nodes and col_nodes have the property "group" then a dendrogram like colorbar will be added to the visualization and a slider can be used to change the group size.

If row_nodes and col_nodes have the property "cl" then the triangles on each row/column label will be colored based on the classification (cl) of each row/column.

If row_nodes or col_nodes have the property "value", then semi-transpaent bars will be made behind the labels that represent "value". Currently this is only implemented for columns, values can only be positive, and the bars are always red.

links properties

required properties: "source", "target", "value"

Link objects are required to have three properties: "source", "target", "value". "source" and "target" give the integer value of the row and column of the tile in the visualization. "value" specifies the opacity and color of the tile, where positive/negative values result in red/blue tiles (tiles are not made for links with zero value). If no 'input_domain' is specified then the domain for input values is given by the maximum absolute value of all link values. The positive and negative tile colors can be modified ysing the 'tile_colors' property in the arguments_obj.

optional properties: "highlight", "value_up", "value_dn", "info"

Links have the opional property "highlight" that can be used to highlight a tile with a black border. Links also have the optional properties "value_up" and "value_dn" which allow the user to split a tile into up- and down-triangles if a link has both up- and down-values. If a link has only an up- or down-value then a normal square tile is shown. Note that adding "highlight", "value_up", or "value_dn" will result in additional svg components and will slow down the visualization. The property info can be used to pass additional information to the tile clickback funciton.

Optional make_clust Properties

reorder clustergram

d3_clustergram.reorder takes a single argument that can take the values: 'clust' or 'rank'; and will reorder the clustergram accordingly.

find row in clustergram

d3_clustergram.find_row will find and zoom into the row that is specified by the input DOM element with id 'gene_search_box'.

d3_clustergram.py

The network json, example_network.json, used in the visualization was produced using the python script make_clust.py and the class definition d3_clustergram.py. The python script d3_clustergram.py defines the class, Network, that loads the example network in tab separated format, example_tsv_network.txt, calculates clustering, and saves the network in the required format. To remake example_network.json run make_clust.py.

D3 Clustergram was developed by Nick Fernandez at Icahn School of Medicine at Mount Sinai.

/*!
* Bootstrap v3.3.4 (http://getbootstrap.com)
* Copyright 2011-2015 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
*/
/*! normalize.css v3.0.2 | MIT License | git.io/normalize */
html {
font-family: sans-serif;
-webkit-text-size-adjust: 100%;
-ms-text-size-adjust: 100%;
}
body {
margin: 0;
}
article,
aside,
details,
figcaption,
figure,
footer,
header,
hgroup,
main,
menu,
nav,
section,
summary {
display: block;
}
audio,
canvas,
progress,
video {
display: inline-block;
vertical-align: baseline;
}
audio:not([controls]) {
display: none;
height: 0;
}
[hidden],
template {
display: none;
}
a {
background-color: transparent;
}
a:active,
a:hover {
outline: 0;
}
abbr[title] {
border-bottom: 1px dotted;
}
b,
strong {
font-weight: bold;
}
dfn {
font-style: italic;
}
h1 {
margin: .67em 0;
font-size: 2em;
}
mark {
color: #000;
background: #ff0;
}
small {
font-size: 80%;
}
sub,
sup {
position: relative;
font-size: 75%;
line-height: 0;
vertical-align: baseline;
}
sup {
top: -.5em;
}
sub {
bottom: -.25em;
}
img {
border: 0;
}
svg:not(:root) {
overflow: hidden;
}
figure {
margin: 1em 40px;
}
hr {
height: 0;
-webkit-box-sizing: content-box;
-moz-box-sizing: content-box;
box-sizing: content-box;
}
pre {
overflow: auto;
}
code,
kbd,
pre,
samp {
font-family: monospace, monospace;
font-size: 1em;
}
button,
input,
optgroup,
select,
textarea {
margin: 0;
font: inherit;
color: inherit;
}
button {
overflow: visible;
}
button,
select {
text-transform: none;
}
button,
html input[type="button"],
input[type="reset"],
input[type="submit"] {
-webkit-appearance: button;
cursor: pointer;
}
button[disabled],
html input[disabled] {
cursor: default;
}
button::-moz-focus-inner,
input::-moz-focus-inner {
padding: 0;
border: 0;
}
input {
line-height: normal;
}
input[type="checkbox"],
input[type="radio"] {
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
padding: 0;
}
input[type="number"]::-webkit-inner-spin-button,
input[type="number"]::-webkit-outer-spin-button {
height: auto;
}
input[type="search"] {
-webkit-box-sizing: content-box;
-moz-box-sizing: content-box;
box-sizing: content-box;
-webkit-appearance: textfield;
}
input[type="search"]::-webkit-search-cancel-button,
input[type="search"]::-webkit-search-decoration {
-webkit-appearance: none;
}
fieldset {
padding: .35em .625em .75em;
margin: 0 2px;
border: 1px solid #c0c0c0;
}
legend {
padding: 0;
border: 0;
}
textarea {
overflow: auto;
}
optgroup {
font-weight: bold;
}
table {
border-spacing: 0;
border-collapse: collapse;
}
td,
th {
padding: 0;
}
/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */
@media print {
*,
*:before,
*:after {
color: #000 !important;
text-shadow: none !important;
background: transparent !important;
-webkit-box-shadow: none !important;
box-shadow: none !important;
}
a,
a:visited {
text-decoration: underline;
}
a[href]:after {
content: " (" attr(href) ")";
}
abbr[title]:after {
content: " (" attr(title) ")";
}
a[href^="#"]:after,
a[href^="javascript:"]:after {
content: "";
}
pre,
blockquote {
border: 1px solid #999;
page-break-inside: avoid;
}
thead {
display: table-header-group;
}
tr,
img {
page-break-inside: avoid;
}
img {
max-width: 100% !important;
}
p,
h2,
h3 {
orphans: 3;
widows: 3;
}
h2,
h3 {
page-break-after: avoid;
}
select {
background: #fff !important;
}
.navbar {
display: none;
}
.btn > .caret,
.dropup > .btn > .caret {
border-top-color: #000 !important;
}
.label {
border: 1px solid #000;
}
.table {
border-collapse: collapse !important;
}
.table td,
.table th {
background-color: #fff !important;
}
.table-bordered th,
.table-bordered td {
border: 1px solid #ddd !important;
}
}
@font-face {
font-family: 'Glyphicons Halflings';
src: url('../fonts/glyphicons-halflings-regular.eot');
src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg');
}
.glyphicon {
position: relative;
top: 1px;
display: inline-block;
font-family: 'Glyphicons Halflings';
font-style: normal;
font-weight: normal;
line-height: 1;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.glyphicon-asterisk:before {
content: "\2a";
}
.glyphicon-plus:before {
content: "\2b";
}
.glyphicon-euro:before,
.glyphicon-eur:before {
content: "\20ac";
}
.glyphicon-minus:before {
content: "\2212";
}
.glyphicon-cloud:before {
content: "\2601";
}
.glyphicon-envelope:before {
content: "\2709";
}
.glyphicon-pencil:before {
content: "\270f";
}
.glyphicon-glass:before {
content: "\e001";
}
.glyphicon-music:before {
content: "\e002";
}
.glyphicon-search:before {
content: "\e003";
}
.glyphicon-heart:before {
content: "\e005";
}
.glyphicon-star:before {
content: "\e006";
}
.glyphicon-star-empty:before {
content: "\e007";
}
.glyphicon-user:before {
content: "\e008";
}
.glyphicon-film:before {
content: "\e009";
}
.glyphicon-th-large:before {
content: "\e010";
}
.glyphicon-th:before {
content: "\e011";
}
.glyphicon-th-list:before {
content: "\e012";
}
.glyphicon-ok:before {
content: "\e013";
}
.glyphicon-remove:before {
content: "\e014";
}
.glyphicon-zoom-in:before {
content: "\e015";
}
.glyphicon-zoom-out:before {
content: "\e016";
}
.glyphicon-off:before {
content: "\e017";
}
.glyphicon-signal:before {
content: "\e018";
}
.glyphicon-cog:before {
content: "\e019";
}
.glyphicon-trash:before {
content: "\e020";
}
.glyphicon-home:before {
content: "\e021";
}
.glyphicon-file:before {
content: "\e022";
}
.glyphicon-time:before {
content: "\e023";
}
.glyphicon-road:before {
content: "\e024";
}
.glyphicon-download-alt:before {
content: "\e025";
}
.glyphicon-download:before {
content: "\e026";
}
.glyphicon-upload:before {
content: "\e027";
}
.glyphicon-inbox:before {
content: "\e028";
}
.glyphicon-play-circle:before {
content: "\e029";
}
.glyphicon-repeat:before {
content: "\e030";
}
.glyphicon-refresh:before {
content: "\e031";
}
.glyphicon-list-alt:before {
content: "\e032";
}
.glyphicon-lock:before {
content: "\e033";
}
.glyphicon-flag:before {
content: "\e034";
}
.glyphicon-headphones:before {
content: "\e035";
}
.glyphicon-volume-off:before {
content: "\e036";
}
.glyphicon-volume-down:before {
content: "\e037";
}
.glyphicon-volume-up:before {
content: "\e038";
}
.glyphicon-qrcode:before {
content: "\e039";
}
.glyphicon-barcode:before {
content: "\e040";
}
.glyphicon-tag:before {
content: "\e041";
}
.glyphicon-tags:before {
content: "\e042";
}
.glyphicon-book:before {
content: "\e043";
}
.glyphicon-bookmark:before {
content: "\e044";
}
.glyphicon-print:before {
content: "\e045";
}
.glyphicon-camera:before {
content: "\e046";
}
.glyphicon-font:before {
content: "\e047";
}
.glyphicon-bold:before {
content: "\e048";
}
.glyphicon-italic:before {
content: "\e049";
}
.glyphicon-text-height:before {
content: "\e050";
}
.glyphicon-text-width:before {
content: "\e051";
}
.glyphicon-align-left:before {
content: "\e052";
}
.glyphicon-align-center:before {
content: "\e053";
}
.glyphicon-align-right:before {
content: "\e054";
}
.glyphicon-align-justify:before {
content: "\e055";
}
.glyphicon-list:before {
content: "\e056";
}
.glyphicon-indent-left:before {
content: "\e057";
}
.glyphicon-indent-right:before {
content: "\e058";
}
.glyphicon-facetime-video:before {
content: "\e059";
}
.glyphicon-picture:before {
content: "\e060";
}
.glyphicon-map-marker:before {
content: "\e062";
}
.glyphicon-adjust:before {
content: "\e063";
}
.glyphicon-tint:before {
content: "\e064";
}
.glyphicon-edit:before {
content: "\e065";
}
.glyphicon-share:before {
content: "\e066";
}
.glyphicon-check:before {
content: "\e067";
}
.glyphicon-move:before {
content: "\e068";
}
.glyphicon-step-backward:before {
content: "\e069";
}
.glyphicon-fast-backward:before {
content: "\e070";
}
.glyphicon-backward:before {
content: "\e071";
}
.glyphicon-play:before {
content: "\e072";
}
.glyphicon-pause:before {
content: "\e073";
}
.glyphicon-stop:before {
content: "\e074";
}
.glyphicon-forward:before {
content: "\e075";
}
.glyphicon-fast-forward:before {
content: "\e076";
}
.glyphicon-step-forward:before {
content: "\e077";
}
.glyphicon-eject:before {
content: "\e078";
}
.glyphicon-chevron-left:before {
content: "\e079";
}
.glyphicon-chevron-right:before {
content: "\e080";
}
.glyphicon-plus-sign:before {
content: "\e081";
}
.glyphicon-minus-sign:before {
content: "\e082";
}
.glyphicon-remove-sign:before {
content: "\e083";
}
.glyphicon-ok-sign:before {
content: "\e084";
}
.glyphicon-question-sign:before {
content: "\e085";
}
.glyphicon-info-sign:before {
content: "\e086";
}
.glyphicon-screenshot:before {
content: "\e087";
}
.glyphicon-remove-circle:before {
content: "\e088";
}
.glyphicon-ok-circle:before {
content: "\e089";
}
.glyphicon-ban-circle:before {
content: "\e090";
}
.glyphicon-arrow-left:before {
content: "\e091";
}
.glyphicon-arrow-right:before {
content: "\e092";
}
.glyphicon-arrow-up:before {
content: "\e093";
}
.glyphicon-arrow-down:before {
content: "\e094";
}
.glyphicon-share-alt:before {
content: "\e095";
}
.glyphicon-resize-full:before {
content: "\e096";
}
.glyphicon-resize-small:before {
content: "\e097";
}
.glyphicon-exclamation-sign:before {
content: "\e101";
}
.glyphicon-gift:before {
content: "\e102";
}
.glyphicon-leaf:before {
content: "\e103";
}
.glyphicon-fire:before {
content: "\e104";
}
.glyphicon-eye-open:before {
content: "\e105";
}
.glyphicon-eye-close:before {
content: "\e106";
}
.glyphicon-warning-sign:before {
content: "\e107";
}
.glyphicon-plane:before {
content: "\e108";
}
.glyphicon-calendar:before {
content: "\e109";
}
.glyphicon-random:before {
content: "\e110";
}
.glyphicon-comment:before {
content: "\e111";
}
.glyphicon-magnet:before {
content: "\e112";
}
.glyphicon-chevron-up:before {
content: "\e113";
}
.glyphicon-chevron-down:before {
content: "\e114";
}
.glyphicon-retweet:before {
content: "\e115";
}
.glyphicon-shopping-cart:before {
content: "\e116";
}
.glyphicon-folder-close:before {
content: "\e117";
}
.glyphicon-folder-open:before {
content: "\e118";
}
.glyphicon-resize-vertical:before {
content: "\e119";
}
.glyphicon-resize-horizontal:before {
content: "\e120";
}
.glyphicon-hdd:before {
content: "\e121";
}
.glyphicon-bullhorn:before {
content: "\e122";
}
.glyphicon-bell:before {
content: "\e123";
}
.glyphicon-certificate:before {
content: "\e124";
}
.glyphicon-thumbs-up:before {
content: "\e125";
}
.glyphicon-thumbs-down:before {
content: "\e126";
}
.glyphicon-hand-right:before {
content: "\e127";
}
.glyphicon-hand-left:before {
content: "\e128";
}
.glyphicon-hand-up:before {
content: "\e129";
}
.glyphicon-hand-down:before {
content: "\e130";
}
.glyphicon-circle-arrow-right:before {
content: "\e131";
}
.glyphicon-circle-arrow-left:before {
content: "\e132";
}
.glyphicon-circle-arrow-up:before {
content: "\e133";
}
.glyphicon-circle-arrow-down:before {
content: "\e134";
}
.glyphicon-globe:before {
content: "\e135";
}
.glyphicon-wrench:before {
content: "\e136";
}
.glyphicon-tasks:before {
content: "\e137";
}
.glyphicon-filter:before {
content: "\e138";
}
.glyphicon-briefcase:before {
content: "\e139";
}
.glyphicon-fullscreen:before {
content: "\e140";
}
.glyphicon-dashboard:before {
content: "\e141";
}
.glyphicon-paperclip:before {
content: "\e142";
}
.glyphicon-heart-empty:before {
content: "\e143";
}
.glyphicon-link:before {
content: "\e144";
}
.glyphicon-phone:before {
content: "\e145";
}
.glyphicon-pushpin:before {
content: "\e146";
}
.glyphicon-usd:before {
content: "\e148";
}
.glyphicon-gbp:before {
content: "\e149";
}
.glyphicon-sort:before {
content: "\e150";
}
.glyphicon-sort-by-alphabet:before {
content: "\e151";
}
.glyphicon-sort-by-alphabet-alt:before {
content: "\e152";
}
.glyphicon-sort-by-order:before {
content: "\e153";
}
.glyphicon-sort-by-order-alt:before {
content: "\e154";
}
.glyphicon-sort-by-attributes:before {
content: "\e155";
}
.glyphicon-sort-by-attributes-alt:before {
content: "\e156";
}
.glyphicon-unchecked:before {
content: "\e157";
}
.glyphicon-expand:before {
content: "\e158";
}
.glyphicon-collapse-down:before {
content: "\e159";
}
.glyphicon-collapse-up:before {
content: "\e160";
}
.glyphicon-log-in:before {
content: "\e161";
}
.glyphicon-flash:before {
content: "\e162";
}
.glyphicon-log-out:before {
content: "\e163";
}
.glyphicon-new-window:before {
content: "\e164";
}
.glyphicon-record:before {
content: "\e165";
}
.glyphicon-save:before {
content: "\e166";
}
.glyphicon-open:before {
content: "\e167";
}
.glyphicon-saved:before {
content: "\e168";
}
.glyphicon-import:before {
content: "\e169";
}
.glyphicon-export:before {
content: "\e170";
}
.glyphicon-send:before {
content: "\e171";
}
.glyphicon-floppy-disk:before {
content: "\e172";
}
.glyphicon-floppy-saved:before {
content: "\e173";
}
.glyphicon-floppy-remove:before {
content: "\e174";
}
.glyphicon-floppy-save:before {
content: "\e175";
}
.glyphicon-floppy-open:before {
content: "\e176";
}
.glyphicon-credit-card:before {
content: "\e177";
}
.glyphicon-transfer:before {
content: "\e178";
}
.glyphicon-cutlery:before {
content: "\e179";
}
.glyphicon-header:before {
content: "\e180";
}
.glyphicon-compressed:before {
content: "\e181";
}
.glyphicon-earphone:before {
content: "\e182";
}
.glyphicon-phone-alt:before {
content: "\e183";
}
.glyphicon-tower:before {
content: "\e184";
}
.glyphicon-stats:before {
content: "\e185";
}
.glyphicon-sd-video:before {
content: "\e186";
}
.glyphicon-hd-video:before {
content: "\e187";
}
.glyphicon-subtitles:before {
content: "\e188";
}
.glyphicon-sound-stereo:before {
content: "\e189";
}
.glyphicon-sound-dolby:before {
content: "\e190";
}
.glyphicon-sound-5-1:before {
content: "\e191";
}
.glyphicon-sound-6-1:before {
content: "\e192";
}
.glyphicon-sound-7-1:before {
content: "\e193";
}
.glyphicon-copyright-mark:before {
content: "\e194";
}
.glyphicon-registration-mark:before {
content: "\e195";
}
.glyphicon-cloud-download:before {
content: "\e197";
}
.glyphicon-cloud-upload:before {
content: "\e198";
}
.glyphicon-tree-conifer:before {
content: "\e199";
}
.glyphicon-tree-deciduous:before {
content: "\e200";
}
.glyphicon-cd:before {
content: "\e201";
}
.glyphicon-save-file:before {
content: "\e202";
}
.glyphicon-open-file:before {
content: "\e203";
}
.glyphicon-level-up:before {
content: "\e204";
}
.glyphicon-copy:before {
content: "\e205";
}
.glyphicon-paste:before {
content: "\e206";
}
.glyphicon-alert:before {
content: "\e209";
}
.glyphicon-equalizer:before {
content: "\e210";
}
.glyphicon-king:before {
content: "\e211";
}
.glyphicon-queen:before {
content: "\e212";
}
.glyphicon-pawn:before {
content: "\e213";
}
.glyphicon-bishop:before {
content: "\e214";
}
.glyphicon-knight:before {
content: "\e215";
}
.glyphicon-baby-formula:before {
content: "\e216";
}
.glyphicon-tent:before {
content: "\26fa";
}
.glyphicon-blackboard:before {
content: "\e218";
}
.glyphicon-bed:before {
content: "\e219";
}
.glyphicon-apple:before {
content: "\f8ff";
}
.glyphicon-erase:before {
content: "\e221";
}
.glyphicon-hourglass:before {
content: "\231b";
}
.glyphicon-lamp:before {
content: "\e223";
}
.glyphicon-duplicate:before {
content: "\e224";
}
.glyphicon-piggy-bank:before {
content: "\e225";
}
.glyphicon-scissors:before {
content: "\e226";
}
.glyphicon-bitcoin:before {
content: "\e227";
}
.glyphicon-btc:before {
content: "\e227";
}
.glyphicon-xbt:before {
content: "\e227";
}
.glyphicon-yen:before {
content: "\00a5";
}
.glyphicon-jpy:before {
content: "\00a5";
}
.glyphicon-ruble:before {
content: "\20bd";
}
.glyphicon-rub:before {
content: "\20bd";
}
.glyphicon-scale:before {
content: "\e230";
}
.glyphicon-ice-lolly:before {
content: "\e231";
}
.glyphicon-ice-lolly-tasted:before {
content: "\e232";
}
.glyphicon-education:before {
content: "\e233";
}
.glyphicon-option-horizontal:before {
content: "\e234";
}
.glyphicon-option-vertical:before {
content: "\e235";
}
.glyphicon-menu-hamburger:before {
content: "\e236";
}
.glyphicon-modal-window:before {
content: "\e237";
}
.glyphicon-oil:before {
content: "\e238";
}
.glyphicon-grain:before {
content: "\e239";
}
.glyphicon-sunglasses:before {
content: "\e240";
}
.glyphicon-text-size:before {
content: "\e241";
}
.glyphicon-text-color:before {
content: "\e242";
}
.glyphicon-text-background:before {
content: "\e243";
}
.glyphicon-object-align-top:before {
content: "\e244";
}
.glyphicon-object-align-bottom:before {
content: "\e245";
}
.glyphicon-object-align-horizontal:before {
content: "\e246";
}
.glyphicon-object-align-left:before {
content: "\e247";
}
.glyphicon-object-align-vertical:before {
content: "\e248";
}
.glyphicon-object-align-right:before {
content: "\e249";
}
.glyphicon-triangle-right:before {
content: "\e250";
}
.glyphicon-triangle-left:before {
content: "\e251";
}
.glyphicon-triangle-bottom:before {
content: "\e252";
}
.glyphicon-triangle-top:before {
content: "\e253";
}
.glyphicon-console:before {
content: "\e254";
}
.glyphicon-superscript:before {
content: "\e255";
}
.glyphicon-subscript:before {
content: "\e256";
}
.glyphicon-menu-left:before {
content: "\e257";
}
.glyphicon-menu-right:before {
content: "\e258";
}
.glyphicon-menu-down:before {
content: "\e259";
}
.glyphicon-menu-up:before {
content: "\e260";
}
* {
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
*:before,
*:after {
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
html {
font-size: 10px;
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}
body {
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
font-size: 14px;
line-height: 1.42857143;
color: #333;
background-color: #fff;
}
input,
button,
select,
textarea {
font-family: inherit;
font-size: inherit;
line-height: inherit;
}
a {
color: #337ab7;
text-decoration: none;
}
a:hover,
a:focus {
color: #23527c;
text-decoration: underline;
}
a:focus {
outline: thin dotted;
outline: 5px auto -webkit-focus-ring-color;
outline-offset: -2px;
}
figure {
margin: 0;
}
img {
vertical-align: middle;
}
.img-responsive,
.thumbnail > img,
.thumbnail a > img,
.carousel-inner > .item > img,
.carousel-inner > .item > a > img {
display: block;
max-width: 100%;
height: auto;
}
.img-rounded {
border-radius: 6px;
}
.img-thumbnail {
display: inline-block;
max-width: 100%;
height: auto;
padding: 4px;
line-height: 1.42857143;
background-color: #fff;
border: 1px solid #ddd;
border-radius: 4px;
-webkit-transition: all .2s ease-in-out;
-o-transition: all .2s ease-in-out;
transition: all .2s ease-in-out;
}
.img-circle {
border-radius: 50%;
}
hr {
margin-top: 20px;
margin-bottom: 20px;
border: 0;
border-top: 1px solid #eee;
}
.sr-only {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
border: 0;
}
.sr-only-focusable:active,
.sr-only-focusable:focus {
position: static;
width: auto;
height: auto;
margin: 0;
overflow: visible;
clip: auto;
}
[role="button"] {
cursor: pointer;
}
h1,
h2,
h3,
h4,
h5,
h6,
.h1,
.h2,
.h3,
.h4,
.h5,
.h6 {
font-family: inherit;
font-weight: 500;
line-height: 1.1;
color: inherit;
}
h1 small,
h2 small,
h3 small,
h4 small,
h5 small,
h6 small,
.h1 small,
.h2 small,
.h3 small,
.h4 small,
.h5 small,
.h6 small,
h1 .small,
h2 .small,
h3 .small,
h4 .small,
h5 .small,
h6 .small,
.h1 .small,
.h2 .small,
.h3 .small,
.h4 .small,
.h5 .small,
.h6 .small {
font-weight: normal;
line-height: 1;
color: #777;
}
h1,
.h1,
h2,
.h2,
h3,
.h3 {
margin-top: 20px;
margin-bottom: 10px;
}
h1 small,
.h1 small,
h2 small,
.h2 small,
h3 small,
.h3 small,
h1 .small,
.h1 .small,
h2 .small,
.h2 .small,
h3 .small,
.h3 .small {
font-size: 65%;
}
h4,
.h4,
h5,
.h5,
h6,
.h6 {
margin-top: 10px;
margin-bottom: 10px;
}
h4 small,
.h4 small,
h5 small,
.h5 small,
h6 small,
.h6 small,
h4 .small,
.h4 .small,
h5 .small,
.h5 .small,
h6 .small,
.h6 .small {
font-size: 75%;
}
h1,
.h1 {
font-size: 36px;
}
h2,
.h2 {
font-size: 30px;
}
h3,
.h3 {
font-size: 24px;
}
h4,
.h4 {
font-size: 18px;
}
h5,
.h5 {
font-size: 14px;
}
h6,
.h6 {
font-size: 12px;
}
p {
margin: 0 0 10px;
}
.lead {
margin-bottom: 20px;
font-size: 16px;
font-weight: 300;
line-height: 1.4;
}
@media (min-width: 768px) {
.lead {
font-size: 21px;
}
}
small,
.small {
font-size: 85%;
}
mark,
.mark {
padding: .2em;
background-color: #fcf8e3;
}
.text-left {
text-align: left;
}
.text-right {
text-align: right;
}
.text-center {
text-align: center;
}
.text-justify {
text-align: justify;
}
.text-nowrap {
white-space: nowrap;
}
.text-lowercase {
text-transform: lowercase;
}
.text-uppercase {
text-transform: uppercase;
}
.text-capitalize {
text-transform: capitalize;
}
.text-muted {
color: #777;
}
.text-primary {
color: #337ab7;
}
a.text-primary:hover {
color: #286090;
}
.text-success {
color: #3c763d;
}
a.text-success:hover {
color: #2b542c;
}
.text-info {
color: #31708f;
}
a.text-info:hover {
color: #245269;
}
.text-warning {
color: #8a6d3b;
}
a.text-warning:hover {
color: #66512c;
}
.text-danger {
color: #a94442;
}
a.text-danger:hover {
color: #843534;
}
.bg-primary {
color: #fff;
background-color: #337ab7;
}
a.bg-primary:hover {
background-color: #286090;
}
.bg-success {
background-color: #dff0d8;
}
a.bg-success:hover {
background-color: #c1e2b3;
}
.bg-info {
background-color: #d9edf7;
}
a.bg-info:hover {
background-color: #afd9ee;
}
.bg-warning {
background-color: #fcf8e3;
}
a.bg-warning:hover {
background-color: #f7ecb5;
}
.bg-danger {
background-color: #f2dede;
}
a.bg-danger:hover {
background-color: #e4b9b9;
}
.page-header {
padding-bottom: 9px;
margin: 40px 0 20px;
border-bottom: 1px solid #eee;
}
ul,
ol {
margin-top: 0;
margin-bottom: 10px;
}
ul ul,
ol ul,
ul ol,
ol ol {
margin-bottom: 0;
}
.list-unstyled {
padding-left: 0;
list-style: none;
}
.list-inline {
padding-left: 0;
margin-left: -5px;
list-style: none;
}
.list-inline > li {
display: inline-block;
padding-right: 5px;
padding-left: 5px;
}
dl {
margin-top: 0;
margin-bottom: 20px;
}
dt,
dd {
line-height: 1.42857143;
}
dt {
font-weight: bold;
}
dd {
margin-left: 0;
}
@media (min-width: 768px) {
.dl-horizontal dt {
float: left;
width: 160px;
overflow: hidden;
clear: left;
text-align: right;
text-overflow: ellipsis;
white-space: nowrap;
}
.dl-horizontal dd {
margin-left: 180px;
}
}
abbr[title],
abbr[data-original-title] {
cursor: help;
border-bottom: 1px dotted #777;
}
.initialism {
font-size: 90%;
text-transform: uppercase;
}
blockquote {
padding: 10px 20px;
margin: 0 0 20px;
font-size: 17.5px;
border-left: 5px solid #eee;
}
blockquote p:last-child,
blockquote ul:last-child,
blockquote ol:last-child {
margin-bottom: 0;
}
blockquote footer,
blockquote small,
blockquote .small {
display: block;
font-size: 80%;
line-height: 1.42857143;
color: #777;
}
blockquote footer:before,
blockquote small:before,
blockquote .small:before {
content: '\2014 \00A0';
}
.blockquote-reverse,
blockquote.pull-right {
padding-right: 15px;
padding-left: 0;
text-align: right;
border-right: 5px solid #eee;
border-left: 0;
}
.blockquote-reverse footer:before,
blockquote.pull-right footer:before,
.blockquote-reverse small:before,
blockquote.pull-right small:before,
.blockquote-reverse .small:before,
blockquote.pull-right .small:before {
content: '';
}
.blockquote-reverse footer:after,
blockquote.pull-right footer:after,
.blockquote-reverse small:after,
blockquote.pull-right small:after,
.blockquote-reverse .small:after,
blockquote.pull-right .small:after {
content: '\00A0 \2014';
}
address {
margin-bottom: 20px;
font-style: normal;
line-height: 1.42857143;
}
code,
kbd,
pre,
samp {
font-family: Menlo, Monaco, Consolas, "Courier New", monospace;
}
code {
padding: 2px 4px;
font-size: 90%;
color: #c7254e;
background-color: #f9f2f4;
border-radius: 4px;
}
kbd {
padding: 2px 4px;
font-size: 90%;
color: #fff;
background-color: #333;
border-radius: 3px;
-webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25);
box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25);
}
kbd kbd {
padding: 0;
font-size: 100%;
font-weight: bold;
-webkit-box-shadow: none;
box-shadow: none;
}
pre {
display: block;
padding: 9.5px;
margin: 0 0 10px;
font-size: 13px;
line-height: 1.42857143;
color: #333;
word-break: break-all;
word-wrap: break-word;
background-color: #f5f5f5;
border: 1px solid #ccc;
border-radius: 4px;
}
pre code {
padding: 0;
font-size: inherit;
color: inherit;
white-space: pre-wrap;
background-color: transparent;
border-radius: 0;
}
.pre-scrollable {
max-height: 340px;
overflow-y: scroll;
}
.container {
padding-right: 15px;
padding-left: 15px;
margin-right: auto;
margin-left: auto;
}
@media (min-width: 768px) {
.container {
width: 750px;
}
}
@media (min-width: 992px) {
.container {
width: 970px;
}
}
@media (min-width: 1200px) {
.container {
width: 1170px;
}
}
.container-fluid {
padding-right: 15px;
padding-left: 15px;
margin-right: auto;
margin-left: auto;
}
.row {
margin-right: -15px;
margin-left: -15px;
}
.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 {
position: relative;
min-height: 1px;
padding-right: 15px;
padding-left: 15px;
}
.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 {
float: left;
}
.col-xs-12 {
width: 100%;
}
.col-xs-11 {
width: 91.66666667%;
}
.col-xs-10 {
width: 83.33333333%;
}
.col-xs-9 {
width: 75%;
}
.col-xs-8 {
width: 66.66666667%;
}
.col-xs-7 {
width: 58.33333333%;
}
.col-xs-6 {
width: 50%;
}
.col-xs-5 {
width: 41.66666667%;
}
.col-xs-4 {
width: 33.33333333%;
}
.col-xs-3 {
width: 25%;
}
.col-xs-2 {
width: 16.66666667%;
}
.col-xs-1 {
width: 8.33333333%;
}
.col-xs-pull-12 {
right: 100%;
}
.col-xs-pull-11 {
right: 91.66666667%;
}
.col-xs-pull-10 {
right: 83.33333333%;
}
.col-xs-pull-9 {
right: 75%;
}
.col-xs-pull-8 {
right: 66.66666667%;
}
.col-xs-pull-7 {
right: 58.33333333%;
}
.col-xs-pull-6 {
right: 50%;
}
.col-xs-pull-5 {
right: 41.66666667%;
}
.col-xs-pull-4 {
right: 33.33333333%;
}
.col-xs-pull-3 {
right: 25%;
}
.col-xs-pull-2 {
right: 16.66666667%;
}
.col-xs-pull-1 {
right: 8.33333333%;
}
.col-xs-pull-0 {
right: auto;
}
.col-xs-push-12 {
left: 100%;
}
.col-xs-push-11 {
left: 91.66666667%;
}
.col-xs-push-10 {
left: 83.33333333%;
}
.col-xs-push-9 {
left: 75%;
}
.col-xs-push-8 {
left: 66.66666667%;
}
.col-xs-push-7 {
left: 58.33333333%;
}
.col-xs-push-6 {
left: 50%;
}
.col-xs-push-5 {
left: 41.66666667%;
}
.col-xs-push-4 {
left: 33.33333333%;
}
.col-xs-push-3 {
left: 25%;
}
.col-xs-push-2 {
left: 16.66666667%;
}
.col-xs-push-1 {
left: 8.33333333%;
}
.col-xs-push-0 {
left: auto;
}
.col-xs-offset-12 {
margin-left: 100%;
}
.col-xs-offset-11 {
margin-left: 91.66666667%;
}
.col-xs-offset-10 {
margin-left: 83.33333333%;
}
.col-xs-offset-9 {
margin-left: 75%;
}
.col-xs-offset-8 {
margin-left: 66.66666667%;
}
.col-xs-offset-7 {
margin-left: 58.33333333%;
}
.col-xs-offset-6 {
margin-left: 50%;
}
.col-xs-offset-5 {
margin-left: 41.66666667%;
}
.col-xs-offset-4 {
margin-left: 33.33333333%;
}
.col-xs-offset-3 {
margin-left: 25%;
}
.col-xs-offset-2 {
margin-left: 16.66666667%;
}
.col-xs-offset-1 {
margin-left: 8.33333333%;
}
.col-xs-offset-0 {
margin-left: 0;
}
@media (min-width: 768px) {
.col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 {
float: left;
}
.col-sm-12 {
width: 100%;
}
.col-sm-11 {
width: 91.66666667%;
}
.col-sm-10 {
width: 83.33333333%;
}
.col-sm-9 {
width: 75%;
}
.col-sm-8 {
width: 66.66666667%;
}
.col-sm-7 {
width: 58.33333333%;
}
.col-sm-6 {
width: 50%;
}
.col-sm-5 {
width: 41.66666667%;
}
.col-sm-4 {
width: 33.33333333%;
}
.col-sm-3 {
width: 25%;
}
.col-sm-2 {
width: 16.66666667%;
}
.col-sm-1 {
width: 8.33333333%;
}
.col-sm-pull-12 {
right: 100%;
}
.col-sm-pull-11 {
right: 91.66666667%;
}
.col-sm-pull-10 {
right: 83.33333333%;
}
.col-sm-pull-9 {
right: 75%;
}
.col-sm-pull-8 {
right: 66.66666667%;
}
.col-sm-pull-7 {
right: 58.33333333%;
}
.col-sm-pull-6 {
right: 50%;
}
.col-sm-pull-5 {
right: 41.66666667%;
}
.col-sm-pull-4 {
right: 33.33333333%;
}
.col-sm-pull-3 {
right: 25%;
}
.col-sm-pull-2 {
right: 16.66666667%;
}
.col-sm-pull-1 {
right: 8.33333333%;
}
.col-sm-pull-0 {
right: auto;
}
.col-sm-push-12 {
left: 100%;
}
.col-sm-push-11 {
left: 91.66666667%;
}
.col-sm-push-10 {
left: 83.33333333%;
}
.col-sm-push-9 {
left: 75%;
}
.col-sm-push-8 {
left: 66.66666667%;
}
.col-sm-push-7 {
left: 58.33333333%;
}
.col-sm-push-6 {
left: 50%;
}
.col-sm-push-5 {
left: 41.66666667%;
}
.col-sm-push-4 {
left: 33.33333333%;
}
.col-sm-push-3 {
left: 25%;
}
.col-sm-push-2 {
left: 16.66666667%;
}
.col-sm-push-1 {
left: 8.33333333%;
}
.col-sm-push-0 {
left: auto;
}
.col-sm-offset-12 {
margin-left: 100%;
}
.col-sm-offset-11 {
margin-left: 91.66666667%;
}
.col-sm-offset-10 {
margin-left: 83.33333333%;
}
.col-sm-offset-9 {
margin-left: 75%;
}
.col-sm-offset-8 {
margin-left: 66.66666667%;
}
.col-sm-offset-7 {
margin-left: 58.33333333%;
}
.col-sm-offset-6 {
margin-left: 50%;
}
.col-sm-offset-5 {
margin-left: 41.66666667%;
}
.col-sm-offset-4 {
margin-left: 33.33333333%;
}
.col-sm-offset-3 {
margin-left: 25%;
}
.col-sm-offset-2 {
margin-left: 16.66666667%;
}
.col-sm-offset-1 {
margin-left: 8.33333333%;
}
.col-sm-offset-0 {
margin-left: 0;
}
}
@media (min-width: 992px) {
.col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 {
float: left;
}
.col-md-12 {
width: 100%;
}
.col-md-11 {
width: 91.66666667%;
}
.col-md-10 {
width: 83.33333333%;
}
.col-md-9 {
width: 75%;
}
.col-md-8 {
width: 66.66666667%;
}
.col-md-7 {
width: 58.33333333%;
}
.col-md-6 {
width: 50%;
}
.col-md-5 {
width: 41.66666667%;
}
.col-md-4 {
width: 33.33333333%;
}
.col-md-3 {
width: 25%;
}
.col-md-2 {
width: 16.66666667%;
}
.col-md-1 {
width: 8.33333333%;
}
.col-md-pull-12 {
right: 100%;
}
.col-md-pull-11 {
right: 91.66666667%;
}
.col-md-pull-10 {
right: 83.33333333%;
}
.col-md-pull-9 {
right: 75%;
}
.col-md-pull-8 {
right: 66.66666667%;
}
.col-md-pull-7 {
right: 58.33333333%;
}
.col-md-pull-6 {
right: 50%;
}
.col-md-pull-5 {
right: 41.66666667%;
}
.col-md-pull-4 {
right: 33.33333333%;
}
.col-md-pull-3 {
right: 25%;
}
.col-md-pull-2 {
right: 16.66666667%;
}
.col-md-pull-1 {
right: 8.33333333%;
}
.col-md-pull-0 {
right: auto;
}
.col-md-push-12 {
left: 100%;
}
.col-md-push-11 {
left: 91.66666667%;
}
.col-md-push-10 {
left: 83.33333333%;
}
.col-md-push-9 {
left: 75%;
}
.col-md-push-8 {
left: 66.66666667%;
}
.col-md-push-7 {
left: 58.33333333%;
}
.col-md-push-6 {
left: 50%;
}
.col-md-push-5 {
left: 41.66666667%;
}
.col-md-push-4 {
left: 33.33333333%;
}
.col-md-push-3 {
left: 25%;
}
.col-md-push-2 {
left: 16.66666667%;
}
.col-md-push-1 {
left: 8.33333333%;
}
.col-md-push-0 {
left: auto;
}
.col-md-offset-12 {
margin-left: 100%;
}
.col-md-offset-11 {
margin-left: 91.66666667%;
}
.col-md-offset-10 {
margin-left: 83.33333333%;
}
.col-md-offset-9 {
margin-left: 75%;
}
.col-md-offset-8 {
margin-left: 66.66666667%;
}
.col-md-offset-7 {
margin-left: 58.33333333%;
}
.col-md-offset-6 {
margin-left: 50%;
}
.col-md-offset-5 {
margin-left: 41.66666667%;
}
.col-md-offset-4 {
margin-left: 33.33333333%;
}
.col-md-offset-3 {
margin-left: 25%;
}
.col-md-offset-2 {
margin-left: 16.66666667%;
}
.col-md-offset-1 {
margin-left: 8.33333333%;
}
.col-md-offset-0 {
margin-left: 0;
}
}
@media (min-width: 1200px) {
.col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 {
float: left;
}
.col-lg-12 {
width: 100%;
}
.col-lg-11 {
width: 91.66666667%;
}
.col-lg-10 {
width: 83.33333333%;
}
.col-lg-9 {
width: 75%;
}
.col-lg-8 {
width: 66.66666667%;
}
.col-lg-7 {
width: 58.33333333%;
}
.col-lg-6 {
width: 50%;
}
.col-lg-5 {
width: 41.66666667%;
}
.col-lg-4 {
width: 33.33333333%;
}
.col-lg-3 {
width: 25%;
}
.col-lg-2 {
width: 16.66666667%;
}
.col-lg-1 {
width: 8.33333333%;
}
.col-lg-pull-12 {
right: 100%;
}
.col-lg-pull-11 {
right: 91.66666667%;
}
.col-lg-pull-10 {
right: 83.33333333%;
}
.col-lg-pull-9 {
right: 75%;
}
.col-lg-pull-8 {
right: 66.66666667%;
}
.col-lg-pull-7 {
right: 58.33333333%;
}
.col-lg-pull-6 {
right: 50%;
}
.col-lg-pull-5 {
right: 41.66666667%;
}
.col-lg-pull-4 {
right: 33.33333333%;
}
.col-lg-pull-3 {
right: 25%;
}
.col-lg-pull-2 {
right: 16.66666667%;
}
.col-lg-pull-1 {
right: 8.33333333%;
}
.col-lg-pull-0 {
right: auto;
}
.col-lg-push-12 {
left: 100%;
}
.col-lg-push-11 {
left: 91.66666667%;
}
.col-lg-push-10 {
left: 83.33333333%;
}
.col-lg-push-9 {
left: 75%;
}
.col-lg-push-8 {
left: 66.66666667%;
}
.col-lg-push-7 {
left: 58.33333333%;
}
.col-lg-push-6 {
left: 50%;
}
.col-lg-push-5 {
left: 41.66666667%;
}
.col-lg-push-4 {
left: 33.33333333%;
}
.col-lg-push-3 {
left: 25%;
}
.col-lg-push-2 {
left: 16.66666667%;
}
.col-lg-push-1 {
left: 8.33333333%;
}
.col-lg-push-0 {
left: auto;
}
.col-lg-offset-12 {
margin-left: 100%;
}
.col-lg-offset-11 {
margin-left: 91.66666667%;
}
.col-lg-offset-10 {
margin-left: 83.33333333%;
}
.col-lg-offset-9 {
margin-left: 75%;
}
.col-lg-offset-8 {
margin-left: 66.66666667%;
}
.col-lg-offset-7 {
margin-left: 58.33333333%;
}
.col-lg-offset-6 {
margin-left: 50%;
}
.col-lg-offset-5 {
margin-left: 41.66666667%;
}
.col-lg-offset-4 {
margin-left: 33.33333333%;
}
.col-lg-offset-3 {
margin-left: 25%;
}
.col-lg-offset-2 {
margin-left: 16.66666667%;
}
.col-lg-offset-1 {
margin-left: 8.33333333%;
}
.col-lg-offset-0 {
margin-left: 0;
}
}
table {
background-color: transparent;
}
caption {
padding-top: 8px;
padding-bottom: 8px;
color: #777;
text-align: left;
}
th {
text-align: left;
}
.table {
width: 100%;
max-width: 100%;
margin-bottom: 20px;
}
.table > thead > tr > th,
.table > tbody > tr > th,
.table > tfoot > tr > th,
.table > thead > tr > td,
.table > tbody > tr > td,
.table > tfoot > tr > td {
padding: 8px;
line-height: 1.42857143;
vertical-align: top;
border-top: 1px solid #ddd;
}
.table > thead > tr > th {
vertical-align: bottom;
border-bottom: 2px solid #ddd;
}
.table > caption + thead > tr:first-child > th,
.table > colgroup + thead > tr:first-child > th,
.table > thead:first-child > tr:first-child > th,
.table > caption + thead > tr:first-child > td,
.table > colgroup + thead > tr:first-child > td,
.table > thead:first-child > tr:first-child > td {
border-top: 0;
}
.table > tbody + tbody {
border-top: 2px solid #ddd;
}
.table .table {
background-color: #fff;
}
.table-condensed > thead > tr > th,
.table-condensed > tbody > tr > th,
.table-condensed > tfoot > tr > th,
.table-condensed > thead > tr > td,
.table-condensed > tbody > tr > td,
.table-condensed > tfoot > tr > td {
padding: 5px;
}
.table-bordered {
border: 1px solid #ddd;
}
.table-bordered > thead > tr > th,
.table-bordered > tbody > tr > th,
.table-bordered > tfoot > tr > th,
.table-bordered > thead > tr > td,
.table-bordered > tbody > tr > td,
.table-bordered > tfoot > tr > td {
border: 1px solid #ddd;
}
.table-bordered > thead > tr > th,
.table-bordered > thead > tr > td {
border-bottom-width: 2px;
}
.table-striped > tbody > tr:nth-of-type(odd) {
background-color: #f9f9f9;
}
.table-hover > tbody > tr:hover {
background-color: #f5f5f5;
}
table col[class*="col-"] {
position: static;
display: table-column;
float: none;
}
table td[class*="col-"],
table th[class*="col-"] {
position: static;
display: table-cell;
float: none;
}
.table > thead > tr > td.active,
.table > tbody > tr > td.active,
.table > tfoot > tr > td.active,
.table > thead > tr > th.active,
.table > tbody > tr > th.active,
.table > tfoot > tr > th.active,
.table > thead > tr.active > td,
.table > tbody > tr.active > td,
.table > tfoot > tr.active > td,
.table > thead > tr.active > th,
.table > tbody > tr.active > th,
.table > tfoot > tr.active > th {
background-color: #f5f5f5;
}
.table-hover > tbody > tr > td.active:hover,
.table-hover > tbody > tr > th.active:hover,
.table-hover > tbody > tr.active:hover > td,
.table-hover > tbody > tr:hover > .active,
.table-hover > tbody > tr.active:hover > th {
background-color: #e8e8e8;
}
.table > thead > tr > td.success,
.table > tbody > tr > td.success,
.table > tfoot > tr > td.success,
.table > thead > tr > th.success,
.table > tbody > tr > th.success,
.table > tfoot > tr > th.success,
.table > thead > tr.success > td,
.table > tbody > tr.success > td,
.table > tfoot > tr.success > td,
.table > thead > tr.success > th,
.table > tbody > tr.success > th,
.table > tfoot > tr.success > th {
background-color: #dff0d8;
}
.table-hover > tbody > tr > td.success:hover,
.table-hover > tbody > tr > th.success:hover,
.table-hover > tbody > tr.success:hover > td,
.table-hover > tbody > tr:hover > .success,
.table-hover > tbody > tr.success:hover > th {
background-color: #d0e9c6;
}
.table > thead > tr > td.info,
.table > tbody > tr > td.info,
.table > tfoot > tr > td.info,
.table > thead > tr > th.info,
.table > tbody > tr > th.info,
.table > tfoot > tr > th.info,
.table > thead > tr.info > td,
.table > tbody > tr.info > td,
.table > tfoot > tr.info > td,
.table > thead > tr.info > th,
.table > tbody > tr.info > th,
.table > tfoot > tr.info > th {
background-color: #d9edf7;
}
.table-hover > tbody > tr > td.info:hover,
.table-hover > tbody > tr > th.info:hover,
.table-hover > tbody > tr.info:hover > td,
.table-hover > tbody > tr:hover > .info,
.table-hover > tbody > tr.info:hover > th {
background-color: #c4e3f3;
}
.table > thead > tr > td.warning,
.table > tbody > tr > td.warning,
.table > tfoot > tr > td.warning,
.table > thead > tr > th.warning,
.table > tbody > tr > th.warning,
.table > tfoot > tr > th.warning,
.table > thead > tr.warning > td,
.table > tbody > tr.warning > td,
.table > tfoot > tr.warning > td,
.table > thead > tr.warning > th,
.table > tbody > tr.warning > th,
.table > tfoot > tr.warning > th {
background-color: #fcf8e3;
}
.table-hover > tbody > tr > td.warning:hover,
.table-hover > tbody > tr > th.warning:hover,
.table-hover > tbody > tr.warning:hover > td,
.table-hover > tbody > tr:hover > .warning,
.table-hover > tbody > tr.warning:hover > th {
background-color: #faf2cc;
}
.table > thead > tr > td.danger,
.table > tbody > tr > td.danger,
.table > tfoot > tr > td.danger,
.table > thead > tr > th.danger,
.table > tbody > tr > th.danger,
.table > tfoot > tr > th.danger,
.table > thead > tr.danger > td,
.table > tbody > tr.danger > td,
.table > tfoot > tr.danger > td,
.table > thead > tr.danger > th,
.table > tbody > tr.danger > th,
.table > tfoot > tr.danger > th {
background-color: #f2dede;
}
.table-hover > tbody > tr > td.danger:hover,
.table-hover > tbody > tr > th.danger:hover,
.table-hover > tbody > tr.danger:hover > td,
.table-hover > tbody > tr:hover > .danger,
.table-hover > tbody > tr.danger:hover > th {
background-color: #ebcccc;
}
.table-responsive {
min-height: .01%;
overflow-x: auto;
}
@media screen and (max-width: 767px) {
.table-responsive {
width: 100%;
margin-bottom: 15px;
overflow-y: hidden;
-ms-overflow-style: -ms-autohiding-scrollbar;
border: 1px solid #ddd;
}
.table-responsive > .table {
margin-bottom: 0;
}
.table-responsive > .table > thead > tr > th,
.table-responsive > .table > tbody > tr > th,
.table-responsive > .table > tfoot > tr > th,
.table-responsive > .table > thead > tr > td,
.table-responsive > .table > tbody > tr > td,
.table-responsive > .table > tfoot > tr > td {
white-space: nowrap;
}
.table-responsive > .table-bordered {
border: 0;
}
.table-responsive > .table-bordered > thead > tr > th:first-child,
.table-responsive > .table-bordered > tbody > tr > th:first-child,
.table-responsive > .table-bordered > tfoot > tr > th:first-child,
.table-responsive > .table-bordered > thead > tr > td:first-child,
.table-responsive > .table-bordered > tbody > tr > td:first-child,
.table-responsive > .table-bordered > tfoot > tr > td:first-child {
border-left: 0;
}
.table-responsive > .table-bordered > thead > tr > th:last-child,
.table-responsive > .table-bordered > tbody > tr > th:last-child,
.table-responsive > .table-bordered > tfoot > tr > th:last-child,
.table-responsive > .table-bordered > thead > tr > td:last-child,
.table-responsive > .table-bordered > tbody > tr > td:last-child,
.table-responsive > .table-bordered > tfoot > tr > td:last-child {
border-right: 0;
}
.table-responsive > .table-bordered > tbody > tr:last-child > th,
.table-responsive > .table-bordered > tfoot > tr:last-child > th,
.table-responsive > .table-bordered > tbody > tr:last-child > td,
.table-responsive > .table-bordered > tfoot > tr:last-child > td {
border-bottom: 0;
}
}
fieldset {
min-width: 0;
padding: 0;
margin: 0;
border: 0;
}
legend {
display: block;
width: 100%;
padding: 0;
margin-bottom: 20px;
font-size: 21px;
line-height: inherit;
color: #333;
border: 0;
border-bottom: 1px solid #e5e5e5;
}
label {
display: inline-block;
max-width: 100%;
margin-bottom: 5px;
font-weight: bold;
}
input[type="search"] {
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
input[type="radio"],
input[type="checkbox"] {
margin: 4px 0 0;
margin-top: 1px \9;
line-height: normal;
}
input[type="file"] {
display: block;
}
input[type="range"] {
display: block;
width: 100%;
}
select[multiple],
select[size] {
height: auto;
}
input[type="file"]:focus,
input[type="radio"]:focus,
input[type="checkbox"]:focus {
outline: thin dotted;
outline: 5px auto -webkit-focus-ring-color;
outline-offset: -2px;
}
output {
display: block;
padding-top: 7px;
font-size: 14px;
line-height: 1.42857143;
color: #555;
}
.form-control {
display: block;
width: 100%;
height: 34px;
padding: 6px 12px;
font-size: 14px;
line-height: 1.42857143;
color: #555;
background-color: #fff;
background-image: none;
border: 1px solid #ccc;
border-radius: 4px;
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
-webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s;
-o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;
}
.form-control:focus {
border-color: #66afe9;
outline: 0;
-webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6);
box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6);
}
.form-control::-moz-placeholder {
color: #999;
opacity: 1;
}
.form-control:-ms-input-placeholder {
color: #999;
}
.form-control::-webkit-input-placeholder {
color: #999;
}
.form-control[disabled],
.form-control[readonly],
fieldset[disabled] .form-control {
background-color: #eee;
opacity: 1;
}
.form-control[disabled],
fieldset[disabled] .form-control {
cursor: not-allowed;
}
textarea.form-control {
height: auto;
}
input[type="search"] {
-webkit-appearance: none;
}
@media screen and (-webkit-min-device-pixel-ratio: 0) {
input[type="date"],
input[type="time"],
input[type="datetime-local"],
input[type="month"] {
line-height: 34px;
}
input[type="date"].input-sm,
input[type="time"].input-sm,
input[type="datetime-local"].input-sm,
input[type="month"].input-sm,
.input-group-sm input[type="date"],
.input-group-sm input[type="time"],
.input-group-sm input[type="datetime-local"],
.input-group-sm input[type="month"] {
line-height: 30px;
}
input[type="date"].input-lg,
input[type="time"].input-lg,
input[type="datetime-local"].input-lg,
input[type="month"].input-lg,
.input-group-lg input[type="date"],
.input-group-lg input[type="time"],
.input-group-lg input[type="datetime-local"],
.input-group-lg input[type="month"] {
line-height: 46px;
}
}
.form-group {
margin-bottom: 15px;
}
.radio,
.checkbox {
position: relative;
display: block;
margin-top: 10px;
margin-bottom: 10px;
}
.radio label,
.checkbox label {
min-height: 20px;
padding-left: 20px;
margin-bottom: 0;
font-weight: normal;
cursor: pointer;
}
.radio input[type="radio"],
.radio-inline input[type="radio"],
.checkbox input[type="checkbox"],
.checkbox-inline input[type="checkbox"] {
position: absolute;
margin-top: 4px \9;
margin-left: -20px;
}
.radio + .radio,
.checkbox + .checkbox {
margin-top: -5px;
}
.radio-inline,
.checkbox-inline {
position: relative;
display: inline-block;
padding-left: 20px;
margin-bottom: 0;
font-weight: normal;
vertical-align: middle;
cursor: pointer;
}
.radio-inline + .radio-inline,
.checkbox-inline + .checkbox-inline {
margin-top: 0;
margin-left: 10px;
}
input[type="radio"][disabled],
input[type="checkbox"][disabled],
input[type="radio"].disabled,
input[type="checkbox"].disabled,
fieldset[disabled] input[type="radio"],
fieldset[disabled] input[type="checkbox"] {
cursor: not-allowed;
}
.radio-inline.disabled,
.checkbox-inline.disabled,
fieldset[disabled] .radio-inline,
fieldset[disabled] .checkbox-inline {
cursor: not-allowed;
}
.radio.disabled label,
.checkbox.disabled label,
fieldset[disabled] .radio label,
fieldset[disabled] .checkbox label {
cursor: not-allowed;
}
.form-control-static {
min-height: 34px;
padding-top: 7px;
padding-bottom: 7px;
margin-bottom: 0;
}
.form-control-static.input-lg,
.form-control-static.input-sm {
padding-right: 0;
padding-left: 0;
}
.input-sm {
height: 30px;
padding: 5px 10px;
font-size: 12px;
line-height: 1.5;
border-radius: 3px;
}
select.input-sm {
height: 30px;
line-height: 30px;
}
textarea.input-sm,
select[multiple].input-sm {
height: auto;
}
.form-group-sm .form-control {
height: 30px;
padding: 5px 10px;
font-size: 12px;
line-height: 1.5;
border-radius: 3px;
}
select.form-group-sm .form-control {
height: 30px;
line-height: 30px;
}
textarea.form-group-sm .form-control,
select[multiple].form-group-sm .form-control {
height: auto;
}
.form-group-sm .form-control-static {
height: 30px;
min-height: 32px;
padding: 5px 10px;
font-size: 12px;
line-height: 1.5;
}
.input-lg {
height: 46px;
padding: 10px 16px;
font-size: 18px;
line-height: 1.3333333;
border-radius: 6px;
}
select.input-lg {
height: 46px;
line-height: 46px;
}
textarea.input-lg,
select[multiple].input-lg {
height: auto;
}
.form-group-lg .form-control {
height: 46px;
padding: 10px 16px;
font-size: 18px;
line-height: 1.3333333;
border-radius: 6px;
}
select.form-group-lg .form-control {
height: 46px;
line-height: 46px;
}
textarea.form-group-lg .form-control,
select[multiple].form-group-lg .form-control {
height: auto;
}
.form-group-lg .form-control-static {
height: 46px;
min-height: 38px;
padding: 10px 16px;
font-size: 18px;
line-height: 1.3333333;
}
.has-feedback {
position: relative;
}
.has-feedback .form-control {
padding-right: 42.5px;
}
.form-control-feedback {
position: absolute;
top: 0;
right: 0;
z-index: 2;
display: block;
width: 34px;
height: 34px;
line-height: 34px;
text-align: center;
pointer-events: none;
}
.input-lg + .form-control-feedback {
width: 46px;
height: 46px;
line-height: 46px;
}
.input-sm + .form-control-feedback {
width: 30px;
height: 30px;
line-height: 30px;
}
.has-success .help-block,
.has-success .control-label,
.has-success .radio,
.has-success .checkbox,
.has-success .radio-inline,
.has-success .checkbox-inline,
.has-success.radio label,
.has-success.checkbox label,
.has-success.radio-inline label,
.has-success.checkbox-inline label {
color: #3c763d;
}
.has-success .form-control {
border-color: #3c763d;
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
}
.has-success .form-control:focus {
border-color: #2b542c;
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168;
box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168;
}
.has-success .input-group-addon {
color: #3c763d;
background-color: #dff0d8;
border-color: #3c763d;
}
.has-success .form-control-feedback {
color: #3c763d;
}
.has-warning .help-block,
.has-warning .control-label,
.has-warning .radio,
.has-warning .checkbox,
.has-warning .radio-inline,
.has-warning .checkbox-inline,
.has-warning.radio label,
.has-warning.checkbox label,
.has-warning.radio-inline label,
.has-warning.checkbox-inline label {
color: #8a6d3b;
}
.has-warning .form-control {
border-color: #8a6d3b;
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
}
.has-warning .form-control:focus {
border-color: #66512c;
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b;
box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b;
}
.has-warning .input-group-addon {
color: #8a6d3b;
background-color: #fcf8e3;
border-color: #8a6d3b;
}
.has-warning .form-control-feedback {
color: #8a6d3b;
}
.has-error .help-block,
.has-error .control-label,
.has-error .radio,
.has-error .checkbox,
.has-error .radio-inline,
.has-error .checkbox-inline,
.has-error.radio label,
.has-error.checkbox label,
.has-error.radio-inline label,
.has-error.checkbox-inline label {
color: #a94442;
}
.has-error .form-control {
border-color: #a94442;
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);
}
.has-error .form-control:focus {
border-color: #843534;
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483;
box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483;
}
.has-error .input-group-addon {
color: #a94442;
background-color: #f2dede;
border-color: #a94442;
}
.has-error .form-control-feedback {
color: #a94442;
}
.has-feedback label ~ .form-control-feedback {
top: 25px;
}
.has-feedback label.sr-only ~ .form-control-feedback {
top: 0;
}
.help-block {
display: block;
margin-top: 5px;
margin-bottom: 10px;
color: #737373;
}
@media (min-width: 768px) {
.form-inline .form-group {
display: inline-block;
margin-bottom: 0;
vertical-align: middle;
}
.form-inline .form-control {
display: inline-block;
width: auto;
vertical-align: middle;
}
.form-inline .form-control-static {
display: inline-block;
}
.form-inline .input-group {
display: inline-table;
vertical-align: middle;
}
.form-inline .input-group .input-group-addon,
.form-inline .input-group .input-group-btn,
.form-inline .input-group .form-control {
width: auto;
}
.form-inline .input-group > .form-control {
width: 100%;
}
.form-inline .control-label {
margin-bottom: 0;
vertical-align: middle;
}
.form-inline .radio,
.form-inline .checkbox {
display: inline-block;
margin-top: 0;
margin-bottom: 0;
vertical-align: middle;
}
.form-inline .radio label,
.form-inline .checkbox label {
padding-left: 0;
}
.form-inline .radio input[type="radio"],
.form-inline .checkbox input[type="checkbox"] {
position: relative;
margin-left: 0;
}
.form-inline .has-feedback .form-control-feedback {
top: 0;
}
}
.form-horizontal .radio,
.form-horizontal .checkbox,
.form-horizontal .radio-inline,
.form-horizontal .checkbox-inline {
padding-top: 7px;
margin-top: 0;
margin-bottom: 0;
}
.form-horizontal .radio,
.form-horizontal .checkbox {
min-height: 27px;
}
.form-horizontal .form-group {
margin-right: -15px;
margin-left: -15px;
}
@media (min-width: 768px) {
.form-horizontal .control-label {
padding-top: 7px;
margin-bottom: 0;
text-align: right;
}
}
.form-horizontal .has-feedback .form-control-feedback {
right: 15px;
}
@media (min-width: 768px) {
.form-horizontal .form-group-lg .control-label {
padding-top: 14.333333px;
}
}
@media (min-width: 768px) {
.form-horizontal .form-group-sm .control-label {
padding-top: 6px;
}
}
.btn {
display: inline-block;
padding: 6px 12px;
margin-bottom: 0;
font-size: 14px;
font-weight: normal;
line-height: 1.42857143;
text-align: center;
white-space: nowrap;
vertical-align: middle;
-ms-touch-action: manipulation;
touch-action: manipulation;
cursor: pointer;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
background-image: none;
border: 1px solid transparent;
border-radius: 4px;
}
.btn:focus,
.btn:active:focus,
.btn.active:focus,
.btn.focus,
.btn:active.focus,
.btn.active.focus {
outline: thin dotted;
outline: 5px auto -webkit-focus-ring-color;
outline-offset: -2px;
}
.btn:hover,
.btn:focus,
.btn.focus {
color: #333;
text-decoration: none;
}
.btn:active,
.btn.active {
background-image: none;
outline: 0;
-webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
}
.btn.disabled,
.btn[disabled],
fieldset[disabled] .btn {
pointer-events: none;
cursor: not-allowed;
filter: alpha(opacity=65);
-webkit-box-shadow: none;
box-shadow: none;
opacity: .65;
}
.btn-default {
color: #333;
background-color: #D0D0D0;
/*border-color: #D0D0D0;*/
border-radius: 0;
}
.btn-default:hover,
.btn-default:focus,
.btn-default.focus,
.btn-default:active,
.btn-default.active,
.open > .dropdown-toggle.btn-default {
color: #333;
background-color: #C4C4C4;
/*border-color: #C4C4C4;*/
}
.btn-default:active,
.btn-default.active,
.open > .dropdown-toggle.btn-default {
background-image: none;
}
.btn-default.disabled,
.btn-default[disabled],
fieldset[disabled] .btn-default,
.btn-default.disabled:hover,
.btn-default[disabled]:hover,
fieldset[disabled] .btn-default:hover,
.btn-default.disabled:focus,
.btn-default[disabled]:focus,
fieldset[disabled] .btn-default:focus,
.btn-default.disabled.focus,
.btn-default[disabled].focus,
fieldset[disabled] .btn-default.focus,
.btn-default.disabled:active,
.btn-default[disabled]:active,
fieldset[disabled] .btn-default:active,
.btn-default.disabled.active,
.btn-default[disabled].active,
fieldset[disabled] .btn-default.active {
background-color: #fff;
/*border-color: #ccc;*/
}
.btn-default .badge {
color: #fff;
background-color: #333;
}
.btn-primary {
color: #fff;
background-color: #337ab7;
border-color: #2e6da4;
}
.btn-primary:hover,
.btn-primary:focus,
.btn-primary.focus,
.btn-primary:active,
.btn-primary.active,
.open > .dropdown-toggle.btn-primary {
color: #fff;
background-color: #286090;
border-color: #204d74;
}
.btn-primary:active,
.btn-primary.active,
.open > .dropdown-toggle.btn-primary {
background-image: none;
}
.btn-primary.disabled,
.btn-primary[disabled],
fieldset[disabled] .btn-primary,
.btn-primary.disabled:hover,
.btn-primary[disabled]:hover,
fieldset[disabled] .btn-primary:hover,
.btn-primary.disabled:focus,
.btn-primary[disabled]:focus,
fieldset[disabled] .btn-primary:focus,
.btn-primary.disabled.focus,
.btn-primary[disabled].focus,
fieldset[disabled] .btn-primary.focus,
.btn-primary.disabled:active,
.btn-primary[disabled]:active,
fieldset[disabled] .btn-primary:active,
.btn-primary.disabled.active,
.btn-primary[disabled].active,
fieldset[disabled] .btn-primary.active {
background-color: #337ab7;
border-color: #2e6da4;
}
.btn-primary .badge {
color: #337ab7;
background-color: #fff;
}
.btn-success {
color: #fff;
background-color: #5cb85c;
border-color: #4cae4c;
}
.btn-success:hover,
.btn-success:focus,
.btn-success.focus,
.btn-success:active,
.btn-success.active,
.open > .dropdown-toggle.btn-success {
color: #fff;
background-color: #449d44;
border-color: #398439;
}
.btn-success:active,
.btn-success.active,
.open > .dropdown-toggle.btn-success {
background-image: none;
}
.btn-success.disabled,
.btn-success[disabled],
fieldset[disabled] .btn-success,
.btn-success.disabled:hover,
.btn-success[disabled]:hover,
fieldset[disabled] .btn-success:hover,
.btn-success.disabled:focus,
.btn-success[disabled]:focus,
fieldset[disabled] .btn-success:focus,
.btn-success.disabled.focus,
.btn-success[disabled].focus,
fieldset[disabled] .btn-success.focus,
.btn-success.disabled:active,
.btn-success[disabled]:active,
fieldset[disabled] .btn-success:active,
.btn-success.disabled.active,
.btn-success[disabled].active,
fieldset[disabled] .btn-success.active {
background-color: #5cb85c;
border-color: #4cae4c;
}
.btn-success .badge {
color: #5cb85c;
background-color: #fff;
}
.btn-info {
color: #fff;
background-color: #5bc0de;
border-color: #46b8da;
}
.btn-info:hover,
.btn-info:focus,
.btn-info.focus,
.btn-info:active,
.btn-info.active,
.open > .dropdown-toggle.btn-info {
color: #fff;
background-color: #31b0d5;
border-color: #269abc;
}
.btn-info:active,
.btn-info.active,
.open > .dropdown-toggle.btn-info {
background-image: none;
}
.btn-info.disabled,
.btn-info[disabled],
fieldset[disabled] .btn-info,
.btn-info.disabled:hover,
.btn-info[disabled]:hover,
fieldset[disabled] .btn-info:hover,
.btn-info.disabled:focus,
.btn-info[disabled]:focus,
fieldset[disabled] .btn-info:focus,
.btn-info.disabled.focus,
.btn-info[disabled].focus,
fieldset[disabled] .btn-info.focus,
.btn-info.disabled:active,
.btn-info[disabled]:active,
fieldset[disabled] .btn-info:active,
.btn-info.disabled.active,
.btn-info[disabled].active,
fieldset[disabled] .btn-info.active {
background-color: #5bc0de;
border-color: #46b8da;
}
.btn-info .badge {
color: #5bc0de;
background-color: #fff;
}
.btn-warning {
color: #fff;
background-color: #f0ad4e;
border-color: #eea236;
}
.btn-warning:hover,
.btn-warning:focus,
.btn-warning.focus,
.btn-warning:active,
.btn-warning.active,
.open > .dropdown-toggle.btn-warning {
color: #fff;
background-color: #ec971f;
border-color: #d58512;
}
.btn-warning:active,
.btn-warning.active,
.open > .dropdown-toggle.btn-warning {
background-image: none;
}
.btn-warning.disabled,
.btn-warning[disabled],
fieldset[disabled] .btn-warning,
.btn-warning.disabled:hover,
.btn-warning[disabled]:hover,
fieldset[disabled] .btn-warning:hover,
.btn-warning.disabled:focus,
.btn-warning[disabled]:focus,
fieldset[disabled] .btn-warning:focus,
.btn-warning.disabled.focus,
.btn-warning[disabled].focus,
fieldset[disabled] .btn-warning.focus,
.btn-warning.disabled:active,
.btn-warning[disabled]:active,
fieldset[disabled] .btn-warning:active,
.btn-warning.disabled.active,
.btn-warning[disabled].active,
fieldset[disabled] .btn-warning.active {
background-color: #f0ad4e;
border-color: #eea236;
}
.btn-warning .badge {
color: #f0ad4e;
background-color: #fff;
}
.btn-danger {
color: #fff;
background-color: #d9534f;
border-color: #d43f3a;
}
.btn-danger:hover,
.btn-danger:focus,
.btn-danger.focus,
.btn-danger:active,
.btn-danger.active,
.open > .dropdown-toggle.btn-danger {
color: #fff;
background-color: #c9302c;
border-color: #ac2925;
}
.btn-danger:active,
.btn-danger.active,
.open > .dropdown-toggle.btn-danger {
background-image: none;
}
.btn-danger.disabled,
.btn-danger[disabled],
fieldset[disabled] .btn-danger,
.btn-danger.disabled:hover,
.btn-danger[disabled]:hover,
fieldset[disabled] .btn-danger:hover,
.btn-danger.disabled:focus,
.btn-danger[disabled]:focus,
fieldset[disabled] .btn-danger:focus,
.btn-danger.disabled.focus,
.btn-danger[disabled].focus,
fieldset[disabled] .btn-danger.focus,
.btn-danger.disabled:active,
.btn-danger[disabled]:active,
fieldset[disabled] .btn-danger:active,
.btn-danger.disabled.active,
.btn-danger[disabled].active,
fieldset[disabled] .btn-danger.active {
background-color: #d9534f;
border-color: #d43f3a;
}
.btn-danger .badge {
color: #d9534f;
background-color: #fff;
}
.btn-link {
font-weight: normal;
color: #337ab7;
border-radius: 0;
}
.btn-link,
.btn-link:active,
.btn-link.active,
.btn-link[disabled],
fieldset[disabled] .btn-link {
background-color: transparent;
-webkit-box-shadow: none;
box-shadow: none;
}
.btn-link,
.btn-link:hover,
.btn-link:focus,
.btn-link:active {
border-color: transparent;
}
.btn-link:hover,
.btn-link:focus {
color: #23527c;
text-decoration: underline;
background-color: transparent;
}
.btn-link[disabled]:hover,
fieldset[disabled] .btn-link:hover,
.btn-link[disabled]:focus,
fieldset[disabled] .btn-link:focus {
color: #777;
text-decoration: none;
}
.btn-lg,
.btn-group-lg > .btn {
padding: 10px 16px;
font-size: 18px;
line-height: 1.3333333;
border-radius: 6px;
}
.btn-sm,
.btn-group-sm > .btn {
padding: 5px 10px;
font-size: 12px;
line-height: 1.5;
border-radius: 3px;
}
.btn-xs,
.btn-group-xs > .btn {
padding: 1px 5px;
font-size: 12px;
line-height: 1.5;
border-radius: 3px;
}
.btn-block {
display: block;
width: 100%;
}
.btn-block + .btn-block {
margin-top: 5px;
}
input[type="submit"].btn-block,
input[type="reset"].btn-block,
input[type="button"].btn-block {
width: 100%;
}
.fade {
opacity: 0;
-webkit-transition: opacity .15s linear;
-o-transition: opacity .15s linear;
transition: opacity .15s linear;
}
.fade.in {
opacity: 1;
}
.collapse {
display: none;
}
.collapse.in {
display: block;
}
tr.collapse.in {
display: table-row;
}
tbody.collapse.in {
display: table-row-group;
}
.collapsing {
position: relative;
height: 0;
overflow: hidden;
-webkit-transition-timing-function: ease;
-o-transition-timing-function: ease;
transition-timing-function: ease;
-webkit-transition-duration: .35s;
-o-transition-duration: .35s;
transition-duration: .35s;
-webkit-transition-property: height, visibility;
-o-transition-property: height, visibility;
transition-property: height, visibility;
}
.caret {
display: inline-block;
width: 0;
height: 0;
margin-left: 2px;
vertical-align: middle;
border-top: 4px dashed;
border-right: 4px solid transparent;
border-left: 4px solid transparent;
}
.dropup,
.dropdown {
position: relative;
}
.dropdown-toggle:focus {
outline: 0;
}
.dropdown-menu {
position: absolute;
top: 100%;
left: 0;
z-index: 1000;
display: none;
float: left;
min-width: 160px;
padding: 5px 0;
margin: 2px 0 0;
font-size: 14px;
text-align: left;
list-style: none;
background-color: #fff;
-webkit-background-clip: padding-box;
background-clip: padding-box;
border: 1px solid #ccc;
border: 1px solid rgba(0, 0, 0, .15);
border-radius: 4px;
-webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175);
box-shadow: 0 6px 12px rgba(0, 0, 0, .175);
}
.dropdown-menu.pull-right {
right: 0;
left: auto;
}
.dropdown-menu .divider {
height: 1px;
margin: 9px 0;
overflow: hidden;
background-color: #e5e5e5;
}
.dropdown-menu > li > a {
display: block;
padding: 3px 20px;
clear: both;
font-weight: normal;
line-height: 1.42857143;
color: #333;
white-space: nowrap;
}
.dropdown-menu > li > a:hover,
.dropdown-menu > li > a:focus {
color: #262626;
text-decoration: none;
background-color: #f5f5f5;
}
.dropdown-menu > .active > a,
.dropdown-menu > .active > a:hover,
.dropdown-menu > .active > a:focus {
color: #fff;
text-decoration: none;
background-color: #337ab7;
outline: 0;
}
.dropdown-menu > .disabled > a,
.dropdown-menu > .disabled > a:hover,
.dropdown-menu > .disabled > a:focus {
color: #777;
}
.dropdown-menu > .disabled > a:hover,
.dropdown-menu > .disabled > a:focus {
text-decoration: none;
cursor: not-allowed;
background-color: transparent;
background-image: none;
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
}
.open > .dropdown-menu {
display: block;
}
.open > a {
outline: 0;
}
.dropdown-menu-right {
right: 0;
left: auto;
}
.dropdown-menu-left {
right: auto;
left: 0;
}
.dropdown-header {
display: block;
padding: 3px 20px;
font-size: 12px;
line-height: 1.42857143;
color: #777;
white-space: nowrap;
}
.dropdown-backdrop {
position: fixed;
top: 0;
right: 0;
bottom: 0;
left: 0;
z-index: 990;
}
.pull-right > .dropdown-menu {
right: 0;
left: auto;
}
.dropup .caret,
.navbar-fixed-bottom .dropdown .caret {
content: "";
border-top: 0;
border-bottom: 4px solid;
}
.dropup .dropdown-menu,
.navbar-fixed-bottom .dropdown .dropdown-menu {
top: auto;
bottom: 100%;
margin-bottom: 2px;
}
@media (min-width: 768px) {
.navbar-right .dropdown-menu {
right: 0;
left: auto;
}
.navbar-right .dropdown-menu-left {
right: auto;
left: 0;
}
}
.btn-group,
.btn-group-vertical {
position: relative;
display: inline-block;
vertical-align: middle;
}
.btn-group > .btn,
.btn-group-vertical > .btn {
position: relative;
float: left;
}
.btn-group > .btn:hover,
.btn-group-vertical > .btn:hover,
.btn-group > .btn:focus,
.btn-group-vertical > .btn:focus,
.btn-group > .btn:active,
.btn-group-vertical > .btn:active,
.btn-group > .btn.active,
.btn-group-vertical > .btn.active {
z-index: 2;
}
.btn-group .btn + .btn,
.btn-group .btn + .btn-group,
.btn-group .btn-group + .btn,
.btn-group .btn-group + .btn-group {
margin-left: -1px;
}
.btn-toolbar {
margin-left: -5px;
}
.btn-toolbar .btn-group,
.btn-toolbar .input-group {
float: left;
}
.btn-toolbar > .btn,
.btn-toolbar > .btn-group,
.btn-toolbar > .input-group {
margin-left: 5px;
}
.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {
border-radius: 0;
}
.btn-group > .btn:first-child {
margin-left: 0;
}
.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {
border-top-right-radius: 0;
border-bottom-right-radius: 0;
}
.btn-group > .btn:last-child:not(:first-child),
.btn-group > .dropdown-toggle:not(:first-child) {
border-top-left-radius: 0;
border-bottom-left-radius: 0;
}
.btn-group > .btn-group {
float: left;
}
.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {
border-radius: 0;
}
.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child,
.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {
border-top-right-radius: 0;
border-bottom-right-radius: 0;
}
.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {
border-top-left-radius: 0;
border-bottom-left-radius: 0;
}
.btn-group .dropdown-toggle:active,
.btn-group.open .dropdown-toggle {
outline: 0;
}
.btn-group > .btn + .dropdown-toggle {
padding-right: 8px;
padding-left: 8px;
}
.btn-group > .btn-lg + .dropdown-toggle {
padding-right: 12px;
padding-left: 12px;
}
.btn-group.open .dropdown-toggle {
-webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
}
.btn-group.open .dropdown-toggle.btn-link {
-webkit-box-shadow: none;
box-shadow: none;
}
.btn .caret {
margin-left: 0;
}
.btn-lg .caret {
border-width: 5px 5px 0;
border-bottom-width: 0;
}
.dropup .btn-lg .caret {
border-width: 0 5px 5px;
}
.btn-group-vertical > .btn,
.btn-group-vertical > .btn-group,
.btn-group-vertical > .btn-group > .btn {
display: block;
float: none;
width: 100%;
max-width: 100%;
}
.btn-group-vertical > .btn-group > .btn {
float: none;
}
.btn-group-vertical > .btn + .btn,
.btn-group-vertical > .btn + .btn-group,
.btn-group-vertical > .btn-group + .btn,
.btn-group-vertical > .btn-group + .btn-group {
margin-top: -1px;
margin-left: 0;
}
.btn-group-vertical > .btn:not(:first-child):not(:last-child) {
border-radius: 0;
}
.btn-group-vertical > .btn:first-child:not(:last-child) {
border-top-right-radius: 4px;
border-bottom-right-radius: 0;
border-bottom-left-radius: 0;
}
.btn-group-vertical > .btn:last-child:not(:first-child) {
border-top-left-radius: 0;
border-top-right-radius: 0;
border-bottom-left-radius: 4px;
}
.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {
border-radius: 0;
}
.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,
.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {
border-bottom-right-radius: 0;
border-bottom-left-radius: 0;
}
.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {
border-top-left-radius: 0;
border-top-right-radius: 0;
}
.btn-group-justified {
display: table;
width: 100%;
table-layout: fixed;
border-collapse: separate;
}
.btn-group-justified > .btn,
.btn-group-justified > .btn-group {
display: table-cell;
float: none;
width: 1%;
}
.btn-group-justified > .btn-group .btn {
width: 100%;
}
.btn-group-justified > .btn-group .dropdown-menu {
left: auto;
}
[data-toggle="buttons"] > .btn input[type="radio"],
[data-toggle="buttons"] > .btn-group > .btn input[type="radio"],
[data-toggle="buttons"] > .btn input[type="checkbox"],
[data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] {
position: absolute;
clip: rect(0, 0, 0, 0);
pointer-events: none;
}
.input-group {
position: relative;
display: table;
border-collapse: separate;
}
.input-group[class*="col-"] {
float: none;
padding-right: 0;
padding-left: 0;
}
.input-group .form-control {
position: relative;
z-index: 2;
float: left;
width: 100%;
margin-bottom: 0;
}
.input-group-lg > .form-control,
.input-group-lg > .input-group-addon,
.input-group-lg > .input-group-btn > .btn {
height: 46px;
padding: 10px 16px;
font-size: 18px;
line-height: 1.3333333;
border-radius: 6px;
}
select.input-group-lg > .form-control,
select.input-group-lg > .input-group-addon,
select.input-group-lg > .input-group-btn > .btn {
height: 46px;
line-height: 46px;
}
textarea.input-group-lg > .form-control,
textarea.input-group-lg > .input-group-addon,
textarea.input-group-lg > .input-group-btn > .btn,
select[multiple].input-group-lg > .form-control,
select[multiple].input-group-lg > .input-group-addon,
select[multiple].input-group-lg > .input-group-btn > .btn {
height: auto;
}
.input-group-sm > .form-control,
.input-group-sm > .input-group-addon,
.input-group-sm > .input-group-btn > .btn {
height: 30px;
padding: 5px 10px;
font-size: 12px;
line-height: 1.5;
border-radius: 3px;
}
select.input-group-sm > .form-control,
select.input-group-sm > .input-group-addon,
select.input-group-sm > .input-group-btn > .btn {
height: 30px;
line-height: 30px;
}
textarea.input-group-sm > .form-control,
textarea.input-group-sm > .input-group-addon,
textarea.input-group-sm > .input-group-btn > .btn,
select[multiple].input-group-sm > .form-control,
select[multiple].input-group-sm > .input-group-addon,
select[multiple].input-group-sm > .input-group-btn > .btn {
height: auto;
}
.input-group-addon,
.input-group-btn,
.input-group .form-control {
display: table-cell;
}
.input-group-addon:not(:first-child):not(:last-child),
.input-group-btn:not(:first-child):not(:last-child),
.input-group .form-control:not(:first-child):not(:last-child) {
border-radius: 0;
}
.input-group-addon,
.input-group-btn {
width: 1%;
white-space: nowrap;
vertical-align: middle;
}
.input-group-addon {
padding: 6px 12px;
font-size: 14px;
font-weight: normal;
line-height: 1;
color: #555;
text-align: center;
background-color: #eee;
border: 1px solid #ccc;
border-radius: 4px;
}
.input-group-addon.input-sm {
padding: 5px 10px;
font-size: 12px;
border-radius: 3px;
}
.input-group-addon.input-lg {
padding: 10px 16px;
font-size: 18px;
border-radius: 6px;
}
.input-group-addon input[type="radio"],
.input-group-addon input[type="checkbox"] {
margin-top: 0;
}
.input-group .form-control:first-child,
.input-group-addon:first-child,
.input-group-btn:first-child > .btn,
.input-group-btn:first-child > .btn-group > .btn,
.input-group-btn:first-child > .dropdown-toggle,
.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),
.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {
border-top-right-radius: 0;
border-bottom-right-radius: 0;
}
.input-group-addon:first-child {
border-right: 0;
}
.input-group .form-control:last-child,
.input-group-addon:last-child,
.input-group-btn:last-child > .btn,
.input-group-btn:last-child > .btn-group > .btn,
.input-group-btn:last-child > .dropdown-toggle,
.input-group-btn:first-child > .btn:not(:first-child),
.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {
border-top-left-radius: 0;
border-bottom-left-radius: 0;
}
.input-group-addon:last-child {
border-left: 0;
}
.input-group-btn {
position: relative;
font-size: 0;
white-space: nowrap;
}
.input-group-btn > .btn {
position: relative;
}
.input-group-btn > .btn + .btn {
margin-left: -1px;
}
.input-group-btn > .btn:hover,
.input-group-btn > .btn:focus,
.input-group-btn > .btn:active {
z-index: 2;
}
.input-group-btn:first-child > .btn,
.input-group-btn:first-child > .btn-group {
margin-right: -1px;
}
.input-group-btn:last-child > .btn,
.input-group-btn:last-child > .btn-group {
margin-left: -1px;
}
.nav {
padding-left: 0;
margin-bottom: 0;
list-style: none;
}
.nav > li {
position: relative;
display: block;
}
.nav > li > a {
position: relative;
display: block;
padding: 10px 15px;
}
.nav > li > a:hover,
.nav > li > a:focus {
text-decoration: none;
background-color: #eee;
}
.nav > li.disabled > a {
color: #777;
}
.nav > li.disabled > a:hover,
.nav > li.disabled > a:focus {
color: #777;
text-decoration: none;
cursor: not-allowed;
background-color: transparent;
}
.nav .open > a,
.nav .open > a:hover,
.nav .open > a:focus {
background-color: #eee;
border-color: #337ab7;
}
.nav .nav-divider {
height: 1px;
margin: 9px 0;
overflow: hidden;
background-color: #e5e5e5;
}
.nav > li > a > img {
max-width: none;
}
.nav-tabs {
border-bottom: 1px solid #ddd;
}
.nav-tabs > li {
float: left;
margin-bottom: -1px;
}
.nav-tabs > li > a {
margin-right: 2px;
line-height: 1.42857143;
border: 1px solid transparent;
border-radius: 4px 4px 0 0;
}
.nav-tabs > li > a:hover {
border-color: #eee #eee #ddd;
}
.nav-tabs > li.active > a,
.nav-tabs > li.active > a:hover,
.nav-tabs > li.active > a:focus {
color: #555;
cursor: default;
background-color: #fff;
border: 1px solid #ddd;
border-bottom-color: transparent;
}
.nav-tabs.nav-justified {
width: 100%;
border-bottom: 0;
}
.nav-tabs.nav-justified > li {
float: none;
}
.nav-tabs.nav-justified > li > a {
margin-bottom: 5px;
text-align: center;
}
.nav-tabs.nav-justified > .dropdown .dropdown-menu {
top: auto;
left: auto;
}
@media (min-width: 768px) {
.nav-tabs.nav-justified > li {
display: table-cell;
width: 1%;
}
.nav-tabs.nav-justified > li > a {
margin-bottom: 0;
}
}
.nav-tabs.nav-justified > li > a {
margin-right: 0;
border-radius: 4px;
}
.nav-tabs.nav-justified > .active > a,
.nav-tabs.nav-justified > .active > a:hover,
.nav-tabs.nav-justified > .active > a:focus {
border: 1px solid #ddd;
}
@media (min-width: 768px) {
.nav-tabs.nav-justified > li > a {
border-bottom: 1px solid #ddd;
border-radius: 4px 4px 0 0;
}
.nav-tabs.nav-justified > .active > a,
.nav-tabs.nav-justified > .active > a:hover,
.nav-tabs.nav-justified > .active > a:focus {
border-bottom-color: #fff;
}
}
.nav-pills > li {
float: left;
}
.nav-pills > li > a {
border-radius: 4px;
}
.nav-pills > li + li {
margin-left: 2px;
}
.nav-pills > li.active > a,
.nav-pills > li.active > a:hover,
.nav-pills > li.active > a:focus {
color: #fff;
background-color: #337ab7;
}
.nav-stacked > li {
float: none;
}
.nav-stacked > li + li {
margin-top: 2px;
margin-left: 0;
}
.nav-justified {
width: 100%;
}
.nav-justified > li {
float: none;
}
.nav-justified > li > a {
margin-bottom: 5px;
text-align: center;
}
.nav-justified > .dropdown .dropdown-menu {
top: auto;
left: auto;
}
@media (min-width: 768px) {
.nav-justified > li {
display: table-cell;
width: 1%;
}
.nav-justified > li > a {
margin-bottom: 0;
}
}
.nav-tabs-justified {
border-bottom: 0;
}
.nav-tabs-justified > li > a {
margin-right: 0;
border-radius: 4px;
}
.nav-tabs-justified > .active > a,
.nav-tabs-justified > .active > a:hover,
.nav-tabs-justified > .active > a:focus {
border: 1px solid #ddd;
}
@media (min-width: 768px) {
.nav-tabs-justified > li > a {
border-bottom: 1px solid #ddd;
border-radius: 4px 4px 0 0;
}
.nav-tabs-justified > .active > a,
.nav-tabs-justified > .active > a:hover,
.nav-tabs-justified > .active > a:focus {
border-bottom-color: #fff;
}
}
.tab-content > .tab-pane {
display: none;
}
.tab-content > .active {
display: block;
}
.nav-tabs .dropdown-menu {
margin-top: -1px;
border-top-left-radius: 0;
border-top-right-radius: 0;
}
.navbar {
position: relative;
min-height: 50px;
margin-bottom: 20px;
border: 1px solid transparent;
}
@media (min-width: 768px) {
.navbar {
border-radius: 4px;
}
}
@media (min-width: 768px) {
.navbar-header {
float: left;
}
}
.navbar-collapse {
padding-right: 15px;
padding-left: 15px;
overflow-x: visible;
-webkit-overflow-scrolling: touch;
border-top: 1px solid transparent;
-webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1);
box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1);
}
.navbar-collapse.in {
overflow-y: auto;
}
@media (min-width: 768px) {
.navbar-collapse {
width: auto;
border-top: 0;
-webkit-box-shadow: none;
box-shadow: none;
}
.navbar-collapse.collapse {
display: block !important;
height: auto !important;
padding-bottom: 0;
overflow: visible !important;
}
.navbar-collapse.in {
overflow-y: visible;
}
.navbar-fixed-top .navbar-collapse,
.navbar-static-top .navbar-collapse,
.navbar-fixed-bottom .navbar-collapse {
padding-right: 0;
padding-left: 0;
}
}
.navbar-fixed-top .navbar-collapse,
.navbar-fixed-bottom .navbar-collapse {
max-height: 340px;
}
@media (max-device-width: 480px) and (orientation: landscape) {
.navbar-fixed-top .navbar-collapse,
.navbar-fixed-bottom .navbar-collapse {
max-height: 200px;
}
}
.container > .navbar-header,
.container-fluid > .navbar-header,
.container > .navbar-collapse,
.container-fluid > .navbar-collapse {
margin-right: -15px;
margin-left: -15px;
}
@media (min-width: 768px) {
.container > .navbar-header,
.container-fluid > .navbar-header,
.container > .navbar-collapse,
.container-fluid > .navbar-collapse {
margin-right: 0;
margin-left: 0;
}
}
.navbar-static-top {
z-index: 1000;
border-width: 0 0 1px;
}
@media (min-width: 768px) {
.navbar-static-top {
border-radius: 0;
}
}
.navbar-fixed-top,
.navbar-fixed-bottom {
position: fixed;
right: 0;
left: 0;
z-index: 1030;
}
@media (min-width: 768px) {
.navbar-fixed-top,
.navbar-fixed-bottom {
border-radius: 0;
}
}
.navbar-fixed-top {
top: 0;
border-width: 0 0 1px;
}
.navbar-fixed-bottom {
bottom: 0;
margin-bottom: 0;
border-width: 1px 0 0;
}
.navbar-brand {
float: left;
height: 50px;
padding: 15px 15px;
font-size: 18px;
line-height: 20px;
}
.navbar-brand:hover,
.navbar-brand:focus {
text-decoration: none;
}
.navbar-brand > img {
display: block;
}
@media (min-width: 768px) {
.navbar > .container .navbar-brand,
.navbar > .container-fluid .navbar-brand {
margin-left: -15px;
}
}
.navbar-toggle {
position: relative;
float: right;
padding: 9px 10px;
margin-top: 8px;
margin-right: 15px;
margin-bottom: 8px;
background-color: transparent;
background-image: none;
border: 1px solid transparent;
border-radius: 4px;
}
.navbar-toggle:focus {
outline: 0;
}
.navbar-toggle .icon-bar {
display: block;
width: 22px;
height: 2px;
border-radius: 1px;
}
.navbar-toggle .icon-bar + .icon-bar {
margin-top: 4px;
}
@media (min-width: 768px) {
.navbar-toggle {
display: none;
}
}
.navbar-nav {
margin: 7.5px -15px;
}
.navbar-nav > li > a {
padding-top: 10px;
padding-bottom: 10px;
line-height: 20px;
}
@media (max-width: 767px) {
.navbar-nav .open .dropdown-menu {
position: static;
float: none;
width: auto;
margin-top: 0;
background-color: transparent;
border: 0;
-webkit-box-shadow: none;
box-shadow: none;
}
.navbar-nav .open .dropdown-menu > li > a,
.navbar-nav .open .dropdown-menu .dropdown-header {
padding: 5px 15px 5px 25px;
}
.navbar-nav .open .dropdown-menu > li > a {
line-height: 20px;
}
.navbar-nav .open .dropdown-menu > li > a:hover,
.navbar-nav .open .dropdown-menu > li > a:focus {
background-image: none;
}
}
@media (min-width: 768px) {
.navbar-nav {
float: left;
margin: 0;
}
.navbar-nav > li {
float: left;
}
.navbar-nav > li > a {
padding-top: 15px;
padding-bottom: 15px;
}
}
.navbar-form {
padding: 10px 15px;
margin-top: 8px;
margin-right: -15px;
margin-bottom: 8px;
margin-left: -15px;
border-top: 1px solid transparent;
border-bottom: 1px solid transparent;
-webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1);
box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1);
}
@media (min-width: 768px) {
.navbar-form .form-group {
display: inline-block;
margin-bottom: 0;
vertical-align: middle;
}
.navbar-form .form-control {
display: inline-block;
width: auto;
vertical-align: middle;
}
.navbar-form .form-control-static {
display: inline-block;
}
.navbar-form .input-group {
display: inline-table;
vertical-align: middle;
}
.navbar-form .input-group .input-group-addon,
.navbar-form .input-group .input-group-btn,
.navbar-form .input-group .form-control {
width: auto;
}
.navbar-form .input-group > .form-control {
width: 100%;
}
.navbar-form .control-label {
margin-bottom: 0;
vertical-align: middle;
}
.navbar-form .radio,
.navbar-form .checkbox {
display: inline-block;
margin-top: 0;
margin-bottom: 0;
vertical-align: middle;
}
.navbar-form .radio label,
.navbar-form .checkbox label {
padding-left: 0;
}
.navbar-form .radio input[type="radio"],
.navbar-form .checkbox input[type="checkbox"] {
position: relative;
margin-left: 0;
}
.navbar-form .has-feedback .form-control-feedback {
top: 0;
}
}
@media (max-width: 767px) {
.navbar-form .form-group {
margin-bottom: 5px;
}
.navbar-form .form-group:last-child {
margin-bottom: 0;
}
}
@media (min-width: 768px) {
.navbar-form {
width: auto;
padding-top: 0;
padding-bottom: 0;
margin-right: 0;
margin-left: 0;
border: 0;
-webkit-box-shadow: none;
box-shadow: none;
}
}
.navbar-nav > li > .dropdown-menu {
margin-top: 0;
border-top-left-radius: 0;
border-top-right-radius: 0;
}
.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {
margin-bottom: 0;
border-top-left-radius: 4px;
border-top-right-radius: 4px;
border-bottom-right-radius: 0;
border-bottom-left-radius: 0;
}
.navbar-btn {
margin-top: 8px;
margin-bottom: 8px;
}
.navbar-btn.btn-sm {
margin-top: 10px;
margin-bottom: 10px;
}
.navbar-btn.btn-xs {
margin-top: 14px;
margin-bottom: 14px;
}
.navbar-text {
margin-top: 15px;
margin-bottom: 15px;
}
@media (min-width: 768px) {
.navbar-text {
float: left;
margin-right: 15px;
margin-left: 15px;
}
}
@media (min-width: 768px) {
.navbar-left {
float: left !important;
}
.navbar-right {
float: right !important;
margin-right: -15px;
}
.navbar-right ~ .navbar-right {
margin-right: 0;
}
}
.navbar-default {
background-color: #f8f8f8;
border-color: #e7e7e7;
}
.navbar-default .navbar-brand {
color: #777;
}
.navbar-default .navbar-brand:hover,
.navbar-default .navbar-brand:focus {
color: #5e5e5e;
background-color: transparent;
}
.navbar-default .navbar-text {
color: #777;
}
.navbar-default .navbar-nav > li > a {
color: #777;
}
.navbar-default .navbar-nav > li > a:hover,
.navbar-default .navbar-nav > li > a:focus {
color: #333;
background-color: transparent;
}
.navbar-default .navbar-nav > .active > a,
.navbar-default .navbar-nav > .active > a:hover,
.navbar-default .navbar-nav > .active > a:focus {
color: #555;
background-color: #e7e7e7;
}
.navbar-default .navbar-nav > .disabled > a,
.navbar-default .navbar-nav > .disabled > a:hover,
.navbar-default .navbar-nav > .disabled > a:focus {
color: #ccc;
background-color: transparent;
}
.navbar-default .navbar-toggle {
border-color: #ddd;
}
.navbar-default .navbar-toggle:hover,
.navbar-default .navbar-toggle:focus {
background-color: #ddd;
}
.navbar-default .navbar-toggle .icon-bar {
background-color: #888;
}
.navbar-default .navbar-collapse,
.navbar-default .navbar-form {
border-color: #e7e7e7;
}
.navbar-default .navbar-nav > .open > a,
.navbar-default .navbar-nav > .open > a:hover,
.navbar-default .navbar-nav > .open > a:focus {
color: #555;
background-color: #e7e7e7;
}
@media (max-width: 767px) {
.navbar-default .navbar-nav .open .dropdown-menu > li > a {
color: #777;
}
.navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,
.navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {
color: #333;
background-color: transparent;
}
.navbar-default .navbar-nav .open .dropdown-menu > .active > a,
.navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,
.navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {
color: #555;
background-color: #e7e7e7;
}
.navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,
.navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,
.navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {
color: #ccc;
background-color: transparent;
}
}
.navbar-default .navbar-link {
color: #777;
}
.navbar-default .navbar-link:hover {
color: #333;
}
.navbar-default .btn-link {
color: #777;
}
.navbar-default .btn-link:hover,
.navbar-default .btn-link:focus {
color: #333;
}
.navbar-default .btn-link[disabled]:hover,
fieldset[disabled] .navbar-default .btn-link:hover,
.navbar-default .btn-link[disabled]:focus,
fieldset[disabled] .navbar-default .btn-link:focus {
color: #ccc;
}
.navbar-inverse {
background-color: #222;
border-color: #080808;
}
.navbar-inverse .navbar-brand {
color: #9d9d9d;
}
.navbar-inverse .navbar-brand:hover,
.navbar-inverse .navbar-brand:focus {
color: #fff;
background-color: transparent;
}
.navbar-inverse .navbar-text {
color: #9d9d9d;
}
.navbar-inverse .navbar-nav > li > a {
color: #9d9d9d;
}
.navbar-inverse .navbar-nav > li > a:hover,
.navbar-inverse .navbar-nav > li > a:focus {
color: #fff;
background-color: transparent;
}
.navbar-inverse .navbar-nav > .active > a,
.navbar-inverse .navbar-nav > .active > a:hover,
.navbar-inverse .navbar-nav > .active > a:focus {
color: #fff;
background-color: #080808;
}
.navbar-inverse .navbar-nav > .disabled > a,
.navbar-inverse .navbar-nav > .disabled > a:hover,
.navbar-inverse .navbar-nav > .disabled > a:focus {
color: #444;
background-color: transparent;
}
.navbar-inverse .navbar-toggle {
border-color: #333;
}
.navbar-inverse .navbar-toggle:hover,
.navbar-inverse .navbar-toggle:focus {
background-color: #333;
}
.navbar-inverse .navbar-toggle .icon-bar {
background-color: #fff;
}
.navbar-inverse .navbar-collapse,
.navbar-inverse .navbar-form {
border-color: #101010;
}
.navbar-inverse .navbar-nav > .open > a,
.navbar-inverse .navbar-nav > .open > a:hover,
.navbar-inverse .navbar-nav > .open > a:focus {
color: #fff;
background-color: #080808;
}
@media (max-width: 767px) {
.navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {
border-color: #080808;
}
.navbar-inverse .navbar-nav .open .dropdown-menu .divider {
background-color: #080808;
}
.navbar-inverse .navbar-nav .open .dropdown-menu > li > a {
color: #9d9d9d;
}
.navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,
.navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {
color: #fff;
background-color: transparent;
}
.navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,
.navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,
.navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {
color: #fff;
background-color: #080808;
}
.navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,
.navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,
.navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {
color: #444;
background-color: transparent;
}
}
.navbar-inverse .navbar-link {
color: #9d9d9d;
}
.navbar-inverse .navbar-link:hover {
color: #fff;
}
.navbar-inverse .btn-link {
color: #9d9d9d;
}
.navbar-inverse .btn-link:hover,
.navbar-inverse .btn-link:focus {
color: #fff;
}
.navbar-inverse .btn-link[disabled]:hover,
fieldset[disabled] .navbar-inverse .btn-link:hover,
.navbar-inverse .btn-link[disabled]:focus,
fieldset[disabled] .navbar-inverse .btn-link:focus {
color: #444;
}
.breadcrumb {
padding: 8px 15px;
margin-bottom: 20px;
list-style: none;
background-color: #f5f5f5;
border-radius: 4px;
}
.breadcrumb > li {
display: inline-block;
}
.breadcrumb > li + li:before {
padding: 0 5px;
color: #ccc;
content: "/\00a0";
}
.breadcrumb > .active {
color: #777;
}
.pagination {
display: inline-block;
padding-left: 0;
margin: 20px 0;
border-radius: 4px;
}
.pagination > li {
display: inline;
}
.pagination > li > a,
.pagination > li > span {
position: relative;
float: left;
padding: 6px 12px;
margin-left: -1px;
line-height: 1.42857143;
color: #337ab7;
text-decoration: none;
background-color: #fff;
border: 1px solid #ddd;
}
.pagination > li:first-child > a,
.pagination > li:first-child > span {
margin-left: 0;
border-top-left-radius: 4px;
border-bottom-left-radius: 4px;
}
.pagination > li:last-child > a,
.pagination > li:last-child > span {
border-top-right-radius: 4px;
border-bottom-right-radius: 4px;
}
.pagination > li > a:hover,
.pagination > li > span:hover,
.pagination > li > a:focus,
.pagination > li > span:focus {
color: #23527c;
background-color: #eee;
border-color: #ddd;
}
.pagination > .active > a,
.pagination > .active > span,
.pagination > .active > a:hover,
.pagination > .active > span:hover,
.pagination > .active > a:focus,
.pagination > .active > span:focus {
z-index: 2;
color: #fff;
cursor: default;
background-color: #337ab7;
border-color: #337ab7;
}
.pagination > .disabled > span,
.pagination > .disabled > span:hover,
.pagination > .disabled > span:focus,
.pagination > .disabled > a,
.pagination > .disabled > a:hover,
.pagination > .disabled > a:focus {
color: #777;
cursor: not-allowed;
background-color: #fff;
border-color: #ddd;
}
.pagination-lg > li > a,
.pagination-lg > li > span {
padding: 10px 16px;
font-size: 18px;
}
.pagination-lg > li:first-child > a,
.pagination-lg > li:first-child > span {
border-top-left-radius: 6px;
border-bottom-left-radius: 6px;
}
.pagination-lg > li:last-child > a,
.pagination-lg > li:last-child > span {
border-top-right-radius: 6px;
border-bottom-right-radius: 6px;
}
.pagination-sm > li > a,
.pagination-sm > li > span {
padding: 5px 10px;
font-size: 12px;
}
.pagination-sm > li:first-child > a,
.pagination-sm > li:first-child > span {
border-top-left-radius: 3px;
border-bottom-left-radius: 3px;
}
.pagination-sm > li:last-child > a,
.pagination-sm > li:last-child > span {
border-top-right-radius: 3px;
border-bottom-right-radius: 3px;
}
.pager {
padding-left: 0;
margin: 20px 0;
text-align: center;
list-style: none;
}
.pager li {
display: inline;
}
.pager li > a,
.pager li > span {
display: inline-block;
padding: 5px 14px;
background-color: #fff;
border: 1px solid #ddd;
border-radius: 15px;
}
.pager li > a:hover,
.pager li > a:focus {
text-decoration: none;
background-color: #eee;
}
.pager .next > a,
.pager .next > span {
float: right;
}
.pager .previous > a,
.pager .previous > span {
float: left;
}
.pager .disabled > a,
.pager .disabled > a:hover,
.pager .disabled > a:focus,
.pager .disabled > span {
color: #777;
cursor: not-allowed;
background-color: #fff;
}
.label {
display: inline;
padding: .2em .6em .3em;
font-size: 75%;
font-weight: bold;
line-height: 1;
color: #fff;
text-align: center;
white-space: nowrap;
vertical-align: baseline;
border-radius: .25em;
}
a.label:hover,
a.label:focus {
color: #fff;
text-decoration: none;
cursor: pointer;
}
.label:empty {
display: none;
}
.btn .label {
position: relative;
top: -1px;
}
.label-default {
background-color: #777;
}
.label-default[href]:hover,
.label-default[href]:focus {
background-color: #5e5e5e;
}
.label-primary {
background-color: #337ab7;
}
.label-primary[href]:hover,
.label-primary[href]:focus {
background-color: #286090;
}
.label-success {
background-color: #5cb85c;
}
.label-success[href]:hover,
.label-success[href]:focus {
background-color: #449d44;
}
.label-info {
background-color: #5bc0de;
}
.label-info[href]:hover,
.label-info[href]:focus {
background-color: #31b0d5;
}
.label-warning {
background-color: #f0ad4e;
}
.label-warning[href]:hover,
.label-warning[href]:focus {
background-color: #ec971f;
}
.label-danger {
background-color: #d9534f;
}
.label-danger[href]:hover,
.label-danger[href]:focus {
background-color: #c9302c;
}
.badge {
display: inline-block;
min-width: 10px;
padding: 3px 7px;
font-size: 12px;
font-weight: bold;
line-height: 1;
color: #fff;
text-align: center;
white-space: nowrap;
vertical-align: baseline;
background-color: #777;
border-radius: 10px;
}
.badge:empty {
display: none;
}
.btn .badge {
position: relative;
top: -1px;
}
.btn-xs .badge,
.btn-group-xs > .btn .badge {
top: 0;
padding: 1px 5px;
}
a.badge:hover,
a.badge:focus {
color: #fff;
text-decoration: none;
cursor: pointer;
}
.list-group-item.active > .badge,
.nav-pills > .active > a > .badge {
color: #337ab7;
background-color: #fff;
}
.list-group-item > .badge {
float: right;
}
.list-group-item > .badge + .badge {
margin-right: 5px;
}
.nav-pills > li > a > .badge {
margin-left: 3px;
}
.jumbotron {
padding: 30px 15px;
margin-bottom: 30px;
color: inherit;
background-color: #eee;
}
.jumbotron h1,
.jumbotron .h1 {
color: inherit;
}
.jumbotron p {
margin-bottom: 15px;
font-size: 21px;
font-weight: 200;
}
.jumbotron > hr {
border-top-color: #d5d5d5;
}
.container .jumbotron,
.container-fluid .jumbotron {
border-radius: 6px;
}
.jumbotron .container {
max-width: 100%;
}
@media screen and (min-width: 768px) {
.jumbotron {
padding: 48px 0;
}
.container .jumbotron,
.container-fluid .jumbotron {
padding-right: 60px;
padding-left: 60px;
}
.jumbotron h1,
.jumbotron .h1 {
font-size: 63px;
}
}
.thumbnail {
display: block;
padding: 4px;
margin-bottom: 20px;
line-height: 1.42857143;
background-color: #fff;
border: 1px solid #ddd;
border-radius: 4px;
-webkit-transition: border .2s ease-in-out;
-o-transition: border .2s ease-in-out;
transition: border .2s ease-in-out;
}
.thumbnail > img,
.thumbnail a > img {
margin-right: auto;
margin-left: auto;
}
a.thumbnail:hover,
a.thumbnail:focus,
a.thumbnail.active {
border-color: #337ab7;
}
.thumbnail .caption {
padding: 9px;
color: #333;
}
.alert {
padding: 15px;
margin-bottom: 20px;
border: 1px solid transparent;
border-radius: 4px;
}
.alert h4 {
margin-top: 0;
color: inherit;
}
.alert .alert-link {
font-weight: bold;
}
.alert > p,
.alert > ul {
margin-bottom: 0;
}
.alert > p + p {
margin-top: 5px;
}
.alert-dismissable,
.alert-dismissible {
padding-right: 35px;
}
.alert-dismissable .close,
.alert-dismissible .close {
position: relative;
top: -2px;
right: -21px;
color: inherit;
}
.alert-success {
color: #3c763d;
background-color: #dff0d8;
border-color: #d6e9c6;
}
.alert-success hr {
border-top-color: #c9e2b3;
}
.alert-success .alert-link {
color: #2b542c;
}
.alert-info {
color: #31708f;
background-color: #d9edf7;
border-color: #bce8f1;
}
.alert-info hr {
border-top-color: #a6e1ec;
}
.alert-info .alert-link {
color: #245269;
}
.alert-warning {
color: #8a6d3b;
background-color: #fcf8e3;
border-color: #faebcc;
}
.alert-warning hr {
border-top-color: #f7e1b5;
}
.alert-warning .alert-link {
color: #66512c;
}
.alert-danger {
color: #a94442;
background-color: #f2dede;
border-color: #ebccd1;
}
.alert-danger hr {
border-top-color: #e4b9c0;
}
.alert-danger .alert-link {
color: #843534;
}
@-webkit-keyframes progress-bar-stripes {
from {
background-position: 40px 0;
}
to {
background-position: 0 0;
}
}
@-o-keyframes progress-bar-stripes {
from {
background-position: 40px 0;
}
to {
background-position: 0 0;
}
}
@keyframes progress-bar-stripes {
from {
background-position: 40px 0;
}
to {
background-position: 0 0;
}
}
.progress {
height: 20px;
margin-bottom: 20px;
overflow: hidden;
background-color: #f5f5f5;
border-radius: 4px;
-webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1);
box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1);
}
.progress-bar {
float: left;
width: 0;
height: 100%;
font-size: 12px;
line-height: 20px;
color: #fff;
text-align: center;
background-color: #337ab7;
-webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15);
box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15);
-webkit-transition: width .6s ease;
-o-transition: width .6s ease;
transition: width .6s ease;
}
.progress-striped .progress-bar,
.progress-bar-striped {
background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
-webkit-background-size: 40px 40px;
background-size: 40px 40px;
}
.progress.active .progress-bar,
.progress-bar.active {
-webkit-animation: progress-bar-stripes 2s linear infinite;
-o-animation: progress-bar-stripes 2s linear infinite;
animation: progress-bar-stripes 2s linear infinite;
}
.progress-bar-success {
background-color: #5cb85c;
}
.progress-striped .progress-bar-success {
background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
}
.progress-bar-info {
background-color: #5bc0de;
}
.progress-striped .progress-bar-info {
background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
}
.progress-bar-warning {
background-color: #f0ad4e;
}
.progress-striped .progress-bar-warning {
background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
}
.progress-bar-danger {
background-color: #d9534f;
}
.progress-striped .progress-bar-danger {
background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
}
.media {
margin-top: 15px;
}
.media:first-child {
margin-top: 0;
}
.media,
.media-body {
overflow: hidden;
zoom: 1;
}
.media-body {
width: 10000px;
}
.media-object {
display: block;
}
.media-right,
.media > .pull-right {
padding-left: 10px;
}
.media-left,
.media > .pull-left {
padding-right: 10px;
}
.media-left,
.media-right,
.media-body {
display: table-cell;
vertical-align: top;
}
.media-middle {
vertical-align: middle;
}
.media-bottom {
vertical-align: bottom;
}
.media-heading {
margin-top: 0;
margin-bottom: 5px;
}
.media-list {
padding-left: 0;
list-style: none;
}
.list-group {
padding-left: 0;
margin-bottom: 20px;
}
.list-group-item {
position: relative;
display: block;
padding: 10px 15px;
margin-bottom: -1px;
background-color: #fff;
border: 1px solid #ddd;
}
.list-group-item:first-child {
border-top-left-radius: 4px;
border-top-right-radius: 4px;
}
.list-group-item:last-child {
margin-bottom: 0;
border-bottom-right-radius: 4px;
border-bottom-left-radius: 4px;
}
a.list-group-item {
color: #555;
}
a.list-group-item .list-group-item-heading {
color: #333;
}
a.list-group-item:hover,
a.list-group-item:focus {
color: #555;
text-decoration: none;
background-color: #f5f5f5;
}
.list-group-item.disabled,
.list-group-item.disabled:hover,
.list-group-item.disabled:focus {
color: #777;
cursor: not-allowed;
background-color: #eee;
}
.list-group-item.disabled .list-group-item-heading,
.list-group-item.disabled:hover .list-group-item-heading,
.list-group-item.disabled:focus .list-group-item-heading {
color: inherit;
}
.list-group-item.disabled .list-group-item-text,
.list-group-item.disabled:hover .list-group-item-text,
.list-group-item.disabled:focus .list-group-item-text {
color: #777;
}
.list-group-item.active,
.list-group-item.active:hover,
.list-group-item.active:focus {
z-index: 2;
color: #fff;
background-color: #337ab7;
border-color: #337ab7;
}
.list-group-item.active .list-group-item-heading,
.list-group-item.active:hover .list-group-item-heading,
.list-group-item.active:focus .list-group-item-heading,
.list-group-item.active .list-group-item-heading > small,
.list-group-item.active:hover .list-group-item-heading > small,
.list-group-item.active:focus .list-group-item-heading > small,
.list-group-item.active .list-group-item-heading > .small,
.list-group-item.active:hover .list-group-item-heading > .small,
.list-group-item.active:focus .list-group-item-heading > .small {
color: inherit;
}
.list-group-item.active .list-group-item-text,
.list-group-item.active:hover .list-group-item-text,
.list-group-item.active:focus .list-group-item-text {
color: #c7ddef;
}
.list-group-item-success {
color: #3c763d;
background-color: #dff0d8;
}
a.list-group-item-success {
color: #3c763d;
}
a.list-group-item-success .list-group-item-heading {
color: inherit;
}
a.list-group-item-success:hover,
a.list-group-item-success:focus {
color: #3c763d;
background-color: #d0e9c6;
}
a.list-group-item-success.active,
a.list-group-item-success.active:hover,
a.list-group-item-success.active:focus {
color: #fff;
background-color: #3c763d;
border-color: #3c763d;
}
.list-group-item-info {
color: #31708f;
background-color: #d9edf7;
}
a.list-group-item-info {
color: #31708f;
}
a.list-group-item-info .list-group-item-heading {
color: inherit;
}
a.list-group-item-info:hover,
a.list-group-item-info:focus {
color: #31708f;
background-color: #c4e3f3;
}
a.list-group-item-info.active,
a.list-group-item-info.active:hover,
a.list-group-item-info.active:focus {
color: #fff;
background-color: #31708f;
border-color: #31708f;
}
.list-group-item-warning {
color: #8a6d3b;
background-color: #fcf8e3;
}
a.list-group-item-warning {
color: #8a6d3b;
}
a.list-group-item-warning .list-group-item-heading {
color: inherit;
}
a.list-group-item-warning:hover,
a.list-group-item-warning:focus {
color: #8a6d3b;
background-color: #faf2cc;
}
a.list-group-item-warning.active,
a.list-group-item-warning.active:hover,
a.list-group-item-warning.active:focus {
color: #fff;
background-color: #8a6d3b;
border-color: #8a6d3b;
}
.list-group-item-danger {
color: #a94442;
background-color: #f2dede;
}
a.list-group-item-danger {
color: #a94442;
}
a.list-group-item-danger .list-group-item-heading {
color: inherit;
}
a.list-group-item-danger:hover,
a.list-group-item-danger:focus {
color: #a94442;
background-color: #ebcccc;
}
a.list-group-item-danger.active,
a.list-group-item-danger.active:hover,
a.list-group-item-danger.active:focus {
color: #fff;
background-color: #a94442;
border-color: #a94442;
}
.list-group-item-heading {
margin-top: 0;
margin-bottom: 5px;
}
.list-group-item-text {
margin-bottom: 0;
line-height: 1.3;
}
.panel {
margin-bottom: 20px;
background-color: #fff;
border: 1px solid transparent;
border-radius: 4px;
-webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .05);
box-shadow: 0 1px 1px rgba(0, 0, 0, .05);
}
.panel-body {
padding: 15px;
}
.panel-heading {
padding: 10px 15px;
border-bottom: 1px solid transparent;
border-top-left-radius: 3px;
border-top-right-radius: 3px;
}
.panel-heading > .dropdown .dropdown-toggle {
color: inherit;
}
.panel-title {
margin-top: 0;
margin-bottom: 0;
font-size: 16px;
color: inherit;
}
.panel-title > a,
.panel-title > small,
.panel-title > .small,
.panel-title > small > a,
.panel-title > .small > a {
color: inherit;
}
.panel-footer {
padding: 10px 15px;
background-color: #f5f5f5;
border-top: 1px solid #ddd;
border-bottom-right-radius: 3px;
border-bottom-left-radius: 3px;
}
.panel > .list-group,
.panel > .panel-collapse > .list-group {
margin-bottom: 0;
}
.panel > .list-group .list-group-item,
.panel > .panel-collapse > .list-group .list-group-item {
border-width: 1px 0;
border-radius: 0;
}
.panel > .list-group:first-child .list-group-item:first-child,
.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {
border-top: 0;
border-top-left-radius: 3px;
border-top-right-radius: 3px;
}
.panel > .list-group:last-child .list-group-item:last-child,
.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {
border-bottom: 0;
border-bottom-right-radius: 3px;
border-bottom-left-radius: 3px;
}
.panel-heading + .list-group .list-group-item:first-child {
border-top-width: 0;
}
.list-group + .panel-footer {
border-top-width: 0;
}
.panel > .table,
.panel > .table-responsive > .table,
.panel > .panel-collapse > .table {
margin-bottom: 0;
}
.panel > .table caption,
.panel > .table-responsive > .table caption,
.panel > .panel-collapse > .table caption {
padding-right: 15px;
padding-left: 15px;
}
.panel > .table:first-child,
.panel > .table-responsive:first-child > .table:first-child {
border-top-left-radius: 3px;
border-top-right-radius: 3px;
}
.panel > .table:first-child > thead:first-child > tr:first-child,
.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,
.panel > .table:first-child > tbody:first-child > tr:first-child,
.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {
border-top-left-radius: 3px;
border-top-right-radius: 3px;
}
.panel > .table:first-child > thead:first-child > tr:first-child td:first-child,
.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,
.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,
.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,
.panel > .table:first-child > thead:first-child > tr:first-child th:first-child,
.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,
.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,
.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {
border-top-left-radius: 3px;
}
.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,
.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,
.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,
.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,
.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,
.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,
.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,
.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {
border-top-right-radius: 3px;
}
.panel > .table:last-child,
.panel > .table-responsive:last-child > .table:last-child {
border-bottom-right-radius: 3px;
border-bottom-left-radius: 3px;
}
.panel > .table:last-child > tbody:last-child > tr:last-child,
.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,
.panel > .table:last-child > tfoot:last-child > tr:last-child,
.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {
border-bottom-right-radius: 3px;
border-bottom-left-radius: 3px;
}
.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,
.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,
.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,
.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,
.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,
.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,
.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,
.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {
border-bottom-left-radius: 3px;
}
.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,
.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,
.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,
.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,
.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,
.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,
.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,
.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {
border-bottom-right-radius: 3px;
}
.panel > .panel-body + .table,
.panel > .panel-body + .table-responsive,
.panel > .table + .panel-body,
.panel > .table-responsive + .panel-body {
border-top: 1px solid #ddd;
}
.panel > .table > tbody:first-child > tr:first-child th,
.panel > .table > tbody:first-child > tr:first-child td {
border-top: 0;
}
.panel > .table-bordered,
.panel > .table-responsive > .table-bordered {
border: 0;
}
.panel > .table-bordered > thead > tr > th:first-child,
.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,
.panel > .table-bordered > tbody > tr > th:first-child,
.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,
.panel > .table-bordered > tfoot > tr > th:first-child,
.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,
.panel > .table-bordered > thead > tr > td:first-child,
.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,
.panel > .table-bordered > tbody > tr > td:first-child,
.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,
.panel > .table-bordered > tfoot > tr > td:first-child,
.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {
border-left: 0;
}
.panel > .table-bordered > thead > tr > th:last-child,
.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,
.panel > .table-bordered > tbody > tr > th:last-child,
.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,
.panel > .table-bordered > tfoot > tr > th:last-child,
.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,
.panel > .table-bordered > thead > tr > td:last-child,
.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,
.panel > .table-bordered > tbody > tr > td:last-child,
.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,
.panel > .table-bordered > tfoot > tr > td:last-child,
.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {
border-right: 0;
}
.panel > .table-bordered > thead > tr:first-child > td,
.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,
.panel > .table-bordered > tbody > tr:first-child > td,
.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,
.panel > .table-bordered > thead > tr:first-child > th,
.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,
.panel > .table-bordered > tbody > tr:first-child > th,
.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {
border-bottom: 0;
}
.panel > .table-bordered > tbody > tr:last-child > td,
.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,
.panel > .table-bordered > tfoot > tr:last-child > td,
.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,
.panel > .table-bordered > tbody > tr:last-child > th,
.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,
.panel > .table-bordered > tfoot > tr:last-child > th,
.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {
border-bottom: 0;
}
.panel > .table-responsive {
margin-bottom: 0;
border: 0;
}
.panel-group {
margin-bottom: 20px;
}
.panel-group .panel {
margin-bottom: 0;
border-radius: 4px;
}
.panel-group .panel + .panel {
margin-top: 5px;
}
.panel-group .panel-heading {
border-bottom: 0;
}
.panel-group .panel-heading + .panel-collapse > .panel-body,
.panel-group .panel-heading + .panel-collapse > .list-group {
border-top: 1px solid #ddd;
}
.panel-group .panel-footer {
border-top: 0;
}
.panel-group .panel-footer + .panel-collapse .panel-body {
border-bottom: 1px solid #ddd;
}
.panel-default {
border-color: #ddd;
}
.panel-default > .panel-heading {
color: #333;
background-color: #f5f5f5;
border-color: #ddd;
}
.panel-default > .panel-heading + .panel-collapse > .panel-body {
border-top-color: #ddd;
}
.panel-default > .panel-heading .badge {
color: #f5f5f5;
background-color: #333;
}
.panel-default > .panel-footer + .panel-collapse > .panel-body {
border-bottom-color: #ddd;
}
.panel-primary {
border-color: #337ab7;
}
.panel-primary > .panel-heading {
color: #fff;
background-color: #337ab7;
border-color: #337ab7;
}
.panel-primary > .panel-heading + .panel-collapse > .panel-body {
border-top-color: #337ab7;
}
.panel-primary > .panel-heading .badge {
color: #337ab7;
background-color: #fff;
}
.panel-primary > .panel-footer + .panel-collapse > .panel-body {
border-bottom-color: #337ab7;
}
.panel-success {
border-color: #d6e9c6;
}
.panel-success > .panel-heading {
color: #3c763d;
background-color: #dff0d8;
border-color: #d6e9c6;
}
.panel-success > .panel-heading + .panel-collapse > .panel-body {
border-top-color: #d6e9c6;
}
.panel-success > .panel-heading .badge {
color: #dff0d8;
background-color: #3c763d;
}
.panel-success > .panel-footer + .panel-collapse > .panel-body {
border-bottom-color: #d6e9c6;
}
.panel-info {
border-color: #bce8f1;
}
.panel-info > .panel-heading {
color: #31708f;
background-color: #d9edf7;
border-color: #bce8f1;
}
.panel-info > .panel-heading + .panel-collapse > .panel-body {
border-top-color: #bce8f1;
}
.panel-info > .panel-heading .badge {
color: #d9edf7;
background-color: #31708f;
}
.panel-info > .panel-footer + .panel-collapse > .panel-body {
border-bottom-color: #bce8f1;
}
.panel-warning {
border-color: #faebcc;
}
.panel-warning > .panel-heading {
color: #8a6d3b;
background-color: #fcf8e3;
border-color: #faebcc;
}
.panel-warning > .panel-heading + .panel-collapse > .panel-body {
border-top-color: #faebcc;
}
.panel-warning > .panel-heading .badge {
color: #fcf8e3;
background-color: #8a6d3b;
}
.panel-warning > .panel-footer + .panel-collapse > .panel-body {
border-bottom-color: #faebcc;
}
.panel-danger {
border-color: #ebccd1;
}
.panel-danger > .panel-heading {
color: #a94442;
background-color: #f2dede;
border-color: #ebccd1;
}
.panel-danger > .panel-heading + .panel-collapse > .panel-body {
border-top-color: #ebccd1;
}
.panel-danger > .panel-heading .badge {
color: #f2dede;
background-color: #a94442;
}
.panel-danger > .panel-footer + .panel-collapse > .panel-body {
border-bottom-color: #ebccd1;
}
.embed-responsive {
position: relative;
display: block;
height: 0;
padding: 0;
overflow: hidden;
}
.embed-responsive .embed-responsive-item,
.embed-responsive iframe,
.embed-responsive embed,
.embed-responsive object,
.embed-responsive video {
position: absolute;
top: 0;
bottom: 0;
left: 0;
width: 100%;
height: 100%;
border: 0;
}
.embed-responsive-16by9 {
padding-bottom: 56.25%;
}
.embed-responsive-4by3 {
padding-bottom: 75%;
}
.well {
min-height: 20px;
padding: 19px;
margin-bottom: 20px;
background-color: #f5f5f5;
border: 1px solid #e3e3e3;
border-radius: 4px;
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05);
box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05);
}
.well blockquote {
border-color: #ddd;
border-color: rgba(0, 0, 0, .15);
}
.well-lg {
padding: 24px;
border-radius: 6px;
}
.well-sm {
padding: 9px;
border-radius: 3px;
}
.close {
float: right;
font-size: 21px;
font-weight: bold;
line-height: 1;
color: #000;
text-shadow: 0 1px 0 #fff;
filter: alpha(opacity=20);
opacity: .2;
}
.close:hover,
.close:focus {
color: #000;
text-decoration: none;
cursor: pointer;
filter: alpha(opacity=50);
opacity: .5;
}
button.close {
-webkit-appearance: none;
padding: 0;
cursor: pointer;
background: transparent;
border: 0;
}
.modal-open {
overflow: hidden;
}
.modal {
position: fixed;
top: 0;
right: 0;
bottom: 0;
left: 0;
z-index: 1050;
display: none;
overflow: hidden;
-webkit-overflow-scrolling: touch;
outline: 0;
}
.modal.fade .modal-dialog {
-webkit-transition: -webkit-transform .3s ease-out;
-o-transition: -o-transform .3s ease-out;
transition: transform .3s ease-out;
-webkit-transform: translate(0, -25%);
-ms-transform: translate(0, -25%);
-o-transform: translate(0, -25%);
transform: translate(0, -25%);
}
.modal.in .modal-dialog {
-webkit-transform: translate(0, 0);
-ms-transform: translate(0, 0);
-o-transform: translate(0, 0);
transform: translate(0, 0);
}
.modal-open .modal {
overflow-x: hidden;
overflow-y: auto;
}
.modal-dialog {
position: relative;
width: auto;
margin: 10px;
}
.modal-content {
position: relative;
background-color: #fff;
-webkit-background-clip: padding-box;
background-clip: padding-box;
border: 1px solid #999;
border: 1px solid rgba(0, 0, 0, .2);
border-radius: 6px;
outline: 0;
-webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5);
box-shadow: 0 3px 9px rgba(0, 0, 0, .5);
}
.modal-backdrop {
position: fixed;
top: 0;
right: 0;
bottom: 0;
left: 0;
z-index: 1040;
background-color: #000;
}
.modal-backdrop.fade {
filter: alpha(opacity=0);
opacity: 0;
}
.modal-backdrop.in {
filter: alpha(opacity=50);
opacity: .5;
}
.modal-header {
min-height: 16.42857143px;
padding: 15px;
border-bottom: 1px solid #e5e5e5;
}
.modal-header .close {
margin-top: -2px;
}
.modal-title {
margin: 0;
line-height: 1.42857143;
}
.modal-body {
position: relative;
padding: 15px;
}
.modal-footer {
padding: 15px;
text-align: right;
border-top: 1px solid #e5e5e5;
}
.modal-footer .btn + .btn {
margin-bottom: 0;
margin-left: 5px;
}
.modal-footer .btn-group .btn + .btn {
margin-left: -1px;
}
.modal-footer .btn-block + .btn-block {
margin-left: 0;
}
.modal-scrollbar-measure {
position: absolute;
top: -9999px;
width: 50px;
height: 50px;
overflow: scroll;
}
@media (min-width: 768px) {
.modal-dialog {
width: 600px;
margin: 30px auto;
}
.modal-content {
-webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5);
box-shadow: 0 5px 15px rgba(0, 0, 0, .5);
}
.modal-sm {
width: 300px;
}
}
@media (min-width: 992px) {
.modal-lg {
width: 900px;
}
}
.tooltip {
position: absolute;
z-index: 1070;
display: block;
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
font-size: 12px;
font-weight: normal;
line-height: 1.4;
filter: alpha(opacity=0);
opacity: 0;
}
.tooltip.in {
filter: alpha(opacity=90);
opacity: .9;
}
.tooltip.top {
padding: 5px 0;
margin-top: -3px;
}
.tooltip.right {
padding: 0 5px;
margin-left: 3px;
}
.tooltip.bottom {
padding: 5px 0;
margin-top: 3px;
}
.tooltip.left {
padding: 0 5px;
margin-left: -3px;
}
.tooltip-inner {
max-width: 200px;
padding: 3px 8px;
color: #fff;
text-align: center;
text-decoration: none;
background-color: #000;
border-radius: 4px;
}
.tooltip-arrow {
position: absolute;
width: 0;
height: 0;
border-color: transparent;
border-style: solid;
}
.tooltip.top .tooltip-arrow {
bottom: 0;
left: 50%;
margin-left: -5px;
border-width: 5px 5px 0;
border-top-color: #000;
}
.tooltip.top-left .tooltip-arrow {
right: 5px;
bottom: 0;
margin-bottom: -5px;
border-width: 5px 5px 0;
border-top-color: #000;
}
.tooltip.top-right .tooltip-arrow {
bottom: 0;
left: 5px;
margin-bottom: -5px;
border-width: 5px 5px 0;
border-top-color: #000;
}
.tooltip.right .tooltip-arrow {
top: 50%;
left: 0;
margin-top: -5px;
border-width: 5px 5px 5px 0;
border-right-color: #000;
}
.tooltip.left .tooltip-arrow {
top: 50%;
right: 0;
margin-top: -5px;
border-width: 5px 0 5px 5px;
border-left-color: #000;
}
.tooltip.bottom .tooltip-arrow {
top: 0;
left: 50%;
margin-left: -5px;
border-width: 0 5px 5px;
border-bottom-color: #000;
}
.tooltip.bottom-left .tooltip-arrow {
top: 0;
right: 5px;
margin-top: -5px;
border-width: 0 5px 5px;
border-bottom-color: #000;
}
.tooltip.bottom-right .tooltip-arrow {
top: 0;
left: 5px;
margin-top: -5px;
border-width: 0 5px 5px;
border-bottom-color: #000;
}
.popover {
position: absolute;
top: 0;
left: 0;
z-index: 1060;
display: none;
max-width: 276px;
padding: 1px;
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
font-size: 14px;
font-weight: normal;
line-height: 1.42857143;
text-align: left;
white-space: normal;
background-color: #fff;
-webkit-background-clip: padding-box;
background-clip: padding-box;
border: 1px solid #ccc;
border: 1px solid rgba(0, 0, 0, .2);
border-radius: 6px;
-webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, .2);
box-shadow: 0 5px 10px rgba(0, 0, 0, .2);
}
.popover.top {
margin-top: -10px;
}
.popover.right {
margin-left: 10px;
}
.popover.bottom {
margin-top: 10px;
}
.popover.left {
margin-left: -10px;
}
.popover-title {
padding: 8px 14px;
margin: 0;
font-size: 14px;
background-color: #f7f7f7;
border-bottom: 1px solid #ebebeb;
border-radius: 5px 5px 0 0;
}
.popover-content {
padding: 9px 14px;
}
.popover > .arrow,
.popover > .arrow:after {
position: absolute;
display: block;
width: 0;
height: 0;
border-color: transparent;
border-style: solid;
}
.popover > .arrow {
border-width: 11px;
}
.popover > .arrow:after {
content: "";
border-width: 10px;
}
.popover.top > .arrow {
bottom: -11px;
left: 50%;
margin-left: -11px;
border-top-color: #999;
border-top-color: rgba(0, 0, 0, .25);
border-bottom-width: 0;
}
.popover.top > .arrow:after {
bottom: 1px;
margin-left: -10px;
content: " ";
border-top-color: #fff;
border-bottom-width: 0;
}
.popover.right > .arrow {
top: 50%;
left: -11px;
margin-top: -11px;
border-right-color: #999;
border-right-color: rgba(0, 0, 0, .25);
border-left-width: 0;
}
.popover.right > .arrow:after {
bottom: -10px;
left: 1px;
content: " ";
border-right-color: #fff;
border-left-width: 0;
}
.popover.bottom > .arrow {
top: -11px;
left: 50%;
margin-left: -11px;
border-top-width: 0;
border-bottom-color: #999;
border-bottom-color: rgba(0, 0, 0, .25);
}
.popover.bottom > .arrow:after {
top: 1px;
margin-left: -10px;
content: " ";
border-top-width: 0;
border-bottom-color: #fff;
}
.popover.left > .arrow {
top: 50%;
right: -11px;
margin-top: -11px;
border-right-width: 0;
border-left-color: #999;
border-left-color: rgba(0, 0, 0, .25);
}
.popover.left > .arrow:after {
right: 1px;
bottom: -10px;
content: " ";
border-right-width: 0;
border-left-color: #fff;
}
.carousel {
position: relative;
}
.carousel-inner {
position: relative;
width: 100%;
overflow: hidden;
}
.carousel-inner > .item {
position: relative;
display: none;
-webkit-transition: .6s ease-in-out left;
-o-transition: .6s ease-in-out left;
transition: .6s ease-in-out left;
}
.carousel-inner > .item > img,
.carousel-inner > .item > a > img {
line-height: 1;
}
@media all and (transform-3d), (-webkit-transform-3d) {
.carousel-inner > .item {
-webkit-transition: -webkit-transform .6s ease-in-out;
-o-transition: -o-transform .6s ease-in-out;
transition: transform .6s ease-in-out;
-webkit-backface-visibility: hidden;
backface-visibility: hidden;
-webkit-perspective: 1000;
perspective: 1000;
}
.carousel-inner > .item.next,
.carousel-inner > .item.active.right {
left: 0;
-webkit-transform: translate3d(100%, 0, 0);
transform: translate3d(100%, 0, 0);
}
.carousel-inner > .item.prev,
.carousel-inner > .item.active.left {
left: 0;
-webkit-transform: translate3d(-100%, 0, 0);
transform: translate3d(-100%, 0, 0);
}
.carousel-inner > .item.next.left,
.carousel-inner > .item.prev.right,
.carousel-inner > .item.active {
left: 0;
-webkit-transform: translate3d(0, 0, 0);
transform: translate3d(0, 0, 0);
}
}
.carousel-inner > .active,
.carousel-inner > .next,
.carousel-inner > .prev {
display: block;
}
.carousel-inner > .active {
left: 0;
}
.carousel-inner > .next,
.carousel-inner > .prev {
position: absolute;
top: 0;
width: 100%;
}
.carousel-inner > .next {
left: 100%;
}
.carousel-inner > .prev {
left: -100%;
}
.carousel-inner > .next.left,
.carousel-inner > .prev.right {
left: 0;
}
.carousel-inner > .active.left {
left: -100%;
}
.carousel-inner > .active.right {
left: 100%;
}
.carousel-control {
position: absolute;
top: 0;
bottom: 0;
left: 0;
width: 15%;
font-size: 20px;
color: #fff;
text-align: center;
text-shadow: 0 1px 2px rgba(0, 0, 0, .6);
filter: alpha(opacity=50);
opacity: .5;
}
.carousel-control.left {
background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);
background-image: -o-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);
background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .5)), to(rgba(0, 0, 0, .0001)));
background-image: linear-gradient(to right, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);
background-repeat: repeat-x;
}
.carousel-control.right {
right: 0;
left: auto;
background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);
background-image: -o-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);
background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .0001)), to(rgba(0, 0, 0, .5)));
background-image: linear-gradient(to right, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);
background-repeat: repeat-x;
}
.carousel-control:hover,
.carousel-control:focus {
color: #fff;
text-decoration: none;
filter: alpha(opacity=90);
outline: 0;
opacity: .9;
}
.carousel-control .icon-prev,
.carousel-control .icon-next,
.carousel-control .glyphicon-chevron-left,
.carousel-control .glyphicon-chevron-right {
position: absolute;
top: 50%;
z-index: 5;
display: inline-block;
}
.carousel-control .icon-prev,
.carousel-control .glyphicon-chevron-left {
left: 50%;
margin-left: -10px;
}
.carousel-control .icon-next,
.carousel-control .glyphicon-chevron-right {
right: 50%;
margin-right: -10px;
}
.carousel-control .icon-prev,
.carousel-control .icon-next {
width: 20px;
height: 20px;
margin-top: -10px;
font-family: serif;
line-height: 1;
}
.carousel-control .icon-prev:before {
content: '\2039';
}
.carousel-control .icon-next:before {
content: '\203a';
}
.carousel-indicators {
position: absolute;
bottom: 10px;
left: 50%;
z-index: 15;
width: 60%;
padding-left: 0;
margin-left: -30%;
text-align: center;
list-style: none;
}
.carousel-indicators li {
display: inline-block;
width: 10px;
height: 10px;
margin: 1px;
text-indent: -999px;
cursor: pointer;
background-color: #000 \9;
background-color: rgba(0, 0, 0, 0);
border: 1px solid #fff;
border-radius: 10px;
}
.carousel-indicators .active {
width: 12px;
height: 12px;
margin: 0;
background-color: #fff;
}
.carousel-caption {
position: absolute;
right: 15%;
bottom: 20px;
left: 15%;
z-index: 10;
padding-top: 20px;
padding-bottom: 20px;
color: #fff;
text-align: center;
text-shadow: 0 1px 2px rgba(0, 0, 0, .6);
}
.carousel-caption .btn {
text-shadow: none;
}
@media screen and (min-width: 768px) {
.carousel-control .glyphicon-chevron-left,
.carousel-control .glyphicon-chevron-right,
.carousel-control .icon-prev,
.carousel-control .icon-next {
width: 30px;
height: 30px;
margin-top: -15px;
font-size: 30px;
}
.carousel-control .glyphicon-chevron-left,
.carousel-control .icon-prev {
margin-left: -15px;
}
.carousel-control .glyphicon-chevron-right,
.carousel-control .icon-next {
margin-right: -15px;
}
.carousel-caption {
right: 20%;
left: 20%;
padding-bottom: 30px;
}
.carousel-indicators {
bottom: 20px;
}
}
.clearfix:before,
.clearfix:after,
.dl-horizontal dd:before,
.dl-horizontal dd:after,
.container:before,
.container:after,
.container-fluid:before,
.container-fluid:after,
.row:before,
.row:after,
.form-horizontal .form-group:before,
.form-horizontal .form-group:after,
.btn-toolbar:before,
.btn-toolbar:after,
.btn-group-vertical > .btn-group:before,
.btn-group-vertical > .btn-group:after,
.nav:before,
.nav:after,
.navbar:before,
.navbar:after,
.navbar-header:before,
.navbar-header:after,
.navbar-collapse:before,
.navbar-collapse:after,
.pager:before,
.pager:after,
.panel-body:before,
.panel-body:after,
.modal-footer:before,
.modal-footer:after {
display: table;
content: " ";
}
.clearfix:after,
.dl-horizontal dd:after,
.container:after,
.container-fluid:after,
.row:after,
.form-horizontal .form-group:after,
.btn-toolbar:after,
.btn-group-vertical > .btn-group:after,
.nav:after,
.navbar:after,
.navbar-header:after,
.navbar-collapse:after,
.pager:after,
.panel-body:after,
.modal-footer:after {
clear: both;
}
.center-block {
display: block;
margin-right: auto;
margin-left: auto;
}
.pull-right {
float: right !important;
}
.pull-left {
float: left !important;
}
.hide {
display: none !important;
}
.show {
display: block !important;
}
.invisible {
visibility: hidden;
}
.text-hide {
font: 0/0 a;
color: transparent;
text-shadow: none;
background-color: transparent;
border: 0;
}
.hidden {
display: none !important;
}
.affix {
position: fixed;
}
@-ms-viewport {
width: device-width;
}
.visible-xs,
.visible-sm,
.visible-md,
.visible-lg {
display: none !important;
}
.visible-xs-block,
.visible-xs-inline,
.visible-xs-inline-block,
.visible-sm-block,
.visible-sm-inline,
.visible-sm-inline-block,
.visible-md-block,
.visible-md-inline,
.visible-md-inline-block,
.visible-lg-block,
.visible-lg-inline,
.visible-lg-inline-block {
display: none !important;
}
@media (max-width: 767px) {
.visible-xs {
display: block !important;
}
table.visible-xs {
display: table;
}
tr.visible-xs {
display: table-row !important;
}
th.visible-xs,
td.visible-xs {
display: table-cell !important;
}
}
@media (max-width: 767px) {
.visible-xs-block {
display: block !important;
}
}
@media (max-width: 767px) {
.visible-xs-inline {
display: inline !important;
}
}
@media (max-width: 767px) {
.visible-xs-inline-block {
display: inline-block !important;
}
}
@media (min-width: 768px) and (max-width: 991px) {
.visible-sm {
display: block !important;
}
table.visible-sm {
display: table;
}
tr.visible-sm {
display: table-row !important;
}
th.visible-sm,
td.visible-sm {
display: table-cell !important;
}
}
@media (min-width: 768px) and (max-width: 991px) {
.visible-sm-block {
display: block !important;
}
}
@media (min-width: 768px) and (max-width: 991px) {
.visible-sm-inline {
display: inline !important;
}
}
@media (min-width: 768px) and (max-width: 991px) {
.visible-sm-inline-block {
display: inline-block !important;
}
}
@media (min-width: 992px) and (max-width: 1199px) {
.visible-md {
display: block !important;
}
table.visible-md {
display: table;
}
tr.visible-md {
display: table-row !important;
}
th.visible-md,
td.visible-md {
display: table-cell !important;
}
}
@media (min-width: 992px) and (max-width: 1199px) {
.visible-md-block {
display: block !important;
}
}
@media (min-width: 992px) and (max-width: 1199px) {
.visible-md-inline {
display: inline !important;
}
}
@media (min-width: 992px) and (max-width: 1199px) {
.visible-md-inline-block {
display: inline-block !important;
}
}
@media (min-width: 1200px) {
.visible-lg {
display: block !important;
}
table.visible-lg {
display: table;
}
tr.visible-lg {
display: table-row !important;
}
th.visible-lg,
td.visible-lg {
display: table-cell !important;
}
}
@media (min-width: 1200px) {
.visible-lg-block {
display: block !important;
}
}
@media (min-width: 1200px) {
.visible-lg-inline {
display: inline !important;
}
}
@media (min-width: 1200px) {
.visible-lg-inline-block {
display: inline-block !important;
}
}
@media (max-width: 767px) {
.hidden-xs {
display: none !important;
}
}
@media (min-width: 768px) and (max-width: 991px) {
.hidden-sm {
display: none !important;
}
}
@media (min-width: 992px) and (max-width: 1199px) {
.hidden-md {
display: none !important;
}
}
@media (min-width: 1200px) {
.hidden-lg {
display: none !important;
}
}
.visible-print {
display: none !important;
}
@media print {
.visible-print {
display: block !important;
}
table.visible-print {
display: table;
}
tr.visible-print {
display: table-row !important;
}
th.visible-print,
td.visible-print {
display: table-cell !important;
}
}
.visible-print-block {
display: none !important;
}
@media print {
.visible-print-block {
display: block !important;
}
}
.visible-print-inline {
display: none !important;
}
@media print {
.visible-print-inline {
display: inline !important;
}
}
.visible-print-inline-block {
display: none !important;
}
@media print {
.visible-print-inline-block {
display: inline-block !important;
}
}
@media print {
.hidden-print {
display: none !important;
}
}
/*# sourceMappingURL=bootstrap.css.map */
/*!
* Bootstrap v3.2.0 (http://getbootstrap.com)
* Copyright 2011-2014 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
*/
if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){return a(b.target).is(this)?b.handleObj.handler.apply(this,arguments):void 0}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.2.0",d.prototype.close=function(b){function c(){f.detach().trigger("closed.bs.alert").remove()}var d=a(this),e=d.attr("data-target");e||(e=d.attr("href"),e=e&&e.replace(/.*(?=#[^\s]*$)/,""));var f=a(e);b&&b.preventDefault(),f.length||(f=d.hasClass("alert")?d:d.parent()),f.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one("bsTransitionEnd",c).emulateTransitionEnd(150):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.2.0",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),d[e](null==f[b]?this.options[b]:f[b]),setTimeout(a.proxy(function(){"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")&&(c.prop("checked")&&this.$element.hasClass("active")?a=!1:b.find(".active").removeClass("active")),a&&c.prop("checked",!this.$element.hasClass("active")).trigger("change")}a&&this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target);d.hasClass("btn")||(d=d.closest(".btn")),b.call(d,"toggle"),c.preventDefault()})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b).on("keydown.bs.carousel",a.proxy(this.keydown,this)),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=this.sliding=this.interval=this.$active=this.$items=null,"hover"==this.options.pause&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.2.0",c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0},c.prototype.keydown=function(a){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.to=function(b){var c=this,d=this.getItemIndex(this.$active=this.$element.find(".item.active"));return b>this.$items.length-1||0>b?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){c.to(b)}):d==b?this.pause().cycle():this.slide(b>d?"next":"prev",a(this.$items[b]))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){return this.sliding?void 0:this.slide("next")},c.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},c.prototype.slide=function(b,c){var d=this.$element.find(".item.active"),e=c||d[b](),f=this.interval,g="next"==b?"left":"right",h="next"==b?"first":"last",i=this;if(!e.length){if(!this.options.wrap)return;e=this.$element.find(".item")[h]()}if(e.hasClass("active"))return this.sliding=!1;var j=e[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:g});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,f&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(e)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:g});return a.support.transition&&this.$element.hasClass("slide")?(e.addClass(b),e[0].offsetWidth,d.addClass(g),e.addClass(g),d.one("bsTransitionEnd",function(){e.removeClass([b,g].join(" ")).addClass("active"),d.removeClass(["active",g].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(1e3*d.css("transition-duration").slice(0,-1))):(d.removeClass("active"),e.addClass("active"),this.sliding=!1,this.$element.trigger(m)),f&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this},a(document).on("click.bs.carousel.data-api","[data-slide], [data-slide-to]",function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}}),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.collapse"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b);!e&&f.toggle&&"show"==b&&(b=!b),e||d.data("bs.collapse",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.transitioning=null,this.options.parent&&(this.$parent=a(this.options.parent)),this.options.toggle&&this.toggle()};c.VERSION="3.2.0",c.DEFAULTS={toggle:!0},c.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},c.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var c=a.Event("show.bs.collapse");if(this.$element.trigger(c),!c.isDefaultPrevented()){var d=this.$parent&&this.$parent.find("> .panel > .in");if(d&&d.length){var e=d.data("bs.collapse");if(e&&e.transitioning)return;b.call(d,"hide"),e||d.data("bs.collapse",null)}var f=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[f](0),this.transitioning=1;var g=function(){this.$element.removeClass("collapsing").addClass("collapse in")[f](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return g.call(this);var h=a.camelCase(["scroll",f].join("-"));this.$element.one("bsTransitionEnd",a.proxy(g,this)).emulateTransitionEnd(350)[f](this.$element[0][h])}}},c.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse").removeClass("in"),this.transitioning=1;var d=function(){this.transitioning=0,this.$element.trigger("hidden.bs.collapse").removeClass("collapsing").addClass("collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(d,this)).emulateTransitionEnd(350):d.call(this)}}},c.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()};var d=a.fn.collapse;a.fn.collapse=b,a.fn.collapse.Constructor=c,a.fn.collapse.noConflict=function(){return a.fn.collapse=d,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(c){var d,e=a(this),f=e.attr("data-target")||c.preventDefault()||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""),g=a(f),h=g.data("bs.collapse"),i=h?"toggle":e.data(),j=e.attr("data-parent"),k=j&&a(j);h&&h.transitioning||(k&&k.find('[data-toggle="collapse"][data-parent="'+j+'"]').not(e).addClass("collapsed"),e[g.hasClass("in")?"addClass":"removeClass"]("collapsed")),b.call(g,i)})}(jQuery),+function(a){"use strict";function b(b){b&&3===b.which||(a(e).remove(),a(f).each(function(){var d=c(a(this)),e={relatedTarget:this};d.hasClass("open")&&(d.trigger(b=a.Event("hide.bs.dropdown",e)),b.isDefaultPrevented()||d.removeClass("open").trigger("hidden.bs.dropdown",e))}))}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.2.0",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a('<div class="dropdown-backdrop"/>').insertAfter(a(this)).on("click",b);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus"),f.toggleClass("open").trigger("shown.bs.dropdown",h)}return!1}},g.prototype.keydown=function(b){if(/(38|40|27)/.test(b.keyCode)){var d=a(this);if(b.preventDefault(),b.stopPropagation(),!d.is(".disabled, :disabled")){var e=c(d),g=e.hasClass("open");if(!g||g&&27==b.keyCode)return 27==b.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.divider):visible a",i=e.find('[role="menu"]'+h+', [role="listbox"]'+h);if(i.length){var j=i.index(i.filter(":focus"));38==b.keyCode&&j>0&&j--,40==b.keyCode&&j<i.length-1&&j++,~j||(j=0),i.eq(j).trigger("focus")}}}};var h=a.fn.dropdown;a.fn.dropdown=d,a.fn.dropdown.Constructor=g,a.fn.dropdown.noConflict=function(){return a.fn.dropdown=h,this},a(document).on("click.bs.dropdown.data-api",b).on("click.bs.dropdown.data-api",".dropdown form",function(a){a.stopPropagation()}).on("click.bs.dropdown.data-api",f,g.prototype.toggle).on("keydown.bs.dropdown.data-api",f+', [role="menu"], [role="listbox"]',g.prototype.keydown)}(jQuery),+function(a){"use strict";function b(b,d){return this.each(function(){var e=a(this),f=e.data("bs.modal"),g=a.extend({},c.DEFAULTS,e.data(),"object"==typeof b&&b);f||e.data("bs.modal",f=new c(this,g)),"string"==typeof b?f[b](d):g.show&&f.show(d)})}var c=function(b,c){this.options=c,this.$body=a(document.body),this.$element=a(b),this.$backdrop=this.isShown=null,this.scrollbarWidth=0,this.options.remote&&this.$element.find(".modal-content").load(this.options.remote,a.proxy(function(){this.$element.trigger("loaded.bs.modal")},this))};c.VERSION="3.2.0",c.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},c.prototype.toggle=function(a){return this.isShown?this.hide():this.show(a)},c.prototype.show=function(b){var c=this,d=a.Event("show.bs.modal",{relatedTarget:b});this.$element.trigger(d),this.isShown||d.isDefaultPrevented()||(this.isShown=!0,this.checkScrollbar(),this.$body.addClass("modal-open"),this.setScrollbar(),this.escape(),this.$element.on("click.dismiss.bs.modal",'[data-dismiss="modal"]',a.proxy(this.hide,this)),this.backdrop(function(){var d=a.support.transition&&c.$element.hasClass("fade");c.$element.parent().length||c.$element.appendTo(c.$body),c.$element.show().scrollTop(0),d&&c.$element[0].offsetWidth,c.$element.addClass("in").attr("aria-hidden",!1),c.enforceFocus();var e=a.Event("shown.bs.modal",{relatedTarget:b});d?c.$element.find(".modal-dialog").one("bsTransitionEnd",function(){c.$element.trigger("focus").trigger(e)}).emulateTransitionEnd(300):c.$element.trigger("focus").trigger(e)}))},c.prototype.hide=function(b){b&&b.preventDefault(),b=a.Event("hide.bs.modal"),this.$element.trigger(b),this.isShown&&!b.isDefaultPrevented()&&(this.isShown=!1,this.$body.removeClass("modal-open"),this.resetScrollbar(),this.escape(),a(document).off("focusin.bs.modal"),this.$element.removeClass("in").attr("aria-hidden",!0).off("click.dismiss.bs.modal"),a.support.transition&&this.$element.hasClass("fade")?this.$element.one("bsTransitionEnd",a.proxy(this.hideModal,this)).emulateTransitionEnd(300):this.hideModal())},c.prototype.enforceFocus=function(){a(document).off("focusin.bs.modal").on("focusin.bs.modal",a.proxy(function(a){this.$element[0]===a.target||this.$element.has(a.target).length||this.$element.trigger("focus")},this))},c.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on("keyup.dismiss.bs.modal",a.proxy(function(a){27==a.which&&this.hide()},this)):this.isShown||this.$element.off("keyup.dismiss.bs.modal")},c.prototype.hideModal=function(){var a=this;this.$element.hide(),this.backdrop(function(){a.$element.trigger("hidden.bs.modal")})},c.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},c.prototype.backdrop=function(b){var c=this,d=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var e=a.support.transition&&d;if(this.$backdrop=a('<div class="modal-backdrop '+d+'" />').appendTo(this.$body),this.$element.on("click.dismiss.bs.modal",a.proxy(function(a){a.target===a.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus.call(this.$element[0]):this.hide.call(this))},this)),e&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!b)return;e?this.$backdrop.one("bsTransitionEnd",b).emulateTransitionEnd(150):b()}else if(!this.isShown&&this.$backdrop){this.$backdrop.removeClass("in");var f=function(){c.removeBackdrop(),b&&b()};a.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one("bsTransitionEnd",f).emulateTransitionEnd(150):f()}else b&&b()},c.prototype.checkScrollbar=function(){document.body.clientWidth>=window.innerWidth||(this.scrollbarWidth=this.scrollbarWidth||this.measureScrollbar())},c.prototype.setScrollbar=function(){var a=parseInt(this.$body.css("padding-right")||0,10);this.scrollbarWidth&&this.$body.css("padding-right",a+this.scrollbarWidth)},c.prototype.resetScrollbar=function(){this.$body.css("padding-right","")},c.prototype.measureScrollbar=function(){var a=document.createElement("div");a.className="modal-scrollbar-measure",this.$body.append(a);var b=a.offsetWidth-a.clientWidth;return this.$body[0].removeChild(a),b};var d=a.fn.modal;a.fn.modal=b,a.fn.modal.Constructor=c,a.fn.modal.noConflict=function(){return a.fn.modal=d,this},a(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(c){var d=a(this),e=d.attr("href"),f=a(d.attr("data-target")||e&&e.replace(/.*(?=#[^\s]+$)/,"")),g=f.data("bs.modal")?"toggle":a.extend({remote:!/#/.test(e)&&e},f.data(),d.data());d.is("a")&&c.preventDefault(),f.one("show.bs.modal",function(a){a.isDefaultPrevented()||f.one("hidden.bs.modal",function(){d.is(":visible")&&d.trigger("focus")})}),b.call(f,g,this)})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tooltip"),f="object"==typeof b&&b;(e||"destroy"!=b)&&(e||d.data("bs.tooltip",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.type=this.options=this.enabled=this.timeout=this.hoverState=this.$element=null,this.init("tooltip",a,b)};c.VERSION="3.2.0",c.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(this.options.viewport.selector||this.options.viewport);for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show()},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide()},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var c=a.contains(document.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!c)return;var d=this,e=this.tip(),f=this.getUID(this.type);this.setContent(),e.attr("id",f),this.$element.attr("aria-describedby",f),this.options.animation&&e.addClass("fade");var g="function"==typeof this.options.placement?this.options.placement.call(this,e[0],this.$element[0]):this.options.placement,h=/\s?auto?\s?/i,i=h.test(g);i&&(g=g.replace(h,"")||"top"),e.detach().css({top:0,left:0,display:"block"}).addClass(g).data("bs."+this.type,this),this.options.container?e.appendTo(this.options.container):e.insertAfter(this.$element);var j=this.getPosition(),k=e[0].offsetWidth,l=e[0].offsetHeight;if(i){var m=g,n=this.$element.parent(),o=this.getPosition(n);g="bottom"==g&&j.top+j.height+l-o.scroll>o.height?"top":"top"==g&&j.top-o.scroll-l<0?"bottom":"right"==g&&j.right+k>o.width?"left":"left"==g&&j.left-k<o.left?"right":g,e.removeClass(m).addClass(g)}var p=this.getCalculatedOffset(g,j,k,l);this.applyPlacement(p,g);var q=function(){d.$element.trigger("shown.bs."+d.type),d.hoverState=null};a.support.transition&&this.$tip.hasClass("fade")?e.one("bsTransitionEnd",q).emulateTransitionEnd(150):q()}},c.prototype.applyPlacement=function(b,c){var d=this.tip(),e=d[0].offsetWidth,f=d[0].offsetHeight,g=parseInt(d.css("margin-top"),10),h=parseInt(d.css("margin-left"),10);isNaN(g)&&(g=0),isNaN(h)&&(h=0),b.top=b.top+g,b.left=b.left+h,a.offset.setOffset(d[0],a.extend({using:function(a){d.css({top:Math.round(a.top),left:Math.round(a.left)})}},b),0),d.addClass("in");var i=d[0].offsetWidth,j=d[0].offsetHeight;"top"==c&&j!=f&&(b.top=b.top+f-j);var k=this.getViewportAdjustedDelta(c,b,i,j);k.left?b.left+=k.left:b.top+=k.top;var l=k.left?2*k.left-e+i:2*k.top-f+j,m=k.left?"left":"top",n=k.left?"offsetWidth":"offsetHeight";d.offset(b),this.replaceArrow(l,d[0][n],m)},c.prototype.replaceArrow=function(a,b,c){this.arrow().css(c,a?50*(1-a/b)+"%":"")},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle();a.find(".tooltip-inner")[this.options.html?"html":"text"](b),a.removeClass("fade in top bottom left right")},c.prototype.hide=function(){function b(){"in"!=c.hoverState&&d.detach(),c.$element.trigger("hidden.bs."+c.type)}var c=this,d=this.tip(),e=a.Event("hide.bs."+this.type);return this.$element.removeAttr("aria-describedby"),this.$element.trigger(e),e.isDefaultPrevented()?void 0:(d.removeClass("in"),a.support.transition&&this.$tip.hasClass("fade")?d.one("bsTransitionEnd",b).emulateTransitionEnd(150):b(),this.hoverState=null,this)},c.prototype.fixTitle=function(){var a=this.$element;(a.attr("title")||"string"!=typeof a.attr("data-original-title"))&&a.attr("data-original-title",a.attr("title")||"").attr("title","")},c.prototype.hasContent=function(){return this.getTitle()},c.prototype.getPosition=function(b){b=b||this.$element;var c=b[0],d="BODY"==c.tagName;return a.extend({},"function"==typeof c.getBoundingClientRect?c.getBoundingClientRect():null,{scroll:d?document.documentElement.scrollTop||document.body.scrollTop:b.scrollTop(),width:d?a(window).width():b.outerWidth(),height:d?a(window).height():b.outerHeight()},d?{top:0,left:0}:b.offset())},c.prototype.getCalculatedOffset=function(a,b,c,d){return"bottom"==a?{top:b.top+b.height,left:b.left+b.width/2-c/2}:"top"==a?{top:b.top-d,left:b.left+b.width/2-c/2}:"left"==a?{top:b.top+b.height/2-d/2,left:b.left-c}:{top:b.top+b.height/2-d/2,left:b.left+b.width}},c.prototype.getViewportAdjustedDelta=function(a,b,c,d){var e={top:0,left:0};if(!this.$viewport)return e;var f=this.options.viewport&&this.options.viewport.padding||0,g=this.getPosition(this.$viewport);if(/right|left/.test(a)){var h=b.top-f-g.scroll,i=b.top+f-g.scroll+d;h<g.top?e.top=g.top-h:i>g.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;j<g.left?e.left=g.left-j:k>g.width&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){return this.$tip=this.$tip||a(this.options.template)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.validate=function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){clearTimeout(this.timeout),this.hide().$element.off("."+this.type).removeData("bs."+this.type)};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b;(e||"destroy"!=b)&&(e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.2.0",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").empty()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")},c.prototype.tip=function(){return this.$tip||(this.$tip=a(this.options.template)),this.$tip};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){var e=a.proxy(this.process,this);this.$body=a("body"),this.$scrollElement=a(a(c).is("body")?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",e),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.2.0",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b="offset",c=0;a.isWindow(this.$scrollElement[0])||(b="position",c=this.$scrollElement.scrollTop()),this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight();var d=this;this.$body.find(this.selector).map(function(){var d=a(this),e=d.data("target")||d.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[b]().top+c,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){d.offsets.push(this[0]),d.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b<=e[0])return g!=(a=f[0])&&this.activate(a);for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(!e[a+1]||b<=e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){this.activeTarget=b,a(this.selector).parentsUntil(this.options.target,".active").removeClass("active");var c=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',d=a(c).parents("li").addClass("active");d.parent(".dropdown-menu").length&&(d=d.closest("li.dropdown").addClass("active")),d.trigger("activate.bs.scrollspy")};var d=a.fn.scrollspy;a.fn.scrollspy=c,a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=d,this},a(window).on("load.bs.scrollspy.data-api",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);c.call(b,b.data())})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new c(this)),"string"==typeof b&&e[b]()})}var c=function(b){this.element=a(b)};c.VERSION="3.2.0",c.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.data("target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){var e=c.find(".active:last a")[0],f=a.Event("show.bs.tab",{relatedTarget:e});if(b.trigger(f),!f.isDefaultPrevented()){var g=a(d);this.activate(b.closest("li"),c),this.activate(g,g.parent(),function(){b.trigger({type:"shown.bs.tab",relatedTarget:e})})}}},c.prototype.activate=function(b,c,d){function e(){f.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),b.addClass("active"),g?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu")&&b.closest("li.dropdown").addClass("active"),d&&d()}var f=c.find("> .active"),g=d&&a.support.transition&&f.hasClass("fade");g?f.one("bsTransitionEnd",e).emulateTransitionEnd(150):e(),f.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this},a(document).on("click.bs.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(c){c.preventDefault(),b.call(a(this),"show")})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=this.unpin=this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.2.0",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=a(document).height(),d=this.$target.scrollTop(),e=this.$element.offset(),f=this.options.offset,g=f.top,h=f.bottom;"object"!=typeof f&&(h=g=f),"function"==typeof g&&(g=f.top(this.$element)),"function"==typeof h&&(h=f.bottom(this.$element));var i=null!=this.unpin&&d+this.unpin<=e.top?!1:null!=h&&e.top+this.$element.height()>=b-h?"bottom":null!=g&&g>=d?"top":!1;if(this.affixed!==i){null!=this.unpin&&this.$element.css("top","");var j="affix"+(i?"-"+i:""),k=a.Event(j+".bs.affix");this.$element.trigger(k),k.isDefaultPrevented()||(this.affixed=i,this.unpin="bottom"==i?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(j).trigger(a.Event(j.replace("affix","affixed"))),"bottom"==i&&this.$element.offset({top:b-this.$element.height()-h}))}}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},d.offsetBottom&&(d.offset.bottom=d.offsetBottom),d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery);
/* stylize header */
h1 {
font-size: 45px;
font-weight: 300;
margin-top: 10px;
margin-bottom: 20px;
}
/*stylize footer */
footer {
margin-left: 200px;
text-align: center;
background-color: #f5f5f5;
font-size: 13px;
padding-left:10px;
padding-right:10px;
}
/* for highlighting row/col labels on hover*/
text.active {
font-weight: bold;
}
/* default svg size for fixed svg option*/
#svg_div{
width:600px;
height:600px;
}
/* stylize the sidebar instructions */
#clust_instruct_container{
display: block;
position:absolute;
width:200px;
padding-right: 0px;
margin-left: 10px;
}
/* stylize instructions */
.viz_instruct_text{
width:99%;
margin: 0 auto;
color:#333;
text-align: justify;
font-size: 12px;
font-weight: 300;
padding-left: 0px;
}
/* title */
#viz_website_title{
font-size: 25px;
margin-top: 10px;
margin-bottom: 5px;
}
/* ordering buttons */
#toggle_order{
/*reduced width sidebar
margin-left used to be 45*/
margin-left: 15px;
margin-top: 20px;
margin-bottom:5px;
}
.order_name{
font-size: 11px;
}
/* container for gene search box */
#gene_search_container{
margin-top: 10px;
margin-left: 0px;
display: none:;
}
/* gene search box */
#gene_search_box{
width:120px;
}
/* gene search button */
#gene_search_button{
margin-top:4px;
}
/*reduce the padding on the buttons*/
.btn{
padding-top:2px;
padding-bottom:2px;
}
!function() {
var d3 = {
version: "3.5.3"
};
if (!Date.now) Date.now = function() {
return +new Date();
};
var d3_arraySlice = [].slice, d3_array = function(list) {
return d3_arraySlice.call(list);
};
var d3_document = document, d3_documentElement = d3_document.documentElement, d3_window = window;
try {
d3_array(d3_documentElement.childNodes)[0].nodeType;
} catch (e) {
d3_array = function(list) {
var i = list.length, array = new Array(i);
while (i--) array[i] = list[i];
return array;
};
}
try {
d3_document.createElement("div").style.setProperty("opacity", 0, "");
} catch (error) {
var d3_element_prototype = d3_window.Element.prototype, d3_element_setAttribute = d3_element_prototype.setAttribute, d3_element_setAttributeNS = d3_element_prototype.setAttributeNS, d3_style_prototype = d3_window.CSSStyleDeclaration.prototype, d3_style_setProperty = d3_style_prototype.setProperty;
d3_element_prototype.setAttribute = function(name, value) {
d3_element_setAttribute.call(this, name, value + "");
};
d3_element_prototype.setAttributeNS = function(space, local, value) {
d3_element_setAttributeNS.call(this, space, local, value + "");
};
d3_style_prototype.setProperty = function(name, value, priority) {
d3_style_setProperty.call(this, name, value + "", priority);
};
}
d3.ascending = d3_ascending;
function d3_ascending(a, b) {
return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
}
d3.descending = function(a, b) {
return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;
};
d3.min = function(array, f) {
var i = -1, n = array.length, a, b;
if (arguments.length === 1) {
while (++i < n) if ((b = array[i]) != null && b >= b) {
a = b;
break;
}
while (++i < n) if ((b = array[i]) != null && a > b) a = b;
} else {
while (++i < n) if ((b = f.call(array, array[i], i)) != null && b >= b) {
a = b;
break;
}
while (++i < n) if ((b = f.call(array, array[i], i)) != null && a > b) a = b;
}
return a;
};
d3.max = function(array, f) {
var i = -1, n = array.length, a, b;
if (arguments.length === 1) {
while (++i < n) if ((b = array[i]) != null && b >= b) {
a = b;
break;
}
while (++i < n) if ((b = array[i]) != null && b > a) a = b;
} else {
while (++i < n) if ((b = f.call(array, array[i], i)) != null && b >= b) {
a = b;
break;
}
while (++i < n) if ((b = f.call(array, array[i], i)) != null && b > a) a = b;
}
return a;
};
d3.extent = function(array, f) {
var i = -1, n = array.length, a, b, c;
if (arguments.length === 1) {
while (++i < n) if ((b = array[i]) != null && b >= b) {
a = c = b;
break;
}
while (++i < n) if ((b = array[i]) != null) {
if (a > b) a = b;
if (c < b) c = b;
}
} else {
while (++i < n) if ((b = f.call(array, array[i], i)) != null && b >= b) {
a = c = b;
break;
}
while (++i < n) if ((b = f.call(array, array[i], i)) != null) {
if (a > b) a = b;
if (c < b) c = b;
}
}
return [ a, c ];
};
function d3_number(x) {
return x === null ? NaN : +x;
}
function d3_numeric(x) {
return !isNaN(x);
}
d3.sum = function(array, f) {
var s = 0, n = array.length, a, i = -1;
if (arguments.length === 1) {
while (++i < n) if (d3_numeric(a = +array[i])) s += a;
} else {
while (++i < n) if (d3_numeric(a = +f.call(array, array[i], i))) s += a;
}
return s;
};
d3.mean = function(array, f) {
var s = 0, n = array.length, a, i = -1, j = n;
if (arguments.length === 1) {
while (++i < n) if (d3_numeric(a = d3_number(array[i]))) s += a; else --j;
} else {
while (++i < n) if (d3_numeric(a = d3_number(f.call(array, array[i], i)))) s += a; else --j;
}
if (j) return s / j;
};
d3.quantile = function(values, p) {
var H = (values.length - 1) * p + 1, h = Math.floor(H), v = +values[h - 1], e = H - h;
return e ? v + e * (values[h] - v) : v;
};
d3.median = function(array, f) {
var numbers = [], n = array.length, a, i = -1;
if (arguments.length === 1) {
while (++i < n) if (d3_numeric(a = d3_number(array[i]))) numbers.push(a);
} else {
while (++i < n) if (d3_numeric(a = d3_number(f.call(array, array[i], i)))) numbers.push(a);
}
if (numbers.length) return d3.quantile(numbers.sort(d3_ascending), .5);
};
d3.variance = function(array, f) {
var n = array.length, m = 0, a, d, s = 0, i = -1, j = 0;
if (arguments.length === 1) {
while (++i < n) {
if (d3_numeric(a = d3_number(array[i]))) {
d = a - m;
m += d / ++j;
s += d * (a - m);
}
}
} else {
while (++i < n) {
if (d3_numeric(a = d3_number(f.call(array, array[i], i)))) {
d = a - m;
m += d / ++j;
s += d * (a - m);
}
}
}
if (j > 1) return s / (j - 1);
};
d3.deviation = function() {
var v = d3.variance.apply(this, arguments);
return v ? Math.sqrt(v) : v;
};
function d3_bisector(compare) {
return {
left: function(a, x, lo, hi) {
if (arguments.length < 3) lo = 0;
if (arguments.length < 4) hi = a.length;
while (lo < hi) {
var mid = lo + hi >>> 1;
if (compare(a[mid], x) < 0) lo = mid + 1; else hi = mid;
}
return lo;
},
right: function(a, x, lo, hi) {
if (arguments.length < 3) lo = 0;
if (arguments.length < 4) hi = a.length;
while (lo < hi) {
var mid = lo + hi >>> 1;
if (compare(a[mid], x) > 0) hi = mid; else lo = mid + 1;
}
return lo;
}
};
}
var d3_bisect = d3_bisector(d3_ascending);
d3.bisectLeft = d3_bisect.left;
d3.bisect = d3.bisectRight = d3_bisect.right;
d3.bisector = function(f) {
return d3_bisector(f.length === 1 ? function(d, x) {
return d3_ascending(f(d), x);
} : f);
};
d3.shuffle = function(array, i0, i1) {
if ((m = arguments.length) < 3) {
i1 = array.length;
if (m < 2) i0 = 0;
}
var m = i1 - i0, t, i;
while (m) {
i = Math.random() * m-- | 0;
t = array[m + i0], array[m + i0] = array[i + i0], array[i + i0] = t;
}
return array;
};
d3.permute = function(array, indexes) {
var i = indexes.length, permutes = new Array(i);
while (i--) permutes[i] = array[indexes[i]];
return permutes;
};
d3.pairs = function(array) {
var i = 0, n = array.length - 1, p0, p1 = array[0], pairs = new Array(n < 0 ? 0 : n);
while (i < n) pairs[i] = [ p0 = p1, p1 = array[++i] ];
return pairs;
};
d3.zip = function() {
if (!(n = arguments.length)) return [];
for (var i = -1, m = d3.min(arguments, d3_zipLength), zips = new Array(m); ++i < m; ) {
for (var j = -1, n, zip = zips[i] = new Array(n); ++j < n; ) {
zip[j] = arguments[j][i];
}
}
return zips;
};
function d3_zipLength(d) {
return d.length;
}
d3.transpose = function(matrix) {
return d3.zip.apply(d3, matrix);
};
d3.keys = function(map) {
var keys = [];
for (var key in map) keys.push(key);
return keys;
};
d3.values = function(map) {
var values = [];
for (var key in map) values.push(map[key]);
return values;
};
d3.entries = function(map) {
var entries = [];
for (var key in map) entries.push({
key: key,
value: map[key]
});
return entries;
};
d3.merge = function(arrays) {
var n = arrays.length, m, i = -1, j = 0, merged, array;
while (++i < n) j += arrays[i].length;
merged = new Array(j);
while (--n >= 0) {
array = arrays[n];
m = array.length;
while (--m >= 0) {
merged[--j] = array[m];
}
}
return merged;
};
var abs = Math.abs;
d3.range = function(start, stop, step) {
if (arguments.length < 3) {
step = 1;
if (arguments.length < 2) {
stop = start;
start = 0;
}
}
if ((stop - start) / step === Infinity) throw new Error("infinite range");
var range = [], k = d3_range_integerScale(abs(step)), i = -1, j;
start *= k, stop *= k, step *= k;
if (step < 0) while ((j = start + step * ++i) > stop) range.push(j / k); else while ((j = start + step * ++i) < stop) range.push(j / k);
return range;
};
function d3_range_integerScale(x) {
var k = 1;
while (x * k % 1) k *= 10;
return k;
}
function d3_class(ctor, properties) {
for (var key in properties) {
Object.defineProperty(ctor.prototype, key, {
value: properties[key],
enumerable: false
});
}
}
d3.map = function(object, f) {
var map = new d3_Map();
if (object instanceof d3_Map) {
object.forEach(function(key, value) {
map.set(key, value);
});
} else if (Array.isArray(object)) {
var i = -1, n = object.length, o;
if (arguments.length === 1) while (++i < n) map.set(i, object[i]); else while (++i < n) map.set(f.call(object, o = object[i], i), o);
} else {
for (var key in object) map.set(key, object[key]);
}
return map;
};
function d3_Map() {
this._ = Object.create(null);
}
var d3_map_proto = "__proto__", d3_map_zero = "\x00";
d3_class(d3_Map, {
has: d3_map_has,
get: function(key) {
return this._[d3_map_escape(key)];
},
set: function(key, value) {
return this._[d3_map_escape(key)] = value;
},
remove: d3_map_remove,
keys: d3_map_keys,
values: function() {
var values = [];
for (var key in this._) values.push(this._[key]);
return values;
},
entries: function() {
var entries = [];
for (var key in this._) entries.push({
key: d3_map_unescape(key),
value: this._[key]
});
return entries;
},
size: d3_map_size,
empty: d3_map_empty,
forEach: function(f) {
for (var key in this._) f.call(this, d3_map_unescape(key), this._[key]);
}
});
function d3_map_escape(key) {
return (key += "") === d3_map_proto || key[0] === d3_map_zero ? d3_map_zero + key : key;
}
function d3_map_unescape(key) {
return (key += "")[0] === d3_map_zero ? key.slice(1) : key;
}
function d3_map_has(key) {
return d3_map_escape(key) in this._;
}
function d3_map_remove(key) {
return (key = d3_map_escape(key)) in this._ && delete this._[key];
}
function d3_map_keys() {
var keys = [];
for (var key in this._) keys.push(d3_map_unescape(key));
return keys;
}
function d3_map_size() {
var size = 0;
for (var key in this._) ++size;
return size;
}
function d3_map_empty() {
for (var key in this._) return false;
return true;
}
d3.nest = function() {
var nest = {}, keys = [], sortKeys = [], sortValues, rollup;
function map(mapType, array, depth) {
if (depth >= keys.length) return rollup ? rollup.call(nest, array) : sortValues ? array.sort(sortValues) : array;
var i = -1, n = array.length, key = keys[depth++], keyValue, object, setter, valuesByKey = new d3_Map(), values;
while (++i < n) {
if (values = valuesByKey.get(keyValue = key(object = array[i]))) {
values.push(object);
} else {
valuesByKey.set(keyValue, [ object ]);
}
}
if (mapType) {
object = mapType();
setter = function(keyValue, values) {
object.set(keyValue, map(mapType, values, depth));
};
} else {
object = {};
setter = function(keyValue, values) {
object[keyValue] = map(mapType, values, depth);
};
}
valuesByKey.forEach(setter);
return object;
}
function entries(map, depth) {
if (depth >= keys.length) return map;
var array = [], sortKey = sortKeys[depth++];
map.forEach(function(key, keyMap) {
array.push({
key: key,
values: entries(keyMap, depth)
});
});
return sortKey ? array.sort(function(a, b) {
return sortKey(a.key, b.key);
}) : array;
}
nest.map = function(array, mapType) {
return map(mapType, array, 0);
};
nest.entries = function(array) {
return entries(map(d3.map, array, 0), 0);
};
nest.key = function(d) {
keys.push(d);
return nest;
};
nest.sortKeys = function(order) {
sortKeys[keys.length - 1] = order;
return nest;
};
nest.sortValues = function(order) {
sortValues = order;
return nest;
};
nest.rollup = function(f) {
rollup = f;
return nest;
};
return nest;
};
d3.set = function(array) {
var set = new d3_Set();
if (array) for (var i = 0, n = array.length; i < n; ++i) set.add(array[i]);
return set;
};
function d3_Set() {
this._ = Object.create(null);
}
d3_class(d3_Set, {
has: d3_map_has,
add: function(key) {
this._[d3_map_escape(key += "")] = true;
return key;
},
remove: d3_map_remove,
values: d3_map_keys,
size: d3_map_size,
empty: d3_map_empty,
forEach: function(f) {
for (var key in this._) f.call(this, d3_map_unescape(key));
}
});
d3.behavior = {};
d3.rebind = function(target, source) {
var i = 1, n = arguments.length, method;
while (++i < n) target[method = arguments[i]] = d3_rebind(target, source, source[method]);
return target;
};
function d3_rebind(target, source, method) {
return function() {
var value = method.apply(source, arguments);
return value === source ? target : value;
};
}
function d3_vendorSymbol(object, name) {
if (name in object) return name;
name = name.charAt(0).toUpperCase() + name.slice(1);
for (var i = 0, n = d3_vendorPrefixes.length; i < n; ++i) {
var prefixName = d3_vendorPrefixes[i] + name;
if (prefixName in object) return prefixName;
}
}
var d3_vendorPrefixes = [ "webkit", "ms", "moz", "Moz", "o", "O" ];
function d3_noop() {}
d3.dispatch = function() {
var dispatch = new d3_dispatch(), i = -1, n = arguments.length;
while (++i < n) dispatch[arguments[i]] = d3_dispatch_event(dispatch);
return dispatch;
};
function d3_dispatch() {}
d3_dispatch.prototype.on = function(type, listener) {
var i = type.indexOf("."), name = "";
if (i >= 0) {
name = type.slice(i + 1);
type = type.slice(0, i);
}
if (type) return arguments.length < 2 ? this[type].on(name) : this[type].on(name, listener);
if (arguments.length === 2) {
if (listener == null) for (type in this) {
if (this.hasOwnProperty(type)) this[type].on(name, null);
}
return this;
}
};
function d3_dispatch_event(dispatch) {
var listeners = [], listenerByName = new d3_Map();
function event() {
var z = listeners, i = -1, n = z.length, l;
while (++i < n) if (l = z[i].on) l.apply(this, arguments);
return dispatch;
}
event.on = function(name, listener) {
var l = listenerByName.get(name), i;
if (arguments.length < 2) return l && l.on;
if (l) {
l.on = null;
listeners = listeners.slice(0, i = listeners.indexOf(l)).concat(listeners.slice(i + 1));
listenerByName.remove(name);
}
if (listener) listeners.push(listenerByName.set(name, {
on: listener
}));
return dispatch;
};
return event;
}
d3.event = null;
function d3_eventPreventDefault() {
d3.event.preventDefault();
}
function d3_eventSource() {
var e = d3.event, s;
while (s = e.sourceEvent) e = s;
return e;
}
function d3_eventDispatch(target) {
var dispatch = new d3_dispatch(), i = 0, n = arguments.length;
while (++i < n) dispatch[arguments[i]] = d3_dispatch_event(dispatch);
dispatch.of = function(thiz, argumentz) {
return function(e1) {
try {
var e0 = e1.sourceEvent = d3.event;
e1.target = target;
d3.event = e1;
dispatch[e1.type].apply(thiz, argumentz);
} finally {
d3.event = e0;
}
};
};
return dispatch;
}
d3.requote = function(s) {
return s.replace(d3_requote_re, "\\$&");
};
var d3_requote_re = /[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g;
var d3_subclass = {}.__proto__ ? function(object, prototype) {
object.__proto__ = prototype;
} : function(object, prototype) {
for (var property in prototype) object[property] = prototype[property];
};
function d3_selection(groups) {
d3_subclass(groups, d3_selectionPrototype);
return groups;
}
var d3_select = function(s, n) {
return n.querySelector(s);
}, d3_selectAll = function(s, n) {
return n.querySelectorAll(s);
}, d3_selectMatcher = d3_documentElement.matches || d3_documentElement[d3_vendorSymbol(d3_documentElement, "matchesSelector")], d3_selectMatches = function(n, s) {
return d3_selectMatcher.call(n, s);
};
if (typeof Sizzle === "function") {
d3_select = function(s, n) {
return Sizzle(s, n)[0] || null;
};
d3_selectAll = Sizzle;
d3_selectMatches = Sizzle.matchesSelector;
}
d3.selection = function() {
return d3_selectionRoot;
};
var d3_selectionPrototype = d3.selection.prototype = [];
d3_selectionPrototype.select = function(selector) {
var subgroups = [], subgroup, subnode, group, node;
selector = d3_selection_selector(selector);
for (var j = -1, m = this.length; ++j < m; ) {
subgroups.push(subgroup = []);
subgroup.parentNode = (group = this[j]).parentNode;
for (var i = -1, n = group.length; ++i < n; ) {
if (node = group[i]) {
subgroup.push(subnode = selector.call(node, node.__data__, i, j));
if (subnode && "__data__" in node) subnode.__data__ = node.__data__;
} else {
subgroup.push(null);
}
}
}
return d3_selection(subgroups);
};
function d3_selection_selector(selector) {
return typeof selector === "function" ? selector : function() {
return d3_select(selector, this);
};
}
d3_selectionPrototype.selectAll = function(selector) {
var subgroups = [], subgroup, node;
selector = d3_selection_selectorAll(selector);
for (var j = -1, m = this.length; ++j < m; ) {
for (var group = this[j], i = -1, n = group.length; ++i < n; ) {
if (node = group[i]) {
subgroups.push(subgroup = d3_array(selector.call(node, node.__data__, i, j)));
subgroup.parentNode = node;
}
}
}
return d3_selection(subgroups);
};
function d3_selection_selectorAll(selector) {
return typeof selector === "function" ? selector : function() {
return d3_selectAll(selector, this);
};
}
var d3_nsPrefix = {
svg: "http://www.w3.org/2000/svg",
xhtml: "http://www.w3.org/1999/xhtml",
xlink: "http://www.w3.org/1999/xlink",
xml: "http://www.w3.org/XML/1998/namespace",
xmlns: "http://www.w3.org/2000/xmlns/"
};
d3.ns = {
prefix: d3_nsPrefix,
qualify: function(name) {
var i = name.indexOf(":"), prefix = name;
if (i >= 0) {
prefix = name.slice(0, i);
name = name.slice(i + 1);
}
return d3_nsPrefix.hasOwnProperty(prefix) ? {
space: d3_nsPrefix[prefix],
local: name
} : name;
}
};
d3_selectionPrototype.attr = function(name, value) {
if (arguments.length < 2) {
if (typeof name === "string") {
var node = this.node();
name = d3.ns.qualify(name);
return name.local ? node.getAttributeNS(name.space, name.local) : node.getAttribute(name);
}
for (value in name) this.each(d3_selection_attr(value, name[value]));
return this;
}
return this.each(d3_selection_attr(name, value));
};
function d3_selection_attr(name, value) {
name = d3.ns.qualify(name);
function attrNull() {
this.removeAttribute(name);
}
function attrNullNS() {
this.removeAttributeNS(name.space, name.local);
}
function attrConstant() {
this.setAttribute(name, value);
}
function attrConstantNS() {
this.setAttributeNS(name.space, name.local, value);
}
function attrFunction() {
var x = value.apply(this, arguments);
if (x == null) this.removeAttribute(name); else this.setAttribute(name, x);
}
function attrFunctionNS() {
var x = value.apply(this, arguments);
if (x == null) this.removeAttributeNS(name.space, name.local); else this.setAttributeNS(name.space, name.local, x);
}
return value == null ? name.local ? attrNullNS : attrNull : typeof value === "function" ? name.local ? attrFunctionNS : attrFunction : name.local ? attrConstantNS : attrConstant;
}
function d3_collapse(s) {
return s.trim().replace(/\s+/g, " ");
}
d3_selectionPrototype.classed = function(name, value) {
if (arguments.length < 2) {
if (typeof name === "string") {
var node = this.node(), n = (name = d3_selection_classes(name)).length, i = -1;
if (value = node.classList) {
while (++i < n) if (!value.contains(name[i])) return false;
} else {
value = node.getAttribute("class");
while (++i < n) if (!d3_selection_classedRe(name[i]).test(value)) return false;
}
return true;
}
for (value in name) this.each(d3_selection_classed(value, name[value]));
return this;
}
return this.each(d3_selection_classed(name, value));
};
function d3_selection_classedRe(name) {
return new RegExp("(?:^|\\s+)" + d3.requote(name) + "(?:\\s+|$)", "g");
}
function d3_selection_classes(name) {
return (name + "").trim().split(/^|\s+/);
}
function d3_selection_classed(name, value) {
name = d3_selection_classes(name).map(d3_selection_classedName);
var n = name.length;
function classedConstant() {
var i = -1;
while (++i < n) name[i](this, value);
}
function classedFunction() {
var i = -1, x = value.apply(this, arguments);
while (++i < n) name[i](this, x);
}
return typeof value === "function" ? classedFunction : classedConstant;
}
function d3_selection_classedName(name) {
var re = d3_selection_classedRe(name);
return function(node, value) {
if (c = node.classList) return value ? c.add(name) : c.remove(name);
var c = node.getAttribute("class") || "";
if (value) {
re.lastIndex = 0;
if (!re.test(c)) node.setAttribute("class", d3_collapse(c + " " + name));
} else {
node.setAttribute("class", d3_collapse(c.replace(re, " ")));
}
};
}
d3_selectionPrototype.style = function(name, value, priority) {
var n = arguments.length;
if (n < 3) {
if (typeof name !== "string") {
if (n < 2) value = "";
for (priority in name) this.each(d3_selection_style(priority, name[priority], value));
return this;
}
if (n < 2) return d3_window.getComputedStyle(this.node(), null).getPropertyValue(name);
priority = "";
}
return this.each(d3_selection_style(name, value, priority));
};
function d3_selection_style(name, value, priority) {
function styleNull() {
this.style.removeProperty(name);
}
function styleConstant() {
this.style.setProperty(name, value, priority);
}
function styleFunction() {
var x = value.apply(this, arguments);
if (x == null) this.style.removeProperty(name); else this.style.setProperty(name, x, priority);
}
return value == null ? styleNull : typeof value === "function" ? styleFunction : styleConstant;
}
d3_selectionPrototype.property = function(name, value) {
if (arguments.length < 2) {
if (typeof name === "string") return this.node()[name];
for (value in name) this.each(d3_selection_property(value, name[value]));
return this;
}
return this.each(d3_selection_property(name, value));
};
function d3_selection_property(name, value) {
function propertyNull() {
delete this[name];
}
function propertyConstant() {
this[name] = value;
}
function propertyFunction() {
var x = value.apply(this, arguments);
if (x == null) delete this[name]; else this[name] = x;
}
return value == null ? propertyNull : typeof value === "function" ? propertyFunction : propertyConstant;
}
d3_selectionPrototype.text = function(value) {
return arguments.length ? this.each(typeof value === "function" ? function() {
var v = value.apply(this, arguments);
this.textContent = v == null ? "" : v;
} : value == null ? function() {
this.textContent = "";
} : function() {
this.textContent = value;
}) : this.node().textContent;
};
d3_selectionPrototype.html = function(value) {
return arguments.length ? this.each(typeof value === "function" ? function() {
var v = value.apply(this, arguments);
this.innerHTML = v == null ? "" : v;
} : value == null ? function() {
this.innerHTML = "";
} : function() {
this.innerHTML = value;
}) : this.node().innerHTML;
};
d3_selectionPrototype.append = function(name) {
name = d3_selection_creator(name);
return this.select(function() {
return this.appendChild(name.apply(this, arguments));
});
};
function d3_selection_creator(name) {
return typeof name === "function" ? name : (name = d3.ns.qualify(name)).local ? function() {
return this.ownerDocument.createElementNS(name.space, name.local);
} : function() {
return this.ownerDocument.createElementNS(this.namespaceURI, name);
};
}
d3_selectionPrototype.insert = function(name, before) {
name = d3_selection_creator(name);
before = d3_selection_selector(before);
return this.select(function() {
return this.insertBefore(name.apply(this, arguments), before.apply(this, arguments) || null);
});
};
d3_selectionPrototype.remove = function() {
return this.each(d3_selectionRemove);
};
function d3_selectionRemove() {
var parent = this.parentNode;
if (parent) parent.removeChild(this);
}
d3_selectionPrototype.data = function(value, key) {
var i = -1, n = this.length, group, node;
if (!arguments.length) {
value = new Array(n = (group = this[0]).length);
while (++i < n) {
if (node = group[i]) {
value[i] = node.__data__;
}
}
return value;
}
function bind(group, groupData) {
var i, n = group.length, m = groupData.length, n0 = Math.min(n, m), updateNodes = new Array(m), enterNodes = new Array(m), exitNodes = new Array(n), node, nodeData;
if (key) {
var nodeByKeyValue = new d3_Map(), keyValues = new Array(n), keyValue;
for (i = -1; ++i < n; ) {
if (nodeByKeyValue.has(keyValue = key.call(node = group[i], node.__data__, i))) {
exitNodes[i] = node;
} else {
nodeByKeyValue.set(keyValue, node);
}
keyValues[i] = keyValue;
}
for (i = -1; ++i < m; ) {
if (!(node = nodeByKeyValue.get(keyValue = key.call(groupData, nodeData = groupData[i], i)))) {
enterNodes[i] = d3_selection_dataNode(nodeData);
} else if (node !== true) {
updateNodes[i] = node;
node.__data__ = nodeData;
}
nodeByKeyValue.set(keyValue, true);
}
for (i = -1; ++i < n; ) {
if (nodeByKeyValue.get(keyValues[i]) !== true) {
exitNodes[i] = group[i];
}
}
} else {
for (i = -1; ++i < n0; ) {
node = group[i];
nodeData = groupData[i];
if (node) {
node.__data__ = nodeData;
updateNodes[i] = node;
} else {
enterNodes[i] = d3_selection_dataNode(nodeData);
}
}
for (;i < m; ++i) {
enterNodes[i] = d3_selection_dataNode(groupData[i]);
}
for (;i < n; ++i) {
exitNodes[i] = group[i];
}
}
enterNodes.update = updateNodes;
enterNodes.parentNode = updateNodes.parentNode = exitNodes.parentNode = group.parentNode;
enter.push(enterNodes);
update.push(updateNodes);
exit.push(exitNodes);
}
var enter = d3_selection_enter([]), update = d3_selection([]), exit = d3_selection([]);
if (typeof value === "function") {
while (++i < n) {
bind(group = this[i], value.call(group, group.parentNode.__data__, i));
}
} else {
while (++i < n) {
bind(group = this[i], value);
}
}
update.enter = function() {
return enter;
};
update.exit = function() {
return exit;
};
return update;
};
function d3_selection_dataNode(data) {
return {
__data__: data
};
}
d3_selectionPrototype.datum = function(value) {
return arguments.length ? this.property("__data__", value) : this.property("__data__");
};
d3_selectionPrototype.filter = function(filter) {
var subgroups = [], subgroup, group, node;
if (typeof filter !== "function") filter = d3_selection_filter(filter);
for (var j = 0, m = this.length; j < m; j++) {
subgroups.push(subgroup = []);
subgroup.parentNode = (group = this[j]).parentNode;
for (var i = 0, n = group.length; i < n; i++) {
if ((node = group[i]) && filter.call(node, node.__data__, i, j)) {
subgroup.push(node);
}
}
}
return d3_selection(subgroups);
};
function d3_selection_filter(selector) {
return function() {
return d3_selectMatches(this, selector);
};
}
d3_selectionPrototype.order = function() {
for (var j = -1, m = this.length; ++j < m; ) {
for (var group = this[j], i = group.length - 1, next = group[i], node; --i >= 0; ) {
if (node = group[i]) {
if (next && next !== node.nextSibling) next.parentNode.insertBefore(node, next);
next = node;
}
}
}
return this;
};
d3_selectionPrototype.sort = function(comparator) {
comparator = d3_selection_sortComparator.apply(this, arguments);
for (var j = -1, m = this.length; ++j < m; ) this[j].sort(comparator);
return this.order();
};
function d3_selection_sortComparator(comparator) {
if (!arguments.length) comparator = d3_ascending;
return function(a, b) {
return a && b ? comparator(a.__data__, b.__data__) : !a - !b;
};
}
d3_selectionPrototype.each = function(callback) {
return d3_selection_each(this, function(node, i, j) {
callback.call(node, node.__data__, i, j);
});
};
function d3_selection_each(groups, callback) {
for (var j = 0, m = groups.length; j < m; j++) {
for (var group = groups[j], i = 0, n = group.length, node; i < n; i++) {
if (node = group[i]) callback(node, i, j);
}
}
return groups;
}
d3_selectionPrototype.call = function(callback) {
var args = d3_array(arguments);
callback.apply(args[0] = this, args);
return this;
};
d3_selectionPrototype.empty = function() {
return !this.node();
};
d3_selectionPrototype.node = function() {
for (var j = 0, m = this.length; j < m; j++) {
for (var group = this[j], i = 0, n = group.length; i < n; i++) {
var node = group[i];
if (node) return node;
}
}
return null;
};
d3_selectionPrototype.size = function() {
var n = 0;
d3_selection_each(this, function() {
++n;
});
return n;
};
function d3_selection_enter(selection) {
d3_subclass(selection, d3_selection_enterPrototype);
return selection;
}
var d3_selection_enterPrototype = [];
d3.selection.enter = d3_selection_enter;
d3.selection.enter.prototype = d3_selection_enterPrototype;
d3_selection_enterPrototype.append = d3_selectionPrototype.append;
d3_selection_enterPrototype.empty = d3_selectionPrototype.empty;
d3_selection_enterPrototype.node = d3_selectionPrototype.node;
d3_selection_enterPrototype.call = d3_selectionPrototype.call;
d3_selection_enterPrototype.size = d3_selectionPrototype.size;
d3_selection_enterPrototype.select = function(selector) {
var subgroups = [], subgroup, subnode, upgroup, group, node;
for (var j = -1, m = this.length; ++j < m; ) {
upgroup = (group = this[j]).update;
subgroups.push(subgroup = []);
subgroup.parentNode = group.parentNode;
for (var i = -1, n = group.length; ++i < n; ) {
if (node = group[i]) {
subgroup.push(upgroup[i] = subnode = selector.call(group.parentNode, node.__data__, i, j));
subnode.__data__ = node.__data__;
} else {
subgroup.push(null);
}
}
}
return d3_selection(subgroups);
};
d3_selection_enterPrototype.insert = function(name, before) {
if (arguments.length < 2) before = d3_selection_enterInsertBefore(this);
return d3_selectionPrototype.insert.call(this, name, before);
};
function d3_selection_enterInsertBefore(enter) {
var i0, j0;
return function(d, i, j) {
var group = enter[j].update, n = group.length, node;
if (j != j0) j0 = j, i0 = 0;
if (i >= i0) i0 = i + 1;
while (!(node = group[i0]) && ++i0 < n) ;
return node;
};
}
d3.select = function(node) {
var group = [ typeof node === "string" ? d3_select(node, d3_document) : node ];
group.parentNode = d3_documentElement;
return d3_selection([ group ]);
};
d3.selectAll = function(nodes) {
var group = d3_array(typeof nodes === "string" ? d3_selectAll(nodes, d3_document) : nodes);
group.parentNode = d3_documentElement;
return d3_selection([ group ]);
};
var d3_selectionRoot = d3.select(d3_documentElement);
d3_selectionPrototype.on = function(type, listener, capture) {
var n = arguments.length;
if (n < 3) {
if (typeof type !== "string") {
if (n < 2) listener = false;
for (capture in type) this.each(d3_selection_on(capture, type[capture], listener));
return this;
}
if (n < 2) return (n = this.node()["__on" + type]) && n._;
capture = false;
}
return this.each(d3_selection_on(type, listener, capture));
};
function d3_selection_on(type, listener, capture) {
var name = "__on" + type, i = type.indexOf("."), wrap = d3_selection_onListener;
if (i > 0) type = type.slice(0, i);
var filter = d3_selection_onFilters.get(type);
if (filter) type = filter, wrap = d3_selection_onFilter;
function onRemove() {
var l = this[name];
if (l) {
this.removeEventListener(type, l, l.$);
delete this[name];
}
}
function onAdd() {
var l = wrap(listener, d3_array(arguments));
onRemove.call(this);
this.addEventListener(type, this[name] = l, l.$ = capture);
l._ = listener;
}
function removeAll() {
var re = new RegExp("^__on([^.]+)" + d3.requote(type) + "$"), match;
for (var name in this) {
if (match = name.match(re)) {
var l = this[name];
this.removeEventListener(match[1], l, l.$);
delete this[name];
}
}
}
return i ? listener ? onAdd : onRemove : listener ? d3_noop : removeAll;
}
var d3_selection_onFilters = d3.map({
mouseenter: "mouseover",
mouseleave: "mouseout"
});
d3_selection_onFilters.forEach(function(k) {
if ("on" + k in d3_document) d3_selection_onFilters.remove(k);
});
function d3_selection_onListener(listener, argumentz) {
return function(e) {
var o = d3.event;
d3.event = e;
argumentz[0] = this.__data__;
try {
listener.apply(this, argumentz);
} finally {
d3.event = o;
}
};
}
function d3_selection_onFilter(listener, argumentz) {
var l = d3_selection_onListener(listener, argumentz);
return function(e) {
var target = this, related = e.relatedTarget;
if (!related || related !== target && !(related.compareDocumentPosition(target) & 8)) {
l.call(target, e);
}
};
}
var d3_event_dragSelect = "onselectstart" in d3_document ? null : d3_vendorSymbol(d3_documentElement.style, "userSelect"), d3_event_dragId = 0;
function d3_event_dragSuppress() {
var name = ".dragsuppress-" + ++d3_event_dragId, click = "click" + name, w = d3.select(d3_window).on("touchmove" + name, d3_eventPreventDefault).on("dragstart" + name, d3_eventPreventDefault).on("selectstart" + name, d3_eventPreventDefault);
if (d3_event_dragSelect) {
var style = d3_documentElement.style, select = style[d3_event_dragSelect];
style[d3_event_dragSelect] = "none";
}
return function(suppressClick) {
w.on(name, null);
if (d3_event_dragSelect) style[d3_event_dragSelect] = select;
if (suppressClick) {
var off = function() {
w.on(click, null);
};
w.on(click, function() {
d3_eventPreventDefault();
off();
}, true);
setTimeout(off, 0);
}
};
}
d3.mouse = function(container) {
return d3_mousePoint(container, d3_eventSource());
};
var d3_mouse_bug44083 = /WebKit/.test(d3_window.navigator.userAgent) ? -1 : 0;
function d3_mousePoint(container, e) {
if (e.changedTouches) e = e.changedTouches[0];
var svg = container.ownerSVGElement || container;
if (svg.createSVGPoint) {
var point = svg.createSVGPoint();
if (d3_mouse_bug44083 < 0 && (d3_window.scrollX || d3_window.scrollY)) {
svg = d3.select("body").append("svg").style({
position: "absolute",
top: 0,
left: 0,
margin: 0,
padding: 0,
border: "none"
}, "important");
var ctm = svg[0][0].getScreenCTM();
d3_mouse_bug44083 = !(ctm.f || ctm.e);
svg.remove();
}
if (d3_mouse_bug44083) point.x = e.pageX, point.y = e.pageY; else point.x = e.clientX,
point.y = e.clientY;
point = point.matrixTransform(container.getScreenCTM().inverse());
return [ point.x, point.y ];
}
var rect = container.getBoundingClientRect();
return [ e.clientX - rect.left - container.clientLeft, e.clientY - rect.top - container.clientTop ];
}
d3.touch = function(container, touches, identifier) {
if (arguments.length < 3) identifier = touches, touches = d3_eventSource().changedTouches;
if (touches) for (var i = 0, n = touches.length, touch; i < n; ++i) {
if ((touch = touches[i]).identifier === identifier) {
return d3_mousePoint(container, touch);
}
}
};
d3.behavior.drag = function() {
var event = d3_eventDispatch(drag, "drag", "dragstart", "dragend"), origin = null, mousedown = dragstart(d3_noop, d3.mouse, d3_behavior_dragMouseSubject, "mousemove", "mouseup"), touchstart = dragstart(d3_behavior_dragTouchId, d3.touch, d3_behavior_dragTouchSubject, "touchmove", "touchend");
function drag() {
this.on("mousedown.drag", mousedown).on("touchstart.drag", touchstart);
}
function dragstart(id, position, subject, move, end) {
return function() {
var that = this, target = d3.event.target, parent = that.parentNode, dispatch = event.of(that, arguments), dragged = 0, dragId = id(), dragName = ".drag" + (dragId == null ? "" : "-" + dragId), dragOffset, dragSubject = d3.select(subject()).on(move + dragName, moved).on(end + dragName, ended), dragRestore = d3_event_dragSuppress(), position0 = position(parent, dragId);
if (origin) {
dragOffset = origin.apply(that, arguments);
dragOffset = [ dragOffset.x - position0[0], dragOffset.y - position0[1] ];
} else {
dragOffset = [ 0, 0 ];
}
dispatch({
type: "dragstart"
});
function moved() {
var position1 = position(parent, dragId), dx, dy;
if (!position1) return;
dx = position1[0] - position0[0];
dy = position1[1] - position0[1];
dragged |= dx | dy;
position0 = position1;
dispatch({
type: "drag",
x: position1[0] + dragOffset[0],
y: position1[1] + dragOffset[1],
dx: dx,
dy: dy
});
}
function ended() {
if (!position(parent, dragId)) return;
dragSubject.on(move + dragName, null).on(end + dragName, null);
dragRestore(dragged && d3.event.target === target);
dispatch({
type: "dragend"
});
}
};
}
drag.origin = function(x) {
if (!arguments.length) return origin;
origin = x;
return drag;
};
return d3.rebind(drag, event, "on");
};
function d3_behavior_dragTouchId() {
return d3.event.changedTouches[0].identifier;
}
function d3_behavior_dragTouchSubject() {
return d3.event.target;
}
function d3_behavior_dragMouseSubject() {
return d3_window;
}
d3.touches = function(container, touches) {
if (arguments.length < 2) touches = d3_eventSource().touches;
return touches ? d3_array(touches).map(function(touch) {
var point = d3_mousePoint(container, touch);
point.identifier = touch.identifier;
return point;
}) : [];
};
var ε = 1e-6, ε2 = ε * ε, π = Math.PI, τ = 2 * π, τε = τ - ε, halfπ = π / 2, d3_radians = π / 180, d3_degrees = 180 / π;
function d3_sgn(x) {
return x > 0 ? 1 : x < 0 ? -1 : 0;
}
function d3_cross2d(a, b, c) {
return (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]);
}
function d3_acos(x) {
return x > 1 ? 0 : x < -1 ? π : Math.acos(x);
}
function d3_asin(x) {
return x > 1 ? halfπ : x < -1 ? -halfπ : Math.asin(x);
}
function d3_sinh(x) {
return ((x = Math.exp(x)) - 1 / x) / 2;
}
function d3_cosh(x) {
return ((x = Math.exp(x)) + 1 / x) / 2;
}
function d3_tanh(x) {
return ((x = Math.exp(2 * x)) - 1) / (x + 1);
}
function d3_haversin(x) {
return (x = Math.sin(x / 2)) * x;
}
var ρ = Math.SQRT2, ρ2 = 2, ρ4 = 4;
d3.interpolateZoom = function(p0, p1) {
var ux0 = p0[0], uy0 = p0[1], w0 = p0[2], ux1 = p1[0], uy1 = p1[1], w1 = p1[2];
var dx = ux1 - ux0, dy = uy1 - uy0, d2 = dx * dx + dy * dy, d1 = Math.sqrt(d2), b0 = (w1 * w1 - w0 * w0 + ρ4 * d2) / (2 * w0 * ρ2 * d1), b1 = (w1 * w1 - w0 * w0 - ρ4 * d2) / (2 * w1 * ρ2 * d1), r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0), r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1), dr = r1 - r0, S = (dr || Math.log(w1 / w0)) / ρ;
function interpolate(t) {
var s = t * S;
if (dr) {
var coshr0 = d3_cosh(r0), u = w0 / (ρ2 * d1) * (coshr0 * d3_tanh(ρ * s + r0) - d3_sinh(r0));
return [ ux0 + u * dx, uy0 + u * dy, w0 * coshr0 / d3_cosh(ρ * s + r0) ];
}
return [ ux0 + t * dx, uy0 + t * dy, w0 * Math.exp(ρ * s) ];
}
interpolate.duration = S * 1e3;
return interpolate;
};
d3.behavior.zoom = function() {
var view = {
x: 0,
y: 0,
k: 1
}, translate0, center0, center, size = [ 960, 500 ], scaleExtent = d3_behavior_zoomInfinity, duration = 250, zooming = 0, mousedown = "mousedown.zoom", mousemove = "mousemove.zoom", mouseup = "mouseup.zoom", mousewheelTimer, touchstart = "touchstart.zoom", touchtime, event = d3_eventDispatch(zoom, "zoomstart", "zoom", "zoomend"), x0, x1, y0, y1;
function zoom(g) {
g.on(mousedown, mousedowned).on(d3_behavior_zoomWheel + ".zoom", mousewheeled).on("dblclick.zoom", dblclicked).on(touchstart, touchstarted);
}
zoom.event = function(g) {
g.each(function() {
var dispatch = event.of(this, arguments), view1 = view;
if (d3_transitionInheritId) {
d3.select(this).transition().each("start.zoom", function() {
view = this.__chart__ || {
x: 0,
y: 0,
k: 1
};
zoomstarted(dispatch);
}).tween("zoom:zoom", function() {
var dx = size[0], dy = size[1], cx = center0 ? center0[0] : dx / 2, cy = center0 ? center0[1] : dy / 2, i = d3.interpolateZoom([ (cx - view.x) / view.k, (cy - view.y) / view.k, dx / view.k ], [ (cx - view1.x) / view1.k, (cy - view1.y) / view1.k, dx / view1.k ]);
return function(t) {
var l = i(t), k = dx / l[2];
this.__chart__ = view = {
x: cx - l[0] * k,
y: cy - l[1] * k,
k: k
};
zoomed(dispatch);
};
}).each("interrupt.zoom", function() {
zoomended(dispatch);
}).each("end.zoom", function() {
zoomended(dispatch);
});
} else {
this.__chart__ = view;
zoomstarted(dispatch);
zoomed(dispatch);
zoomended(dispatch);
}
});
};
zoom.translate = function(_) {
if (!arguments.length) return [ view.x, view.y ];
view = {
x: +_[0],
y: +_[1],
k: view.k
};
rescale();
return zoom;
};
zoom.scale = function(_) {
if (!arguments.length) return view.k;
view = {
x: view.x,
y: view.y,
k: +_
};
rescale();
return zoom;
};
zoom.scaleExtent = function(_) {
if (!arguments.length) return scaleExtent;
scaleExtent = _ == null ? d3_behavior_zoomInfinity : [ +_[0], +_[1] ];
return zoom;
};
zoom.center = function(_) {
if (!arguments.length) return center;
center = _ && [ +_[0], +_[1] ];
return zoom;
};
zoom.size = function(_) {
if (!arguments.length) return size;
size = _ && [ +_[0], +_[1] ];
return zoom;
};
zoom.duration = function(_) {
if (!arguments.length) return duration;
duration = +_;
return zoom;
};
zoom.x = function(z) {
if (!arguments.length) return x1;
x1 = z;
x0 = z.copy();
view = {
x: 0,
y: 0,
k: 1
};
return zoom;
};
zoom.y = function(z) {
if (!arguments.length) return y1;
y1 = z;
y0 = z.copy();
view = {
x: 0,
y: 0,
k: 1
};
return zoom;
};
function location(p) {
return [ (p[0] - view.x) / view.k, (p[1] - view.y) / view.k ];
}
function point(l) {
return [ l[0] * view.k + view.x, l[1] * view.k + view.y ];
}
function scaleTo(s) {
view.k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], s));
}
function translateTo(p, l) {
l = point(l);
view.x += p[0] - l[0];
view.y += p[1] - l[1];
}
function zoomTo(that, p, l, k) {
that.__chart__ = {
x: view.x,
y: view.y,
k: view.k
};
scaleTo(Math.pow(2, k));
translateTo(center0 = p, l);
that = d3.select(that);
if (duration > 0) that = that.transition().duration(duration);
that.call(zoom.event);
}
function rescale() {
if (x1) x1.domain(x0.range().map(function(x) {
return (x - view.x) / view.k;
}).map(x0.invert));
if (y1) y1.domain(y0.range().map(function(y) {
return (y - view.y) / view.k;
}).map(y0.invert));
}
function zoomstarted(dispatch) {
if (!zooming++) dispatch({
type: "zoomstart"
});
}
function zoomed(dispatch) {
rescale();
dispatch({
type: "zoom",
scale: view.k,
translate: [ view.x, view.y ]
});
}
function zoomended(dispatch) {
if (!--zooming) dispatch({
type: "zoomend"
});
center0 = null;
}
function mousedowned() {
var that = this, target = d3.event.target, dispatch = event.of(that, arguments), dragged = 0, subject = d3.select(d3_window).on(mousemove, moved).on(mouseup, ended), location0 = location(d3.mouse(that)), dragRestore = d3_event_dragSuppress();
d3_selection_interrupt.call(that);
zoomstarted(dispatch);
function moved() {
dragged = 1;
translateTo(d3.mouse(that), location0);
zoomed(dispatch);
}
function ended() {
subject.on(mousemove, null).on(mouseup, null);
dragRestore(dragged && d3.event.target === target);
zoomended(dispatch);
}
}
function touchstarted() {
var that = this, dispatch = event.of(that, arguments), locations0 = {}, distance0 = 0, scale0, zoomName = ".zoom-" + d3.event.changedTouches[0].identifier, touchmove = "touchmove" + zoomName, touchend = "touchend" + zoomName, targets = [], subject = d3.select(that), dragRestore = d3_event_dragSuppress();
started();
zoomstarted(dispatch);
subject.on(mousedown, null).on(touchstart, started);
function relocate() {
var touches = d3.touches(that);
scale0 = view.k;
touches.forEach(function(t) {
if (t.identifier in locations0) locations0[t.identifier] = location(t);
});
return touches;
}
function started() {
var target = d3.event.target;
d3.select(target).on(touchmove, moved).on(touchend, ended);
targets.push(target);
var changed = d3.event.changedTouches;
for (var i = 0, n = changed.length; i < n; ++i) {
locations0[changed[i].identifier] = null;
}
var touches = relocate(), now = Date.now();
if (touches.length === 1) {
if (now - touchtime < 500) {
var p = touches[0];
zoomTo(that, p, locations0[p.identifier], Math.floor(Math.log(view.k) / Math.LN2) + 1);
d3_eventPreventDefault();
}
touchtime = now;
} else if (touches.length > 1) {
var p = touches[0], q = touches[1], dx = p[0] - q[0], dy = p[1] - q[1];
distance0 = dx * dx + dy * dy;
}
}
function moved() {
var touches = d3.touches(that), p0, l0, p1, l1;
d3_selection_interrupt.call(that);
for (var i = 0, n = touches.length; i < n; ++i, l1 = null) {
p1 = touches[i];
if (l1 = locations0[p1.identifier]) {
if (l0) break;
p0 = p1, l0 = l1;
}
}
if (l1) {
var distance1 = (distance1 = p1[0] - p0[0]) * distance1 + (distance1 = p1[1] - p0[1]) * distance1, scale1 = distance0 && Math.sqrt(distance1 / distance0);
p0 = [ (p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2 ];
l0 = [ (l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2 ];
scaleTo(scale1 * scale0);
}
touchtime = null;
translateTo(p0, l0);
zoomed(dispatch);
}
function ended() {
if (d3.event.touches.length) {
var changed = d3.event.changedTouches;
for (var i = 0, n = changed.length; i < n; ++i) {
delete locations0[changed[i].identifier];
}
for (var identifier in locations0) {
return void relocate();
}
}
d3.selectAll(targets).on(zoomName, null);
subject.on(mousedown, mousedowned).on(touchstart, touchstarted);
dragRestore();
zoomended(dispatch);
}
}
function mousewheeled() {
var dispatch = event.of(this, arguments);
if (mousewheelTimer) clearTimeout(mousewheelTimer); else translate0 = location(center0 = center || d3.mouse(this)),
d3_selection_interrupt.call(this), zoomstarted(dispatch);
mousewheelTimer = setTimeout(function() {
mousewheelTimer = null;
zoomended(dispatch);
}, 50);
d3_eventPreventDefault();
scaleTo(Math.pow(2, d3_behavior_zoomDelta() * .002) * view.k);
translateTo(center0, translate0);
zoomed(dispatch);
}
function dblclicked() {
var p = d3.mouse(this), k = Math.log(view.k) / Math.LN2;
zoomTo(this, p, location(p), d3.event.shiftKey ? Math.ceil(k) - 1 : Math.floor(k) + 1);
}
return d3.rebind(zoom, event, "on");
};
var d3_behavior_zoomInfinity = [ 0, Infinity ];
var d3_behavior_zoomDelta, d3_behavior_zoomWheel = "onwheel" in d3_document ? (d3_behavior_zoomDelta = function() {
return -d3.event.deltaY * (d3.event.deltaMode ? 120 : 1);
}, "wheel") : "onmousewheel" in d3_document ? (d3_behavior_zoomDelta = function() {
return d3.event.wheelDelta;
}, "mousewheel") : (d3_behavior_zoomDelta = function() {
return -d3.event.detail;
}, "MozMousePixelScroll");
d3.color = d3_color;
function d3_color() {}
d3_color.prototype.toString = function() {
return this.rgb() + "";
};
d3.hsl = d3_hsl;
function d3_hsl(h, s, l) {
return this instanceof d3_hsl ? void (this.h = +h, this.s = +s, this.l = +l) : arguments.length < 2 ? h instanceof d3_hsl ? new d3_hsl(h.h, h.s, h.l) : d3_rgb_parse("" + h, d3_rgb_hsl, d3_hsl) : new d3_hsl(h, s, l);
}
var d3_hslPrototype = d3_hsl.prototype = new d3_color();
d3_hslPrototype.brighter = function(k) {
k = Math.pow(.7, arguments.length ? k : 1);
return new d3_hsl(this.h, this.s, this.l / k);
};
d3_hslPrototype.darker = function(k) {
k = Math.pow(.7, arguments.length ? k : 1);
return new d3_hsl(this.h, this.s, k * this.l);
};
d3_hslPrototype.rgb = function() {
return d3_hsl_rgb(this.h, this.s, this.l);
};
function d3_hsl_rgb(h, s, l) {
var m1, m2;
h = isNaN(h) ? 0 : (h %= 360) < 0 ? h + 360 : h;
s = isNaN(s) ? 0 : s < 0 ? 0 : s > 1 ? 1 : s;
l = l < 0 ? 0 : l > 1 ? 1 : l;
m2 = l <= .5 ? l * (1 + s) : l + s - l * s;
m1 = 2 * l - m2;
function v(h) {
if (h > 360) h -= 360; else if (h < 0) h += 360;
if (h < 60) return m1 + (m2 - m1) * h / 60;
if (h < 180) return m2;
if (h < 240) return m1 + (m2 - m1) * (240 - h) / 60;
return m1;
}
function vv(h) {
return Math.round(v(h) * 255);
}
return new d3_rgb(vv(h + 120), vv(h), vv(h - 120));
}
d3.hcl = d3_hcl;
function d3_hcl(h, c, l) {
return this instanceof d3_hcl ? void (this.h = +h, this.c = +c, this.l = +l) : arguments.length < 2 ? h instanceof d3_hcl ? new d3_hcl(h.h, h.c, h.l) : h instanceof d3_lab ? d3_lab_hcl(h.l, h.a, h.b) : d3_lab_hcl((h = d3_rgb_lab((h = d3.rgb(h)).r, h.g, h.b)).l, h.a, h.b) : new d3_hcl(h, c, l);
}
var d3_hclPrototype = d3_hcl.prototype = new d3_color();
d3_hclPrototype.brighter = function(k) {
return new d3_hcl(this.h, this.c, Math.min(100, this.l + d3_lab_K * (arguments.length ? k : 1)));
};
d3_hclPrototype.darker = function(k) {
return new d3_hcl(this.h, this.c, Math.max(0, this.l - d3_lab_K * (arguments.length ? k : 1)));
};
d3_hclPrototype.rgb = function() {
return d3_hcl_lab(this.h, this.c, this.l).rgb();
};
function d3_hcl_lab(h, c, l) {
if (isNaN(h)) h = 0;
if (isNaN(c)) c = 0;
return new d3_lab(l, Math.cos(h *= d3_radians) * c, Math.sin(h) * c);
}
d3.lab = d3_lab;
function d3_lab(l, a, b) {
return this instanceof d3_lab ? void (this.l = +l, this.a = +a, this.b = +b) : arguments.length < 2 ? l instanceof d3_lab ? new d3_lab(l.l, l.a, l.b) : l instanceof d3_hcl ? d3_hcl_lab(l.h, l.c, l.l) : d3_rgb_lab((l = d3_rgb(l)).r, l.g, l.b) : new d3_lab(l, a, b);
}
var d3_lab_K = 18;
var d3_lab_X = .95047, d3_lab_Y = 1, d3_lab_Z = 1.08883;
var d3_labPrototype = d3_lab.prototype = new d3_color();
d3_labPrototype.brighter = function(k) {
return new d3_lab(Math.min(100, this.l + d3_lab_K * (arguments.length ? k : 1)), this.a, this.b);
};
d3_labPrototype.darker = function(k) {
return new d3_lab(Math.max(0, this.l - d3_lab_K * (arguments.length ? k : 1)), this.a, this.b);
};
d3_labPrototype.rgb = function() {
return d3_lab_rgb(this.l, this.a, this.b);
};
function d3_lab_rgb(l, a, b) {
var y = (l + 16) / 116, x = y + a / 500, z = y - b / 200;
x = d3_lab_xyz(x) * d3_lab_X;
y = d3_lab_xyz(y) * d3_lab_Y;
z = d3_lab_xyz(z) * d3_lab_Z;
return new d3_rgb(d3_xyz_rgb(3.2404542 * x - 1.5371385 * y - .4985314 * z), d3_xyz_rgb(-.969266 * x + 1.8760108 * y + .041556 * z), d3_xyz_rgb(.0556434 * x - .2040259 * y + 1.0572252 * z));
}
function d3_lab_hcl(l, a, b) {
return l > 0 ? new d3_hcl(Math.atan2(b, a) * d3_degrees, Math.sqrt(a * a + b * b), l) : new d3_hcl(NaN, NaN, l);
}
function d3_lab_xyz(x) {
return x > .206893034 ? x * x * x : (x - 4 / 29) / 7.787037;
}
function d3_xyz_lab(x) {
return x > .008856 ? Math.pow(x, 1 / 3) : 7.787037 * x + 4 / 29;
}
function d3_xyz_rgb(r) {
return Math.round(255 * (r <= .00304 ? 12.92 * r : 1.055 * Math.pow(r, 1 / 2.4) - .055));
}
d3.rgb = d3_rgb;
function d3_rgb(r, g, b) {
return this instanceof d3_rgb ? void (this.r = ~~r, this.g = ~~g, this.b = ~~b) : arguments.length < 2 ? r instanceof d3_rgb ? new d3_rgb(r.r, r.g, r.b) : d3_rgb_parse("" + r, d3_rgb, d3_hsl_rgb) : new d3_rgb(r, g, b);
}
function d3_rgbNumber(value) {
return new d3_rgb(value >> 16, value >> 8 & 255, value & 255);
}
function d3_rgbString(value) {
return d3_rgbNumber(value) + "";
}
var d3_rgbPrototype = d3_rgb.prototype = new d3_color();
d3_rgbPrototype.brighter = function(k) {
k = Math.pow(.7, arguments.length ? k : 1);
var r = this.r, g = this.g, b = this.b, i = 30;
if (!r && !g && !b) return new d3_rgb(i, i, i);
if (r && r < i) r = i;
if (g && g < i) g = i;
if (b && b < i) b = i;
return new d3_rgb(Math.min(255, r / k), Math.min(255, g / k), Math.min(255, b / k));
};
d3_rgbPrototype.darker = function(k) {
k = Math.pow(.7, arguments.length ? k : 1);
return new d3_rgb(k * this.r, k * this.g, k * this.b);
};
d3_rgbPrototype.hsl = function() {
return d3_rgb_hsl(this.r, this.g, this.b);
};
d3_rgbPrototype.toString = function() {
return "#" + d3_rgb_hex(this.r) + d3_rgb_hex(this.g) + d3_rgb_hex(this.b);
};
function d3_rgb_hex(v) {
return v < 16 ? "0" + Math.max(0, v).toString(16) : Math.min(255, v).toString(16);
}
function d3_rgb_parse(format, rgb, hsl) {
var r = 0, g = 0, b = 0, m1, m2, color;
m1 = /([a-z]+)\((.*)\)/i.exec(format);
if (m1) {
m2 = m1[2].split(",");
switch (m1[1]) {
case "hsl":
{
return hsl(parseFloat(m2[0]), parseFloat(m2[1]) / 100, parseFloat(m2[2]) / 100);
}
case "rgb":
{
return rgb(d3_rgb_parseNumber(m2[0]), d3_rgb_parseNumber(m2[1]), d3_rgb_parseNumber(m2[2]));
}
}
}
if (color = d3_rgb_names.get(format)) return rgb(color.r, color.g, color.b);
if (format != null && format.charAt(0) === "#" && !isNaN(color = parseInt(format.slice(1), 16))) {
if (format.length === 4) {
r = (color & 3840) >> 4;
r = r >> 4 | r;
g = color & 240;
g = g >> 4 | g;
b = color & 15;
b = b << 4 | b;
} else if (format.length === 7) {
r = (color & 16711680) >> 16;
g = (color & 65280) >> 8;
b = color & 255;
}
}
return rgb(r, g, b);
}
function d3_rgb_hsl(r, g, b) {
var min = Math.min(r /= 255, g /= 255, b /= 255), max = Math.max(r, g, b), d = max - min, h, s, l = (max + min) / 2;
if (d) {
s = l < .5 ? d / (max + min) : d / (2 - max - min);
if (r == max) h = (g - b) / d + (g < b ? 6 : 0); else if (g == max) h = (b - r) / d + 2; else h = (r - g) / d + 4;
h *= 60;
} else {
h = NaN;
s = l > 0 && l < 1 ? 0 : h;
}
return new d3_hsl(h, s, l);
}
function d3_rgb_lab(r, g, b) {
r = d3_rgb_xyz(r);
g = d3_rgb_xyz(g);
b = d3_rgb_xyz(b);
var x = d3_xyz_lab((.4124564 * r + .3575761 * g + .1804375 * b) / d3_lab_X), y = d3_xyz_lab((.2126729 * r + .7151522 * g + .072175 * b) / d3_lab_Y), z = d3_xyz_lab((.0193339 * r + .119192 * g + .9503041 * b) / d3_lab_Z);
return d3_lab(116 * y - 16, 500 * (x - y), 200 * (y - z));
}
function d3_rgb_xyz(r) {
return (r /= 255) <= .04045 ? r / 12.92 : Math.pow((r + .055) / 1.055, 2.4);
}
function d3_rgb_parseNumber(c) {
var f = parseFloat(c);
return c.charAt(c.length - 1) === "%" ? Math.round(f * 2.55) : f;
}
var d3_rgb_names = d3.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
});
d3_rgb_names.forEach(function(key, value) {
d3_rgb_names.set(key, d3_rgbNumber(value));
});
function d3_functor(v) {
return typeof v === "function" ? v : function() {
return v;
};
}
d3.functor = d3_functor;
function d3_identity(d) {
return d;
}
d3.xhr = d3_xhrType(d3_identity);
function d3_xhrType(response) {
return function(url, mimeType, callback) {
if (arguments.length === 2 && typeof mimeType === "function") callback = mimeType,
mimeType = null;
return d3_xhr(url, mimeType, response, callback);
};
}
function d3_xhr(url, mimeType, response, callback) {
var xhr = {}, dispatch = d3.dispatch("beforesend", "progress", "load", "error"), headers = {}, request = new XMLHttpRequest(), responseType = null;
if (d3_window.XDomainRequest && !("withCredentials" in request) && /^(http(s)?:)?\/\//.test(url)) request = new XDomainRequest();
"onload" in request ? request.onload = request.onerror = respond : request.onreadystatechange = function() {
request.readyState > 3 && respond();
};
function respond() {
var status = request.status, result;
if (!status && d3_xhrHasResponse(request) || status >= 200 && status < 300 || status === 304) {
try {
result = response.call(xhr, request);
} catch (e) {
dispatch.error.call(xhr, e);
return;
}
dispatch.load.call(xhr, result);
} else {
dispatch.error.call(xhr, request);
}
}
request.onprogress = function(event) {
var o = d3.event;
d3.event = event;
try {
dispatch.progress.call(xhr, request);
} finally {
d3.event = o;
}
};
xhr.header = function(name, value) {
name = (name + "").toLowerCase();
if (arguments.length < 2) return headers[name];
if (value == null) delete headers[name]; else headers[name] = value + "";
return xhr;
};
xhr.mimeType = function(value) {
if (!arguments.length) return mimeType;
mimeType = value == null ? null : value + "";
return xhr;
};
xhr.responseType = function(value) {
if (!arguments.length) return responseType;
responseType = value;
return xhr;
};
xhr.response = function(value) {
response = value;
return xhr;
};
[ "get", "post" ].forEach(function(method) {
xhr[method] = function() {
return xhr.send.apply(xhr, [ method ].concat(d3_array(arguments)));
};
});
xhr.send = function(method, data, callback) {
if (arguments.length === 2 && typeof data === "function") callback = data, data = null;
request.open(method, url, true);
if (mimeType != null && !("accept" in headers)) headers["accept"] = mimeType + ",*/*";
if (request.setRequestHeader) for (var name in headers) request.setRequestHeader(name, headers[name]);
if (mimeType != null && request.overrideMimeType) request.overrideMimeType(mimeType);
if (responseType != null) request.responseType = responseType;
if (callback != null) xhr.on("error", callback).on("load", function(request) {
callback(null, request);
});
dispatch.beforesend.call(xhr, request);
request.send(data == null ? null : data);
return xhr;
};
xhr.abort = function() {
request.abort();
return xhr;
};
d3.rebind(xhr, dispatch, "on");
return callback == null ? xhr : xhr.get(d3_xhr_fixCallback(callback));
}
function d3_xhr_fixCallback(callback) {
return callback.length === 1 ? function(error, request) {
callback(error == null ? request : null);
} : callback;
}
function d3_xhrHasResponse(request) {
var type = request.responseType;
return type && type !== "text" ? request.response : request.responseText;
}
d3.dsv = function(delimiter, mimeType) {
var reFormat = new RegExp('["' + delimiter + "\n]"), delimiterCode = delimiter.charCodeAt(0);
function dsv(url, row, callback) {
if (arguments.length < 3) callback = row, row = null;
var xhr = d3_xhr(url, mimeType, row == null ? response : typedResponse(row), callback);
xhr.row = function(_) {
return arguments.length ? xhr.response((row = _) == null ? response : typedResponse(_)) : row;
};
return xhr;
}
function response(request) {
return dsv.parse(request.responseText);
}
function typedResponse(f) {
return function(request) {
return dsv.parse(request.responseText, f);
};
}
dsv.parse = function(text, f) {
var o;
return dsv.parseRows(text, function(row, i) {
if (o) return o(row, i - 1);
var a = new Function("d", "return {" + row.map(function(name, i) {
return JSON.stringify(name) + ": d[" + i + "]";
}).join(",") + "}");
o = f ? function(row, i) {
return f(a(row), i);
} : a;
});
};
dsv.parseRows = function(text, f) {
var EOL = {}, EOF = {}, rows = [], N = text.length, I = 0, n = 0, t, eol;
function token() {
if (I >= N) return EOF;
if (eol) return eol = false, EOL;
var j = I;
if (text.charCodeAt(j) === 34) {
var i = j;
while (i++ < N) {
if (text.charCodeAt(i) === 34) {
if (text.charCodeAt(i + 1) !== 34) break;
++i;
}
}
I = i + 2;
var c = text.charCodeAt(i + 1);
if (c === 13) {
eol = true;
if (text.charCodeAt(i + 2) === 10) ++I;
} else if (c === 10) {
eol = true;
}
return text.slice(j + 1, i).replace(/""/g, '"');
}
while (I < N) {
var c = text.charCodeAt(I++), k = 1;
if (c === 10) eol = true; else if (c === 13) {
eol = true;
if (text.charCodeAt(I) === 10) ++I, ++k;
} else if (c !== delimiterCode) continue;
return text.slice(j, I - k);
}
return text.slice(j);
}
while ((t = token()) !== EOF) {
var a = [];
while (t !== EOL && t !== EOF) {
a.push(t);
t = token();
}
if (f && (a = f(a, n++)) == null) continue;
rows.push(a);
}
return rows;
};
dsv.format = function(rows) {
if (Array.isArray(rows[0])) return dsv.formatRows(rows);
var fieldSet = new d3_Set(), fields = [];
rows.forEach(function(row) {
for (var field in row) {
if (!fieldSet.has(field)) {
fields.push(fieldSet.add(field));
}
}
});
return [ fields.map(formatValue).join(delimiter) ].concat(rows.map(function(row) {
return fields.map(function(field) {
return formatValue(row[field]);
}).join(delimiter);
})).join("\n");
};
dsv.formatRows = function(rows) {
return rows.map(formatRow).join("\n");
};
function formatRow(row) {
return row.map(formatValue).join(delimiter);
}
function formatValue(text) {
return reFormat.test(text) ? '"' + text.replace(/\"/g, '""') + '"' : text;
}
return dsv;
};
d3.csv = d3.dsv(",", "text/csv");
d3.tsv = d3.dsv(" ", "text/tab-separated-values");
var d3_timer_queueHead, d3_timer_queueTail, d3_timer_interval, d3_timer_timeout, d3_timer_active, d3_timer_frame = d3_window[d3_vendorSymbol(d3_window, "requestAnimationFrame")] || function(callback) {
setTimeout(callback, 17);
};
d3.timer = function(callback, delay, then) {
var n = arguments.length;
if (n < 2) delay = 0;
if (n < 3) then = Date.now();
var time = then + delay, timer = {
c: callback,
t: time,
f: false,
n: null
};
if (d3_timer_queueTail) d3_timer_queueTail.n = timer; else d3_timer_queueHead = timer;
d3_timer_queueTail = timer;
if (!d3_timer_interval) {
d3_timer_timeout = clearTimeout(d3_timer_timeout);
d3_timer_interval = 1;
d3_timer_frame(d3_timer_step);
}
};
function d3_timer_step() {
var now = d3_timer_mark(), delay = d3_timer_sweep() - now;
if (delay > 24) {
if (isFinite(delay)) {
clearTimeout(d3_timer_timeout);
d3_timer_timeout = setTimeout(d3_timer_step, delay);
}
d3_timer_interval = 0;
} else {
d3_timer_interval = 1;
d3_timer_frame(d3_timer_step);
}
}
d3.timer.flush = function() {
d3_timer_mark();
d3_timer_sweep();
};
function d3_timer_mark() {
var now = Date.now();
d3_timer_active = d3_timer_queueHead;
while (d3_timer_active) {
if (now >= d3_timer_active.t) d3_timer_active.f = d3_timer_active.c(now - d3_timer_active.t);
d3_timer_active = d3_timer_active.n;
}
return now;
}
function d3_timer_sweep() {
var t0, t1 = d3_timer_queueHead, time = Infinity;
while (t1) {
if (t1.f) {
t1 = t0 ? t0.n = t1.n : d3_timer_queueHead = t1.n;
} else {
if (t1.t < time) time = t1.t;
t1 = (t0 = t1).n;
}
}
d3_timer_queueTail = t0;
return time;
}
function d3_format_precision(x, p) {
return p - (x ? Math.ceil(Math.log(x) / Math.LN10) : 1);
}
d3.round = function(x, n) {
return n ? Math.round(x * (n = Math.pow(10, n))) / n : Math.round(x);
};
var d3_formatPrefixes = [ "y", "z", "a", "f", "p", "n", "µ", "m", "", "k", "M", "G", "T", "P", "E", "Z", "Y" ].map(d3_formatPrefix);
d3.formatPrefix = function(value, precision) {
var i = 0;
if (value) {
if (value < 0) value *= -1;
if (precision) value = d3.round(value, d3_format_precision(value, precision));
i = 1 + Math.floor(1e-12 + Math.log(value) / Math.LN10);
i = Math.max(-24, Math.min(24, Math.floor((i - 1) / 3) * 3));
}
return d3_formatPrefixes[8 + i / 3];
};
function d3_formatPrefix(d, i) {
var k = Math.pow(10, abs(8 - i) * 3);
return {
scale: i > 8 ? function(d) {
return d / k;
} : function(d) {
return d * k;
},
symbol: d
};
}
function d3_locale_numberFormat(locale) {
var locale_decimal = locale.decimal, locale_thousands = locale.thousands, locale_grouping = locale.grouping, locale_currency = locale.currency, formatGroup = locale_grouping && locale_thousands ? function(value, width) {
var i = value.length, t = [], j = 0, g = locale_grouping[0], length = 0;
while (i > 0 && g > 0) {
if (length + g + 1 > width) g = Math.max(1, width - length);
t.push(value.substring(i -= g, i + g));
if ((length += g + 1) > width) break;
g = locale_grouping[j = (j + 1) % locale_grouping.length];
}
return t.reverse().join(locale_thousands);
} : d3_identity;
return function(specifier) {
var match = d3_format_re.exec(specifier), fill = match[1] || " ", align = match[2] || ">", sign = match[3] || "-", symbol = match[4] || "", zfill = match[5], width = +match[6], comma = match[7], precision = match[8], type = match[9], scale = 1, prefix = "", suffix = "", integer = false, exponent = true;
if (precision) precision = +precision.substring(1);
if (zfill || fill === "0" && align === "=") {
zfill = fill = "0";
align = "=";
}
switch (type) {
case "n":
comma = true;
type = "g";
break;
case "%":
scale = 100;
suffix = "%";
type = "f";
break;
case "p":
scale = 100;
suffix = "%";
type = "r";
break;
case "b":
case "o":
case "x":
case "X":
if (symbol === "#") prefix = "0" + type.toLowerCase();
case "c":
exponent = false;
case "d":
integer = true;
precision = 0;
break;
case "s":
scale = -1;
type = "r";
break;
}
if (symbol === "$") prefix = locale_currency[0], suffix = locale_currency[1];
if (type == "r" && !precision) type = "g";
if (precision != null) {
if (type == "g") precision = Math.max(1, Math.min(21, precision)); else if (type == "e" || type == "f") precision = Math.max(0, Math.min(20, precision));
}
type = d3_format_types.get(type) || d3_format_typeDefault;
var zcomma = zfill && comma;
return function(value) {
var fullSuffix = suffix;
if (integer && value % 1) return "";
var negative = value < 0 || value === 0 && 1 / value < 0 ? (value = -value, "-") : sign === "-" ? "" : sign;
if (scale < 0) {
var unit = d3.formatPrefix(value, precision);
value = unit.scale(value);
fullSuffix = unit.symbol + suffix;
} else {
value *= scale;
}
value = type(value, precision);
var i = value.lastIndexOf("."), before, after;
if (i < 0) {
var j = exponent ? value.lastIndexOf("e") : -1;
if (j < 0) before = value, after = ""; else before = value.substring(0, j), after = value.substring(j);
} else {
before = value.substring(0, i);
after = locale_decimal + value.substring(i + 1);
}
if (!zfill && comma) before = formatGroup(before, Infinity);
var length = prefix.length + before.length + after.length + (zcomma ? 0 : negative.length), padding = length < width ? new Array(length = width - length + 1).join(fill) : "";
if (zcomma) before = formatGroup(padding + before, padding.length ? width - after.length : Infinity);
negative += prefix;
value = before + after;
return (align === "<" ? negative + value + padding : align === ">" ? padding + negative + value : align === "^" ? padding.substring(0, length >>= 1) + negative + value + padding.substring(length) : negative + (zcomma ? value : padding + value)) + fullSuffix;
};
};
}
var d3_format_re = /(?:([^{])?([<>=^]))?([+\- ])?([$#])?(0)?(\d+)?(,)?(\.-?\d+)?([a-z%])?/i;
var d3_format_types = d3.map({
b: function(x) {
return x.toString(2);
},
c: function(x) {
return String.fromCharCode(x);
},
o: function(x) {
return x.toString(8);
},
x: function(x) {
return x.toString(16);
},
X: function(x) {
return x.toString(16).toUpperCase();
},
g: function(x, p) {
return x.toPrecision(p);
},
e: function(x, p) {
return x.toExponential(p);
},
f: function(x, p) {
return x.toFixed(p);
},
r: function(x, p) {
return (x = d3.round(x, d3_format_precision(x, p))).toFixed(Math.max(0, Math.min(20, d3_format_precision(x * (1 + 1e-15), p))));
}
});
function d3_format_typeDefault(x) {
return x + "";
}
var d3_time = d3.time = {}, d3_date = Date;
function d3_date_utc() {
this._ = new Date(arguments.length > 1 ? Date.UTC.apply(this, arguments) : arguments[0]);
}
d3_date_utc.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() {
d3_time_prototype.setUTCDate.apply(this._, arguments);
},
setDay: function() {
d3_time_prototype.setUTCDay.apply(this._, arguments);
},
setFullYear: function() {
d3_time_prototype.setUTCFullYear.apply(this._, arguments);
},
setHours: function() {
d3_time_prototype.setUTCHours.apply(this._, arguments);
},
setMilliseconds: function() {
d3_time_prototype.setUTCMilliseconds.apply(this._, arguments);
},
setMinutes: function() {
d3_time_prototype.setUTCMinutes.apply(this._, arguments);
},
setMonth: function() {
d3_time_prototype.setUTCMonth.apply(this._, arguments);
},
setSeconds: function() {
d3_time_prototype.setUTCSeconds.apply(this._, arguments);
},
setTime: function() {
d3_time_prototype.setTime.apply(this._, arguments);
}
};
var d3_time_prototype = Date.prototype;
function d3_time_interval(local, step, number) {
function round(date) {
var d0 = local(date), d1 = offset(d0, 1);
return date - d0 < d1 - date ? d0 : d1;
}
function ceil(date) {
step(date = local(new d3_date(date - 1)), 1);
return date;
}
function offset(date, k) {
step(date = new d3_date(+date), k);
return date;
}
function range(t0, t1, dt) {
var time = ceil(t0), times = [];
if (dt > 1) {
while (time < t1) {
if (!(number(time) % dt)) times.push(new Date(+time));
step(time, 1);
}
} else {
while (time < t1) times.push(new Date(+time)), step(time, 1);
}
return times;
}
function range_utc(t0, t1, dt) {
try {
d3_date = d3_date_utc;
var utc = new d3_date_utc();
utc._ = t0;
return range(utc, t1, dt);
} finally {
d3_date = Date;
}
}
local.floor = local;
local.round = round;
local.ceil = ceil;
local.offset = offset;
local.range = range;
var utc = local.utc = d3_time_interval_utc(local);
utc.floor = utc;
utc.round = d3_time_interval_utc(round);
utc.ceil = d3_time_interval_utc(ceil);
utc.offset = d3_time_interval_utc(offset);
utc.range = range_utc;
return local;
}
function d3_time_interval_utc(method) {
return function(date, k) {
try {
d3_date = d3_date_utc;
var utc = new d3_date_utc();
utc._ = date;
return method(utc, k)._;
} finally {
d3_date = Date;
}
};
}
d3_time.year = d3_time_interval(function(date) {
date = d3_time.day(date);
date.setMonth(0, 1);
return date;
}, function(date, offset) {
date.setFullYear(date.getFullYear() + offset);
}, function(date) {
return date.getFullYear();
});
d3_time.years = d3_time.year.range;
d3_time.years.utc = d3_time.year.utc.range;
d3_time.day = d3_time_interval(function(date) {
var day = new d3_date(2e3, 0);
day.setFullYear(date.getFullYear(), date.getMonth(), date.getDate());
return day;
}, function(date, offset) {
date.setDate(date.getDate() + offset);
}, function(date) {
return date.getDate() - 1;
});
d3_time.days = d3_time.day.range;
d3_time.days.utc = d3_time.day.utc.range;
d3_time.dayOfYear = function(date) {
var year = d3_time.year(date);
return Math.floor((date - year - (date.getTimezoneOffset() - year.getTimezoneOffset()) * 6e4) / 864e5);
};
[ "sunday", "monday", "tuesday", "wednesday", "thursday", "friday", "saturday" ].forEach(function(day, i) {
i = 7 - i;
var interval = d3_time[day] = d3_time_interval(function(date) {
(date = d3_time.day(date)).setDate(date.getDate() - (date.getDay() + i) % 7);
return date;
}, function(date, offset) {
date.setDate(date.getDate() + Math.floor(offset) * 7);
}, function(date) {
var day = d3_time.year(date).getDay();
return Math.floor((d3_time.dayOfYear(date) + (day + i) % 7) / 7) - (day !== i);
});
d3_time[day + "s"] = interval.range;
d3_time[day + "s"].utc = interval.utc.range;
d3_time[day + "OfYear"] = function(date) {
var day = d3_time.year(date).getDay();
return Math.floor((d3_time.dayOfYear(date) + (day + i) % 7) / 7);
};
});
d3_time.week = d3_time.sunday;
d3_time.weeks = d3_time.sunday.range;
d3_time.weeks.utc = d3_time.sunday.utc.range;
d3_time.weekOfYear = d3_time.sundayOfYear;
function d3_locale_timeFormat(locale) {
var locale_dateTime = locale.dateTime, locale_date = locale.date, locale_time = locale.time, locale_periods = locale.periods, locale_days = locale.days, locale_shortDays = locale.shortDays, locale_months = locale.months, locale_shortMonths = locale.shortMonths;
function d3_time_format(template) {
var n = template.length;
function format(date) {
var string = [], i = -1, j = 0, c, p, f;
while (++i < n) {
if (template.charCodeAt(i) === 37) {
string.push(template.slice(j, i));
if ((p = d3_time_formatPads[c = template.charAt(++i)]) != null) c = template.charAt(++i);
if (f = d3_time_formats[c]) c = f(date, p == null ? c === "e" ? " " : "0" : p);
string.push(c);
j = i + 1;
}
}
string.push(template.slice(j, i));
return string.join("");
}
format.parse = function(string) {
var d = {
y: 1900,
m: 0,
d: 1,
H: 0,
M: 0,
S: 0,
L: 0,
Z: null
}, i = d3_time_parse(d, template, string, 0);
if (i != string.length) return null;
if ("p" in d) d.H = d.H % 12 + d.p * 12;
var localZ = d.Z != null && d3_date !== d3_date_utc, date = new (localZ ? d3_date_utc : d3_date)();
if ("j" in d) date.setFullYear(d.y, 0, d.j); else if ("w" in d && ("W" in d || "U" in d)) {
date.setFullYear(d.y, 0, 1);
date.setFullYear(d.y, 0, "W" in d ? (d.w + 6) % 7 + d.W * 7 - (date.getDay() + 5) % 7 : d.w + d.U * 7 - (date.getDay() + 6) % 7);
} else date.setFullYear(d.y, d.m, d.d);
date.setHours(d.H + (d.Z / 100 | 0), d.M + d.Z % 100, d.S, d.L);
return localZ ? date._ : date;
};
format.toString = function() {
return template;
};
return format;
}
function d3_time_parse(date, template, string, j) {
var c, p, t, i = 0, n = template.length, m = string.length;
while (i < n) {
if (j >= m) return -1;
c = template.charCodeAt(i++);
if (c === 37) {
t = template.charAt(i++);
p = d3_time_parsers[t in d3_time_formatPads ? template.charAt(i++) : t];
if (!p || (j = p(date, string, j)) < 0) return -1;
} else if (c != string.charCodeAt(j++)) {
return -1;
}
}
return j;
}
d3_time_format.utc = function(template) {
var local = d3_time_format(template);
function format(date) {
try {
d3_date = d3_date_utc;
var utc = new d3_date();
utc._ = date;
return local(utc);
} finally {
d3_date = Date;
}
}
format.parse = function(string) {
try {
d3_date = d3_date_utc;
var date = local.parse(string);
return date && date._;
} finally {
d3_date = Date;
}
};
format.toString = local.toString;
return format;
};
d3_time_format.multi = d3_time_format.utc.multi = d3_time_formatMulti;
var d3_time_periodLookup = d3.map(), d3_time_dayRe = d3_time_formatRe(locale_days), d3_time_dayLookup = d3_time_formatLookup(locale_days), d3_time_dayAbbrevRe = d3_time_formatRe(locale_shortDays), d3_time_dayAbbrevLookup = d3_time_formatLookup(locale_shortDays), d3_time_monthRe = d3_time_formatRe(locale_months), d3_time_monthLookup = d3_time_formatLookup(locale_months), d3_time_monthAbbrevRe = d3_time_formatRe(locale_shortMonths), d3_time_monthAbbrevLookup = d3_time_formatLookup(locale_shortMonths);
locale_periods.forEach(function(p, i) {
d3_time_periodLookup.set(p.toLowerCase(), i);
});
var d3_time_formats = {
a: function(d) {
return locale_shortDays[d.getDay()];
},
A: function(d) {
return locale_days[d.getDay()];
},
b: function(d) {
return locale_shortMonths[d.getMonth()];
},
B: function(d) {
return locale_months[d.getMonth()];
},
c: d3_time_format(locale_dateTime),
d: function(d, p) {
return d3_time_formatPad(d.getDate(), p, 2);
},
e: function(d, p) {
return d3_time_formatPad(d.getDate(), p, 2);
},
H: function(d, p) {
return d3_time_formatPad(d.getHours(), p, 2);
},
I: function(d, p) {
return d3_time_formatPad(d.getHours() % 12 || 12, p, 2);
},
j: function(d, p) {
return d3_time_formatPad(1 + d3_time.dayOfYear(d), p, 3);
},
L: function(d, p) {
return d3_time_formatPad(d.getMilliseconds(), p, 3);
},
m: function(d, p) {
return d3_time_formatPad(d.getMonth() + 1, p, 2);
},
M: function(d, p) {
return d3_time_formatPad(d.getMinutes(), p, 2);
},
p: function(d) {
return locale_periods[+(d.getHours() >= 12)];
},
S: function(d, p) {
return d3_time_formatPad(d.getSeconds(), p, 2);
},
U: function(d, p) {
return d3_time_formatPad(d3_time.sundayOfYear(d), p, 2);
},
w: function(d) {
return d.getDay();
},
W: function(d, p) {
return d3_time_formatPad(d3_time.mondayOfYear(d), p, 2);
},
x: d3_time_format(locale_date),
X: d3_time_format(locale_time),
y: function(d, p) {
return d3_time_formatPad(d.getFullYear() % 100, p, 2);
},
Y: function(d, p) {
return d3_time_formatPad(d.getFullYear() % 1e4, p, 4);
},
Z: d3_time_zone,
"%": function() {
return "%";
}
};
var d3_time_parsers = {
a: d3_time_parseWeekdayAbbrev,
A: d3_time_parseWeekday,
b: d3_time_parseMonthAbbrev,
B: d3_time_parseMonth,
c: d3_time_parseLocaleFull,
d: d3_time_parseDay,
e: d3_time_parseDay,
H: d3_time_parseHour24,
I: d3_time_parseHour24,
j: d3_time_parseDayOfYear,
L: d3_time_parseMilliseconds,
m: d3_time_parseMonthNumber,
M: d3_time_parseMinutes,
p: d3_time_parseAmPm,
S: d3_time_parseSeconds,
U: d3_time_parseWeekNumberSunday,
w: d3_time_parseWeekdayNumber,
W: d3_time_parseWeekNumberMonday,
x: d3_time_parseLocaleDate,
X: d3_time_parseLocaleTime,
y: d3_time_parseYear,
Y: d3_time_parseFullYear,
Z: d3_time_parseZone,
"%": d3_time_parseLiteralPercent
};
function d3_time_parseWeekdayAbbrev(date, string, i) {
d3_time_dayAbbrevRe.lastIndex = 0;
var n = d3_time_dayAbbrevRe.exec(string.slice(i));
return n ? (date.w = d3_time_dayAbbrevLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;
}
function d3_time_parseWeekday(date, string, i) {
d3_time_dayRe.lastIndex = 0;
var n = d3_time_dayRe.exec(string.slice(i));
return n ? (date.w = d3_time_dayLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;
}
function d3_time_parseMonthAbbrev(date, string, i) {
d3_time_monthAbbrevRe.lastIndex = 0;
var n = d3_time_monthAbbrevRe.exec(string.slice(i));
return n ? (date.m = d3_time_monthAbbrevLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;
}
function d3_time_parseMonth(date, string, i) {
d3_time_monthRe.lastIndex = 0;
var n = d3_time_monthRe.exec(string.slice(i));
return n ? (date.m = d3_time_monthLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;
}
function d3_time_parseLocaleFull(date, string, i) {
return d3_time_parse(date, d3_time_formats.c.toString(), string, i);
}
function d3_time_parseLocaleDate(date, string, i) {
return d3_time_parse(date, d3_time_formats.x.toString(), string, i);
}
function d3_time_parseLocaleTime(date, string, i) {
return d3_time_parse(date, d3_time_formats.X.toString(), string, i);
}
function d3_time_parseAmPm(date, string, i) {
var n = d3_time_periodLookup.get(string.slice(i, i += 2).toLowerCase());
return n == null ? -1 : (date.p = n, i);
}
return d3_time_format;
}
var d3_time_formatPads = {
"-": "",
_: " ",
"0": "0"
}, d3_time_numberRe = /^\s*\d+/, d3_time_percentRe = /^%/;
function d3_time_formatPad(value, fill, width) {
var sign = value < 0 ? "-" : "", string = (sign ? -value : value) + "", length = string.length;
return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string);
}
function d3_time_formatRe(names) {
return new RegExp("^(?:" + names.map(d3.requote).join("|") + ")", "i");
}
function d3_time_formatLookup(names) {
var map = new d3_Map(), i = -1, n = names.length;
while (++i < n) map.set(names[i].toLowerCase(), i);
return map;
}
function d3_time_parseWeekdayNumber(date, string, i) {
d3_time_numberRe.lastIndex = 0;
var n = d3_time_numberRe.exec(string.slice(i, i + 1));
return n ? (date.w = +n[0], i + n[0].length) : -1;
}
function d3_time_parseWeekNumberSunday(date, string, i) {
d3_time_numberRe.lastIndex = 0;
var n = d3_time_numberRe.exec(string.slice(i));
return n ? (date.U = +n[0], i + n[0].length) : -1;
}
function d3_time_parseWeekNumberMonday(date, string, i) {
d3_time_numberRe.lastIndex = 0;
var n = d3_time_numberRe.exec(string.slice(i));
return n ? (date.W = +n[0], i + n[0].length) : -1;
}
function d3_time_parseFullYear(date, string, i) {
d3_time_numberRe.lastIndex = 0;
var n = d3_time_numberRe.exec(string.slice(i, i + 4));
return n ? (date.y = +n[0], i + n[0].length) : -1;
}
function d3_time_parseYear(date, string, i) {
d3_time_numberRe.lastIndex = 0;
var n = d3_time_numberRe.exec(string.slice(i, i + 2));
return n ? (date.y = d3_time_expandYear(+n[0]), i + n[0].length) : -1;
}
function d3_time_parseZone(date, string, i) {
return /^[+-]\d{4}$/.test(string = string.slice(i, i + 5)) ? (date.Z = -string,
i + 5) : -1;
}
function d3_time_expandYear(d) {
return d + (d > 68 ? 1900 : 2e3);
}
function d3_time_parseMonthNumber(date, string, i) {
d3_time_numberRe.lastIndex = 0;
var n = d3_time_numberRe.exec(string.slice(i, i + 2));
return n ? (date.m = n[0] - 1, i + n[0].length) : -1;
}
function d3_time_parseDay(date, string, i) {
d3_time_numberRe.lastIndex = 0;
var n = d3_time_numberRe.exec(string.slice(i, i + 2));
return n ? (date.d = +n[0], i + n[0].length) : -1;
}
function d3_time_parseDayOfYear(date, string, i) {
d3_time_numberRe.lastIndex = 0;
var n = d3_time_numberRe.exec(string.slice(i, i + 3));
return n ? (date.j = +n[0], i + n[0].length) : -1;
}
function d3_time_parseHour24(date, string, i) {
d3_time_numberRe.lastIndex = 0;
var n = d3_time_numberRe.exec(string.slice(i, i + 2));
return n ? (date.H = +n[0], i + n[0].length) : -1;
}
function d3_time_parseMinutes(date, string, i) {
d3_time_numberRe.lastIndex = 0;
var n = d3_time_numberRe.exec(string.slice(i, i + 2));
return n ? (date.M = +n[0], i + n[0].length) : -1;
}
function d3_time_parseSeconds(date, string, i) {
d3_time_numberRe.lastIndex = 0;
var n = d3_time_numberRe.exec(string.slice(i, i + 2));
return n ? (date.S = +n[0], i + n[0].length) : -1;
}
function d3_time_parseMilliseconds(date, string, i) {
d3_time_numberRe.lastIndex = 0;
var n = d3_time_numberRe.exec(string.slice(i, i + 3));
return n ? (date.L = +n[0], i + n[0].length) : -1;
}
function d3_time_zone(d) {
var z = d.getTimezoneOffset(), zs = z > 0 ? "-" : "+", zh = abs(z) / 60 | 0, zm = abs(z) % 60;
return zs + d3_time_formatPad(zh, "0", 2) + d3_time_formatPad(zm, "0", 2);
}
function d3_time_parseLiteralPercent(date, string, i) {
d3_time_percentRe.lastIndex = 0;
var n = d3_time_percentRe.exec(string.slice(i, i + 1));
return n ? i + n[0].length : -1;
}
function d3_time_formatMulti(formats) {
var n = formats.length, i = -1;
while (++i < n) formats[i][0] = this(formats[i][0]);
return function(date) {
var i = 0, f = formats[i];
while (!f[1](date)) f = formats[++i];
return f[0](date);
};
}
d3.locale = function(locale) {
return {
numberFormat: d3_locale_numberFormat(locale),
timeFormat: d3_locale_timeFormat(locale)
};
};
var d3_locale_enUS = d3.locale({
decimal: ".",
thousands: ",",
grouping: [ 3 ],
currency: [ "$", "" ],
dateTime: "%a %b %e %X %Y",
date: "%m/%d/%Y",
time: "%H:%M:%S",
periods: [ "AM", "PM" ],
days: [ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ],
shortDays: [ "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" ],
months: [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ],
shortMonths: [ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" ]
});
d3.format = d3_locale_enUS.numberFormat;
d3.geo = {};
function d3_adder() {}
d3_adder.prototype = {
s: 0,
t: 0,
add: function(y) {
d3_adderSum(y, this.t, d3_adderTemp);
d3_adderSum(d3_adderTemp.s, this.s, this);
if (this.s) this.t += d3_adderTemp.t; else this.s = d3_adderTemp.t;
},
reset: function() {
this.s = this.t = 0;
},
valueOf: function() {
return this.s;
}
};
var d3_adderTemp = new d3_adder();
function d3_adderSum(a, b, o) {
var x = o.s = a + b, bv = x - a, av = x - bv;
o.t = a - av + (b - bv);
}
d3.geo.stream = function(object, listener) {
if (object && d3_geo_streamObjectType.hasOwnProperty(object.type)) {
d3_geo_streamObjectType[object.type](object, listener);
} else {
d3_geo_streamGeometry(object, listener);
}
};
function d3_geo_streamGeometry(geometry, listener) {
if (geometry && d3_geo_streamGeometryType.hasOwnProperty(geometry.type)) {
d3_geo_streamGeometryType[geometry.type](geometry, listener);
}
}
var d3_geo_streamObjectType = {
Feature: function(feature, listener) {
d3_geo_streamGeometry(feature.geometry, listener);
},
FeatureCollection: function(object, listener) {
var features = object.features, i = -1, n = features.length;
while (++i < n) d3_geo_streamGeometry(features[i].geometry, listener);
}
};
var d3_geo_streamGeometryType = {
Sphere: function(object, listener) {
listener.sphere();
},
Point: function(object, listener) {
object = object.coordinates;
listener.point(object[0], object[1], object[2]);
},
MultiPoint: function(object, listener) {
var coordinates = object.coordinates, i = -1, n = coordinates.length;
while (++i < n) object = coordinates[i], listener.point(object[0], object[1], object[2]);
},
LineString: function(object, listener) {
d3_geo_streamLine(object.coordinates, listener, 0);
},
MultiLineString: function(object, listener) {
var coordinates = object.coordinates, i = -1, n = coordinates.length;
while (++i < n) d3_geo_streamLine(coordinates[i], listener, 0);
},
Polygon: function(object, listener) {
d3_geo_streamPolygon(object.coordinates, listener);
},
MultiPolygon: function(object, listener) {
var coordinates = object.coordinates, i = -1, n = coordinates.length;
while (++i < n) d3_geo_streamPolygon(coordinates[i], listener);
},
GeometryCollection: function(object, listener) {
var geometries = object.geometries, i = -1, n = geometries.length;
while (++i < n) d3_geo_streamGeometry(geometries[i], listener);
}
};
function d3_geo_streamLine(coordinates, listener, closed) {
var i = -1, n = coordinates.length - closed, coordinate;
listener.lineStart();
while (++i < n) coordinate = coordinates[i], listener.point(coordinate[0], coordinate[1], coordinate[2]);
listener.lineEnd();
}
function d3_geo_streamPolygon(coordinates, listener) {
var i = -1, n = coordinates.length;
listener.polygonStart();
while (++i < n) d3_geo_streamLine(coordinates[i], listener, 1);
listener.polygonEnd();
}
d3.geo.area = function(object) {
d3_geo_areaSum = 0;
d3.geo.stream(object, d3_geo_area);
return d3_geo_areaSum;
};
var d3_geo_areaSum, d3_geo_areaRingSum = new d3_adder();
var d3_geo_area = {
sphere: function() {
d3_geo_areaSum += 4 * π;
},
point: d3_noop,
lineStart: d3_noop,
lineEnd: d3_noop,
polygonStart: function() {
d3_geo_areaRingSum.reset();
d3_geo_area.lineStart = d3_geo_areaRingStart;
},
polygonEnd: function() {
var area = 2 * d3_geo_areaRingSum;
d3_geo_areaSum += area < 0 ? 4 * π + area : area;
d3_geo_area.lineStart = d3_geo_area.lineEnd = d3_geo_area.point = d3_noop;
}
};
function d3_geo_areaRingStart() {
var λ00, φ00, λ0, cosφ0, sinφ0;
d3_geo_area.point = function(λ, φ) {
d3_geo_area.point = nextPoint;
λ0 = (λ00 = λ) * d3_radians, cosφ0 = Math.cos(φ = (φ00 = φ) * d3_radians / 2 + π / 4),
sinφ0 = Math.sin(φ);
};
function nextPoint(λ, φ) {
λ *= d3_radians;
φ = φ * d3_radians / 2 + π / 4;
var dλ = λ - λ0, sdλ = dλ >= 0 ? 1 : -1, adλ = sdλ * dλ, cosφ = Math.cos(φ), sinφ = Math.sin(φ), k = sinφ0 * sinφ, u = cosφ0 * cosφ + k * Math.cos(adλ), v = k * sdλ * Math.sin(adλ);
d3_geo_areaRingSum.add(Math.atan2(v, u));
λ0 = λ, cosφ0 = cosφ, sinφ0 = sinφ;
}
d3_geo_area.lineEnd = function() {
nextPoint(λ00, φ00);
};
}
function d3_geo_cartesian(spherical) {
var λ = spherical[0], φ = spherical[1], cosφ = Math.cos(φ);
return [ cosφ * Math.cos(λ), cosφ * Math.sin(λ), Math.sin(φ) ];
}
function d3_geo_cartesianDot(a, b) {
return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
}
function d3_geo_cartesianCross(a, b) {
return [ a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0] ];
}
function d3_geo_cartesianAdd(a, b) {
a[0] += b[0];
a[1] += b[1];
a[2] += b[2];
}
function d3_geo_cartesianScale(vector, k) {
return [ vector[0] * k, vector[1] * k, vector[2] * k ];
}
function d3_geo_cartesianNormalize(d) {
var l = Math.sqrt(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]);
d[0] /= l;
d[1] /= l;
d[2] /= l;
}
function d3_geo_spherical(cartesian) {
return [ Math.atan2(cartesian[1], cartesian[0]), d3_asin(cartesian[2]) ];
}
function d3_geo_sphericalEqual(a, b) {
return abs(a[0] - b[0]) < ε && abs(a[1] - b[1]) < ε;
}
d3.geo.bounds = function() {
var λ0, φ0, λ1, φ1, λ_, λ__, φ__, p0, dλSum, ranges, range;
var bound = {
point: point,
lineStart: lineStart,
lineEnd: lineEnd,
polygonStart: function() {
bound.point = ringPoint;
bound.lineStart = ringStart;
bound.lineEnd = ringEnd;
dλSum = 0;
d3_geo_area.polygonStart();
},
polygonEnd: function() {
d3_geo_area.polygonEnd();
bound.point = point;
bound.lineStart = lineStart;
bound.lineEnd = lineEnd;
if (d3_geo_areaRingSum < 0) λ0 = -(λ1 = 180), φ0 = -(φ1 = 90); else if (dλSum > ε) φ1 = 90; else if (dλSum < -ε) φ0 = -90;
range[0] = λ0, range[1] = λ1;
}
};
function point(λ, φ) {
ranges.push(range = [ λ0 = λ, λ1 = λ ]);
if (φ < φ0) φ0 = φ;
if (φ > φ1) φ1 = φ;
}
function linePoint(λ, φ) {
var p = d3_geo_cartesian([ λ * d3_radians, φ * d3_radians ]);
if (p0) {
var normal = d3_geo_cartesianCross(p0, p), equatorial = [ normal[1], -normal[0], 0 ], inflection = d3_geo_cartesianCross(equatorial, normal);
d3_geo_cartesianNormalize(inflection);
inflection = d3_geo_spherical(inflection);
var dλ = λ - λ_, s = dλ > 0 ? 1 : -1, λi = inflection[0] * d3_degrees * s, antimeridian = abs(dλ) > 180;
if (antimeridian ^ (s * λ_ < λi && λi < s * λ)) {
var φi = inflection[1] * d3_degrees;
if (φi > φ1) φ1 = φi;
} else if (λi = (λi + 360) % 360 - 180, antimeridian ^ (s * λ_ < λi && λi < s * λ)) {
var φi = -inflection[1] * d3_degrees;
if (φi < φ0) φ0 = φi;
} else {
if (φ < φ0) φ0 = φ;
if (φ > φ1) φ1 = φ;
}
if (antimeridian) {
if (λ < λ_) {
if (angle(λ0, λ) > angle(λ0, λ1)) λ1 = λ;
} else {
if (angle(λ, λ1) > angle(λ0, λ1)) λ0 = λ;
}
} else {
if (λ1 >= λ0) {
if (λ < λ0) λ0 = λ;
if (λ > λ1) λ1 = λ;
} else {
if (λ > λ_) {
if (angle(λ0, λ) > angle(λ0, λ1)) λ1 = λ;
} else {
if (angle(λ, λ1) > angle(λ0, λ1)) λ0 = λ;
}
}
}
} else {
point(λ, φ);
}
p0 = p, λ_ = λ;
}
function lineStart() {
bound.point = linePoint;
}
function lineEnd() {
range[0] = λ0, range[1] = λ1;
bound.point = point;
p0 = null;
}
function ringPoint(λ, φ) {
if (p0) {
var dλ = λ - λ_;
dλSum += abs(dλ) > 180 ? dλ + (dλ > 0 ? 360 : -360) : dλ;
} else λ__ = λ, φ__ = φ;
d3_geo_area.point(λ, φ);
linePoint(λ, φ);
}
function ringStart() {
d3_geo_area.lineStart();
}
function ringEnd() {
ringPoint(λ__, φ__);
d3_geo_area.lineEnd();
if (abs(dλSum) > ε) λ0 = -(λ1 = 180);
range[0] = λ0, range[1] = λ1;
p0 = null;
}
function angle(λ0, λ1) {
return (λ1 -= λ0) < 0 ? λ1 + 360 : λ1;
}
function compareRanges(a, b) {
return a[0] - b[0];
}
function withinRange(x, range) {
return range[0] <= range[1] ? range[0] <= x && x <= range[1] : x < range[0] || range[1] < x;
}
return function(feature) {
φ1 = λ1 = -(λ0 = φ0 = Infinity);
ranges = [];
d3.geo.stream(feature, bound);
var n = ranges.length;
if (n) {
ranges.sort(compareRanges);
for (var i = 1, a = ranges[0], b, merged = [ a ]; i < n; ++i) {
b = ranges[i];
if (withinRange(b[0], a) || withinRange(b[1], a)) {
if (angle(a[0], b[1]) > angle(a[0], a[1])) a[1] = b[1];
if (angle(b[0], a[1]) > angle(a[0], a[1])) a[0] = b[0];
} else {
merged.push(a = b);
}
}
var best = -Infinity, dλ;
for (var n = merged.length - 1, i = 0, a = merged[n], b; i <= n; a = b, ++i) {
b = merged[i];
if ((dλ = angle(a[1], b[0])) > best) best = dλ, λ0 = b[0], λ1 = a[1];
}
}
ranges = range = null;
return λ0 === Infinity || φ0 === Infinity ? [ [ NaN, NaN ], [ NaN, NaN ] ] : [ [ λ0, φ0 ], [ λ1, φ1 ] ];
};
}();
d3.geo.centroid = function(object) {
d3_geo_centroidW0 = d3_geo_centroidW1 = d3_geo_centroidX0 = d3_geo_centroidY0 = d3_geo_centroidZ0 = d3_geo_centroidX1 = d3_geo_centroidY1 = d3_geo_centroidZ1 = d3_geo_centroidX2 = d3_geo_centroidY2 = d3_geo_centroidZ2 = 0;
d3.geo.stream(object, d3_geo_centroid);
var x = d3_geo_centroidX2, y = d3_geo_centroidY2, z = d3_geo_centroidZ2, m = x * x + y * y + z * z;
if (m < ε2) {
x = d3_geo_centroidX1, y = d3_geo_centroidY1, z = d3_geo_centroidZ1;
if (d3_geo_centroidW1 < ε) x = d3_geo_centroidX0, y = d3_geo_centroidY0, z = d3_geo_centroidZ0;
m = x * x + y * y + z * z;
if (m < ε2) return [ NaN, NaN ];
}
return [ Math.atan2(y, x) * d3_degrees, d3_asin(z / Math.sqrt(m)) * d3_degrees ];
};
var d3_geo_centroidW0, d3_geo_centroidW1, d3_geo_centroidX0, d3_geo_centroidY0, d3_geo_centroidZ0, d3_geo_centroidX1, d3_geo_centroidY1, d3_geo_centroidZ1, d3_geo_centroidX2, d3_geo_centroidY2, d3_geo_centroidZ2;
var d3_geo_centroid = {
sphere: d3_noop,
point: d3_geo_centroidPoint,
lineStart: d3_geo_centroidLineStart,
lineEnd: d3_geo_centroidLineEnd,
polygonStart: function() {
d3_geo_centroid.lineStart = d3_geo_centroidRingStart;
},
polygonEnd: function() {
d3_geo_centroid.lineStart = d3_geo_centroidLineStart;
}
};
function d3_geo_centroidPoint(λ, φ) {
λ *= d3_radians;
var cosφ = Math.cos(φ *= d3_radians);
d3_geo_centroidPointXYZ(cosφ * Math.cos(λ), cosφ * Math.sin(λ), Math.sin(φ));
}
function d3_geo_centroidPointXYZ(x, y, z) {
++d3_geo_centroidW0;
d3_geo_centroidX0 += (x - d3_geo_centroidX0) / d3_geo_centroidW0;
d3_geo_centroidY0 += (y - d3_geo_centroidY0) / d3_geo_centroidW0;
d3_geo_centroidZ0 += (z - d3_geo_centroidZ0) / d3_geo_centroidW0;
}
function d3_geo_centroidLineStart() {
var x0, y0, z0;
d3_geo_centroid.point = function(λ, φ) {
λ *= d3_radians;
var cosφ = Math.cos(φ *= d3_radians);
x0 = cosφ * Math.cos(λ);
y0 = cosφ * Math.sin(λ);
z0 = Math.sin(φ);
d3_geo_centroid.point = nextPoint;
d3_geo_centroidPointXYZ(x0, y0, z0);
};
function nextPoint(λ, φ) {
λ *= d3_radians;
var cosφ = Math.cos(φ *= d3_radians), x = cosφ * Math.cos(λ), y = cosφ * Math.sin(λ), z = Math.sin(φ), w = Math.atan2(Math.sqrt((w = y0 * z - z0 * y) * w + (w = z0 * x - x0 * z) * w + (w = x0 * y - y0 * x) * w), x0 * x + y0 * y + z0 * z);
d3_geo_centroidW1 += w;
d3_geo_centroidX1 += w * (x0 + (x0 = x));
d3_geo_centroidY1 += w * (y0 + (y0 = y));
d3_geo_centroidZ1 += w * (z0 + (z0 = z));
d3_geo_centroidPointXYZ(x0, y0, z0);
}
}
function d3_geo_centroidLineEnd() {
d3_geo_centroid.point = d3_geo_centroidPoint;
}
function d3_geo_centroidRingStart() {
var λ00, φ00, x0, y0, z0;
d3_geo_centroid.point = function(λ, φ) {
λ00 = λ, φ00 = φ;
d3_geo_centroid.point = nextPoint;
λ *= d3_radians;
var cosφ = Math.cos(φ *= d3_radians);
x0 = cosφ * Math.cos(λ);
y0 = cosφ * Math.sin(λ);
z0 = Math.sin(φ);
d3_geo_centroidPointXYZ(x0, y0, z0);
};
d3_geo_centroid.lineEnd = function() {
nextPoint(λ00, φ00);
d3_geo_centroid.lineEnd = d3_geo_centroidLineEnd;
d3_geo_centroid.point = d3_geo_centroidPoint;
};
function nextPoint(λ, φ) {
λ *= d3_radians;
var cosφ = Math.cos(φ *= d3_radians), x = cosφ * Math.cos(λ), y = cosφ * Math.sin(λ), z = Math.sin(φ), cx = y0 * z - z0 * y, cy = z0 * x - x0 * z, cz = x0 * y - y0 * x, m = Math.sqrt(cx * cx + cy * cy + cz * cz), u = x0 * x + y0 * y + z0 * z, v = m && -d3_acos(u) / m, w = Math.atan2(m, u);
d3_geo_centroidX2 += v * cx;
d3_geo_centroidY2 += v * cy;
d3_geo_centroidZ2 += v * cz;
d3_geo_centroidW1 += w;
d3_geo_centroidX1 += w * (x0 + (x0 = x));
d3_geo_centroidY1 += w * (y0 + (y0 = y));
d3_geo_centroidZ1 += w * (z0 + (z0 = z));
d3_geo_centroidPointXYZ(x0, y0, z0);
}
}
function d3_geo_compose(a, b) {
function compose(x, y) {
return x = a(x, y), b(x[0], x[1]);
}
if (a.invert && b.invert) compose.invert = function(x, y) {
return x = b.invert(x, y), x && a.invert(x[0], x[1]);
};
return compose;
}
function d3_true() {
return true;
}
function d3_geo_clipPolygon(segments, compare, clipStartInside, interpolate, listener) {
var subject = [], clip = [];
segments.forEach(function(segment) {
if ((n = segment.length - 1) <= 0) return;
var n, p0 = segment[0], p1 = segment[n];
if (d3_geo_sphericalEqual(p0, p1)) {
listener.lineStart();
for (var i = 0; i < n; ++i) listener.point((p0 = segment[i])[0], p0[1]);
listener.lineEnd();
return;
}
var a = new d3_geo_clipPolygonIntersection(p0, segment, null, true), b = new d3_geo_clipPolygonIntersection(p0, null, a, false);
a.o = b;
subject.push(a);
clip.push(b);
a = new d3_geo_clipPolygonIntersection(p1, segment, null, false);
b = new d3_geo_clipPolygonIntersection(p1, null, a, true);
a.o = b;
subject.push(a);
clip.push(b);
});
clip.sort(compare);
d3_geo_clipPolygonLinkCircular(subject);
d3_geo_clipPolygonLinkCircular(clip);
if (!subject.length) return;
for (var i = 0, entry = clipStartInside, n = clip.length; i < n; ++i) {
clip[i].e = entry = !entry;
}
var start = subject[0], points, point;
while (1) {
var current = start, isSubject = true;
while (current.v) if ((current = current.n) === start) return;
points = current.z;
listener.lineStart();
do {
current.v = current.o.v = true;
if (current.e) {
if (isSubject) {
for (var i = 0, n = points.length; i < n; ++i) listener.point((point = points[i])[0], point[1]);
} else {
interpolate(current.x, current.n.x, 1, listener);
}
current = current.n;
} else {
if (isSubject) {
points = current.p.z;
for (var i = points.length - 1; i >= 0; --i) listener.point((point = points[i])[0], point[1]);
} else {
interpolate(current.x, current.p.x, -1, listener);
}
current = current.p;
}
current = current.o;
points = current.z;
isSubject = !isSubject;
} while (!current.v);
listener.lineEnd();
}
}
function d3_geo_clipPolygonLinkCircular(array) {
if (!(n = array.length)) return;
var n, i = 0, a = array[0], b;
while (++i < n) {
a.n = b = array[i];
b.p = a;
a = b;
}
a.n = b = array[0];
b.p = a;
}
function d3_geo_clipPolygonIntersection(point, points, other, entry) {
this.x = point;
this.z = points;
this.o = other;
this.e = entry;
this.v = false;
this.n = this.p = null;
}
function d3_geo_clip(pointVisible, clipLine, interpolate, clipStart) {
return function(rotate, listener) {
var line = clipLine(listener), rotatedClipStart = rotate.invert(clipStart[0], clipStart[1]);
var clip = {
point: point,
lineStart: lineStart,
lineEnd: lineEnd,
polygonStart: function() {
clip.point = pointRing;
clip.lineStart = ringStart;
clip.lineEnd = ringEnd;
segments = [];
polygon = [];
},
polygonEnd: function() {
clip.point = point;
clip.lineStart = lineStart;
clip.lineEnd = lineEnd;
segments = d3.merge(segments);
var clipStartInside = d3_geo_pointInPolygon(rotatedClipStart, polygon);
if (segments.length) {
if (!polygonStarted) listener.polygonStart(), polygonStarted = true;
d3_geo_clipPolygon(segments, d3_geo_clipSort, clipStartInside, interpolate, listener);
} else if (clipStartInside) {
if (!polygonStarted) listener.polygonStart(), polygonStarted = true;
listener.lineStart();
interpolate(null, null, 1, listener);
listener.lineEnd();
}
if (polygonStarted) listener.polygonEnd(), polygonStarted = false;
segments = polygon = null;
},
sphere: function() {
listener.polygonStart();
listener.lineStart();
interpolate(null, null, 1, listener);
listener.lineEnd();
listener.polygonEnd();
}
};
function point(λ, φ) {
var point = rotate(λ, φ);
if (pointVisible(λ = point[0], φ = point[1])) listener.point(λ, φ);
}
function pointLine(λ, φ) {
var point = rotate(λ, φ);
line.point(point[0], point[1]);
}
function lineStart() {
clip.point = pointLine;
line.lineStart();
}
function lineEnd() {
clip.point = point;
line.lineEnd();
}
var segments;
var buffer = d3_geo_clipBufferListener(), ringListener = clipLine(buffer), polygonStarted = false, polygon, ring;
function pointRing(λ, φ) {
ring.push([ λ, φ ]);
var point = rotate(λ, φ);
ringListener.point(point[0], point[1]);
}
function ringStart() {
ringListener.lineStart();
ring = [];
}
function ringEnd() {
pointRing(ring[0][0], ring[0][1]);
ringListener.lineEnd();
var clean = ringListener.clean(), ringSegments = buffer.buffer(), segment, n = ringSegments.length;
ring.pop();
polygon.push(ring);
ring = null;
if (!n) return;
if (clean & 1) {
segment = ringSegments[0];
var n = segment.length - 1, i = -1, point;
if (n > 0) {
if (!polygonStarted) listener.polygonStart(), polygonStarted = true;
listener.lineStart();
while (++i < n) listener.point((point = segment[i])[0], point[1]);
listener.lineEnd();
}
return;
}
if (n > 1 && clean & 2) ringSegments.push(ringSegments.pop().concat(ringSegments.shift()));
segments.push(ringSegments.filter(d3_geo_clipSegmentLength1));
}
return clip;
};
}
function d3_geo_clipSegmentLength1(segment) {
return segment.length > 1;
}
function d3_geo_clipBufferListener() {
var lines = [], line;
return {
lineStart: function() {
lines.push(line = []);
},
point: function(λ, φ) {
line.push([ λ, φ ]);
},
lineEnd: d3_noop,
buffer: function() {
var buffer = lines;
lines = [];
line = null;
return buffer;
},
rejoin: function() {
if (lines.length > 1) lines.push(lines.pop().concat(lines.shift()));
}
};
}
function d3_geo_clipSort(a, b) {
return ((a = a.x)[0] < 0 ? a[1] - halfπ - ε : halfπ - a[1]) - ((b = b.x)[0] < 0 ? b[1] - halfπ - ε : halfπ - b[1]);
}
var d3_geo_clipAntimeridian = d3_geo_clip(d3_true, d3_geo_clipAntimeridianLine, d3_geo_clipAntimeridianInterpolate, [ -π, -π / 2 ]);
function d3_geo_clipAntimeridianLine(listener) {
var λ0 = NaN, φ0 = NaN, sλ0 = NaN, clean;
return {
lineStart: function() {
listener.lineStart();
clean = 1;
},
point: function(λ1, φ1) {
var sλ1 = λ1 > 0 ? π : -π, dλ = abs(λ1 - λ0);
if (abs(dλ - π) < ε) {
listener.point(λ0, φ0 = (φ0 + φ1) / 2 > 0 ? halfπ : -halfπ);
listener.point(sλ0, φ0);
listener.lineEnd();
listener.lineStart();
listener.point(sλ1, φ0);
listener.point(λ1, φ0);
clean = 0;
} else if (sλ0 !== sλ1 && dλ >= π) {
if (abs(λ0 - sλ0) < ε) λ0 -= sλ0 * ε;
if (abs(λ1 - sλ1) < ε) λ1 -= sλ1 * ε;
φ0 = d3_geo_clipAntimeridianIntersect(λ0, φ0, λ1, φ1);
listener.point(sλ0, φ0);
listener.lineEnd();
listener.lineStart();
listener.point(sλ1, φ0);
clean = 0;
}
listener.point(λ0 = λ1, φ0 = φ1);
sλ0 = sλ1;
},
lineEnd: function() {
listener.lineEnd();
λ0 = φ0 = NaN;
},
clean: function() {
return 2 - clean;
}
};
}
function d3_geo_clipAntimeridianIntersect(λ0, φ0, λ1, φ1) {
var cosφ0, cosφ1, sinλ0_λ1 = Math.sin(λ0 - λ1);
return abs(sinλ0_λ1) > ε ? Math.atan((Math.sin(φ0) * (cosφ1 = Math.cos(φ1)) * Math.sin(λ1) - Math.sin(φ1) * (cosφ0 = Math.cos(φ0)) * Math.sin(λ0)) / (cosφ0 * cosφ1 * sinλ0_λ1)) : (φ0 + φ1) / 2;
}
function d3_geo_clipAntimeridianInterpolate(from, to, direction, listener) {
var φ;
if (from == null) {
φ = direction * halfπ;
listener.point(-π, φ);
listener.point(0, φ);
listener.point(π, φ);
listener.point(π, 0);
listener.point(π, -φ);
listener.point(0, -φ);
listener.point(-π, -φ);
listener.point(-π, 0);
listener.point(-π, φ);
} else if (abs(from[0] - to[0]) > ε) {
var s = from[0] < to[0] ? π : -π;
φ = direction * s / 2;
listener.point(-s, φ);
listener.point(0, φ);
listener.point(s, φ);
} else {
listener.point(to[0], to[1]);
}
}
function d3_geo_pointInPolygon(point, polygon) {
var meridian = point[0], parallel = point[1], meridianNormal = [ Math.sin(meridian), -Math.cos(meridian), 0 ], polarAngle = 0, winding = 0;
d3_geo_areaRingSum.reset();
for (var i = 0, n = polygon.length; i < n; ++i) {
var ring = polygon[i], m = ring.length;
if (!m) continue;
var point0 = ring[0], λ0 = point0[0], φ0 = point0[1] / 2 + π / 4, sinφ0 = Math.sin(φ0), cosφ0 = Math.cos(φ0), j = 1;
while (true) {
if (j === m) j = 0;
point = ring[j];
var λ = point[0], φ = point[1] / 2 + π / 4, sinφ = Math.sin(φ), cosφ = Math.cos(φ), dλ = λ - λ0, sdλ = dλ >= 0 ? 1 : -1, adλ = sdλ * dλ, antimeridian = adλ > π, k = sinφ0 * sinφ;
d3_geo_areaRingSum.add(Math.atan2(k * sdλ * Math.sin(adλ), cosφ0 * cosφ + k * Math.cos(adλ)));
polarAngle += antimeridian ? dλ + sdλ * τ : dλ;
if (antimeridian ^ λ0 >= meridian ^ λ >= meridian) {
var arc = d3_geo_cartesianCross(d3_geo_cartesian(point0), d3_geo_cartesian(point));
d3_geo_cartesianNormalize(arc);
var intersection = d3_geo_cartesianCross(meridianNormal, arc);
d3_geo_cartesianNormalize(intersection);
var φarc = (antimeridian ^ dλ >= 0 ? -1 : 1) * d3_asin(intersection[2]);
if (parallel > φarc || parallel === φarc && (arc[0] || arc[1])) {
winding += antimeridian ^ dλ >= 0 ? 1 : -1;
}
}
if (!j++) break;
λ0 = λ, sinφ0 = sinφ, cosφ0 = cosφ, point0 = point;
}
}
return (polarAngle < -ε || polarAngle < ε && d3_geo_areaRingSum < 0) ^ winding & 1;
}
function d3_geo_clipCircle(radius) {
var cr = Math.cos(radius), smallRadius = cr > 0, notHemisphere = abs(cr) > ε, interpolate = d3_geo_circleInterpolate(radius, 6 * d3_radians);
return d3_geo_clip(visible, clipLine, interpolate, smallRadius ? [ 0, -radius ] : [ -π, radius - π ]);
function visible(λ, φ) {
return Math.cos(λ) * Math.cos(φ) > cr;
}
function clipLine(listener) {
var point0, c0, v0, v00, clean;
return {
lineStart: function() {
v00 = v0 = false;
clean = 1;
},
point: function(λ, φ) {
var point1 = [ λ, φ ], point2, v = visible(λ, φ), c = smallRadius ? v ? 0 : code(λ, φ) : v ? code(λ + (λ < 0 ? π : -π), φ) : 0;
if (!point0 && (v00 = v0 = v)) listener.lineStart();
if (v !== v0) {
point2 = intersect(point0, point1);
if (d3_geo_sphericalEqual(point0, point2) || d3_geo_sphericalEqual(point1, point2)) {
point1[0] += ε;
point1[1] += ε;
v = visible(point1[0], point1[1]);
}
}
if (v !== v0) {
clean = 0;
if (v) {
listener.lineStart();
point2 = intersect(point1, point0);
listener.point(point2[0], point2[1]);
} else {
point2 = intersect(point0, point1);
listener.point(point2[0], point2[1]);
listener.lineEnd();
}
point0 = point2;
} else if (notHemisphere && point0 && smallRadius ^ v) {
var t;
if (!(c & c0) && (t = intersect(point1, point0, true))) {
clean = 0;
if (smallRadius) {
listener.lineStart();
listener.point(t[0][0], t[0][1]);
listener.point(t[1][0], t[1][1]);
listener.lineEnd();
} else {
listener.point(t[1][0], t[1][1]);
listener.lineEnd();
listener.lineStart();
listener.point(t[0][0], t[0][1]);
}
}
}
if (v && (!point0 || !d3_geo_sphericalEqual(point0, point1))) {
listener.point(point1[0], point1[1]);
}
point0 = point1, v0 = v, c0 = c;
},
lineEnd: function() {
if (v0) listener.lineEnd();
point0 = null;
},
clean: function() {
return clean | (v00 && v0) << 1;
}
};
}
function intersect(a, b, two) {
var pa = d3_geo_cartesian(a), pb = d3_geo_cartesian(b);
var n1 = [ 1, 0, 0 ], n2 = d3_geo_cartesianCross(pa, pb), n2n2 = d3_geo_cartesianDot(n2, n2), n1n2 = n2[0], determinant = n2n2 - n1n2 * n1n2;
if (!determinant) return !two && a;
var c1 = cr * n2n2 / determinant, c2 = -cr * n1n2 / determinant, n1xn2 = d3_geo_cartesianCross(n1, n2), A = d3_geo_cartesianScale(n1, c1), B = d3_geo_cartesianScale(n2, c2);
d3_geo_cartesianAdd(A, B);
var u = n1xn2, w = d3_geo_cartesianDot(A, u), uu = d3_geo_cartesianDot(u, u), t2 = w * w - uu * (d3_geo_cartesianDot(A, A) - 1);
if (t2 < 0) return;
var t = Math.sqrt(t2), q = d3_geo_cartesianScale(u, (-w - t) / uu);
d3_geo_cartesianAdd(q, A);
q = d3_geo_spherical(q);
if (!two) return q;
var λ0 = a[0], λ1 = b[0], φ0 = a[1], φ1 = b[1], z;
if (λ1 < λ0) z = λ0, λ0 = λ1, λ1 = z;
var δλ = λ1 - λ0, polar = abs(δλ - π) < ε, meridian = polar || δλ < ε;
if (!polar && φ1 < φ0) z = φ0, φ0 = φ1, φ1 = z;
if (meridian ? polar ? φ0 + φ1 > 0 ^ q[1] < (abs(q[0] - λ0) < ε ? φ0 : φ1) : φ0 <= q[1] && q[1] <= φ1 : δλ > π ^ (λ0 <= q[0] && q[0] <= λ1)) {
var q1 = d3_geo_cartesianScale(u, (-w + t) / uu);
d3_geo_cartesianAdd(q1, A);
return [ q, d3_geo_spherical(q1) ];
}
}
function code(λ, φ) {
var r = smallRadius ? radius : π - radius, code = 0;
if (λ < -r) code |= 1; else if (λ > r) code |= 2;
if (φ < -r) code |= 4; else if (φ > r) code |= 8;
return code;
}
}
function d3_geom_clipLine(x0, y0, x1, y1) {
return function(line) {
var a = line.a, b = line.b, ax = a.x, ay = a.y, bx = b.x, by = b.y, t0 = 0, t1 = 1, dx = bx - ax, dy = by - ay, r;
r = x0 - ax;
if (!dx && r > 0) return;
r /= dx;
if (dx < 0) {
if (r < t0) return;
if (r < t1) t1 = r;
} else if (dx > 0) {
if (r > t1) return;
if (r > t0) t0 = r;
}
r = x1 - ax;
if (!dx && r < 0) return;
r /= dx;
if (dx < 0) {
if (r > t1) return;
if (r > t0) t0 = r;
} else if (dx > 0) {
if (r < t0) return;
if (r < t1) t1 = r;
}
r = y0 - ay;
if (!dy && r > 0) return;
r /= dy;
if (dy < 0) {
if (r < t0) return;
if (r < t1) t1 = r;
} else if (dy > 0) {
if (r > t1) return;
if (r > t0) t0 = r;
}
r = y1 - ay;
if (!dy && r < 0) return;
r /= dy;
if (dy < 0) {
if (r > t1) return;
if (r > t0) t0 = r;
} else if (dy > 0) {
if (r < t0) return;
if (r < t1) t1 = r;
}
if (t0 > 0) line.a = {
x: ax + t0 * dx,
y: ay + t0 * dy
};
if (t1 < 1) line.b = {
x: ax + t1 * dx,
y: ay + t1 * dy
};
return line;
};
}
var d3_geo_clipExtentMAX = 1e9;
d3.geo.clipExtent = function() {
var x0, y0, x1, y1, stream, clip, clipExtent = {
stream: function(output) {
if (stream) stream.valid = false;
stream = clip(output);
stream.valid = true;
return stream;
},
extent: function(_) {
if (!arguments.length) return [ [ x0, y0 ], [ x1, y1 ] ];
clip = d3_geo_clipExtent(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]);
if (stream) stream.valid = false, stream = null;
return clipExtent;
}
};
return clipExtent.extent([ [ 0, 0 ], [ 960, 500 ] ]);
};
function d3_geo_clipExtent(x0, y0, x1, y1) {
return function(listener) {
var listener_ = listener, bufferListener = d3_geo_clipBufferListener(), clipLine = d3_geom_clipLine(x0, y0, x1, y1), segments, polygon, ring;
var clip = {
point: point,
lineStart: lineStart,
lineEnd: lineEnd,
polygonStart: function() {
listener = bufferListener;
segments = [];
polygon = [];
clean = true;
},
polygonEnd: function() {
listener = listener_;
segments = d3.merge(segments);
var clipStartInside = insidePolygon([ x0, y1 ]), inside = clean && clipStartInside, visible = segments.length;
if (inside || visible) {
listener.polygonStart();
if (inside) {
listener.lineStart();
interpolate(null, null, 1, listener);
listener.lineEnd();
}
if (visible) {
d3_geo_clipPolygon(segments, compare, clipStartInside, interpolate, listener);
}
listener.polygonEnd();
}
segments = polygon = ring = null;
}
};
function insidePolygon(p) {
var wn = 0, n = polygon.length, y = p[1];
for (var i = 0; i < n; ++i) {
for (var j = 1, v = polygon[i], m = v.length, a = v[0], b; j < m; ++j) {
b = v[j];
if (a[1] <= y) {
if (b[1] > y && d3_cross2d(a, b, p) > 0) ++wn;
} else {
if (b[1] <= y && d3_cross2d(a, b, p) < 0) --wn;
}
a = b;
}
}
return wn !== 0;
}
function interpolate(from, to, direction, listener) {
var a = 0, a1 = 0;
if (from == null || (a = corner(from, direction)) !== (a1 = corner(to, direction)) || comparePoints(from, to) < 0 ^ direction > 0) {
do {
listener.point(a === 0 || a === 3 ? x0 : x1, a > 1 ? y1 : y0);
} while ((a = (a + direction + 4) % 4) !== a1);
} else {
listener.point(to[0], to[1]);
}
}
function pointVisible(x, y) {
return x0 <= x && x <= x1 && y0 <= y && y <= y1;
}
function point(x, y) {
if (pointVisible(x, y)) listener.point(x, y);
}
var x__, y__, v__, x_, y_, v_, first, clean;
function lineStart() {
clip.point = linePoint;
if (polygon) polygon.push(ring = []);
first = true;
v_ = false;
x_ = y_ = NaN;
}
function lineEnd() {
if (segments) {
linePoint(x__, y__);
if (v__ && v_) bufferListener.rejoin();
segments.push(bufferListener.buffer());
}
clip.point = point;
if (v_) listener.lineEnd();
}
function linePoint(x, y) {
x = Math.max(-d3_geo_clipExtentMAX, Math.min(d3_geo_clipExtentMAX, x));
y = Math.max(-d3_geo_clipExtentMAX, Math.min(d3_geo_clipExtentMAX, y));
var v = pointVisible(x, y);
if (polygon) ring.push([ x, y ]);
if (first) {
x__ = x, y__ = y, v__ = v;
first = false;
if (v) {
listener.lineStart();
listener.point(x, y);
}
} else {
if (v && v_) listener.point(x, y); else {
var l = {
a: {
x: x_,
y: y_
},
b: {
x: x,
y: y
}
};
if (clipLine(l)) {
if (!v_) {
listener.lineStart();
listener.point(l.a.x, l.a.y);
}
listener.point(l.b.x, l.b.y);
if (!v) listener.lineEnd();
clean = false;
} else if (v) {
listener.lineStart();
listener.point(x, y);
clean = false;
}
}
}
x_ = x, y_ = y, v_ = v;
}
return clip;
};
function corner(p, direction) {
return abs(p[0] - x0) < ε ? direction > 0 ? 0 : 3 : abs(p[0] - x1) < ε ? direction > 0 ? 2 : 1 : abs(p[1] - y0) < ε ? direction > 0 ? 1 : 0 : direction > 0 ? 3 : 2;
}
function compare(a, b) {
return comparePoints(a.x, b.x);
}
function comparePoints(a, b) {
var ca = corner(a, 1), cb = corner(b, 1);
return ca !== cb ? ca - cb : ca === 0 ? b[1] - a[1] : ca === 1 ? a[0] - b[0] : ca === 2 ? a[1] - b[1] : b[0] - a[0];
}
}
function d3_geo_conic(projectAt) {
var φ0 = 0, φ1 = π / 3, m = d3_geo_projectionMutator(projectAt), p = m(φ0, φ1);
p.parallels = function(_) {
if (!arguments.length) return [ φ0 / π * 180, φ1 / π * 180 ];
return m(φ0 = _[0] * π / 180, φ1 = _[1] * π / 180);
};
return p;
}
function d3_geo_conicEqualArea(φ0, φ1) {
var sinφ0 = Math.sin(φ0), n = (sinφ0 + Math.sin(φ1)) / 2, C = 1 + sinφ0 * (2 * n - sinφ0), ρ0 = Math.sqrt(C) / n;
function forward(λ, φ) {
var ρ = Math.sqrt(C - 2 * n * Math.sin(φ)) / n;
return [ ρ * Math.sin(λ *= n), ρ0 - ρ * Math.cos(λ) ];
}
forward.invert = function(x, y) {
var ρ0_y = ρ0 - y;
return [ Math.atan2(x, ρ0_y) / n, d3_asin((C - (x * x + ρ0_y * ρ0_y) * n * n) / (2 * n)) ];
};
return forward;
}
(d3.geo.conicEqualArea = function() {
return d3_geo_conic(d3_geo_conicEqualArea);
}).raw = d3_geo_conicEqualArea;
d3.geo.albers = function() {
return d3.geo.conicEqualArea().rotate([ 96, 0 ]).center([ -.6, 38.7 ]).parallels([ 29.5, 45.5 ]).scale(1070);
};
d3.geo.albersUsa = function() {
var lower48 = d3.geo.albers();
var alaska = d3.geo.conicEqualArea().rotate([ 154, 0 ]).center([ -2, 58.5 ]).parallels([ 55, 65 ]);
var hawaii = d3.geo.conicEqualArea().rotate([ 157, 0 ]).center([ -3, 19.9 ]).parallels([ 8, 18 ]);
var point, pointStream = {
point: function(x, y) {
point = [ x, y ];
}
}, lower48Point, alaskaPoint, hawaiiPoint;
function albersUsa(coordinates) {
var x = coordinates[0], y = coordinates[1];
point = null;
(lower48Point(x, y), point) || (alaskaPoint(x, y), point) || hawaiiPoint(x, y);
return point;
}
albersUsa.invert = function(coordinates) {
var k = lower48.scale(), t = lower48.translate(), x = (coordinates[0] - t[0]) / k, y = (coordinates[1] - t[1]) / k;
return (y >= .12 && y < .234 && x >= -.425 && x < -.214 ? alaska : y >= .166 && y < .234 && x >= -.214 && x < -.115 ? hawaii : lower48).invert(coordinates);
};
albersUsa.stream = function(stream) {
var lower48Stream = lower48.stream(stream), alaskaStream = alaska.stream(stream), hawaiiStream = hawaii.stream(stream);
return {
point: function(x, y) {
lower48Stream.point(x, y);
alaskaStream.point(x, y);
hawaiiStream.point(x, y);
},
sphere: function() {
lower48Stream.sphere();
alaskaStream.sphere();
hawaiiStream.sphere();
},
lineStart: function() {
lower48Stream.lineStart();
alaskaStream.lineStart();
hawaiiStream.lineStart();
},
lineEnd: function() {
lower48Stream.lineEnd();
alaskaStream.lineEnd();
hawaiiStream.lineEnd();
},
polygonStart: function() {
lower48Stream.polygonStart();
alaskaStream.polygonStart();
hawaiiStream.polygonStart();
},
polygonEnd: function() {
lower48Stream.polygonEnd();
alaskaStream.polygonEnd();
hawaiiStream.polygonEnd();
}
};
};
albersUsa.precision = function(_) {
if (!arguments.length) return lower48.precision();
lower48.precision(_);
alaska.precision(_);
hawaii.precision(_);
return albersUsa;
};
albersUsa.scale = function(_) {
if (!arguments.length) return lower48.scale();
lower48.scale(_);
alaska.scale(_ * .35);
hawaii.scale(_);
return albersUsa.translate(lower48.translate());
};
albersUsa.translate = function(_) {
if (!arguments.length) return lower48.translate();
var k = lower48.scale(), x = +_[0], y = +_[1];
lower48Point = lower48.translate(_).clipExtent([ [ x - .455 * k, y - .238 * k ], [ x + .455 * k, y + .238 * k ] ]).stream(pointStream).point;
alaskaPoint = alaska.translate([ x - .307 * k, y + .201 * k ]).clipExtent([ [ x - .425 * k + ε, y + .12 * k + ε ], [ x - .214 * k - ε, y + .234 * k - ε ] ]).stream(pointStream).point;
hawaiiPoint = hawaii.translate([ x - .205 * k, y + .212 * k ]).clipExtent([ [ x - .214 * k + ε, y + .166 * k + ε ], [ x - .115 * k - ε, y + .234 * k - ε ] ]).stream(pointStream).point;
return albersUsa;
};
return albersUsa.scale(1070);
};
var d3_geo_pathAreaSum, d3_geo_pathAreaPolygon, d3_geo_pathArea = {
point: d3_noop,
lineStart: d3_noop,
lineEnd: d3_noop,
polygonStart: function() {
d3_geo_pathAreaPolygon = 0;
d3_geo_pathArea.lineStart = d3_geo_pathAreaRingStart;
},
polygonEnd: function() {
d3_geo_pathArea.lineStart = d3_geo_pathArea.lineEnd = d3_geo_pathArea.point = d3_noop;
d3_geo_pathAreaSum += abs(d3_geo_pathAreaPolygon / 2);
}
};
function d3_geo_pathAreaRingStart() {
var x00, y00, x0, y0;
d3_geo_pathArea.point = function(x, y) {
d3_geo_pathArea.point = nextPoint;
x00 = x0 = x, y00 = y0 = y;
};
function nextPoint(x, y) {
d3_geo_pathAreaPolygon += y0 * x - x0 * y;
x0 = x, y0 = y;
}
d3_geo_pathArea.lineEnd = function() {
nextPoint(x00, y00);
};
}
var d3_geo_pathBoundsX0, d3_geo_pathBoundsY0, d3_geo_pathBoundsX1, d3_geo_pathBoundsY1;
var d3_geo_pathBounds = {
point: d3_geo_pathBoundsPoint,
lineStart: d3_noop,
lineEnd: d3_noop,
polygonStart: d3_noop,
polygonEnd: d3_noop
};
function d3_geo_pathBoundsPoint(x, y) {
if (x < d3_geo_pathBoundsX0) d3_geo_pathBoundsX0 = x;
if (x > d3_geo_pathBoundsX1) d3_geo_pathBoundsX1 = x;
if (y < d3_geo_pathBoundsY0) d3_geo_pathBoundsY0 = y;
if (y > d3_geo_pathBoundsY1) d3_geo_pathBoundsY1 = y;
}
function d3_geo_pathBuffer() {
var pointCircle = d3_geo_pathBufferCircle(4.5), buffer = [];
var stream = {
point: point,
lineStart: function() {
stream.point = pointLineStart;
},
lineEnd: lineEnd,
polygonStart: function() {
stream.lineEnd = lineEndPolygon;
},
polygonEnd: function() {
stream.lineEnd = lineEnd;
stream.point = point;
},
pointRadius: function(_) {
pointCircle = d3_geo_pathBufferCircle(_);
return stream;
},
result: function() {
if (buffer.length) {
var result = buffer.join("");
buffer = [];
return result;
}
}
};
function point(x, y) {
buffer.push("M", x, ",", y, pointCircle);
}
function pointLineStart(x, y) {
buffer.push("M", x, ",", y);
stream.point = pointLine;
}
function pointLine(x, y) {
buffer.push("L", x, ",", y);
}
function lineEnd() {
stream.point = point;
}
function lineEndPolygon() {
buffer.push("Z");
}
return stream;
}
function d3_geo_pathBufferCircle(radius) {
return "m0," + radius + "a" + radius + "," + radius + " 0 1,1 0," + -2 * radius + "a" + radius + "," + radius + " 0 1,1 0," + 2 * radius + "z";
}
var d3_geo_pathCentroid = {
point: d3_geo_pathCentroidPoint,
lineStart: d3_geo_pathCentroidLineStart,
lineEnd: d3_geo_pathCentroidLineEnd,
polygonStart: function() {
d3_geo_pathCentroid.lineStart = d3_geo_pathCentroidRingStart;
},
polygonEnd: function() {
d3_geo_pathCentroid.point = d3_geo_pathCentroidPoint;
d3_geo_pathCentroid.lineStart = d3_geo_pathCentroidLineStart;
d3_geo_pathCentroid.lineEnd = d3_geo_pathCentroidLineEnd;
}
};
function d3_geo_pathCentroidPoint(x, y) {
d3_geo_centroidX0 += x;
d3_geo_centroidY0 += y;
++d3_geo_centroidZ0;
}
function d3_geo_pathCentroidLineStart() {
var x0, y0;
d3_geo_pathCentroid.point = function(x, y) {
d3_geo_pathCentroid.point = nextPoint;
d3_geo_pathCentroidPoint(x0 = x, y0 = y);
};
function nextPoint(x, y) {
var dx = x - x0, dy = y - y0, z = Math.sqrt(dx * dx + dy * dy);
d3_geo_centroidX1 += z * (x0 + x) / 2;
d3_geo_centroidY1 += z * (y0 + y) / 2;
d3_geo_centroidZ1 += z;
d3_geo_pathCentroidPoint(x0 = x, y0 = y);
}
}
function d3_geo_pathCentroidLineEnd() {
d3_geo_pathCentroid.point = d3_geo_pathCentroidPoint;
}
function d3_geo_pathCentroidRingStart() {
var x00, y00, x0, y0;
d3_geo_pathCentroid.point = function(x, y) {
d3_geo_pathCentroid.point = nextPoint;
d3_geo_pathCentroidPoint(x00 = x0 = x, y00 = y0 = y);
};
function nextPoint(x, y) {
var dx = x - x0, dy = y - y0, z = Math.sqrt(dx * dx + dy * dy);
d3_geo_centroidX1 += z * (x0 + x) / 2;
d3_geo_centroidY1 += z * (y0 + y) / 2;
d3_geo_centroidZ1 += z;
z = y0 * x - x0 * y;
d3_geo_centroidX2 += z * (x0 + x);
d3_geo_centroidY2 += z * (y0 + y);
d3_geo_centroidZ2 += z * 3;
d3_geo_pathCentroidPoint(x0 = x, y0 = y);
}
d3_geo_pathCentroid.lineEnd = function() {
nextPoint(x00, y00);
};
}
function d3_geo_pathContext(context) {
var pointRadius = 4.5;
var stream = {
point: point,
lineStart: function() {
stream.point = pointLineStart;
},
lineEnd: lineEnd,
polygonStart: function() {
stream.lineEnd = lineEndPolygon;
},
polygonEnd: function() {
stream.lineEnd = lineEnd;
stream.point = point;
},
pointRadius: function(_) {
pointRadius = _;
return stream;
},
result: d3_noop
};
function point(x, y) {
context.moveTo(x + pointRadius, y);
context.arc(x, y, pointRadius, 0, τ);
}
function pointLineStart(x, y) {
context.moveTo(x, y);
stream.point = pointLine;
}
function pointLine(x, y) {
context.lineTo(x, y);
}
function lineEnd() {
stream.point = point;
}
function lineEndPolygon() {
context.closePath();
}
return stream;
}
function d3_geo_resample(project) {
var δ2 = .5, cosMinDistance = Math.cos(30 * d3_radians), maxDepth = 16;
function resample(stream) {
return (maxDepth ? resampleRecursive : resampleNone)(stream);
}
function resampleNone(stream) {
return d3_geo_transformPoint(stream, function(x, y) {
x = project(x, y);
stream.point(x[0], x[1]);
});
}
function resampleRecursive(stream) {
var λ00, φ00, x00, y00, a00, b00, c00, λ0, x0, y0, a0, b0, c0;
var resample = {
point: point,
lineStart: lineStart,
lineEnd: lineEnd,
polygonStart: function() {
stream.polygonStart();
resample.lineStart = ringStart;
},
polygonEnd: function() {
stream.polygonEnd();
resample.lineStart = lineStart;
}
};
function point(x, y) {
x = project(x, y);
stream.point(x[0], x[1]);
}
function lineStart() {
x0 = NaN;
resample.point = linePoint;
stream.lineStart();
}
function linePoint(λ, φ) {
var c = d3_geo_cartesian([ λ, φ ]), p = project(λ, φ);
resampleLineTo(x0, y0, λ0, a0, b0, c0, x0 = p[0], y0 = p[1], λ0 = λ, a0 = c[0], b0 = c[1], c0 = c[2], maxDepth, stream);
stream.point(x0, y0);
}
function lineEnd() {
resample.point = point;
stream.lineEnd();
}
function ringStart() {
lineStart();
resample.point = ringPoint;
resample.lineEnd = ringEnd;
}
function ringPoint(λ, φ) {
linePoint(λ00 = λ, φ00 = φ), x00 = x0, y00 = y0, a00 = a0, b00 = b0, c00 = c0;
resample.point = linePoint;
}
function ringEnd() {
resampleLineTo(x0, y0, λ0, a0, b0, c0, x00, y00, λ00, a00, b00, c00, maxDepth, stream);
resample.lineEnd = lineEnd;
lineEnd();
}
return resample;
}
function resampleLineTo(x0, y0, λ0, a0, b0, c0, x1, y1, λ1, a1, b1, c1, depth, stream) {
var dx = x1 - x0, dy = y1 - y0, d2 = dx * dx + dy * dy;
if (d2 > 4 * δ2 && depth--) {
var a = a0 + a1, b = b0 + b1, c = c0 + c1, m = Math.sqrt(a * a + b * b + c * c), φ2 = Math.asin(c /= m), λ2 = abs(abs(c) - 1) < ε || abs(λ0 - λ1) < ε ? (λ0 + λ1) / 2 : Math.atan2(b, a), p = project(λ2, φ2), x2 = p[0], y2 = p[1], dx2 = x2 - x0, dy2 = y2 - y0, dz = dy * dx2 - dx * dy2;
if (dz * dz / d2 > δ2 || abs((dx * dx2 + dy * dy2) / d2 - .5) > .3 || a0 * a1 + b0 * b1 + c0 * c1 < cosMinDistance) {
resampleLineTo(x0, y0, λ0, a0, b0, c0, x2, y2, λ2, a /= m, b /= m, c, depth, stream);
stream.point(x2, y2);
resampleLineTo(x2, y2, λ2, a, b, c, x1, y1, λ1, a1, b1, c1, depth, stream);
}
}
}
resample.precision = function(_) {
if (!arguments.length) return Math.sqrt(δ2);
maxDepth = (δ2 = _ * _) > 0 && 16;
return resample;
};
return resample;
}
d3.geo.path = function() {
var pointRadius = 4.5, projection, context, projectStream, contextStream, cacheStream;
function path(object) {
if (object) {
if (typeof pointRadius === "function") contextStream.pointRadius(+pointRadius.apply(this, arguments));
if (!cacheStream || !cacheStream.valid) cacheStream = projectStream(contextStream);
d3.geo.stream(object, cacheStream);
}
return contextStream.result();
}
path.area = function(object) {
d3_geo_pathAreaSum = 0;
d3.geo.stream(object, projectStream(d3_geo_pathArea));
return d3_geo_pathAreaSum;
};
path.centroid = function(object) {
d3_geo_centroidX0 = d3_geo_centroidY0 = d3_geo_centroidZ0 = d3_geo_centroidX1 = d3_geo_centroidY1 = d3_geo_centroidZ1 = d3_geo_centroidX2 = d3_geo_centroidY2 = d3_geo_centroidZ2 = 0;
d3.geo.stream(object, projectStream(d3_geo_pathCentroid));
return d3_geo_centroidZ2 ? [ d3_geo_centroidX2 / d3_geo_centroidZ2, d3_geo_centroidY2 / d3_geo_centroidZ2 ] : d3_geo_centroidZ1 ? [ d3_geo_centroidX1 / d3_geo_centroidZ1, d3_geo_centroidY1 / d3_geo_centroidZ1 ] : d3_geo_centroidZ0 ? [ d3_geo_centroidX0 / d3_geo_centroidZ0, d3_geo_centroidY0 / d3_geo_centroidZ0 ] : [ NaN, NaN ];
};
path.bounds = function(object) {
d3_geo_pathBoundsX1 = d3_geo_pathBoundsY1 = -(d3_geo_pathBoundsX0 = d3_geo_pathBoundsY0 = Infinity);
d3.geo.stream(object, projectStream(d3_geo_pathBounds));
return [ [ d3_geo_pathBoundsX0, d3_geo_pathBoundsY0 ], [ d3_geo_pathBoundsX1, d3_geo_pathBoundsY1 ] ];
};
path.projection = function(_) {
if (!arguments.length) return projection;
projectStream = (projection = _) ? _.stream || d3_geo_pathProjectStream(_) : d3_identity;
return reset();
};
path.context = function(_) {
if (!arguments.length) return context;
contextStream = (context = _) == null ? new d3_geo_pathBuffer() : new d3_geo_pathContext(_);
if (typeof pointRadius !== "function") contextStream.pointRadius(pointRadius);
return reset();
};
path.pointRadius = function(_) {
if (!arguments.length) return pointRadius;
pointRadius = typeof _ === "function" ? _ : (contextStream.pointRadius(+_), +_);
return path;
};
function reset() {
cacheStream = null;
return path;
}
return path.projection(d3.geo.albersUsa()).context(null);
};
function d3_geo_pathProjectStream(project) {
var resample = d3_geo_resample(function(x, y) {
return project([ x * d3_degrees, y * d3_degrees ]);
});
return function(stream) {
return d3_geo_projectionRadians(resample(stream));
};
}
d3.geo.transform = function(methods) {
return {
stream: function(stream) {
var transform = new d3_geo_transform(stream);
for (var k in methods) transform[k] = methods[k];
return transform;
}
};
};
function d3_geo_transform(stream) {
this.stream = stream;
}
d3_geo_transform.prototype = {
point: function(x, y) {
this.stream.point(x, y);
},
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();
}
};
function d3_geo_transformPoint(stream, point) {
return {
point: point,
sphere: function() {
stream.sphere();
},
lineStart: function() {
stream.lineStart();
},
lineEnd: function() {
stream.lineEnd();
},
polygonStart: function() {
stream.polygonStart();
},
polygonEnd: function() {
stream.polygonEnd();
}
};
}
d3.geo.projection = d3_geo_projection;
d3.geo.projectionMutator = d3_geo_projectionMutator;
function d3_geo_projection(project) {
return d3_geo_projectionMutator(function() {
return project;
})();
}
function d3_geo_projectionMutator(projectAt) {
var project, rotate, projectRotate, projectResample = d3_geo_resample(function(x, y) {
x = project(x, y);
return [ x[0] * k + δx, δy - x[1] * k ];
}), k = 150, x = 480, y = 250, λ = 0, φ = 0, δλ = 0, δφ = 0, δγ = 0, δx, δy, preclip = d3_geo_clipAntimeridian, postclip = d3_identity, clipAngle = null, clipExtent = null, stream;
function projection(point) {
point = projectRotate(point[0] * d3_radians, point[1] * d3_radians);
return [ point[0] * k + δx, δy - point[1] * k ];
}
function invert(point) {
point = projectRotate.invert((point[0] - δx) / k, (δy - point[1]) / k);
return point && [ point[0] * d3_degrees, point[1] * d3_degrees ];
}
projection.stream = function(output) {
if (stream) stream.valid = false;
stream = d3_geo_projectionRadians(preclip(rotate, projectResample(postclip(output))));
stream.valid = true;
return stream;
};
projection.clipAngle = function(_) {
if (!arguments.length) return clipAngle;
preclip = _ == null ? (clipAngle = _, d3_geo_clipAntimeridian) : d3_geo_clipCircle((clipAngle = +_) * d3_radians);
return invalidate();
};
projection.clipExtent = function(_) {
if (!arguments.length) return clipExtent;
clipExtent = _;
postclip = _ ? d3_geo_clipExtent(_[0][0], _[0][1], _[1][0], _[1][1]) : d3_identity;
return invalidate();
};
projection.scale = function(_) {
if (!arguments.length) return k;
k = +_;
return reset();
};
projection.translate = function(_) {
if (!arguments.length) return [ x, y ];
x = +_[0];
y = +_[1];
return reset();
};
projection.center = function(_) {
if (!arguments.length) return [ λ * d3_degrees, φ * d3_degrees ];
λ = _[0] % 360 * d3_radians;
φ = _[1] % 360 * d3_radians;
return reset();
};
projection.rotate = function(_) {
if (!arguments.length) return [ δλ * d3_degrees, δφ * d3_degrees, δγ * d3_degrees ];
δλ = _[0] % 360 * d3_radians;
δφ = _[1] % 360 * d3_radians;
δγ = _.length > 2 ? _[2] % 360 * d3_radians : 0;
return reset();
};
d3.rebind(projection, projectResample, "precision");
function reset() {
projectRotate = d3_geo_compose(rotate = d3_geo_rotation(δλ, δφ, δγ), project);
var center = project(λ, φ);
δx = x - center[0] * k;
δy = y + center[1] * k;
return invalidate();
}
function invalidate() {
if (stream) stream.valid = false, stream = null;
return projection;
}
return function() {
project = projectAt.apply(this, arguments);
projection.invert = project.invert && invert;
return reset();
};
}
function d3_geo_projectionRadians(stream) {
return d3_geo_transformPoint(stream, function(x, y) {
stream.point(x * d3_radians, y * d3_radians);
});
}
function d3_geo_equirectangular(λ, φ) {
return [ λ, φ ];
}
(d3.geo.equirectangular = function() {
return d3_geo_projection(d3_geo_equirectangular);
}).raw = d3_geo_equirectangular.invert = d3_geo_equirectangular;
d3.geo.rotation = function(rotate) {
rotate = d3_geo_rotation(rotate[0] % 360 * d3_radians, rotate[1] * d3_radians, rotate.length > 2 ? rotate[2] * d3_radians : 0);
function forward(coordinates) {
coordinates = rotate(coordinates[0] * d3_radians, coordinates[1] * d3_radians);
return coordinates[0] *= d3_degrees, coordinates[1] *= d3_degrees, coordinates;
}
forward.invert = function(coordinates) {
coordinates = rotate.invert(coordinates[0] * d3_radians, coordinates[1] * d3_radians);
return coordinates[0] *= d3_degrees, coordinates[1] *= d3_degrees, coordinates;
};
return forward;
};
function d3_geo_identityRotation(λ, φ) {
return [ λ > π ? λ - τ : λ < -π ? λ + τ : λ, φ ];
}
d3_geo_identityRotation.invert = d3_geo_equirectangular;
function d3_geo_rotation(δλ, δφ, δγ) {
return δλ ? δφ || δγ ? d3_geo_compose(d3_geo_rotationλ(δλ), d3_geo_rotationφγ(δφ, δγ)) : d3_geo_rotationλ(δλ) : δφ || δγ ? d3_geo_rotationφγ(δφ, δγ) : d3_geo_identityRotation;
}
function d3_geo_forwardRotationλ(δλ) {
return function(λ, φ) {
return λ += δλ, [ λ > π ? λ - τ : λ < -π ? λ + τ : λ, φ ];
};
}
function d3_geo_rotationλ(δλ) {
var rotation = d3_geo_forwardRotationλ(δλ);
rotation.invert = d3_geo_forwardRotationλ(-δλ);
return rotation;
}
function d3_geo_rotationφγ(δφ, δγ) {
var cosδφ = Math.cos(δφ), sinδφ = Math.sin(δφ), cosδγ = Math.cos(δγ), sinδγ = Math.sin(δγ);
function rotation(λ, φ) {
var cosφ = Math.cos(φ), x = Math.cos(λ) * cosφ, y = Math.sin(λ) * cosφ, z = Math.sin(φ), k = z * cosδφ + x * sinδφ;
return [ Math.atan2(y * cosδγ - k * sinδγ, x * cosδφ - z * sinδφ), d3_asin(k * cosδγ + y * sinδγ) ];
}
rotation.invert = function(λ, φ) {
var cosφ = Math.cos(φ), x = Math.cos(λ) * cosφ, y = Math.sin(λ) * cosφ, z = Math.sin(φ), k = z * cosδγ - y * sinδγ;
return [ Math.atan2(y * cosδγ + z * sinδγ, x * cosδφ + k * sinδφ), d3_asin(k * cosδφ - x * sinδφ) ];
};
return rotation;
}
d3.geo.circle = function() {
var origin = [ 0, 0 ], angle, precision = 6, interpolate;
function circle() {
var center = typeof origin === "function" ? origin.apply(this, arguments) : origin, rotate = d3_geo_rotation(-center[0] * d3_radians, -center[1] * d3_radians, 0).invert, ring = [];
interpolate(null, null, 1, {
point: function(x, y) {
ring.push(x = rotate(x, y));
x[0] *= d3_degrees, x[1] *= d3_degrees;
}
});
return {
type: "Polygon",
coordinates: [ ring ]
};
}
circle.origin = function(x) {
if (!arguments.length) return origin;
origin = x;
return circle;
};
circle.angle = function(x) {
if (!arguments.length) return angle;
interpolate = d3_geo_circleInterpolate((angle = +x) * d3_radians, precision * d3_radians);
return circle;
};
circle.precision = function(_) {
if (!arguments.length) return precision;
interpolate = d3_geo_circleInterpolate(angle * d3_radians, (precision = +_) * d3_radians);
return circle;
};
return circle.angle(90);
};
function d3_geo_circleInterpolate(radius, precision) {
var cr = Math.cos(radius), sr = Math.sin(radius);
return function(from, to, direction, listener) {
var step = direction * precision;
if (from != null) {
from = d3_geo_circleAngle(cr, from);
to = d3_geo_circleAngle(cr, to);
if (direction > 0 ? from < to : from > to) from += direction * τ;
} else {
from = radius + direction * τ;
to = radius - .5 * step;
}
for (var point, t = from; direction > 0 ? t > to : t < to; t -= step) {
listener.point((point = d3_geo_spherical([ cr, -sr * Math.cos(t), -sr * Math.sin(t) ]))[0], point[1]);
}
};
}
function d3_geo_circleAngle(cr, point) {
var a = d3_geo_cartesian(point);
a[0] -= cr;
d3_geo_cartesianNormalize(a);
var angle = d3_acos(-a[1]);
return ((-a[2] < 0 ? -angle : angle) + 2 * Math.PI - ε) % (2 * Math.PI);
}
d3.geo.distance = function(a, b) {
var Δλ = (b[0] - a[0]) * d3_radians, φ0 = a[1] * d3_radians, φ1 = b[1] * d3_radians, sinΔλ = Math.sin(Δλ), cosΔλ = Math.cos(Δλ), sinφ0 = Math.sin(φ0), cosφ0 = Math.cos(φ0), sinφ1 = Math.sin(φ1), cosφ1 = Math.cos(φ1), t;
return Math.atan2(Math.sqrt((t = cosφ1 * sinΔλ) * t + (t = cosφ0 * sinφ1 - sinφ0 * cosφ1 * cosΔλ) * t), sinφ0 * sinφ1 + cosφ0 * cosφ1 * cosΔλ);
};
d3.geo.graticule = function() {
var x1, x0, X1, X0, y1, y0, Y1, Y0, dx = 10, dy = dx, DX = 90, DY = 360, x, y, X, Y, precision = 2.5;
function graticule() {
return {
type: "MultiLineString",
coordinates: lines()
};
}
function lines() {
return d3.range(Math.ceil(X0 / DX) * DX, X1, DX).map(X).concat(d3.range(Math.ceil(Y0 / DY) * DY, Y1, DY).map(Y)).concat(d3.range(Math.ceil(x0 / dx) * dx, x1, dx).filter(function(x) {
return abs(x % DX) > ε;
}).map(x)).concat(d3.range(Math.ceil(y0 / dy) * dy, y1, dy).filter(function(y) {
return abs(y % DY) > ε;
}).map(y));
}
graticule.lines = function() {
return lines().map(function(coordinates) {
return {
type: "LineString",
coordinates: coordinates
};
});
};
graticule.outline = function() {
return {
type: "Polygon",
coordinates: [ X(X0).concat(Y(Y1).slice(1), X(X1).reverse().slice(1), Y(Y0).reverse().slice(1)) ]
};
};
graticule.extent = function(_) {
if (!arguments.length) return graticule.minorExtent();
return graticule.majorExtent(_).minorExtent(_);
};
graticule.majorExtent = function(_) {
if (!arguments.length) return [ [ X0, Y0 ], [ X1, Y1 ] ];
X0 = +_[0][0], X1 = +_[1][0];
Y0 = +_[0][1], Y1 = +_[1][1];
if (X0 > X1) _ = X0, X0 = X1, X1 = _;
if (Y0 > Y1) _ = Y0, Y0 = Y1, Y1 = _;
return graticule.precision(precision);
};
graticule.minorExtent = function(_) {
if (!arguments.length) return [ [ x0, y0 ], [ x1, y1 ] ];
x0 = +_[0][0], x1 = +_[1][0];
y0 = +_[0][1], y1 = +_[1][1];
if (x0 > x1) _ = x0, x0 = x1, x1 = _;
if (y0 > y1) _ = y0, y0 = y1, y1 = _;
return graticule.precision(precision);
};
graticule.step = function(_) {
if (!arguments.length) return graticule.minorStep();
return graticule.majorStep(_).minorStep(_);
};
graticule.majorStep = function(_) {
if (!arguments.length) return [ DX, DY ];
DX = +_[0], DY = +_[1];
return graticule;
};
graticule.minorStep = function(_) {
if (!arguments.length) return [ dx, dy ];
dx = +_[0], dy = +_[1];
return graticule;
};
graticule.precision = function(_) {
if (!arguments.length) return precision;
precision = +_;
x = d3_geo_graticuleX(y0, y1, 90);
y = d3_geo_graticuleY(x0, x1, precision);
X = d3_geo_graticuleX(Y0, Y1, 90);
Y = d3_geo_graticuleY(X0, X1, precision);
return graticule;
};
return graticule.majorExtent([ [ -180, -90 + ε ], [ 180, 90 - ε ] ]).minorExtent([ [ -180, -80 - ε ], [ 180, 80 + ε ] ]);
};
function d3_geo_graticuleX(y0, y1, dy) {
var y = d3.range(y0, y1 - ε, dy).concat(y1);
return function(x) {
return y.map(function(y) {
return [ x, y ];
});
};
}
function d3_geo_graticuleY(x0, x1, dx) {
var x = d3.range(x0, x1 - ε, dx).concat(x1);
return function(y) {
return x.map(function(x) {
return [ x, y ];
});
};
}
function d3_source(d) {
return d.source;
}
function d3_target(d) {
return d.target;
}
d3.geo.greatArc = function() {
var source = d3_source, source_, target = d3_target, target_;
function greatArc() {
return {
type: "LineString",
coordinates: [ source_ || source.apply(this, arguments), target_ || target.apply(this, arguments) ]
};
}
greatArc.distance = function() {
return d3.geo.distance(source_ || source.apply(this, arguments), target_ || target.apply(this, arguments));
};
greatArc.source = function(_) {
if (!arguments.length) return source;
source = _, source_ = typeof _ === "function" ? null : _;
return greatArc;
};
greatArc.target = function(_) {
if (!arguments.length) return target;
target = _, target_ = typeof _ === "function" ? null : _;
return greatArc;
};
greatArc.precision = function() {
return arguments.length ? greatArc : 0;
};
return greatArc;
};
d3.geo.interpolate = function(source, target) {
return d3_geo_interpolate(source[0] * d3_radians, source[1] * d3_radians, target[0] * d3_radians, target[1] * d3_radians);
};
function d3_geo_interpolate(x0, y0, x1, y1) {
var cy0 = Math.cos(y0), sy0 = Math.sin(y0), cy1 = Math.cos(y1), sy1 = Math.sin(y1), kx0 = cy0 * Math.cos(x0), ky0 = cy0 * Math.sin(x0), kx1 = cy1 * Math.cos(x1), ky1 = cy1 * Math.sin(x1), d = 2 * Math.asin(Math.sqrt(d3_haversin(y1 - y0) + cy0 * cy1 * d3_haversin(x1 - x0))), k = 1 / Math.sin(d);
var interpolate = d ? function(t) {
var B = Math.sin(t *= d) * k, A = Math.sin(d - t) * k, x = A * kx0 + B * kx1, y = A * ky0 + B * ky1, z = A * sy0 + B * sy1;
return [ Math.atan2(y, x) * d3_degrees, Math.atan2(z, Math.sqrt(x * x + y * y)) * d3_degrees ];
} : function() {
return [ x0 * d3_degrees, y0 * d3_degrees ];
};
interpolate.distance = d;
return interpolate;
}
d3.geo.length = function(object) {
d3_geo_lengthSum = 0;
d3.geo.stream(object, d3_geo_length);
return d3_geo_lengthSum;
};
var d3_geo_lengthSum;
var d3_geo_length = {
sphere: d3_noop,
point: d3_noop,
lineStart: d3_geo_lengthLineStart,
lineEnd: d3_noop,
polygonStart: d3_noop,
polygonEnd: d3_noop
};
function d3_geo_lengthLineStart() {
var λ0, sinφ0, cosφ0;
d3_geo_length.point = function(λ, φ) {
λ0 = λ * d3_radians, sinφ0 = Math.sin(φ *= d3_radians), cosφ0 = Math.cos(φ);
d3_geo_length.point = nextPoint;
};
d3_geo_length.lineEnd = function() {
d3_geo_length.point = d3_geo_length.lineEnd = d3_noop;
};
function nextPoint(λ, φ) {
var sinφ = Math.sin(φ *= d3_radians), cosφ = Math.cos(φ), t = abs((λ *= d3_radians) - λ0), cosΔλ = Math.cos(t);
d3_geo_lengthSum += Math.atan2(Math.sqrt((t = cosφ * Math.sin(t)) * t + (t = cosφ0 * sinφ - sinφ0 * cosφ * cosΔλ) * t), sinφ0 * sinφ + cosφ0 * cosφ * cosΔλ);
λ0 = λ, sinφ0 = sinφ, cosφ0 = cosφ;
}
}
function d3_geo_azimuthal(scale, angle) {
function azimuthal(λ, φ) {
var cosλ = Math.cos(λ), cosφ = Math.cos(φ), k = scale(cosλ * cosφ);
return [ k * cosφ * Math.sin(λ), k * Math.sin(φ) ];
}
azimuthal.invert = function(x, y) {
var ρ = Math.sqrt(x * x + y * y), c = angle(ρ), sinc = Math.sin(c), cosc = Math.cos(c);
return [ Math.atan2(x * sinc, ρ * cosc), Math.asin(ρ && y * sinc / ρ) ];
};
return azimuthal;
}
var d3_geo_azimuthalEqualArea = d3_geo_azimuthal(function(cosλcosφ) {
return Math.sqrt(2 / (1 + cosλcosφ));
}, function(ρ) {
return 2 * Math.asin(ρ / 2);
});
(d3.geo.azimuthalEqualArea = function() {
return d3_geo_projection(d3_geo_azimuthalEqualArea);
}).raw = d3_geo_azimuthalEqualArea;
var d3_geo_azimuthalEquidistant = d3_geo_azimuthal(function(cosλcosφ) {
var c = Math.acos(cosλcosφ);
return c && c / Math.sin(c);
}, d3_identity);
(d3.geo.azimuthalEquidistant = function() {
return d3_geo_projection(d3_geo_azimuthalEquidistant);
}).raw = d3_geo_azimuthalEquidistant;
function d3_geo_conicConformal(φ0, φ1) {
var cosφ0 = Math.cos(φ0), t = function(φ) {
return Math.tan(π / 4 + φ / 2);
}, n = φ0 === φ1 ? Math.sin(φ0) : Math.log(cosφ0 / Math.cos(φ1)) / Math.log(t(φ1) / t(φ0)), F = cosφ0 * Math.pow(t(φ0), n) / n;
if (!n) return d3_geo_mercator;
function forward(λ, φ) {
if (F > 0) {
if (φ < -halfπ + ε) φ = -halfπ + ε;
} else {
if (φ > halfπ - ε) φ = halfπ - ε;
}
var ρ = F / Math.pow(t(φ), n);
return [ ρ * Math.sin(n * λ), F - ρ * Math.cos(n * λ) ];
}
forward.invert = function(x, y) {
var ρ0_y = F - y, ρ = d3_sgn(n) * Math.sqrt(x * x + ρ0_y * ρ0_y);
return [ Math.atan2(x, ρ0_y) / n, 2 * Math.atan(Math.pow(F / ρ, 1 / n)) - halfπ ];
};
return forward;
}
(d3.geo.conicConformal = function() {
return d3_geo_conic(d3_geo_conicConformal);
}).raw = d3_geo_conicConformal;
function d3_geo_conicEquidistant(φ0, φ1) {
var cosφ0 = Math.cos(φ0), n = φ0 === φ1 ? Math.sin(φ0) : (cosφ0 - Math.cos(φ1)) / (φ1 - φ0), G = cosφ0 / n + φ0;
if (abs(n) < ε) return d3_geo_equirectangular;
function forward(λ, φ) {
var ρ = G - φ;
return [ ρ * Math.sin(n * λ), G - ρ * Math.cos(n * λ) ];
}
forward.invert = function(x, y) {
var ρ0_y = G - y;
return [ Math.atan2(x, ρ0_y) / n, G - d3_sgn(n) * Math.sqrt(x * x + ρ0_y * ρ0_y) ];
};
return forward;
}
(d3.geo.conicEquidistant = function() {
return d3_geo_conic(d3_geo_conicEquidistant);
}).raw = d3_geo_conicEquidistant;
var d3_geo_gnomonic = d3_geo_azimuthal(function(cosλcosφ) {
return 1 / cosλcosφ;
}, Math.atan);
(d3.geo.gnomonic = function() {
return d3_geo_projection(d3_geo_gnomonic);
}).raw = d3_geo_gnomonic;
function d3_geo_mercator(λ, φ) {
return [ λ, Math.log(Math.tan(π / 4 + φ / 2)) ];
}
d3_geo_mercator.invert = function(x, y) {
return [ x, 2 * Math.atan(Math.exp(y)) - halfπ ];
};
function d3_geo_mercatorProjection(project) {
var m = d3_geo_projection(project), scale = m.scale, translate = m.translate, clipExtent = m.clipExtent, clipAuto;
m.scale = function() {
var v = scale.apply(m, arguments);
return v === m ? clipAuto ? m.clipExtent(null) : m : v;
};
m.translate = function() {
var v = translate.apply(m, arguments);
return v === m ? clipAuto ? m.clipExtent(null) : m : v;
};
m.clipExtent = function(_) {
var v = clipExtent.apply(m, arguments);
if (v === m) {
if (clipAuto = _ == null) {
var k = π * scale(), t = translate();
clipExtent([ [ t[0] - k, t[1] - k ], [ t[0] + k, t[1] + k ] ]);
}
} else if (clipAuto) {
v = null;
}
return v;
};
return m.clipExtent(null);
}
(d3.geo.mercator = function() {
return d3_geo_mercatorProjection(d3_geo_mercator);
}).raw = d3_geo_mercator;
var d3_geo_orthographic = d3_geo_azimuthal(function() {
return 1;
}, Math.asin);
(d3.geo.orthographic = function() {
return d3_geo_projection(d3_geo_orthographic);
}).raw = d3_geo_orthographic;
var d3_geo_stereographic = d3_geo_azimuthal(function(cosλcosφ) {
return 1 / (1 + cosλcosφ);
}, function(ρ) {
return 2 * Math.atan(ρ);
});
(d3.geo.stereographic = function() {
return d3_geo_projection(d3_geo_stereographic);
}).raw = d3_geo_stereographic;
function d3_geo_transverseMercator(λ, φ) {
return [ Math.log(Math.tan(π / 4 + φ / 2)), -λ ];
}
d3_geo_transverseMercator.invert = function(x, y) {
return [ -y, 2 * Math.atan(Math.exp(x)) - halfπ ];
};
(d3.geo.transverseMercator = function() {
var projection = d3_geo_mercatorProjection(d3_geo_transverseMercator), center = projection.center, rotate = projection.rotate;
projection.center = function(_) {
return _ ? center([ -_[1], _[0] ]) : (_ = center(), [ _[1], -_[0] ]);
};
projection.rotate = function(_) {
return _ ? rotate([ _[0], _[1], _.length > 2 ? _[2] + 90 : 90 ]) : (_ = rotate(),
[ _[0], _[1], _[2] - 90 ]);
};
return rotate([ 0, 0, 90 ]);
}).raw = d3_geo_transverseMercator;
d3.geom = {};
function d3_geom_pointX(d) {
return d[0];
}
function d3_geom_pointY(d) {
return d[1];
}
d3.geom.hull = function(vertices) {
var x = d3_geom_pointX, y = d3_geom_pointY;
if (arguments.length) return hull(vertices);
function hull(data) {
if (data.length < 3) return [];
var fx = d3_functor(x), fy = d3_functor(y), i, n = data.length, points = [], flippedPoints = [];
for (i = 0; i < n; i++) {
points.push([ +fx.call(this, data[i], i), +fy.call(this, data[i], i), i ]);
}
points.sort(d3_geom_hullOrder);
for (i = 0; i < n; i++) flippedPoints.push([ points[i][0], -points[i][1] ]);
var upper = d3_geom_hullUpper(points), lower = d3_geom_hullUpper(flippedPoints);
var skipLeft = lower[0] === upper[0], skipRight = lower[lower.length - 1] === upper[upper.length - 1], polygon = [];
for (i = upper.length - 1; i >= 0; --i) polygon.push(data[points[upper[i]][2]]);
for (i = +skipLeft; i < lower.length - skipRight; ++i) polygon.push(data[points[lower[i]][2]]);
return polygon;
}
hull.x = function(_) {
return arguments.length ? (x = _, hull) : x;
};
hull.y = function(_) {
return arguments.length ? (y = _, hull) : y;
};
return hull;
};
function d3_geom_hullUpper(points) {
var n = points.length, hull = [ 0, 1 ], hs = 2;
for (var i = 2; i < n; i++) {
while (hs > 1 && d3_cross2d(points[hull[hs - 2]], points[hull[hs - 1]], points[i]) <= 0) --hs;
hull[hs++] = i;
}
return hull.slice(0, hs);
}
function d3_geom_hullOrder(a, b) {
return a[0] - b[0] || a[1] - b[1];
}
d3.geom.polygon = function(coordinates) {
d3_subclass(coordinates, d3_geom_polygonPrototype);
return coordinates;
};
var d3_geom_polygonPrototype = d3.geom.polygon.prototype = [];
d3_geom_polygonPrototype.area = function() {
var i = -1, n = this.length, a, b = this[n - 1], area = 0;
while (++i < n) {
a = b;
b = this[i];
area += a[1] * b[0] - a[0] * b[1];
}
return area * .5;
};
d3_geom_polygonPrototype.centroid = function(k) {
var i = -1, n = this.length, x = 0, y = 0, a, b = this[n - 1], c;
if (!arguments.length) k = -1 / (6 * this.area());
while (++i < n) {
a = b;
b = this[i];
c = a[0] * b[1] - b[0] * a[1];
x += (a[0] + b[0]) * c;
y += (a[1] + b[1]) * c;
}
return [ x * k, y * k ];
};
d3_geom_polygonPrototype.clip = function(subject) {
var input, closed = d3_geom_polygonClosed(subject), i = -1, n = this.length - d3_geom_polygonClosed(this), j, m, a = this[n - 1], b, c, d;
while (++i < n) {
input = subject.slice();
subject.length = 0;
b = this[i];
c = input[(m = input.length - closed) - 1];
j = -1;
while (++j < m) {
d = input[j];
if (d3_geom_polygonInside(d, a, b)) {
if (!d3_geom_polygonInside(c, a, b)) {
subject.push(d3_geom_polygonIntersect(c, d, a, b));
}
subject.push(d);
} else if (d3_geom_polygonInside(c, a, b)) {
subject.push(d3_geom_polygonIntersect(c, d, a, b));
}
c = d;
}
if (closed) subject.push(subject[0]);
a = b;
}
return subject;
};
function d3_geom_polygonInside(p, a, b) {
return (b[0] - a[0]) * (p[1] - a[1]) < (b[1] - a[1]) * (p[0] - a[0]);
}
function d3_geom_polygonIntersect(c, d, a, b) {
var x1 = c[0], x3 = a[0], x21 = d[0] - x1, x43 = b[0] - x3, y1 = c[1], y3 = a[1], y21 = d[1] - y1, y43 = b[1] - y3, ua = (x43 * (y1 - y3) - y43 * (x1 - x3)) / (y43 * x21 - x43 * y21);
return [ x1 + ua * x21, y1 + ua * y21 ];
}
function d3_geom_polygonClosed(coordinates) {
var a = coordinates[0], b = coordinates[coordinates.length - 1];
return !(a[0] - b[0] || a[1] - b[1]);
}
var d3_geom_voronoiEdges, d3_geom_voronoiCells, d3_geom_voronoiBeaches, d3_geom_voronoiBeachPool = [], d3_geom_voronoiFirstCircle, d3_geom_voronoiCircles, d3_geom_voronoiCirclePool = [];
function d3_geom_voronoiBeach() {
d3_geom_voronoiRedBlackNode(this);
this.edge = this.site = this.circle = null;
}
function d3_geom_voronoiCreateBeach(site) {
var beach = d3_geom_voronoiBeachPool.pop() || new d3_geom_voronoiBeach();
beach.site = site;
return beach;
}
function d3_geom_voronoiDetachBeach(beach) {
d3_geom_voronoiDetachCircle(beach);
d3_geom_voronoiBeaches.remove(beach);
d3_geom_voronoiBeachPool.push(beach);
d3_geom_voronoiRedBlackNode(beach);
}
function d3_geom_voronoiRemoveBeach(beach) {
var circle = beach.circle, x = circle.x, y = circle.cy, vertex = {
x: x,
y: y
}, previous = beach.P, next = beach.N, disappearing = [ beach ];
d3_geom_voronoiDetachBeach(beach);
var lArc = previous;
while (lArc.circle && abs(x - lArc.circle.x) < ε && abs(y - lArc.circle.cy) < ε) {
previous = lArc.P;
disappearing.unshift(lArc);
d3_geom_voronoiDetachBeach(lArc);
lArc = previous;
}
disappearing.unshift(lArc);
d3_geom_voronoiDetachCircle(lArc);
var rArc = next;
while (rArc.circle && abs(x - rArc.circle.x) < ε && abs(y - rArc.circle.cy) < ε) {
next = rArc.N;
disappearing.push(rArc);
d3_geom_voronoiDetachBeach(rArc);
rArc = next;
}
disappearing.push(rArc);
d3_geom_voronoiDetachCircle(rArc);
var nArcs = disappearing.length, iArc;
for (iArc = 1; iArc < nArcs; ++iArc) {
rArc = disappearing[iArc];
lArc = disappearing[iArc - 1];
d3_geom_voronoiSetEdgeEnd(rArc.edge, lArc.site, rArc.site, vertex);
}
lArc = disappearing[0];
rArc = disappearing[nArcs - 1];
rArc.edge = d3_geom_voronoiCreateEdge(lArc.site, rArc.site, null, vertex);
d3_geom_voronoiAttachCircle(lArc);
d3_geom_voronoiAttachCircle(rArc);
}
function d3_geom_voronoiAddBeach(site) {
var x = site.x, directrix = site.y, lArc, rArc, dxl, dxr, node = d3_geom_voronoiBeaches._;
while (node) {
dxl = d3_geom_voronoiLeftBreakPoint(node, directrix) - x;
if (dxl > ε) node = node.L; else {
dxr = x - d3_geom_voronoiRightBreakPoint(node, directrix);
if (dxr > ε) {
if (!node.R) {
lArc = node;
break;
}
node = node.R;
} else {
if (dxl > -ε) {
lArc = node.P;
rArc = node;
} else if (dxr > -ε) {
lArc = node;
rArc = node.N;
} else {
lArc = rArc = node;
}
break;
}
}
}
var newArc = d3_geom_voronoiCreateBeach(site);
d3_geom_voronoiBeaches.insert(lArc, newArc);
if (!lArc && !rArc) return;
if (lArc === rArc) {
d3_geom_voronoiDetachCircle(lArc);
rArc = d3_geom_voronoiCreateBeach(lArc.site);
d3_geom_voronoiBeaches.insert(newArc, rArc);
newArc.edge = rArc.edge = d3_geom_voronoiCreateEdge(lArc.site, newArc.site);
d3_geom_voronoiAttachCircle(lArc);
d3_geom_voronoiAttachCircle(rArc);
return;
}
if (!rArc) {
newArc.edge = d3_geom_voronoiCreateEdge(lArc.site, newArc.site);
return;
}
d3_geom_voronoiDetachCircle(lArc);
d3_geom_voronoiDetachCircle(rArc);
var lSite = lArc.site, ax = lSite.x, ay = lSite.y, bx = site.x - ax, by = site.y - ay, rSite = rArc.site, cx = rSite.x - ax, cy = rSite.y - ay, d = 2 * (bx * cy - by * cx), hb = bx * bx + by * by, hc = cx * cx + cy * cy, vertex = {
x: (cy * hb - by * hc) / d + ax,
y: (bx * hc - cx * hb) / d + ay
};
d3_geom_voronoiSetEdgeEnd(rArc.edge, lSite, rSite, vertex);
newArc.edge = d3_geom_voronoiCreateEdge(lSite, site, null, vertex);
rArc.edge = d3_geom_voronoiCreateEdge(site, rSite, null, vertex);
d3_geom_voronoiAttachCircle(lArc);
d3_geom_voronoiAttachCircle(rArc);
}
function d3_geom_voronoiLeftBreakPoint(arc, directrix) {
var site = arc.site, rfocx = site.x, rfocy = site.y, pby2 = rfocy - directrix;
if (!pby2) return rfocx;
var lArc = arc.P;
if (!lArc) return -Infinity;
site = lArc.site;
var lfocx = site.x, lfocy = site.y, plby2 = lfocy - directrix;
if (!plby2) return lfocx;
var hl = lfocx - rfocx, aby2 = 1 / pby2 - 1 / plby2, b = hl / plby2;
if (aby2) return (-b + Math.sqrt(b * b - 2 * aby2 * (hl * hl / (-2 * plby2) - lfocy + plby2 / 2 + rfocy - pby2 / 2))) / aby2 + rfocx;
return (rfocx + lfocx) / 2;
}
function d3_geom_voronoiRightBreakPoint(arc, directrix) {
var rArc = arc.N;
if (rArc) return d3_geom_voronoiLeftBreakPoint(rArc, directrix);
var site = arc.site;
return site.y === directrix ? site.x : Infinity;
}
function d3_geom_voronoiCell(site) {
this.site = site;
this.edges = [];
}
d3_geom_voronoiCell.prototype.prepare = function() {
var halfEdges = this.edges, iHalfEdge = halfEdges.length, edge;
while (iHalfEdge--) {
edge = halfEdges[iHalfEdge].edge;
if (!edge.b || !edge.a) halfEdges.splice(iHalfEdge, 1);
}
halfEdges.sort(d3_geom_voronoiHalfEdgeOrder);
return halfEdges.length;
};
function d3_geom_voronoiCloseCells(extent) {
var x0 = extent[0][0], x1 = extent[1][0], y0 = extent[0][1], y1 = extent[1][1], x2, y2, x3, y3, cells = d3_geom_voronoiCells, iCell = cells.length, cell, iHalfEdge, halfEdges, nHalfEdges, start, end;
while (iCell--) {
cell = cells[iCell];
if (!cell || !cell.prepare()) continue;
halfEdges = cell.edges;
nHalfEdges = halfEdges.length;
iHalfEdge = 0;
while (iHalfEdge < nHalfEdges) {
end = halfEdges[iHalfEdge].end(), x3 = end.x, y3 = end.y;
start = halfEdges[++iHalfEdge % nHalfEdges].start(), x2 = start.x, y2 = start.y;
if (abs(x3 - x2) > ε || abs(y3 - y2) > ε) {
halfEdges.splice(iHalfEdge, 0, new d3_geom_voronoiHalfEdge(d3_geom_voronoiCreateBorderEdge(cell.site, end, abs(x3 - x0) < ε && y1 - y3 > ε ? {
x: x0,
y: abs(x2 - x0) < ε ? y2 : y1
} : abs(y3 - y1) < ε && x1 - x3 > ε ? {
x: abs(y2 - y1) < ε ? x2 : x1,
y: y1
} : abs(x3 - x1) < ε && y3 - y0 > ε ? {
x: x1,
y: abs(x2 - x1) < ε ? y2 : y0
} : abs(y3 - y0) < ε && x3 - x0 > ε ? {
x: abs(y2 - y0) < ε ? x2 : x0,
y: y0
} : null), cell.site, null));
++nHalfEdges;
}
}
}
}
function d3_geom_voronoiHalfEdgeOrder(a, b) {
return b.angle - a.angle;
}
function d3_geom_voronoiCircle() {
d3_geom_voronoiRedBlackNode(this);
this.x = this.y = this.arc = this.site = this.cy = null;
}
function d3_geom_voronoiAttachCircle(arc) {
var lArc = arc.P, rArc = arc.N;
if (!lArc || !rArc) return;
var lSite = lArc.site, cSite = arc.site, rSite = rArc.site;
if (lSite === rSite) return;
var bx = cSite.x, by = cSite.y, ax = lSite.x - bx, ay = lSite.y - by, cx = rSite.x - bx, cy = rSite.y - by;
var d = 2 * (ax * cy - ay * cx);
if (d >= -ε2) return;
var ha = ax * ax + ay * ay, hc = cx * cx + cy * cy, x = (cy * ha - ay * hc) / d, y = (ax * hc - cx * ha) / d, cy = y + by;
var circle = d3_geom_voronoiCirclePool.pop() || new d3_geom_voronoiCircle();
circle.arc = arc;
circle.site = cSite;
circle.x = x + bx;
circle.y = cy + Math.sqrt(x * x + y * y);
circle.cy = cy;
arc.circle = circle;
var before = null, node = d3_geom_voronoiCircles._;
while (node) {
if (circle.y < node.y || circle.y === node.y && circle.x <= node.x) {
if (node.L) node = node.L; else {
before = node.P;
break;
}
} else {
if (node.R) node = node.R; else {
before = node;
break;
}
}
}
d3_geom_voronoiCircles.insert(before, circle);
if (!before) d3_geom_voronoiFirstCircle = circle;
}
function d3_geom_voronoiDetachCircle(arc) {
var circle = arc.circle;
if (circle) {
if (!circle.P) d3_geom_voronoiFirstCircle = circle.N;
d3_geom_voronoiCircles.remove(circle);
d3_geom_voronoiCirclePool.push(circle);
d3_geom_voronoiRedBlackNode(circle);
arc.circle = null;
}
}
function d3_geom_voronoiClipEdges(extent) {
var edges = d3_geom_voronoiEdges, clip = d3_geom_clipLine(extent[0][0], extent[0][1], extent[1][0], extent[1][1]), i = edges.length, e;
while (i--) {
e = edges[i];
if (!d3_geom_voronoiConnectEdge(e, extent) || !clip(e) || abs(e.a.x - e.b.x) < ε && abs(e.a.y - e.b.y) < ε) {
e.a = e.b = null;
edges.splice(i, 1);
}
}
}
function d3_geom_voronoiConnectEdge(edge, extent) {
var vb = edge.b;
if (vb) return true;
var va = edge.a, x0 = extent[0][0], x1 = extent[1][0], y0 = extent[0][1], y1 = extent[1][1], lSite = edge.l, rSite = edge.r, lx = lSite.x, ly = lSite.y, rx = rSite.x, ry = rSite.y, fx = (lx + rx) / 2, fy = (ly + ry) / 2, fm, fb;
if (ry === ly) {
if (fx < x0 || fx >= x1) return;
if (lx > rx) {
if (!va) va = {
x: fx,
y: y0
}; else if (va.y >= y1) return;
vb = {
x: fx,
y: y1
};
} else {
if (!va) va = {
x: fx,
y: y1
}; else if (va.y < y0) return;
vb = {
x: fx,
y: y0
};
}
} else {
fm = (lx - rx) / (ry - ly);
fb = fy - fm * fx;
if (fm < -1 || fm > 1) {
if (lx > rx) {
if (!va) va = {
x: (y0 - fb) / fm,
y: y0
}; else if (va.y >= y1) return;
vb = {
x: (y1 - fb) / fm,
y: y1
};
} else {
if (!va) va = {
x: (y1 - fb) / fm,
y: y1
}; else if (va.y < y0) return;
vb = {
x: (y0 - fb) / fm,
y: y0
};
}
} else {
if (ly < ry) {
if (!va) va = {
x: x0,
y: fm * x0 + fb
}; else if (va.x >= x1) return;
vb = {
x: x1,
y: fm * x1 + fb
};
} else {
if (!va) va = {
x: x1,
y: fm * x1 + fb
}; else if (va.x < x0) return;
vb = {
x: x0,
y: fm * x0 + fb
};
}
}
}
edge.a = va;
edge.b = vb;
return true;
}
function d3_geom_voronoiEdge(lSite, rSite) {
this.l = lSite;
this.r = rSite;
this.a = this.b = null;
}
function d3_geom_voronoiCreateEdge(lSite, rSite, va, vb) {
var edge = new d3_geom_voronoiEdge(lSite, rSite);
d3_geom_voronoiEdges.push(edge);
if (va) d3_geom_voronoiSetEdgeEnd(edge, lSite, rSite, va);
if (vb) d3_geom_voronoiSetEdgeEnd(edge, rSite, lSite, vb);
d3_geom_voronoiCells[lSite.i].edges.push(new d3_geom_voronoiHalfEdge(edge, lSite, rSite));
d3_geom_voronoiCells[rSite.i].edges.push(new d3_geom_voronoiHalfEdge(edge, rSite, lSite));
return edge;
}
function d3_geom_voronoiCreateBorderEdge(lSite, va, vb) {
var edge = new d3_geom_voronoiEdge(lSite, null);
edge.a = va;
edge.b = vb;
d3_geom_voronoiEdges.push(edge);
return edge;
}
function d3_geom_voronoiSetEdgeEnd(edge, lSite, rSite, vertex) {
if (!edge.a && !edge.b) {
edge.a = vertex;
edge.l = lSite;
edge.r = rSite;
} else if (edge.l === rSite) {
edge.b = vertex;
} else {
edge.a = vertex;
}
}
function d3_geom_voronoiHalfEdge(edge, lSite, rSite) {
var va = edge.a, vb = edge.b;
this.edge = edge;
this.site = lSite;
this.angle = rSite ? Math.atan2(rSite.y - lSite.y, rSite.x - lSite.x) : edge.l === lSite ? Math.atan2(vb.x - va.x, va.y - vb.y) : Math.atan2(va.x - vb.x, vb.y - va.y);
}
d3_geom_voronoiHalfEdge.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;
}
};
function d3_geom_voronoiRedBlackTree() {
this._ = null;
}
function d3_geom_voronoiRedBlackNode(node) {
node.U = node.C = node.L = node.R = node.P = node.N = null;
}
d3_geom_voronoiRedBlackTree.prototype = {
insert: function(after, node) {
var parent, grandpa, uncle;
if (after) {
node.P = after;
node.N = after.N;
if (after.N) after.N.P = node;
after.N = node;
if (after.R) {
after = after.R;
while (after.L) after = after.L;
after.L = node;
} else {
after.R = node;
}
parent = after;
} else if (this._) {
after = d3_geom_voronoiRedBlackFirst(this._);
node.P = null;
node.N = after;
after.P = after.L = node;
parent = after;
} else {
node.P = node.N = null;
this._ = node;
parent = null;
}
node.L = node.R = null;
node.U = parent;
node.C = true;
after = node;
while (parent && parent.C) {
grandpa = parent.U;
if (parent === grandpa.L) {
uncle = grandpa.R;
if (uncle && uncle.C) {
parent.C = uncle.C = false;
grandpa.C = true;
after = grandpa;
} else {
if (after === parent.R) {
d3_geom_voronoiRedBlackRotateLeft(this, parent);
after = parent;
parent = after.U;
}
parent.C = false;
grandpa.C = true;
d3_geom_voronoiRedBlackRotateRight(this, grandpa);
}
} else {
uncle = grandpa.L;
if (uncle && uncle.C) {
parent.C = uncle.C = false;
grandpa.C = true;
after = grandpa;
} else {
if (after === parent.L) {
d3_geom_voronoiRedBlackRotateRight(this, parent);
after = parent;
parent = after.U;
}
parent.C = false;
grandpa.C = true;
d3_geom_voronoiRedBlackRotateLeft(this, grandpa);
}
}
parent = after.U;
}
this._.C = false;
},
remove: function(node) {
if (node.N) node.N.P = node.P;
if (node.P) node.P.N = node.N;
node.N = node.P = null;
var parent = node.U, sibling, left = node.L, right = node.R, next, red;
if (!left) next = right; else if (!right) next = left; else next = d3_geom_voronoiRedBlackFirst(right);
if (parent) {
if (parent.L === node) parent.L = next; else parent.R = next;
} else {
this._ = next;
}
if (left && right) {
red = next.C;
next.C = node.C;
next.L = left;
left.U = next;
if (next !== right) {
parent = next.U;
next.U = node.U;
node = next.R;
parent.L = node;
next.R = right;
right.U = next;
} else {
next.U = parent;
parent = next;
node = next.R;
}
} else {
red = node.C;
node = next;
}
if (node) node.U = parent;
if (red) return;
if (node && node.C) {
node.C = false;
return;
}
do {
if (node === this._) break;
if (node === parent.L) {
sibling = parent.R;
if (sibling.C) {
sibling.C = false;
parent.C = true;
d3_geom_voronoiRedBlackRotateLeft(this, parent);
sibling = parent.R;
}
if (sibling.L && sibling.L.C || sibling.R && sibling.R.C) {
if (!sibling.R || !sibling.R.C) {
sibling.L.C = false;
sibling.C = true;
d3_geom_voronoiRedBlackRotateRight(this, sibling);
sibling = parent.R;
}
sibling.C = parent.C;
parent.C = sibling.R.C = false;
d3_geom_voronoiRedBlackRotateLeft(this, parent);
node = this._;
break;
}
} else {
sibling = parent.L;
if (sibling.C) {
sibling.C = false;
parent.C = true;
d3_geom_voronoiRedBlackRotateRight(this, parent);
sibling = parent.L;
}
if (sibling.L && sibling.L.C || sibling.R && sibling.R.C) {
if (!sibling.L || !sibling.L.C) {
sibling.R.C = false;
sibling.C = true;
d3_geom_voronoiRedBlackRotateLeft(this, sibling);
sibling = parent.L;
}
sibling.C = parent.C;
parent.C = sibling.L.C = false;
d3_geom_voronoiRedBlackRotateRight(this, parent);
node = this._;
break;
}
}
sibling.C = true;
node = parent;
parent = parent.U;
} while (!node.C);
if (node) node.C = false;
}
};
function d3_geom_voronoiRedBlackRotateLeft(tree, node) {
var p = node, q = node.R, parent = p.U;
if (parent) {
if (parent.L === p) parent.L = q; else parent.R = q;
} else {
tree._ = q;
}
q.U = parent;
p.U = q;
p.R = q.L;
if (p.R) p.R.U = p;
q.L = p;
}
function d3_geom_voronoiRedBlackRotateRight(tree, node) {
var p = node, q = node.L, parent = p.U;
if (parent) {
if (parent.L === p) parent.L = q; else parent.R = q;
} else {
tree._ = q;
}
q.U = parent;
p.U = q;
p.L = q.R;
if (p.L) p.L.U = p;
q.R = p;
}
function d3_geom_voronoiRedBlackFirst(node) {
while (node.L) node = node.L;
return node;
}
function d3_geom_voronoi(sites, bbox) {
var site = sites.sort(d3_geom_voronoiVertexOrder).pop(), x0, y0, circle;
d3_geom_voronoiEdges = [];
d3_geom_voronoiCells = new Array(sites.length);
d3_geom_voronoiBeaches = new d3_geom_voronoiRedBlackTree();
d3_geom_voronoiCircles = new d3_geom_voronoiRedBlackTree();
while (true) {
circle = d3_geom_voronoiFirstCircle;
if (site && (!circle || site.y < circle.y || site.y === circle.y && site.x < circle.x)) {
if (site.x !== x0 || site.y !== y0) {
d3_geom_voronoiCells[site.i] = new d3_geom_voronoiCell(site);
d3_geom_voronoiAddBeach(site);
x0 = site.x, y0 = site.y;
}
site = sites.pop();
} else if (circle) {
d3_geom_voronoiRemoveBeach(circle.arc);
} else {
break;
}
}
if (bbox) d3_geom_voronoiClipEdges(bbox), d3_geom_voronoiCloseCells(bbox);
var diagram = {
cells: d3_geom_voronoiCells,
edges: d3_geom_voronoiEdges
};
d3_geom_voronoiBeaches = d3_geom_voronoiCircles = d3_geom_voronoiEdges = d3_geom_voronoiCells = null;
return diagram;
}
function d3_geom_voronoiVertexOrder(a, b) {
return b.y - a.y || b.x - a.x;
}
d3.geom.voronoi = function(points) {
var x = d3_geom_pointX, y = d3_geom_pointY, fx = x, fy = y, clipExtent = d3_geom_voronoiClipExtent;
if (points) return voronoi(points);
function voronoi(data) {
var polygons = new Array(data.length), x0 = clipExtent[0][0], y0 = clipExtent[0][1], x1 = clipExtent[1][0], y1 = clipExtent[1][1];
d3_geom_voronoi(sites(data), clipExtent).cells.forEach(function(cell, i) {
var edges = cell.edges, site = cell.site, polygon = polygons[i] = edges.length ? edges.map(function(e) {
var s = e.start();
return [ s.x, s.y ];
}) : site.x >= x0 && site.x <= x1 && site.y >= y0 && site.y <= y1 ? [ [ x0, y1 ], [ x1, y1 ], [ x1, y0 ], [ x0, y0 ] ] : [];
polygon.point = data[i];
});
return polygons;
}
function sites(data) {
return data.map(function(d, i) {
return {
x: Math.round(fx(d, i) / ε) * ε,
y: Math.round(fy(d, i) / ε) * ε,
i: i
};
});
}
voronoi.links = function(data) {
return d3_geom_voronoi(sites(data)).edges.filter(function(edge) {
return edge.l && edge.r;
}).map(function(edge) {
return {
source: data[edge.l.i],
target: data[edge.r.i]
};
});
};
voronoi.triangles = function(data) {
var triangles = [];
d3_geom_voronoi(sites(data)).cells.forEach(function(cell, i) {
var site = cell.site, edges = cell.edges.sort(d3_geom_voronoiHalfEdgeOrder), j = -1, m = edges.length, e0, s0, e1 = edges[m - 1].edge, s1 = e1.l === site ? e1.r : e1.l;
while (++j < m) {
e0 = e1;
s0 = s1;
e1 = edges[j].edge;
s1 = e1.l === site ? e1.r : e1.l;
if (i < s0.i && i < s1.i && d3_geom_voronoiTriangleArea(site, s0, s1) < 0) {
triangles.push([ data[i], data[s0.i], data[s1.i] ]);
}
}
});
return triangles;
};
voronoi.x = function(_) {
return arguments.length ? (fx = d3_functor(x = _), voronoi) : x;
};
voronoi.y = function(_) {
return arguments.length ? (fy = d3_functor(y = _), voronoi) : y;
};
voronoi.clipExtent = function(_) {
if (!arguments.length) return clipExtent === d3_geom_voronoiClipExtent ? null : clipExtent;
clipExtent = _ == null ? d3_geom_voronoiClipExtent : _;
return voronoi;
};
voronoi.size = function(_) {
if (!arguments.length) return clipExtent === d3_geom_voronoiClipExtent ? null : clipExtent && clipExtent[1];
return voronoi.clipExtent(_ && [ [ 0, 0 ], _ ]);
};
return voronoi;
};
var d3_geom_voronoiClipExtent = [ [ -1e6, -1e6 ], [ 1e6, 1e6 ] ];
function d3_geom_voronoiTriangleArea(a, b, c) {
return (a.x - c.x) * (b.y - a.y) - (a.x - b.x) * (c.y - a.y);
}
d3.geom.delaunay = function(vertices) {
return d3.geom.voronoi().triangles(vertices);
};
d3.geom.quadtree = function(points, x1, y1, x2, y2) {
var x = d3_geom_pointX, y = d3_geom_pointY, compat;
if (compat = arguments.length) {
x = d3_geom_quadtreeCompatX;
y = d3_geom_quadtreeCompatY;
if (compat === 3) {
y2 = y1;
x2 = x1;
y1 = x1 = 0;
}
return quadtree(points);
}
function quadtree(data) {
var d, fx = d3_functor(x), fy = d3_functor(y), xs, ys, i, n, x1_, y1_, x2_, y2_;
if (x1 != null) {
x1_ = x1, y1_ = y1, x2_ = x2, y2_ = y2;
} else {
x2_ = y2_ = -(x1_ = y1_ = Infinity);
xs = [], ys = [];
n = data.length;
if (compat) for (i = 0; i < n; ++i) {
d = data[i];
if (d.x < x1_) x1_ = d.x;
if (d.y < y1_) y1_ = d.y;
if (d.x > x2_) x2_ = d.x;
if (d.y > y2_) y2_ = d.y;
xs.push(d.x);
ys.push(d.y);
} else for (i = 0; i < n; ++i) {
var x_ = +fx(d = data[i], i), y_ = +fy(d, i);
if (x_ < x1_) x1_ = x_;
if (y_ < y1_) y1_ = y_;
if (x_ > x2_) x2_ = x_;
if (y_ > y2_) y2_ = y_;
xs.push(x_);
ys.push(y_);
}
}
var dx = x2_ - x1_, dy = y2_ - y1_;
if (dx > dy) y2_ = y1_ + dx; else x2_ = x1_ + dy;
function insert(n, d, x, y, x1, y1, x2, y2) {
if (isNaN(x) || isNaN(y)) return;
if (n.leaf) {
var nx = n.x, ny = n.y;
if (nx != null) {
if (abs(nx - x) + abs(ny - y) < .01) {
insertChild(n, d, x, y, x1, y1, x2, y2);
} else {
var nPoint = n.point;
n.x = n.y = n.point = null;
insertChild(n, nPoint, nx, ny, x1, y1, x2, y2);
insertChild(n, d, x, y, x1, y1, x2, y2);
}
} else {
n.x = x, n.y = y, n.point = d;
}
} else {
insertChild(n, d, x, y, x1, y1, x2, y2);
}
}
function insertChild(n, d, x, y, x1, y1, x2, y2) {
var xm = (x1 + x2) * .5, ym = (y1 + y2) * .5, right = x >= xm, below = y >= ym, i = below << 1 | right;
n.leaf = false;
n = n.nodes[i] || (n.nodes[i] = d3_geom_quadtreeNode());
if (right) x1 = xm; else x2 = xm;
if (below) y1 = ym; else y2 = ym;
insert(n, d, x, y, x1, y1, x2, y2);
}
var root = d3_geom_quadtreeNode();
root.add = function(d) {
insert(root, d, +fx(d, ++i), +fy(d, i), x1_, y1_, x2_, y2_);
};
root.visit = function(f) {
d3_geom_quadtreeVisit(f, root, x1_, y1_, x2_, y2_);
};
root.find = function(point) {
return d3_geom_quadtreeFind(root, point[0], point[1], x1_, y1_, x2_, y2_);
};
i = -1;
if (x1 == null) {
while (++i < n) {
insert(root, data[i], xs[i], ys[i], x1_, y1_, x2_, y2_);
}
--i;
} else data.forEach(root.add);
xs = ys = data = d = null;
return root;
}
quadtree.x = function(_) {
return arguments.length ? (x = _, quadtree) : x;
};
quadtree.y = function(_) {
return arguments.length ? (y = _, quadtree) : y;
};
quadtree.extent = function(_) {
if (!arguments.length) return x1 == null ? null : [ [ x1, y1 ], [ x2, y2 ] ];
if (_ == null) x1 = y1 = x2 = y2 = null; else x1 = +_[0][0], y1 = +_[0][1], x2 = +_[1][0],
y2 = +_[1][1];
return quadtree;
};
quadtree.size = function(_) {
if (!arguments.length) return x1 == null ? null : [ x2 - x1, y2 - y1 ];
if (_ == null) x1 = y1 = x2 = y2 = null; else x1 = y1 = 0, x2 = +_[0], y2 = +_[1];
return quadtree;
};
return quadtree;
};
function d3_geom_quadtreeCompatX(d) {
return d.x;
}
function d3_geom_quadtreeCompatY(d) {
return d.y;
}
function d3_geom_quadtreeNode() {
return {
leaf: true,
nodes: [],
point: null,
x: null,
y: null
};
}
function d3_geom_quadtreeVisit(f, node, x1, y1, x2, y2) {
if (!f(node, x1, y1, x2, y2)) {
var sx = (x1 + x2) * .5, sy = (y1 + y2) * .5, children = node.nodes;
if (children[0]) d3_geom_quadtreeVisit(f, children[0], x1, y1, sx, sy);
if (children[1]) d3_geom_quadtreeVisit(f, children[1], sx, y1, x2, sy);
if (children[2]) d3_geom_quadtreeVisit(f, children[2], x1, sy, sx, y2);
if (children[3]) d3_geom_quadtreeVisit(f, children[3], sx, sy, x2, y2);
}
}
function d3_geom_quadtreeFind(root, x, y, x0, y0, x3, y3) {
var minDistance2 = Infinity, closestPoint;
(function find(node, x1, y1, x2, y2) {
if (x1 > x3 || y1 > y3 || x2 < x0 || y2 < y0) return;
if (point = node.point) {
var point, dx = x - point[0], dy = y - point[1], distance2 = dx * dx + dy * dy;
if (distance2 < minDistance2) {
var distance = Math.sqrt(minDistance2 = distance2);
x0 = x - distance, y0 = y - distance;
x3 = x + distance, y3 = y + distance;
closestPoint = point;
}
}
var children = node.nodes, xm = (x1 + x2) * .5, ym = (y1 + y2) * .5, right = x >= xm, below = y >= ym;
for (var i = below << 1 | right, j = i + 4; i < j; ++i) {
if (node = children[i & 3]) switch (i & 3) {
case 0:
find(node, x1, y1, xm, ym);
break;
case 1:
find(node, xm, y1, x2, ym);
break;
case 2:
find(node, x1, ym, xm, y2);
break;
case 3:
find(node, xm, ym, x2, y2);
break;
}
}
})(root, x0, y0, x3, y3);
return closestPoint;
}
d3.interpolateRgb = d3_interpolateRgb;
function d3_interpolateRgb(a, b) {
a = d3.rgb(a);
b = d3.rgb(b);
var ar = a.r, ag = a.g, ab = a.b, br = b.r - ar, bg = b.g - ag, bb = b.b - ab;
return function(t) {
return "#" + d3_rgb_hex(Math.round(ar + br * t)) + d3_rgb_hex(Math.round(ag + bg * t)) + d3_rgb_hex(Math.round(ab + bb * t));
};
}
d3.interpolateObject = d3_interpolateObject;
function d3_interpolateObject(a, b) {
var i = {}, c = {}, k;
for (k in a) {
if (k in b) {
i[k] = d3_interpolate(a[k], b[k]);
} else {
c[k] = a[k];
}
}
for (k in b) {
if (!(k in a)) {
c[k] = b[k];
}
}
return function(t) {
for (k in i) c[k] = i[k](t);
return c;
};
}
d3.interpolateNumber = d3_interpolateNumber;
function d3_interpolateNumber(a, b) {
a = +a, b = +b;
return function(t) {
return a * (1 - t) + b * t;
};
}
d3.interpolateString = d3_interpolateString;
function d3_interpolateString(a, b) {
var bi = d3_interpolate_numberA.lastIndex = d3_interpolate_numberB.lastIndex = 0, am, bm, bs, i = -1, s = [], q = [];
a = a + "", b = b + "";
while ((am = d3_interpolate_numberA.exec(a)) && (bm = d3_interpolate_numberB.exec(b))) {
if ((bs = bm.index) > bi) {
bs = b.slice(bi, bs);
if (s[i]) s[i] += bs; else s[++i] = bs;
}
if ((am = am[0]) === (bm = bm[0])) {
if (s[i]) s[i] += bm; else s[++i] = bm;
} else {
s[++i] = null;
q.push({
i: i,
x: d3_interpolateNumber(am, bm)
});
}
bi = d3_interpolate_numberB.lastIndex;
}
if (bi < b.length) {
bs = b.slice(bi);
if (s[i]) s[i] += bs; else s[++i] = bs;
}
return s.length < 2 ? q[0] ? (b = q[0].x, function(t) {
return b(t) + "";
}) : function() {
return b;
} : (b = q.length, function(t) {
for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t);
return s.join("");
});
}
var d3_interpolate_numberA = /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g, d3_interpolate_numberB = new RegExp(d3_interpolate_numberA.source, "g");
d3.interpolate = d3_interpolate;
function d3_interpolate(a, b) {
var i = d3.interpolators.length, f;
while (--i >= 0 && !(f = d3.interpolators[i](a, b))) ;
return f;
}
d3.interpolators = [ function(a, b) {
var t = typeof b;
return (t === "string" ? d3_rgb_names.has(b) || /^(#|rgb\(|hsl\()/.test(b) ? d3_interpolateRgb : d3_interpolateString : b instanceof d3_color ? d3_interpolateRgb : Array.isArray(b) ? d3_interpolateArray : t === "object" && isNaN(b) ? d3_interpolateObject : d3_interpolateNumber)(a, b);
} ];
d3.interpolateArray = d3_interpolateArray;
function d3_interpolateArray(a, b) {
var x = [], c = [], na = a.length, nb = b.length, n0 = Math.min(a.length, b.length), i;
for (i = 0; i < n0; ++i) x.push(d3_interpolate(a[i], b[i]));
for (;i < na; ++i) c[i] = a[i];
for (;i < nb; ++i) c[i] = b[i];
return function(t) {
for (i = 0; i < n0; ++i) c[i] = x[i](t);
return c;
};
}
var d3_ease_default = function() {
return d3_identity;
};
var d3_ease = d3.map({
linear: d3_ease_default,
poly: d3_ease_poly,
quad: function() {
return d3_ease_quad;
},
cubic: function() {
return d3_ease_cubic;
},
sin: function() {
return d3_ease_sin;
},
exp: function() {
return d3_ease_exp;
},
circle: function() {
return d3_ease_circle;
},
elastic: d3_ease_elastic,
back: d3_ease_back,
bounce: function() {
return d3_ease_bounce;
}
});
var d3_ease_mode = d3.map({
"in": d3_identity,
out: d3_ease_reverse,
"in-out": d3_ease_reflect,
"out-in": function(f) {
return d3_ease_reflect(d3_ease_reverse(f));
}
});
d3.ease = function(name) {
var i = name.indexOf("-"), t = i >= 0 ? name.slice(0, i) : name, m = i >= 0 ? name.slice(i + 1) : "in";
t = d3_ease.get(t) || d3_ease_default;
m = d3_ease_mode.get(m) || d3_identity;
return d3_ease_clamp(m(t.apply(null, d3_arraySlice.call(arguments, 1))));
};
function d3_ease_clamp(f) {
return function(t) {
return t <= 0 ? 0 : t >= 1 ? 1 : f(t);
};
}
function d3_ease_reverse(f) {
return function(t) {
return 1 - f(1 - t);
};
}
function d3_ease_reflect(f) {
return function(t) {
return .5 * (t < .5 ? f(2 * t) : 2 - f(2 - 2 * t));
};
}
function d3_ease_quad(t) {
return t * t;
}
function d3_ease_cubic(t) {
return t * t * t;
}
function d3_ease_cubicInOut(t) {
if (t <= 0) return 0;
if (t >= 1) return 1;
var t2 = t * t, t3 = t2 * t;
return 4 * (t < .5 ? t3 : 3 * (t - t2) + t3 - .75);
}
function d3_ease_poly(e) {
return function(t) {
return Math.pow(t, e);
};
}
function d3_ease_sin(t) {
return 1 - Math.cos(t * halfπ);
}
function d3_ease_exp(t) {
return Math.pow(2, 10 * (t - 1));
}
function d3_ease_circle(t) {
return 1 - Math.sqrt(1 - t * t);
}
function d3_ease_elastic(a, p) {
var s;
if (arguments.length < 2) p = .45;
if (arguments.length) s = p / τ * Math.asin(1 / a); else a = 1, s = p / 4;
return function(t) {
return 1 + a * Math.pow(2, -10 * t) * Math.sin((t - s) * τ / p);
};
}
function d3_ease_back(s) {
if (!s) s = 1.70158;
return function(t) {
return t * t * ((s + 1) * t - s);
};
}
function d3_ease_bounce(t) {
return t < 1 / 2.75 ? 7.5625 * t * t : t < 2 / 2.75 ? 7.5625 * (t -= 1.5 / 2.75) * t + .75 : t < 2.5 / 2.75 ? 7.5625 * (t -= 2.25 / 2.75) * t + .9375 : 7.5625 * (t -= 2.625 / 2.75) * t + .984375;
}
d3.interpolateHcl = d3_interpolateHcl;
function d3_interpolateHcl(a, b) {
a = d3.hcl(a);
b = d3.hcl(b);
var ah = a.h, ac = a.c, al = a.l, bh = b.h - ah, bc = b.c - ac, bl = b.l - al;
if (isNaN(bc)) bc = 0, ac = isNaN(ac) ? b.c : ac;
if (isNaN(bh)) bh = 0, ah = isNaN(ah) ? b.h : ah; else if (bh > 180) bh -= 360; else if (bh < -180) bh += 360;
return function(t) {
return d3_hcl_lab(ah + bh * t, ac + bc * t, al + bl * t) + "";
};
}
d3.interpolateHsl = d3_interpolateHsl;
function d3_interpolateHsl(a, b) {
a = d3.hsl(a);
b = d3.hsl(b);
var ah = a.h, as = a.s, al = a.l, bh = b.h - ah, bs = b.s - as, bl = b.l - al;
if (isNaN(bs)) bs = 0, as = isNaN(as) ? b.s : as;
if (isNaN(bh)) bh = 0, ah = isNaN(ah) ? b.h : ah; else if (bh > 180) bh -= 360; else if (bh < -180) bh += 360;
return function(t) {
return d3_hsl_rgb(ah + bh * t, as + bs * t, al + bl * t) + "";
};
}
d3.interpolateLab = d3_interpolateLab;
function d3_interpolateLab(a, b) {
a = d3.lab(a);
b = d3.lab(b);
var al = a.l, aa = a.a, ab = a.b, bl = b.l - al, ba = b.a - aa, bb = b.b - ab;
return function(t) {
return d3_lab_rgb(al + bl * t, aa + ba * t, ab + bb * t) + "";
};
}
d3.interpolateRound = d3_interpolateRound;
function d3_interpolateRound(a, b) {
b -= a;
return function(t) {
return Math.round(a + b * t);
};
}
d3.transform = function(string) {
var g = d3_document.createElementNS(d3.ns.prefix.svg, "g");
return (d3.transform = function(string) {
if (string != null) {
g.setAttribute("transform", string);
var t = g.transform.baseVal.consolidate();
}
return new d3_transform(t ? t.matrix : d3_transformIdentity);
})(string);
};
function d3_transform(m) {
var r0 = [ m.a, m.b ], r1 = [ m.c, m.d ], kx = d3_transformNormalize(r0), kz = d3_transformDot(r0, r1), ky = d3_transformNormalize(d3_transformCombine(r1, r0, -kz)) || 0;
if (r0[0] * r1[1] < r1[0] * r0[1]) {
r0[0] *= -1;
r0[1] *= -1;
kx *= -1;
kz *= -1;
}
this.rotate = (kx ? Math.atan2(r0[1], r0[0]) : Math.atan2(-r1[0], r1[1])) * d3_degrees;
this.translate = [ m.e, m.f ];
this.scale = [ kx, ky ];
this.skew = ky ? Math.atan2(kz, ky) * d3_degrees : 0;
}
d3_transform.prototype.toString = function() {
return "translate(" + this.translate + ")rotate(" + this.rotate + ")skewX(" + this.skew + ")scale(" + this.scale + ")";
};
function d3_transformDot(a, b) {
return a[0] * b[0] + a[1] * b[1];
}
function d3_transformNormalize(a) {
var k = Math.sqrt(d3_transformDot(a, a));
if (k) {
a[0] /= k;
a[1] /= k;
}
return k;
}
function d3_transformCombine(a, b, k) {
a[0] += k * b[0];
a[1] += k * b[1];
return a;
}
var d3_transformIdentity = {
a: 1,
b: 0,
c: 0,
d: 1,
e: 0,
f: 0
};
d3.interpolateTransform = d3_interpolateTransform;
function d3_interpolateTransform(a, b) {
var s = [], q = [], n, A = d3.transform(a), B = d3.transform(b), ta = A.translate, tb = B.translate, ra = A.rotate, rb = B.rotate, wa = A.skew, wb = B.skew, ka = A.scale, kb = B.scale;
if (ta[0] != tb[0] || ta[1] != tb[1]) {
s.push("translate(", null, ",", null, ")");
q.push({
i: 1,
x: d3_interpolateNumber(ta[0], tb[0])
}, {
i: 3,
x: d3_interpolateNumber(ta[1], tb[1])
});
} else if (tb[0] || tb[1]) {
s.push("translate(" + tb + ")");
} else {
s.push("");
}
if (ra != rb) {
if (ra - rb > 180) rb += 360; else if (rb - ra > 180) ra += 360;
q.push({
i: s.push(s.pop() + "rotate(", null, ")") - 2,
x: d3_interpolateNumber(ra, rb)
});
} else if (rb) {
s.push(s.pop() + "rotate(" + rb + ")");
}
if (wa != wb) {
q.push({
i: s.push(s.pop() + "skewX(", null, ")") - 2,
x: d3_interpolateNumber(wa, wb)
});
} else if (wb) {
s.push(s.pop() + "skewX(" + wb + ")");
}
if (ka[0] != kb[0] || ka[1] != kb[1]) {
n = s.push(s.pop() + "scale(", null, ",", null, ")");
q.push({
i: n - 4,
x: d3_interpolateNumber(ka[0], kb[0])
}, {
i: n - 2,
x: d3_interpolateNumber(ka[1], kb[1])
});
} else if (kb[0] != 1 || kb[1] != 1) {
s.push(s.pop() + "scale(" + kb + ")");
}
n = q.length;
return function(t) {
var i = -1, o;
while (++i < n) s[(o = q[i]).i] = o.x(t);
return s.join("");
};
}
function d3_uninterpolateNumber(a, b) {
b = (b -= a = +a) || 1 / b;
return function(x) {
return (x - a) / b;
};
}
function d3_uninterpolateClamp(a, b) {
b = (b -= a = +a) || 1 / b;
return function(x) {
return Math.max(0, Math.min(1, (x - a) / b));
};
}
d3.layout = {};
d3.layout.bundle = function() {
return function(links) {
var paths = [], i = -1, n = links.length;
while (++i < n) paths.push(d3_layout_bundlePath(links[i]));
return paths;
};
};
function d3_layout_bundlePath(link) {
var start = link.source, end = link.target, lca = d3_layout_bundleLeastCommonAncestor(start, end), points = [ start ];
while (start !== lca) {
start = start.parent;
points.push(start);
}
var k = points.length;
while (end !== lca) {
points.splice(k, 0, end);
end = end.parent;
}
return points;
}
function d3_layout_bundleAncestors(node) {
var ancestors = [], parent = node.parent;
while (parent != null) {
ancestors.push(node);
node = parent;
parent = parent.parent;
}
ancestors.push(node);
return ancestors;
}
function d3_layout_bundleLeastCommonAncestor(a, b) {
if (a === b) return a;
var aNodes = d3_layout_bundleAncestors(a), bNodes = d3_layout_bundleAncestors(b), aNode = aNodes.pop(), bNode = bNodes.pop(), sharedNode = null;
while (aNode === bNode) {
sharedNode = aNode;
aNode = aNodes.pop();
bNode = bNodes.pop();
}
return sharedNode;
}
d3.layout.chord = function() {
var chord = {}, chords, groups, matrix, n, padding = 0, sortGroups, sortSubgroups, sortChords;
function relayout() {
var subgroups = {}, groupSums = [], groupIndex = d3.range(n), subgroupIndex = [], k, x, x0, i, j;
chords = [];
groups = [];
k = 0, i = -1;
while (++i < n) {
x = 0, j = -1;
while (++j < n) {
x += matrix[i][j];
}
groupSums.push(x);
subgroupIndex.push(d3.range(n));
k += x;
}
if (sortGroups) {
groupIndex.sort(function(a, b) {
return sortGroups(groupSums[a], groupSums[b]);
});
}
if (sortSubgroups) {
subgroupIndex.forEach(function(d, i) {
d.sort(function(a, b) {
return sortSubgroups(matrix[i][a], matrix[i][b]);
});
});
}
k = (τ - padding * n) / k;
x = 0, i = -1;
while (++i < n) {
x0 = x, j = -1;
while (++j < n) {
var di = groupIndex[i], dj = subgroupIndex[di][j], v = matrix[di][dj], a0 = x, a1 = x += v * k;
subgroups[di + "-" + dj] = {
index: di,
subindex: dj,
startAngle: a0,
endAngle: a1,
value: v
};
}
groups[di] = {
index: di,
startAngle: x0,
endAngle: x,
value: (x - x0) / k
};
x += padding;
}
i = -1;
while (++i < n) {
j = i - 1;
while (++j < n) {
var source = subgroups[i + "-" + j], target = subgroups[j + "-" + i];
if (source.value || target.value) {
chords.push(source.value < target.value ? {
source: target,
target: source
} : {
source: source,
target: target
});
}
}
}
if (sortChords) resort();
}
function resort() {
chords.sort(function(a, b) {
return sortChords((a.source.value + a.target.value) / 2, (b.source.value + b.target.value) / 2);
});
}
chord.matrix = function(x) {
if (!arguments.length) return matrix;
n = (matrix = x) && matrix.length;
chords = groups = null;
return chord;
};
chord.padding = function(x) {
if (!arguments.length) return padding;
padding = x;
chords = groups = null;
return chord;
};
chord.sortGroups = function(x) {
if (!arguments.length) return sortGroups;
sortGroups = x;
chords = groups = null;
return chord;
};
chord.sortSubgroups = function(x) {
if (!arguments.length) return sortSubgroups;
sortSubgroups = x;
chords = null;
return chord;
};
chord.sortChords = function(x) {
if (!arguments.length) return sortChords;
sortChords = x;
if (chords) resort();
return chord;
};
chord.chords = function() {
if (!chords) relayout();
return chords;
};
chord.groups = function() {
if (!groups) relayout();
return groups;
};
return chord;
};
d3.layout.force = function() {
var force = {}, event = d3.dispatch("start", "tick", "end"), size = [ 1, 1 ], drag, alpha, friction = .9, linkDistance = d3_layout_forceLinkDistance, linkStrength = d3_layout_forceLinkStrength, charge = -30, chargeDistance2 = d3_layout_forceChargeDistance2, gravity = .1, theta2 = .64, nodes = [], links = [], distances, strengths, charges;
function repulse(node) {
return function(quad, x1, _, x2) {
if (quad.point !== node) {
var dx = quad.cx - node.x, dy = quad.cy - node.y, dw = x2 - x1, dn = dx * dx + dy * dy;
if (dw * dw / theta2 < dn) {
if (dn < chargeDistance2) {
var k = quad.charge / dn;
node.px -= dx * k;
node.py -= dy * k;
}
return true;
}
if (quad.point && dn && dn < chargeDistance2) {
var k = quad.pointCharge / dn;
node.px -= dx * k;
node.py -= dy * k;
}
}
return !quad.charge;
};
}
force.tick = function() {
if ((alpha *= .99) < .005) {
event.end({
type: "end",
alpha: alpha = 0
});
return true;
}
var n = nodes.length, m = links.length, q, i, o, s, t, l, k, x, y;
for (i = 0; i < m; ++i) {
o = links[i];
s = o.source;
t = o.target;
x = t.x - s.x;
y = t.y - s.y;
if (l = x * x + y * y) {
l = alpha * strengths[i] * ((l = Math.sqrt(l)) - distances[i]) / l;
x *= l;
y *= l;
t.x -= x * (k = s.weight / (t.weight + s.weight));
t.y -= y * k;
s.x += x * (k = 1 - k);
s.y += y * k;
}
}
if (k = alpha * gravity) {
x = size[0] / 2;
y = size[1] / 2;
i = -1;
if (k) while (++i < n) {
o = nodes[i];
o.x += (x - o.x) * k;
o.y += (y - o.y) * k;
}
}
if (charge) {
d3_layout_forceAccumulate(q = d3.geom.quadtree(nodes), alpha, charges);
i = -1;
while (++i < n) {
if (!(o = nodes[i]).fixed) {
q.visit(repulse(o));
}
}
}
i = -1;
while (++i < n) {
o = nodes[i];
if (o.fixed) {
o.x = o.px;
o.y = o.py;
} else {
o.x -= (o.px - (o.px = o.x)) * friction;
o.y -= (o.py - (o.py = o.y)) * friction;
}
}
event.tick({
type: "tick",
alpha: alpha
});
};
force.nodes = function(x) {
if (!arguments.length) return nodes;
nodes = x;
return force;
};
force.links = function(x) {
if (!arguments.length) return links;
links = x;
return force;
};
force.size = function(x) {
if (!arguments.length) return size;
size = x;
return force;
};
force.linkDistance = function(x) {
if (!arguments.length) return linkDistance;
linkDistance = typeof x === "function" ? x : +x;
return force;
};
force.distance = force.linkDistance;
force.linkStrength = function(x) {
if (!arguments.length) return linkStrength;
linkStrength = typeof x === "function" ? x : +x;
return force;
};
force.friction = function(x) {
if (!arguments.length) return friction;
friction = +x;
return force;
};
force.charge = function(x) {
if (!arguments.length) return charge;
charge = typeof x === "function" ? x : +x;
return force;
};
force.chargeDistance = function(x) {
if (!arguments.length) return Math.sqrt(chargeDistance2);
chargeDistance2 = x * x;
return force;
};
force.gravity = function(x) {
if (!arguments.length) return gravity;
gravity = +x;
return force;
};
force.theta = function(x) {
if (!arguments.length) return Math.sqrt(theta2);
theta2 = x * x;
return force;
};
force.alpha = function(x) {
if (!arguments.length) return alpha;
x = +x;
if (alpha) {
if (x > 0) alpha = x; else alpha = 0;
} else if (x > 0) {
event.start({
type: "start",
alpha: alpha = x
});
d3.timer(force.tick);
}
return force;
};
force.start = function() {
var i, n = nodes.length, m = links.length, w = size[0], h = size[1], neighbors, o;
for (i = 0; i < n; ++i) {
(o = nodes[i]).index = i;
o.weight = 0;
}
for (i = 0; i < m; ++i) {
o = links[i];
if (typeof o.source == "number") o.source = nodes[o.source];
if (typeof o.target == "number") o.target = nodes[o.target];
++o.source.weight;
++o.target.weight;
}
for (i = 0; i < n; ++i) {
o = nodes[i];
if (isNaN(o.x)) o.x = position("x", w);
if (isNaN(o.y)) o.y = position("y", h);
if (isNaN(o.px)) o.px = o.x;
if (isNaN(o.py)) o.py = o.y;
}
distances = [];
if (typeof linkDistance === "function") for (i = 0; i < m; ++i) distances[i] = +linkDistance.call(this, links[i], i); else for (i = 0; i < m; ++i) distances[i] = linkDistance;
strengths = [];
if (typeof linkStrength === "function") for (i = 0; i < m; ++i) strengths[i] = +linkStrength.call(this, links[i], i); else for (i = 0; i < m; ++i) strengths[i] = linkStrength;
charges = [];
if (typeof charge === "function") for (i = 0; i < n; ++i) charges[i] = +charge.call(this, nodes[i], i); else for (i = 0; i < n; ++i) charges[i] = charge;
function position(dimension, size) {
if (!neighbors) {
neighbors = new Array(n);
for (j = 0; j < n; ++j) {
neighbors[j] = [];
}
for (j = 0; j < m; ++j) {
var o = links[j];
neighbors[o.source.index].push(o.target);
neighbors[o.target.index].push(o.source);
}
}
var candidates = neighbors[i], j = -1, m = candidates.length, x;
while (++j < m) if (!isNaN(x = candidates[j][dimension])) return x;
return Math.random() * size;
}
return force.resume();
};
force.resume = function() {
return force.alpha(.1);
};
force.stop = function() {
return force.alpha(0);
};
force.drag = function() {
if (!drag) drag = d3.behavior.drag().origin(d3_identity).on("dragstart.force", d3_layout_forceDragstart).on("drag.force", dragmove).on("dragend.force", d3_layout_forceDragend);
if (!arguments.length) return drag;
this.on("mouseover.force", d3_layout_forceMouseover).on("mouseout.force", d3_layout_forceMouseout).call(drag);
};
function dragmove(d) {
d.px = d3.event.x, d.py = d3.event.y;
force.resume();
}
return d3.rebind(force, event, "on");
};
function d3_layout_forceDragstart(d) {
d.fixed |= 2;
}
function d3_layout_forceDragend(d) {
d.fixed &= ~6;
}
function d3_layout_forceMouseover(d) {
d.fixed |= 4;
d.px = d.x, d.py = d.y;
}
function d3_layout_forceMouseout(d) {
d.fixed &= ~4;
}
function d3_layout_forceAccumulate(quad, alpha, charges) {
var cx = 0, cy = 0;
quad.charge = 0;
if (!quad.leaf) {
var nodes = quad.nodes, n = nodes.length, i = -1, c;
while (++i < n) {
c = nodes[i];
if (c == null) continue;
d3_layout_forceAccumulate(c, alpha, charges);
quad.charge += c.charge;
cx += c.charge * c.cx;
cy += c.charge * c.cy;
}
}
if (quad.point) {
if (!quad.leaf) {
quad.point.x += Math.random() - .5;
quad.point.y += Math.random() - .5;
}
var k = alpha * charges[quad.point.index];
quad.charge += quad.pointCharge = k;
cx += k * quad.point.x;
cy += k * quad.point.y;
}
quad.cx = cx / quad.charge;
quad.cy = cy / quad.charge;
}
var d3_layout_forceLinkDistance = 20, d3_layout_forceLinkStrength = 1, d3_layout_forceChargeDistance2 = Infinity;
d3.layout.hierarchy = function() {
var sort = d3_layout_hierarchySort, children = d3_layout_hierarchyChildren, value = d3_layout_hierarchyValue;
function hierarchy(root) {
var stack = [ root ], nodes = [], node;
root.depth = 0;
while ((node = stack.pop()) != null) {
nodes.push(node);
if ((childs = children.call(hierarchy, node, node.depth)) && (n = childs.length)) {
var n, childs, child;
while (--n >= 0) {
stack.push(child = childs[n]);
child.parent = node;
child.depth = node.depth + 1;
}
if (value) node.value = 0;
node.children = childs;
} else {
if (value) node.value = +value.call(hierarchy, node, node.depth) || 0;
delete node.children;
}
}
d3_layout_hierarchyVisitAfter(root, function(node) {
var childs, parent;
if (sort && (childs = node.children)) childs.sort(sort);
if (value && (parent = node.parent)) parent.value += node.value;
});
return nodes;
}
hierarchy.sort = function(x) {
if (!arguments.length) return sort;
sort = x;
return hierarchy;
};
hierarchy.children = function(x) {
if (!arguments.length) return children;
children = x;
return hierarchy;
};
hierarchy.value = function(x) {
if (!arguments.length) return value;
value = x;
return hierarchy;
};
hierarchy.revalue = function(root) {
if (value) {
d3_layout_hierarchyVisitBefore(root, function(node) {
if (node.children) node.value = 0;
});
d3_layout_hierarchyVisitAfter(root, function(node) {
var parent;
if (!node.children) node.value = +value.call(hierarchy, node, node.depth) || 0;
if (parent = node.parent) parent.value += node.value;
});
}
return root;
};
return hierarchy;
};
function d3_layout_hierarchyRebind(object, hierarchy) {
d3.rebind(object, hierarchy, "sort", "children", "value");
object.nodes = object;
object.links = d3_layout_hierarchyLinks;
return object;
}
function d3_layout_hierarchyVisitBefore(node, callback) {
var nodes = [ node ];
while ((node = nodes.pop()) != null) {
callback(node);
if ((children = node.children) && (n = children.length)) {
var n, children;
while (--n >= 0) nodes.push(children[n]);
}
}
}
function d3_layout_hierarchyVisitAfter(node, callback) {
var nodes = [ node ], nodes2 = [];
while ((node = nodes.pop()) != null) {
nodes2.push(node);
if ((children = node.children) && (n = children.length)) {
var i = -1, n, children;
while (++i < n) nodes.push(children[i]);
}
}
while ((node = nodes2.pop()) != null) {
callback(node);
}
}
function d3_layout_hierarchyChildren(d) {
return d.children;
}
function d3_layout_hierarchyValue(d) {
return d.value;
}
function d3_layout_hierarchySort(a, b) {
return b.value - a.value;
}
function d3_layout_hierarchyLinks(nodes) {
return d3.merge(nodes.map(function(parent) {
return (parent.children || []).map(function(child) {
return {
source: parent,
target: child
};
});
}));
}
d3.layout.partition = function() {
var hierarchy = d3.layout.hierarchy(), size = [ 1, 1 ];
function position(node, x, dx, dy) {
var children = node.children;
node.x = x;
node.y = node.depth * dy;
node.dx = dx;
node.dy = dy;
if (children && (n = children.length)) {
var i = -1, n, c, d;
dx = node.value ? dx / node.value : 0;
while (++i < n) {
position(c = children[i], x, d = c.value * dx, dy);
x += d;
}
}
}
function depth(node) {
var children = node.children, d = 0;
if (children && (n = children.length)) {
var i = -1, n;
while (++i < n) d = Math.max(d, depth(children[i]));
}
return 1 + d;
}
function partition(d, i) {
var nodes = hierarchy.call(this, d, i);
position(nodes[0], 0, size[0], size[1] / depth(nodes[0]));
return nodes;
}
partition.size = function(x) {
if (!arguments.length) return size;
size = x;
return partition;
};
return d3_layout_hierarchyRebind(partition, hierarchy);
};
d3.layout.pie = function() {
var value = Number, sort = d3_layout_pieSortByValue, startAngle = 0, endAngle = τ, padAngle = 0;
function pie(data) {
var n = data.length, values = data.map(function(d, i) {
return +value.call(pie, d, i);
}), a = +(typeof startAngle === "function" ? startAngle.apply(this, arguments) : startAngle), da = (typeof endAngle === "function" ? endAngle.apply(this, arguments) : endAngle) - a, p = Math.min(Math.abs(da) / n, +(typeof padAngle === "function" ? padAngle.apply(this, arguments) : padAngle)), pa = p * (da < 0 ? -1 : 1), k = (da - n * pa) / d3.sum(values), index = d3.range(n), arcs = [], v;
if (sort != null) index.sort(sort === d3_layout_pieSortByValue ? function(i, j) {
return values[j] - values[i];
} : function(i, j) {
return sort(data[i], data[j]);
});
index.forEach(function(i) {
arcs[i] = {
data: data[i],
value: v = values[i],
startAngle: a,
endAngle: a += v * k + pa,
padAngle: p
};
});
return arcs;
}
pie.value = function(_) {
if (!arguments.length) return value;
value = _;
return pie;
};
pie.sort = function(_) {
if (!arguments.length) return sort;
sort = _;
return pie;
};
pie.startAngle = function(_) {
if (!arguments.length) return startAngle;
startAngle = _;
return pie;
};
pie.endAngle = function(_) {
if (!arguments.length) return endAngle;
endAngle = _;
return pie;
};
pie.padAngle = function(_) {
if (!arguments.length) return padAngle;
padAngle = _;
return pie;
};
return pie;
};
var d3_layout_pieSortByValue = {};
d3.layout.stack = function() {
var values = d3_identity, order = d3_layout_stackOrderDefault, offset = d3_layout_stackOffsetZero, out = d3_layout_stackOut, x = d3_layout_stackX, y = d3_layout_stackY;
function stack(data, index) {
if (!(n = data.length)) return data;
var series = data.map(function(d, i) {
return values.call(stack, d, i);
});
var points = series.map(function(d) {
return d.map(function(v, i) {
return [ x.call(stack, v, i), y.call(stack, v, i) ];
});
});
var orders = order.call(stack, points, index);
series = d3.permute(series, orders);
points = d3.permute(points, orders);
var offsets = offset.call(stack, points, index);
var m = series[0].length, n, i, j, o;
for (j = 0; j < m; ++j) {
out.call(stack, series[0][j], o = offsets[j], points[0][j][1]);
for (i = 1; i < n; ++i) {
out.call(stack, series[i][j], o += points[i - 1][j][1], points[i][j][1]);
}
}
return data;
}
stack.values = function(x) {
if (!arguments.length) return values;
values = x;
return stack;
};
stack.order = function(x) {
if (!arguments.length) return order;
order = typeof x === "function" ? x : d3_layout_stackOrders.get(x) || d3_layout_stackOrderDefault;
return stack;
};
stack.offset = function(x) {
if (!arguments.length) return offset;
offset = typeof x === "function" ? x : d3_layout_stackOffsets.get(x) || d3_layout_stackOffsetZero;
return stack;
};
stack.x = function(z) {
if (!arguments.length) return x;
x = z;
return stack;
};
stack.y = function(z) {
if (!arguments.length) return y;
y = z;
return stack;
};
stack.out = function(z) {
if (!arguments.length) return out;
out = z;
return stack;
};
return stack;
};
function d3_layout_stackX(d) {
return d.x;
}
function d3_layout_stackY(d) {
return d.y;
}
function d3_layout_stackOut(d, y0, y) {
d.y0 = y0;
d.y = y;
}
var d3_layout_stackOrders = d3.map({
"inside-out": function(data) {
var n = data.length, i, j, max = data.map(d3_layout_stackMaxIndex), sums = data.map(d3_layout_stackReduceSum), index = d3.range(n).sort(function(a, b) {
return max[a] - max[b];
}), top = 0, bottom = 0, tops = [], bottoms = [];
for (i = 0; i < n; ++i) {
j = index[i];
if (top < bottom) {
top += sums[j];
tops.push(j);
} else {
bottom += sums[j];
bottoms.push(j);
}
}
return bottoms.reverse().concat(tops);
},
reverse: function(data) {
return d3.range(data.length).reverse();
},
"default": d3_layout_stackOrderDefault
});
var d3_layout_stackOffsets = d3.map({
silhouette: function(data) {
var n = data.length, m = data[0].length, sums = [], max = 0, i, j, o, y0 = [];
for (j = 0; j < m; ++j) {
for (i = 0, o = 0; i < n; i++) o += data[i][j][1];
if (o > max) max = o;
sums.push(o);
}
for (j = 0; j < m; ++j) {
y0[j] = (max - sums[j]) / 2;
}
return y0;
},
wiggle: function(data) {
var n = data.length, x = data[0], m = x.length, i, j, k, s1, s2, s3, dx, o, o0, y0 = [];
y0[0] = o = o0 = 0;
for (j = 1; j < m; ++j) {
for (i = 0, s1 = 0; i < n; ++i) s1 += data[i][j][1];
for (i = 0, s2 = 0, dx = x[j][0] - x[j - 1][0]; i < n; ++i) {
for (k = 0, s3 = (data[i][j][1] - data[i][j - 1][1]) / (2 * dx); k < i; ++k) {
s3 += (data[k][j][1] - data[k][j - 1][1]) / dx;
}
s2 += s3 * data[i][j][1];
}
y0[j] = o -= s1 ? s2 / s1 * dx : 0;
if (o < o0) o0 = o;
}
for (j = 0; j < m; ++j) y0[j] -= o0;
return y0;
},
expand: function(data) {
var n = data.length, m = data[0].length, k = 1 / n, i, j, o, y0 = [];
for (j = 0; j < m; ++j) {
for (i = 0, o = 0; i < n; i++) o += data[i][j][1];
if (o) for (i = 0; i < n; i++) data[i][j][1] /= o; else for (i = 0; i < n; i++) data[i][j][1] = k;
}
for (j = 0; j < m; ++j) y0[j] = 0;
return y0;
},
zero: d3_layout_stackOffsetZero
});
function d3_layout_stackOrderDefault(data) {
return d3.range(data.length);
}
function d3_layout_stackOffsetZero(data) {
var j = -1, m = data[0].length, y0 = [];
while (++j < m) y0[j] = 0;
return y0;
}
function d3_layout_stackMaxIndex(array) {
var i = 1, j = 0, v = array[0][1], k, n = array.length;
for (;i < n; ++i) {
if ((k = array[i][1]) > v) {
j = i;
v = k;
}
}
return j;
}
function d3_layout_stackReduceSum(d) {
return d.reduce(d3_layout_stackSum, 0);
}
function d3_layout_stackSum(p, d) {
return p + d[1];
}
d3.layout.histogram = function() {
var frequency = true, valuer = Number, ranger = d3_layout_histogramRange, binner = d3_layout_histogramBinSturges;
function histogram(data, i) {
var bins = [], values = data.map(valuer, this), range = ranger.call(this, values, i), thresholds = binner.call(this, range, values, i), bin, i = -1, n = values.length, m = thresholds.length - 1, k = frequency ? 1 : 1 / n, x;
while (++i < m) {
bin = bins[i] = [];
bin.dx = thresholds[i + 1] - (bin.x = thresholds[i]);
bin.y = 0;
}
if (m > 0) {
i = -1;
while (++i < n) {
x = values[i];
if (x >= range[0] && x <= range[1]) {
bin = bins[d3.bisect(thresholds, x, 1, m) - 1];
bin.y += k;
bin.push(data[i]);
}
}
}
return bins;
}
histogram.value = function(x) {
if (!arguments.length) return valuer;
valuer = x;
return histogram;
};
histogram.range = function(x) {
if (!arguments.length) return ranger;
ranger = d3_functor(x);
return histogram;
};
histogram.bins = function(x) {
if (!arguments.length) return binner;
binner = typeof x === "number" ? function(range) {
return d3_layout_histogramBinFixed(range, x);
} : d3_functor(x);
return histogram;
};
histogram.frequency = function(x) {
if (!arguments.length) return frequency;
frequency = !!x;
return histogram;
};
return histogram;
};
function d3_layout_histogramBinSturges(range, values) {
return d3_layout_histogramBinFixed(range, Math.ceil(Math.log(values.length) / Math.LN2 + 1));
}
function d3_layout_histogramBinFixed(range, n) {
var x = -1, b = +range[0], m = (range[1] - b) / n, f = [];
while (++x <= n) f[x] = m * x + b;
return f;
}
function d3_layout_histogramRange(values) {
return [ d3.min(values), d3.max(values) ];
}
d3.layout.pack = function() {
var hierarchy = d3.layout.hierarchy().sort(d3_layout_packSort), padding = 0, size = [ 1, 1 ], radius;
function pack(d, i) {
var nodes = hierarchy.call(this, d, i), root = nodes[0], w = size[0], h = size[1], r = radius == null ? Math.sqrt : typeof radius === "function" ? radius : function() {
return radius;
};
root.x = root.y = 0;
d3_layout_hierarchyVisitAfter(root, function(d) {
d.r = +r(d.value);
});
d3_layout_hierarchyVisitAfter(root, d3_layout_packSiblings);
if (padding) {
var dr = padding * (radius ? 1 : Math.max(2 * root.r / w, 2 * root.r / h)) / 2;
d3_layout_hierarchyVisitAfter(root, function(d) {
d.r += dr;
});
d3_layout_hierarchyVisitAfter(root, d3_layout_packSiblings);
d3_layout_hierarchyVisitAfter(root, function(d) {
d.r -= dr;
});
}
d3_layout_packTransform(root, w / 2, h / 2, radius ? 1 : 1 / Math.max(2 * root.r / w, 2 * root.r / h));
return nodes;
}
pack.size = function(_) {
if (!arguments.length) return size;
size = _;
return pack;
};
pack.radius = function(_) {
if (!arguments.length) return radius;
radius = _ == null || typeof _ === "function" ? _ : +_;
return pack;
};
pack.padding = function(_) {
if (!arguments.length) return padding;
padding = +_;
return pack;
};
return d3_layout_hierarchyRebind(pack, hierarchy);
};
function d3_layout_packSort(a, b) {
return a.value - b.value;
}
function d3_layout_packInsert(a, b) {
var c = a._pack_next;
a._pack_next = b;
b._pack_prev = a;
b._pack_next = c;
c._pack_prev = b;
}
function d3_layout_packSplice(a, b) {
a._pack_next = b;
b._pack_prev = a;
}
function d3_layout_packIntersects(a, b) {
var dx = b.x - a.x, dy = b.y - a.y, dr = a.r + b.r;
return .999 * dr * dr > dx * dx + dy * dy;
}
function d3_layout_packSiblings(node) {
if (!(nodes = node.children) || !(n = nodes.length)) return;
var nodes, xMin = Infinity, xMax = -Infinity, yMin = Infinity, yMax = -Infinity, a, b, c, i, j, k, n;
function bound(node) {
xMin = Math.min(node.x - node.r, xMin);
xMax = Math.max(node.x + node.r, xMax);
yMin = Math.min(node.y - node.r, yMin);
yMax = Math.max(node.y + node.r, yMax);
}
nodes.forEach(d3_layout_packLink);
a = nodes[0];
a.x = -a.r;
a.y = 0;
bound(a);
if (n > 1) {
b = nodes[1];
b.x = b.r;
b.y = 0;
bound(b);
if (n > 2) {
c = nodes[2];
d3_layout_packPlace(a, b, c);
bound(c);
d3_layout_packInsert(a, c);
a._pack_prev = c;
d3_layout_packInsert(c, b);
b = a._pack_next;
for (i = 3; i < n; i++) {
d3_layout_packPlace(a, b, c = nodes[i]);
var isect = 0, s1 = 1, s2 = 1;
for (j = b._pack_next; j !== b; j = j._pack_next, s1++) {
if (d3_layout_packIntersects(j, c)) {
isect = 1;
break;
}
}
if (isect == 1) {
for (k = a._pack_prev; k !== j._pack_prev; k = k._pack_prev, s2++) {
if (d3_layout_packIntersects(k, c)) {
break;
}
}
}
if (isect) {
if (s1 < s2 || s1 == s2 && b.r < a.r) d3_layout_packSplice(a, b = j); else d3_layout_packSplice(a = k, b);
i--;
} else {
d3_layout_packInsert(a, c);
b = c;
bound(c);
}
}
}
}
var cx = (xMin + xMax) / 2, cy = (yMin + yMax) / 2, cr = 0;
for (i = 0; i < n; i++) {
c = nodes[i];
c.x -= cx;
c.y -= cy;
cr = Math.max(cr, c.r + Math.sqrt(c.x * c.x + c.y * c.y));
}
node.r = cr;
nodes.forEach(d3_layout_packUnlink);
}
function d3_layout_packLink(node) {
node._pack_next = node._pack_prev = node;
}
function d3_layout_packUnlink(node) {
delete node._pack_next;
delete node._pack_prev;
}
function d3_layout_packTransform(node, x, y, k) {
var children = node.children;
node.x = x += k * node.x;
node.y = y += k * node.y;
node.r *= k;
if (children) {
var i = -1, n = children.length;
while (++i < n) d3_layout_packTransform(children[i], x, y, k);
}
}
function d3_layout_packPlace(a, b, c) {
var db = a.r + c.r, dx = b.x - a.x, dy = b.y - a.y;
if (db && (dx || dy)) {
var da = b.r + c.r, dc = dx * dx + dy * dy;
da *= da;
db *= db;
var x = .5 + (db - da) / (2 * dc), y = Math.sqrt(Math.max(0, 2 * da * (db + dc) - (db -= dc) * db - da * da)) / (2 * dc);
c.x = a.x + x * dx + y * dy;
c.y = a.y + x * dy - y * dx;
} else {
c.x = a.x + db;
c.y = a.y;
}
}
d3.layout.tree = function() {
var hierarchy = d3.layout.hierarchy().sort(null).value(null), separation = d3_layout_treeSeparation, size = [ 1, 1 ], nodeSize = null;
function tree(d, i) {
var nodes = hierarchy.call(this, d, i), root0 = nodes[0], root1 = wrapTree(root0);
d3_layout_hierarchyVisitAfter(root1, firstWalk), root1.parent.m = -root1.z;
d3_layout_hierarchyVisitBefore(root1, secondWalk);
if (nodeSize) d3_layout_hierarchyVisitBefore(root0, sizeNode); else {
var left = root0, right = root0, bottom = root0;
d3_layout_hierarchyVisitBefore(root0, function(node) {
if (node.x < left.x) left = node;
if (node.x > right.x) right = node;
if (node.depth > bottom.depth) bottom = node;
});
var tx = separation(left, right) / 2 - left.x, kx = size[0] / (right.x + separation(right, left) / 2 + tx), ky = size[1] / (bottom.depth || 1);
d3_layout_hierarchyVisitBefore(root0, function(node) {
node.x = (node.x + tx) * kx;
node.y = node.depth * ky;
});
}
return nodes;
}
function wrapTree(root0) {
var root1 = {
A: null,
children: [ root0 ]
}, queue = [ root1 ], node1;
while ((node1 = queue.pop()) != null) {
for (var children = node1.children, child, i = 0, n = children.length; i < n; ++i) {
queue.push((children[i] = child = {
_: children[i],
parent: node1,
children: (child = children[i].children) && child.slice() || [],
A: null,
a: null,
z: 0,
m: 0,
c: 0,
s: 0,
t: null,
i: i
}).a = child);
}
}
return root1.children[0];
}
function firstWalk(v) {
var children = v.children, siblings = v.parent.children, w = v.i ? siblings[v.i - 1] : null;
if (children.length) {
d3_layout_treeShift(v);
var midpoint = (children[0].z + children[children.length - 1].z) / 2;
if (w) {
v.z = w.z + separation(v._, w._);
v.m = v.z - midpoint;
} else {
v.z = midpoint;
}
} else if (w) {
v.z = w.z + separation(v._, w._);
}
v.parent.A = apportion(v, w, v.parent.A || siblings[0]);
}
function secondWalk(v) {
v._.x = v.z + v.parent.m;
v.m += v.parent.m;
}
function apportion(v, w, ancestor) {
if (w) {
var vip = v, vop = v, vim = w, vom = vip.parent.children[0], sip = vip.m, sop = vop.m, sim = vim.m, som = vom.m, shift;
while (vim = d3_layout_treeRight(vim), vip = d3_layout_treeLeft(vip), vim && vip) {
vom = d3_layout_treeLeft(vom);
vop = d3_layout_treeRight(vop);
vop.a = v;
shift = vim.z + sim - vip.z - sip + separation(vim._, vip._);
if (shift > 0) {
d3_layout_treeMove(d3_layout_treeAncestor(vim, v, ancestor), v, shift);
sip += shift;
sop += shift;
}
sim += vim.m;
sip += vip.m;
som += vom.m;
sop += vop.m;
}
if (vim && !d3_layout_treeRight(vop)) {
vop.t = vim;
vop.m += sim - sop;
}
if (vip && !d3_layout_treeLeft(vom)) {
vom.t = vip;
vom.m += sip - som;
ancestor = v;
}
}
return ancestor;
}
function sizeNode(node) {
node.x *= size[0];
node.y = node.depth * size[1];
}
tree.separation = function(x) {
if (!arguments.length) return separation;
separation = x;
return tree;
};
tree.size = function(x) {
if (!arguments.length) return nodeSize ? null : size;
nodeSize = (size = x) == null ? sizeNode : null;
return tree;
};
tree.nodeSize = function(x) {
if (!arguments.length) return nodeSize ? size : null;
nodeSize = (size = x) == null ? null : sizeNode;
return tree;
};
return d3_layout_hierarchyRebind(tree, hierarchy);
};
function d3_layout_treeSeparation(a, b) {
return a.parent == b.parent ? 1 : 2;
}
function d3_layout_treeLeft(v) {
var children = v.children;
return children.length ? children[0] : v.t;
}
function d3_layout_treeRight(v) {
var children = v.children, n;
return (n = children.length) ? children[n - 1] : v.t;
}
function d3_layout_treeMove(wm, wp, shift) {
var change = shift / (wp.i - wm.i);
wp.c -= change;
wp.s += shift;
wm.c += change;
wp.z += shift;
wp.m += shift;
}
function d3_layout_treeShift(v) {
var shift = 0, change = 0, children = v.children, i = children.length, w;
while (--i >= 0) {
w = children[i];
w.z += shift;
w.m += shift;
shift += w.s + (change += w.c);
}
}
function d3_layout_treeAncestor(vim, v, ancestor) {
return vim.a.parent === v.parent ? vim.a : ancestor;
}
d3.layout.cluster = function() {
var hierarchy = d3.layout.hierarchy().sort(null).value(null), separation = d3_layout_treeSeparation, size = [ 1, 1 ], nodeSize = false;
function cluster(d, i) {
var nodes = hierarchy.call(this, d, i), root = nodes[0], previousNode, x = 0;
d3_layout_hierarchyVisitAfter(root, function(node) {
var children = node.children;
if (children && children.length) {
node.x = d3_layout_clusterX(children);
node.y = d3_layout_clusterY(children);
} else {
node.x = previousNode ? x += separation(node, previousNode) : 0;
node.y = 0;
previousNode = node;
}
});
var left = d3_layout_clusterLeft(root), right = d3_layout_clusterRight(root), x0 = left.x - separation(left, right) / 2, x1 = right.x + separation(right, left) / 2;
d3_layout_hierarchyVisitAfter(root, nodeSize ? function(node) {
node.x = (node.x - root.x) * size[0];
node.y = (root.y - node.y) * size[1];
} : function(node) {
node.x = (node.x - x0) / (x1 - x0) * size[0];
node.y = (1 - (root.y ? node.y / root.y : 1)) * size[1];
});
return nodes;
}
cluster.separation = function(x) {
if (!arguments.length) return separation;
separation = x;
return cluster;
};
cluster.size = function(x) {
if (!arguments.length) return nodeSize ? null : size;
nodeSize = (size = x) == null;
return cluster;
};
cluster.nodeSize = function(x) {
if (!arguments.length) return nodeSize ? size : null;
nodeSize = (size = x) != null;
return cluster;
};
return d3_layout_hierarchyRebind(cluster, hierarchy);
};
function d3_layout_clusterY(children) {
return 1 + d3.max(children, function(child) {
return child.y;
});
}
function d3_layout_clusterX(children) {
return children.reduce(function(x, child) {
return x + child.x;
}, 0) / children.length;
}
function d3_layout_clusterLeft(node) {
var children = node.children;
return children && children.length ? d3_layout_clusterLeft(children[0]) : node;
}
function d3_layout_clusterRight(node) {
var children = node.children, n;
return children && (n = children.length) ? d3_layout_clusterRight(children[n - 1]) : node;
}
d3.layout.treemap = function() {
var hierarchy = d3.layout.hierarchy(), round = Math.round, size = [ 1, 1 ], padding = null, pad = d3_layout_treemapPadNull, sticky = false, stickies, mode = "squarify", ratio = .5 * (1 + Math.sqrt(5));
function scale(children, k) {
var i = -1, n = children.length, child, area;
while (++i < n) {
area = (child = children[i]).value * (k < 0 ? 0 : k);
child.area = isNaN(area) || area <= 0 ? 0 : area;
}
}
function squarify(node) {
var children = node.children;
if (children && children.length) {
var rect = pad(node), row = [], remaining = children.slice(), child, best = Infinity, score, u = mode === "slice" ? rect.dx : mode === "dice" ? rect.dy : mode === "slice-dice" ? node.depth & 1 ? rect.dy : rect.dx : Math.min(rect.dx, rect.dy), n;
scale(remaining, rect.dx * rect.dy / node.value);
row.area = 0;
while ((n = remaining.length) > 0) {
row.push(child = remaining[n - 1]);
row.area += child.area;
if (mode !== "squarify" || (score = worst(row, u)) <= best) {
remaining.pop();
best = score;
} else {
row.area -= row.pop().area;
position(row, u, rect, false);
u = Math.min(rect.dx, rect.dy);
row.length = row.area = 0;
best = Infinity;
}
}
if (row.length) {
position(row, u, rect, true);
row.length = row.area = 0;
}
children.forEach(squarify);
}
}
function stickify(node) {
var children = node.children;
if (children && children.length) {
var rect = pad(node), remaining = children.slice(), child, row = [];
scale(remaining, rect.dx * rect.dy / node.value);
row.area = 0;
while (child = remaining.pop()) {
row.push(child);
row.area += child.area;
if (child.z != null) {
position(row, child.z ? rect.dx : rect.dy, rect, !remaining.length);
row.length = row.area = 0;
}
}
children.forEach(stickify);
}
}
function worst(row, u) {
var s = row.area, r, rmax = 0, rmin = Infinity, i = -1, n = row.length;
while (++i < n) {
if (!(r = row[i].area)) continue;
if (r < rmin) rmin = r;
if (r > rmax) rmax = r;
}
s *= s;
u *= u;
return s ? Math.max(u * rmax * ratio / s, s / (u * rmin * ratio)) : Infinity;
}
function position(row, u, rect, flush) {
var i = -1, n = row.length, x = rect.x, y = rect.y, v = u ? round(row.area / u) : 0, o;
if (u == rect.dx) {
if (flush || v > rect.dy) v = rect.dy;
while (++i < n) {
o = row[i];
o.x = x;
o.y = y;
o.dy = v;
x += o.dx = Math.min(rect.x + rect.dx - x, v ? round(o.area / v) : 0);
}
o.z = true;
o.dx += rect.x + rect.dx - x;
rect.y += v;
rect.dy -= v;
} else {
if (flush || v > rect.dx) v = rect.dx;
while (++i < n) {
o = row[i];
o.x = x;
o.y = y;
o.dx = v;
y += o.dy = Math.min(rect.y + rect.dy - y, v ? round(o.area / v) : 0);
}
o.z = false;
o.dy += rect.y + rect.dy - y;
rect.x += v;
rect.dx -= v;
}
}
function treemap(d) {
var nodes = stickies || hierarchy(d), root = nodes[0];
root.x = 0;
root.y = 0;
root.dx = size[0];
root.dy = size[1];
if (stickies) hierarchy.revalue(root);
scale([ root ], root.dx * root.dy / root.value);
(stickies ? stickify : squarify)(root);
if (sticky) stickies = nodes;
return nodes;
}
treemap.size = function(x) {
if (!arguments.length) return size;
size = x;
return treemap;
};
treemap.padding = function(x) {
if (!arguments.length) return padding;
function padFunction(node) {
var p = x.call(treemap, node, node.depth);
return p == null ? d3_layout_treemapPadNull(node) : d3_layout_treemapPad(node, typeof p === "number" ? [ p, p, p, p ] : p);
}
function padConstant(node) {
return d3_layout_treemapPad(node, x);
}
var type;
pad = (padding = x) == null ? d3_layout_treemapPadNull : (type = typeof x) === "function" ? padFunction : type === "number" ? (x = [ x, x, x, x ],
padConstant) : padConstant;
return treemap;
};
treemap.round = function(x) {
if (!arguments.length) return round != Number;
round = x ? Math.round : Number;
return treemap;
};
treemap.sticky = function(x) {
if (!arguments.length) return sticky;
sticky = x;
stickies = null;
return treemap;
};
treemap.ratio = function(x) {
if (!arguments.length) return ratio;
ratio = x;
return treemap;
};
treemap.mode = function(x) {
if (!arguments.length) return mode;
mode = x + "";
return treemap;
};
return d3_layout_hierarchyRebind(treemap, hierarchy);
};
function d3_layout_treemapPadNull(node) {
return {
x: node.x,
y: node.y,
dx: node.dx,
dy: node.dy
};
}
function d3_layout_treemapPad(node, padding) {
var x = node.x + padding[3], y = node.y + padding[0], dx = node.dx - padding[1] - padding[3], dy = node.dy - padding[0] - padding[2];
if (dx < 0) {
x += dx / 2;
dx = 0;
}
if (dy < 0) {
y += dy / 2;
dy = 0;
}
return {
x: x,
y: y,
dx: dx,
dy: dy
};
}
d3.random = {
normal: function(µ, σ) {
var n = arguments.length;
if (n < 2) σ = 1;
if (n < 1) µ = 0;
return function() {
var x, y, r;
do {
x = Math.random() * 2 - 1;
y = Math.random() * 2 - 1;
r = x * x + y * y;
} while (!r || r > 1);
return µ + σ * x * Math.sqrt(-2 * Math.log(r) / r);
};
},
logNormal: function() {
var random = d3.random.normal.apply(d3, arguments);
return function() {
return Math.exp(random());
};
},
bates: function(m) {
var random = d3.random.irwinHall(m);
return function() {
return random() / m;
};
},
irwinHall: function(m) {
return function() {
for (var s = 0, j = 0; j < m; j++) s += Math.random();
return s;
};
}
};
d3.scale = {};
function d3_scaleExtent(domain) {
var start = domain[0], stop = domain[domain.length - 1];
return start < stop ? [ start, stop ] : [ stop, start ];
}
function d3_scaleRange(scale) {
return scale.rangeExtent ? scale.rangeExtent() : d3_scaleExtent(scale.range());
}
function d3_scale_bilinear(domain, range, uninterpolate, interpolate) {
var u = uninterpolate(domain[0], domain[1]), i = interpolate(range[0], range[1]);
return function(x) {
return i(u(x));
};
}
function d3_scale_nice(domain, nice) {
var i0 = 0, i1 = domain.length - 1, x0 = domain[i0], x1 = domain[i1], dx;
if (x1 < x0) {
dx = i0, i0 = i1, i1 = dx;
dx = x0, x0 = x1, x1 = dx;
}
domain[i0] = nice.floor(x0);
domain[i1] = nice.ceil(x1);
return domain;
}
function d3_scale_niceStep(step) {
return step ? {
floor: function(x) {
return Math.floor(x / step) * step;
},
ceil: function(x) {
return Math.ceil(x / step) * step;
}
} : d3_scale_niceIdentity;
}
var d3_scale_niceIdentity = {
floor: d3_identity,
ceil: d3_identity
};
function d3_scale_polylinear(domain, range, uninterpolate, interpolate) {
var u = [], i = [], j = 0, k = Math.min(domain.length, range.length) - 1;
if (domain[k] < domain[0]) {
domain = domain.slice().reverse();
range = range.slice().reverse();
}
while (++j <= k) {
u.push(uninterpolate(domain[j - 1], domain[j]));
i.push(interpolate(range[j - 1], range[j]));
}
return function(x) {
var j = d3.bisect(domain, x, 1, k) - 1;
return i[j](u[j](x));
};
}
d3.scale.linear = function() {
return d3_scale_linear([ 0, 1 ], [ 0, 1 ], d3_interpolate, false);
};
function d3_scale_linear(domain, range, interpolate, clamp) {
var output, input;
function rescale() {
var linear = Math.min(domain.length, range.length) > 2 ? d3_scale_polylinear : d3_scale_bilinear, uninterpolate = clamp ? d3_uninterpolateClamp : d3_uninterpolateNumber;
output = linear(domain, range, uninterpolate, interpolate);
input = linear(range, domain, uninterpolate, d3_interpolate);
return scale;
}
function scale(x) {
return output(x);
}
scale.invert = function(y) {
return input(y);
};
scale.domain = function(x) {
if (!arguments.length) return domain;
domain = x.map(Number);
return rescale();
};
scale.range = function(x) {
if (!arguments.length) return range;
range = x;
return rescale();
};
scale.rangeRound = function(x) {
return scale.range(x).interpolate(d3_interpolateRound);
};
scale.clamp = function(x) {
if (!arguments.length) return clamp;
clamp = x;
return rescale();
};
scale.interpolate = function(x) {
if (!arguments.length) return interpolate;
interpolate = x;
return rescale();
};
scale.ticks = function(m) {
return d3_scale_linearTicks(domain, m);
};
scale.tickFormat = function(m, format) {
return d3_scale_linearTickFormat(domain, m, format);
};
scale.nice = function(m) {
d3_scale_linearNice(domain, m);
return rescale();
};
scale.copy = function() {
return d3_scale_linear(domain, range, interpolate, clamp);
};
return rescale();
}
function d3_scale_linearRebind(scale, linear) {
return d3.rebind(scale, linear, "range", "rangeRound", "interpolate", "clamp");
}
function d3_scale_linearNice(domain, m) {
return d3_scale_nice(domain, d3_scale_niceStep(d3_scale_linearTickRange(domain, m)[2]));
}
function d3_scale_linearTickRange(domain, m) {
if (m == null) m = 10;
var extent = d3_scaleExtent(domain), span = extent[1] - extent[0], step = Math.pow(10, Math.floor(Math.log(span / m) / Math.LN10)), err = m / span * step;
if (err <= .15) step *= 10; else if (err <= .35) step *= 5; else if (err <= .75) step *= 2;
extent[0] = Math.ceil(extent[0] / step) * step;
extent[1] = Math.floor(extent[1] / step) * step + step * .5;
extent[2] = step;
return extent;
}
function d3_scale_linearTicks(domain, m) {
return d3.range.apply(d3, d3_scale_linearTickRange(domain, m));
}
function d3_scale_linearTickFormat(domain, m, format) {
var range = d3_scale_linearTickRange(domain, m);
if (format) {
var match = d3_format_re.exec(format);
match.shift();
if (match[8] === "s") {
var prefix = d3.formatPrefix(Math.max(abs(range[0]), abs(range[1])));
if (!match[7]) match[7] = "." + d3_scale_linearPrecision(prefix.scale(range[2]));
match[8] = "f";
format = d3.format(match.join(""));
return function(d) {
return format(prefix.scale(d)) + prefix.symbol;
};
}
if (!match[7]) match[7] = "." + d3_scale_linearFormatPrecision(match[8], range);
format = match.join("");
} else {
format = ",." + d3_scale_linearPrecision(range[2]) + "f";
}
return d3.format(format);
}
var d3_scale_linearFormatSignificant = {
s: 1,
g: 1,
p: 1,
r: 1,
e: 1
};
function d3_scale_linearPrecision(value) {
return -Math.floor(Math.log(value) / Math.LN10 + .01);
}
function d3_scale_linearFormatPrecision(type, range) {
var p = d3_scale_linearPrecision(range[2]);
return type in d3_scale_linearFormatSignificant ? Math.abs(p - d3_scale_linearPrecision(Math.max(abs(range[0]), abs(range[1])))) + +(type !== "e") : p - (type === "%") * 2;
}
d3.scale.log = function() {
return d3_scale_log(d3.scale.linear().domain([ 0, 1 ]), 10, true, [ 1, 10 ]);
};
function d3_scale_log(linear, base, positive, domain) {
function log(x) {
return (positive ? Math.log(x < 0 ? 0 : x) : -Math.log(x > 0 ? 0 : -x)) / Math.log(base);
}
function pow(x) {
return positive ? Math.pow(base, x) : -Math.pow(base, -x);
}
function scale(x) {
return linear(log(x));
}
scale.invert = function(x) {
return pow(linear.invert(x));
};
scale.domain = function(x) {
if (!arguments.length) return domain;
positive = x[0] >= 0;
linear.domain((domain = x.map(Number)).map(log));
return scale;
};
scale.base = function(_) {
if (!arguments.length) return base;
base = +_;
linear.domain(domain.map(log));
return scale;
};
scale.nice = function() {
var niced = d3_scale_nice(domain.map(log), positive ? Math : d3_scale_logNiceNegative);
linear.domain(niced);
domain = niced.map(pow);
return scale;
};
scale.ticks = function() {
var extent = d3_scaleExtent(domain), ticks = [], u = extent[0], v = extent[1], i = Math.floor(log(u)), j = Math.ceil(log(v)), n = base % 1 ? 2 : base;
if (isFinite(j - i)) {
if (positive) {
for (;i < j; i++) for (var k = 1; k < n; k++) ticks.push(pow(i) * k);
ticks.push(pow(i));
} else {
ticks.push(pow(i));
for (;i++ < j; ) for (var k = n - 1; k > 0; k--) ticks.push(pow(i) * k);
}
for (i = 0; ticks[i] < u; i++) {}
for (j = ticks.length; ticks[j - 1] > v; j--) {}
ticks = ticks.slice(i, j);
}
return ticks;
};
scale.tickFormat = function(n, format) {
if (!arguments.length) return d3_scale_logFormat;
if (arguments.length < 2) format = d3_scale_logFormat; else if (typeof format !== "function") format = d3.format(format);
var k = Math.max(.1, n / scale.ticks().length), f = positive ? (e = 1e-12, Math.ceil) : (e = -1e-12,
Math.floor), e;
return function(d) {
return d / pow(f(log(d) + e)) <= k ? format(d) : "";
};
};
scale.copy = function() {
return d3_scale_log(linear.copy(), base, positive, domain);
};
return d3_scale_linearRebind(scale, linear);
}
var d3_scale_logFormat = d3.format(".0e"), d3_scale_logNiceNegative = {
floor: function(x) {
return -Math.ceil(-x);
},
ceil: function(x) {
return -Math.floor(-x);
}
};
d3.scale.pow = function() {
return d3_scale_pow(d3.scale.linear(), 1, [ 0, 1 ]);
};
function d3_scale_pow(linear, exponent, domain) {
var powp = d3_scale_powPow(exponent), powb = d3_scale_powPow(1 / exponent);
function scale(x) {
return linear(powp(x));
}
scale.invert = function(x) {
return powb(linear.invert(x));
};
scale.domain = function(x) {
if (!arguments.length) return domain;
linear.domain((domain = x.map(Number)).map(powp));
return scale;
};
scale.ticks = function(m) {
return d3_scale_linearTicks(domain, m);
};
scale.tickFormat = function(m, format) {
return d3_scale_linearTickFormat(domain, m, format);
};
scale.nice = function(m) {
return scale.domain(d3_scale_linearNice(domain, m));
};
scale.exponent = function(x) {
if (!arguments.length) return exponent;
powp = d3_scale_powPow(exponent = x);
powb = d3_scale_powPow(1 / exponent);
linear.domain(domain.map(powp));
return scale;
};
scale.copy = function() {
return d3_scale_pow(linear.copy(), exponent, domain);
};
return d3_scale_linearRebind(scale, linear);
}
function d3_scale_powPow(e) {
return function(x) {
return x < 0 ? -Math.pow(-x, e) : Math.pow(x, e);
};
}
d3.scale.sqrt = function() {
return d3.scale.pow().exponent(.5);
};
d3.scale.ordinal = function() {
return d3_scale_ordinal([], {
t: "range",
a: [ [] ]
});
};
function d3_scale_ordinal(domain, ranger) {
var index, range, rangeBand;
function scale(x) {
return range[((index.get(x) || (ranger.t === "range" ? index.set(x, domain.push(x)) : NaN)) - 1) % range.length];
}
function steps(start, step) {
return d3.range(domain.length).map(function(i) {
return start + step * i;
});
}
scale.domain = function(x) {
if (!arguments.length) return domain;
domain = [];
index = new d3_Map();
var i = -1, n = x.length, xi;
while (++i < n) if (!index.has(xi = x[i])) index.set(xi, domain.push(xi));
return scale[ranger.t].apply(scale, ranger.a);
};
scale.range = function(x) {
if (!arguments.length) return range;
range = x;
rangeBand = 0;
ranger = {
t: "range",
a: arguments
};
return scale;
};
scale.rangePoints = function(x, padding) {
if (arguments.length < 2) padding = 0;
var start = x[0], stop = x[1], step = domain.length < 2 ? (start = (start + stop) / 2,
0) : (stop - start) / (domain.length - 1 + padding);
range = steps(start + step * padding / 2, step);
rangeBand = 0;
ranger = {
t: "rangePoints",
a: arguments
};
return scale;
};
scale.rangeRoundPoints = function(x, padding) {
if (arguments.length < 2) padding = 0;
var start = x[0], stop = x[1], step = domain.length < 2 ? (start = stop = Math.round((start + stop) / 2),
0) : (stop - start) / (domain.length - 1 + padding) | 0;
range = steps(start + Math.round(step * padding / 2 + (stop - start - (domain.length - 1 + padding) * step) / 2), step);
rangeBand = 0;
ranger = {
t: "rangeRoundPoints",
a: arguments
};
return scale;
};
scale.rangeBands = function(x, padding, outerPadding) {
if (arguments.length < 2) padding = 0;
if (arguments.length < 3) outerPadding = padding;
var reverse = x[1] < x[0], start = x[reverse - 0], stop = x[1 - reverse], step = (stop - start) / (domain.length - padding + 2 * outerPadding);
range = steps(start + step * outerPadding, step);
if (reverse) range.reverse();
rangeBand = step * (1 - padding);
ranger = {
t: "rangeBands",
a: arguments
};
return scale;
};
scale.rangeRoundBands = function(x, padding, outerPadding) {
if (arguments.length < 2) padding = 0;
if (arguments.length < 3) outerPadding = padding;
var reverse = x[1] < x[0], start = x[reverse - 0], stop = x[1 - reverse], step = Math.floor((stop - start) / (domain.length - padding + 2 * outerPadding));
range = steps(start + Math.round((stop - start - (domain.length - padding) * step) / 2), step);
if (reverse) range.reverse();
rangeBand = Math.round(step * (1 - padding));
ranger = {
t: "rangeRoundBands",
a: arguments
};
return scale;
};
scale.rangeBand = function() {
return rangeBand;
};
scale.rangeExtent = function() {
return d3_scaleExtent(ranger.a[0]);
};
scale.copy = function() {
return d3_scale_ordinal(domain, ranger);
};
return scale.domain(domain);
}
d3.scale.category10 = function() {
return d3.scale.ordinal().range(d3_category10);
};
d3.scale.category20 = function() {
return d3.scale.ordinal().range(d3_category20);
};
d3.scale.category20b = function() {
return d3.scale.ordinal().range(d3_category20b);
};
d3.scale.category20c = function() {
return d3.scale.ordinal().range(d3_category20c);
};
var d3_category10 = [ 2062260, 16744206, 2924588, 14034728, 9725885, 9197131, 14907330, 8355711, 12369186, 1556175 ].map(d3_rgbString);
var d3_category20 = [ 2062260, 11454440, 16744206, 16759672, 2924588, 10018698, 14034728, 16750742, 9725885, 12955861, 9197131, 12885140, 14907330, 16234194, 8355711, 13092807, 12369186, 14408589, 1556175, 10410725 ].map(d3_rgbString);
var d3_category20b = [ 3750777, 5395619, 7040719, 10264286, 6519097, 9216594, 11915115, 13556636, 9202993, 12426809, 15186514, 15190932, 8666169, 11356490, 14049643, 15177372, 8077683, 10834324, 13528509, 14589654 ].map(d3_rgbString);
var d3_category20c = [ 3244733, 7057110, 10406625, 13032431, 15095053, 16616764, 16625259, 16634018, 3253076, 7652470, 10607003, 13101504, 7695281, 10394312, 12369372, 14342891, 6513507, 9868950, 12434877, 14277081 ].map(d3_rgbString);
d3.scale.quantile = function() {
return d3_scale_quantile([], []);
};
function d3_scale_quantile(domain, range) {
var thresholds;
function rescale() {
var k = 0, q = range.length;
thresholds = [];
while (++k < q) thresholds[k - 1] = d3.quantile(domain, k / q);
return scale;
}
function scale(x) {
if (!isNaN(x = +x)) return range[d3.bisect(thresholds, x)];
}
scale.domain = function(x) {
if (!arguments.length) return domain;
domain = x.map(d3_number).filter(d3_numeric).sort(d3_ascending);
return rescale();
};
scale.range = function(x) {
if (!arguments.length) return range;
range = x;
return rescale();
};
scale.quantiles = function() {
return thresholds;
};
scale.invertExtent = function(y) {
y = range.indexOf(y);
return y < 0 ? [ NaN, NaN ] : [ y > 0 ? thresholds[y - 1] : domain[0], y < thresholds.length ? thresholds[y] : domain[domain.length - 1] ];
};
scale.copy = function() {
return d3_scale_quantile(domain, range);
};
return rescale();
}
d3.scale.quantize = function() {
return d3_scale_quantize(0, 1, [ 0, 1 ]);
};
function d3_scale_quantize(x0, x1, range) {
var kx, i;
function scale(x) {
return range[Math.max(0, Math.min(i, Math.floor(kx * (x - x0))))];
}
function rescale() {
kx = range.length / (x1 - x0);
i = range.length - 1;
return scale;
}
scale.domain = function(x) {
if (!arguments.length) return [ x0, x1 ];
x0 = +x[0];
x1 = +x[x.length - 1];
return rescale();
};
scale.range = function(x) {
if (!arguments.length) return range;
range = x;
return rescale();
};
scale.invertExtent = function(y) {
y = range.indexOf(y);
y = y < 0 ? NaN : y / kx + x0;
return [ y, y + 1 / kx ];
};
scale.copy = function() {
return d3_scale_quantize(x0, x1, range);
};
return rescale();
}
d3.scale.threshold = function() {
return d3_scale_threshold([ .5 ], [ 0, 1 ]);
};
function d3_scale_threshold(domain, range) {
function scale(x) {
if (x <= x) return range[d3.bisect(domain, x)];
}
scale.domain = function(_) {
if (!arguments.length) return domain;
domain = _;
return scale;
};
scale.range = function(_) {
if (!arguments.length) return range;
range = _;
return scale;
};
scale.invertExtent = function(y) {
y = range.indexOf(y);
return [ domain[y - 1], domain[y] ];
};
scale.copy = function() {
return d3_scale_threshold(domain, range);
};
return scale;
}
d3.scale.identity = function() {
return d3_scale_identity([ 0, 1 ]);
};
function d3_scale_identity(domain) {
function identity(x) {
return +x;
}
identity.invert = identity;
identity.domain = identity.range = function(x) {
if (!arguments.length) return domain;
domain = x.map(identity);
return identity;
};
identity.ticks = function(m) {
return d3_scale_linearTicks(domain, m);
};
identity.tickFormat = function(m, format) {
return d3_scale_linearTickFormat(domain, m, format);
};
identity.copy = function() {
return d3_scale_identity(domain);
};
return identity;
}
d3.svg = {};
function d3_zero() {
return 0;
}
d3.svg.arc = function() {
var innerRadius = d3_svg_arcInnerRadius, outerRadius = d3_svg_arcOuterRadius, cornerRadius = d3_zero, padRadius = d3_svg_arcAuto, startAngle = d3_svg_arcStartAngle, endAngle = d3_svg_arcEndAngle, padAngle = d3_svg_arcPadAngle;
function arc() {
var r0 = Math.max(0, +innerRadius.apply(this, arguments)), r1 = Math.max(0, +outerRadius.apply(this, arguments)), a0 = startAngle.apply(this, arguments) - halfπ, a1 = endAngle.apply(this, arguments) - halfπ, da = Math.abs(a1 - a0), cw = a0 > a1 ? 0 : 1;
if (r1 < r0) rc = r1, r1 = r0, r0 = rc;
if (da >= τε) return circleSegment(r1, cw) + (r0 ? circleSegment(r0, 1 - cw) : "") + "Z";
var rc, cr, rp, ap, p0 = 0, p1 = 0, x0, y0, x1, y1, x2, y2, x3, y3, path = [];
if (ap = (+padAngle.apply(this, arguments) || 0) / 2) {
rp = padRadius === d3_svg_arcAuto ? Math.sqrt(r0 * r0 + r1 * r1) : +padRadius.apply(this, arguments);
if (!cw) p1 *= -1;
if (r1) p1 = d3_asin(rp / r1 * Math.sin(ap));
if (r0) p0 = d3_asin(rp / r0 * Math.sin(ap));
}
if (r1) {
x0 = r1 * Math.cos(a0 + p1);
y0 = r1 * Math.sin(a0 + p1);
x1 = r1 * Math.cos(a1 - p1);
y1 = r1 * Math.sin(a1 - p1);
var l1 = Math.abs(a1 - a0 - 2 * p1) <= π ? 0 : 1;
if (p1 && d3_svg_arcSweep(x0, y0, x1, y1) === cw ^ l1) {
var h1 = (a0 + a1) / 2;
x0 = r1 * Math.cos(h1);
y0 = r1 * Math.sin(h1);
x1 = y1 = null;
}
} else {
x0 = y0 = 0;
}
if (r0) {
x2 = r0 * Math.cos(a1 - p0);
y2 = r0 * Math.sin(a1 - p0);
x3 = r0 * Math.cos(a0 + p0);
y3 = r0 * Math.sin(a0 + p0);
var l0 = Math.abs(a0 - a1 + 2 * p0) <= π ? 0 : 1;
if (p0 && d3_svg_arcSweep(x2, y2, x3, y3) === 1 - cw ^ l0) {
var h0 = (a0 + a1) / 2;
x2 = r0 * Math.cos(h0);
y2 = r0 * Math.sin(h0);
x3 = y3 = null;
}
} else {
x2 = y2 = 0;
}
if ((rc = Math.min(Math.abs(r1 - r0) / 2, +cornerRadius.apply(this, arguments))) > .001) {
cr = r0 < r1 ^ cw ? 0 : 1;
var oc = x3 == null ? [ x2, y2 ] : x1 == null ? [ x0, y0 ] : d3_geom_polygonIntersect([ x0, y0 ], [ x3, y3 ], [ x1, y1 ], [ x2, y2 ]), ax = x0 - oc[0], ay = y0 - oc[1], bx = x1 - oc[0], by = y1 - oc[1], kc = 1 / Math.sin(Math.acos((ax * bx + ay * by) / (Math.sqrt(ax * ax + ay * ay) * Math.sqrt(bx * bx + by * by))) / 2), lc = Math.sqrt(oc[0] * oc[0] + oc[1] * oc[1]);
if (x1 != null) {
var rc1 = Math.min(rc, (r1 - lc) / (kc + 1)), t30 = d3_svg_arcCornerTangents(x3 == null ? [ x2, y2 ] : [ x3, y3 ], [ x0, y0 ], r1, rc1, cw), t12 = d3_svg_arcCornerTangents([ x1, y1 ], [ x2, y2 ], r1, rc1, cw);
if (rc === rc1) {
path.push("M", t30[0], "A", rc1, ",", rc1, " 0 0,", cr, " ", t30[1], "A", r1, ",", r1, " 0 ", 1 - cw ^ d3_svg_arcSweep(t30[1][0], t30[1][1], t12[1][0], t12[1][1]), ",", cw, " ", t12[1], "A", rc1, ",", rc1, " 0 0,", cr, " ", t12[0]);
} else {
path.push("M", t30[0], "A", rc1, ",", rc1, " 0 1,", cr, " ", t12[0]);
}
} else {
path.push("M", x0, ",", y0);
}
if (x3 != null) {
var rc0 = Math.min(rc, (r0 - lc) / (kc - 1)), t03 = d3_svg_arcCornerTangents([ x0, y0 ], [ x3, y3 ], r0, -rc0, cw), t21 = d3_svg_arcCornerTangents([ x2, y2 ], x1 == null ? [ x0, y0 ] : [ x1, y1 ], r0, -rc0, cw);
if (rc === rc0) {
path.push("L", t21[0], "A", rc0, ",", rc0, " 0 0,", cr, " ", t21[1], "A", r0, ",", r0, " 0 ", cw ^ d3_svg_arcSweep(t21[1][0], t21[1][1], t03[1][0], t03[1][1]), ",", 1 - cw, " ", t03[1], "A", rc0, ",", rc0, " 0 0,", cr, " ", t03[0]);
} else {
path.push("L", t21[0], "A", rc0, ",", rc0, " 0 0,", cr, " ", t03[0]);
}
} else {
path.push("L", x2, ",", y2);
}
} else {
path.push("M", x0, ",", y0);
if (x1 != null) path.push("A", r1, ",", r1, " 0 ", l1, ",", cw, " ", x1, ",", y1);
path.push("L", x2, ",", y2);
if (x3 != null) path.push("A", r0, ",", r0, " 0 ", l0, ",", 1 - cw, " ", x3, ",", y3);
}
path.push("Z");
return path.join("");
}
function circleSegment(r1, cw) {
return "M0," + r1 + "A" + r1 + "," + r1 + " 0 1," + cw + " 0," + -r1 + "A" + r1 + "," + r1 + " 0 1," + cw + " 0," + r1;
}
arc.innerRadius = function(v) {
if (!arguments.length) return innerRadius;
innerRadius = d3_functor(v);
return arc;
};
arc.outerRadius = function(v) {
if (!arguments.length) return outerRadius;
outerRadius = d3_functor(v);
return arc;
};
arc.cornerRadius = function(v) {
if (!arguments.length) return cornerRadius;
cornerRadius = d3_functor(v);
return arc;
};
arc.padRadius = function(v) {
if (!arguments.length) return padRadius;
padRadius = v == d3_svg_arcAuto ? d3_svg_arcAuto : d3_functor(v);
return arc;
};
arc.startAngle = function(v) {
if (!arguments.length) return startAngle;
startAngle = d3_functor(v);
return arc;
};
arc.endAngle = function(v) {
if (!arguments.length) return endAngle;
endAngle = d3_functor(v);
return arc;
};
arc.padAngle = function(v) {
if (!arguments.length) return padAngle;
padAngle = d3_functor(v);
return arc;
};
arc.centroid = function() {
var r = (+innerRadius.apply(this, arguments) + +outerRadius.apply(this, arguments)) / 2, a = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - halfπ;
return [ Math.cos(a) * r, Math.sin(a) * r ];
};
return arc;
};
var d3_svg_arcAuto = "auto";
function d3_svg_arcInnerRadius(d) {
return d.innerRadius;
}
function d3_svg_arcOuterRadius(d) {
return d.outerRadius;
}
function d3_svg_arcStartAngle(d) {
return d.startAngle;
}
function d3_svg_arcEndAngle(d) {
return d.endAngle;
}
function d3_svg_arcPadAngle(d) {
return d && d.padAngle;
}
function d3_svg_arcSweep(x0, y0, x1, y1) {
return (x0 - x1) * y0 - (y0 - y1) * x0 > 0 ? 0 : 1;
}
function d3_svg_arcCornerTangents(p0, p1, r1, rc, cw) {
var x01 = p0[0] - p1[0], y01 = p0[1] - p1[1], lo = (cw ? rc : -rc) / Math.sqrt(x01 * x01 + y01 * y01), ox = lo * y01, oy = -lo * x01, x1 = p0[0] + ox, y1 = p0[1] + oy, x2 = p1[0] + ox, y2 = p1[1] + oy, x3 = (x1 + x2) / 2, y3 = (y1 + y2) / 2, dx = x2 - x1, dy = y2 - y1, d2 = dx * dx + dy * dy, r = r1 - rc, D = x1 * y2 - x2 * y1, d = (dy < 0 ? -1 : 1) * Math.sqrt(r * r * d2 - D * D), cx0 = (D * dy - dx * d) / d2, cy0 = (-D * dx - dy * d) / d2, cx1 = (D * dy + dx * d) / d2, cy1 = (-D * dx + dy * d) / d2, dx0 = cx0 - x3, dy0 = cy0 - y3, dx1 = cx1 - x3, dy1 = cy1 - y3;
if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) cx0 = cx1, cy0 = cy1;
return [ [ cx0 - ox, cy0 - oy ], [ cx0 * r1 / r, cy0 * r1 / r ] ];
}
function d3_svg_line(projection) {
var x = d3_geom_pointX, y = d3_geom_pointY, defined = d3_true, interpolate = d3_svg_lineLinear, interpolateKey = interpolate.key, tension = .7;
function line(data) {
var segments = [], points = [], i = -1, n = data.length, d, fx = d3_functor(x), fy = d3_functor(y);
function segment() {
segments.push("M", interpolate(projection(points), tension));
}
while (++i < n) {
if (defined.call(this, d = data[i], i)) {
points.push([ +fx.call(this, d, i), +fy.call(this, d, i) ]);
} else if (points.length) {
segment();
points = [];
}
}
if (points.length) segment();
return segments.length ? segments.join("") : null;
}
line.x = function(_) {
if (!arguments.length) return x;
x = _;
return line;
};
line.y = function(_) {
if (!arguments.length) return y;
y = _;
return line;
};
line.defined = function(_) {
if (!arguments.length) return defined;
defined = _;
return line;
};
line.interpolate = function(_) {
if (!arguments.length) return interpolateKey;
if (typeof _ === "function") interpolateKey = interpolate = _; else interpolateKey = (interpolate = d3_svg_lineInterpolators.get(_) || d3_svg_lineLinear).key;
return line;
};
line.tension = function(_) {
if (!arguments.length) return tension;
tension = _;
return line;
};
return line;
}
d3.svg.line = function() {
return d3_svg_line(d3_identity);
};
var d3_svg_lineInterpolators = d3.map({
linear: d3_svg_lineLinear,
"linear-closed": d3_svg_lineLinearClosed,
step: d3_svg_lineStep,
"step-before": d3_svg_lineStepBefore,
"step-after": d3_svg_lineStepAfter,
basis: d3_svg_lineBasis,
"basis-open": d3_svg_lineBasisOpen,
"basis-closed": d3_svg_lineBasisClosed,
bundle: d3_svg_lineBundle,
cardinal: d3_svg_lineCardinal,
"cardinal-open": d3_svg_lineCardinalOpen,
"cardinal-closed": d3_svg_lineCardinalClosed,
monotone: d3_svg_lineMonotone
});
d3_svg_lineInterpolators.forEach(function(key, value) {
value.key = key;
value.closed = /-closed$/.test(key);
});
function d3_svg_lineLinear(points) {
return points.join("L");
}
function d3_svg_lineLinearClosed(points) {
return d3_svg_lineLinear(points) + "Z";
}
function d3_svg_lineStep(points) {
var i = 0, n = points.length, p = points[0], path = [ p[0], ",", p[1] ];
while (++i < n) path.push("H", (p[0] + (p = points[i])[0]) / 2, "V", p[1]);
if (n > 1) path.push("H", p[0]);
return path.join("");
}
function d3_svg_lineStepBefore(points) {
var i = 0, n = points.length, p = points[0], path = [ p[0], ",", p[1] ];
while (++i < n) path.push("V", (p = points[i])[1], "H", p[0]);
return path.join("");
}
function d3_svg_lineStepAfter(points) {
var i = 0, n = points.length, p = points[0], path = [ p[0], ",", p[1] ];
while (++i < n) path.push("H", (p = points[i])[0], "V", p[1]);
return path.join("");
}
function d3_svg_lineCardinalOpen(points, tension) {
return points.length < 4 ? d3_svg_lineLinear(points) : points[1] + d3_svg_lineHermite(points.slice(1, -1), d3_svg_lineCardinalTangents(points, tension));
}
function d3_svg_lineCardinalClosed(points, tension) {
return points.length < 3 ? d3_svg_lineLinear(points) : points[0] + d3_svg_lineHermite((points.push(points[0]),
points), d3_svg_lineCardinalTangents([ points[points.length - 2] ].concat(points, [ points[1] ]), tension));
}
function d3_svg_lineCardinal(points, tension) {
return points.length < 3 ? d3_svg_lineLinear(points) : points[0] + d3_svg_lineHermite(points, d3_svg_lineCardinalTangents(points, tension));
}
function d3_svg_lineHermite(points, tangents) {
if (tangents.length < 1 || points.length != tangents.length && points.length != tangents.length + 2) {
return d3_svg_lineLinear(points);
}
var quad = points.length != tangents.length, path = "", p0 = points[0], p = points[1], t0 = tangents[0], t = t0, pi = 1;
if (quad) {
path += "Q" + (p[0] - t0[0] * 2 / 3) + "," + (p[1] - t0[1] * 2 / 3) + "," + p[0] + "," + p[1];
p0 = points[1];
pi = 2;
}
if (tangents.length > 1) {
t = tangents[1];
p = points[pi];
pi++;
path += "C" + (p0[0] + t0[0]) + "," + (p0[1] + t0[1]) + "," + (p[0] - t[0]) + "," + (p[1] - t[1]) + "," + p[0] + "," + p[1];
for (var i = 2; i < tangents.length; i++, pi++) {
p = points[pi];
t = tangents[i];
path += "S" + (p[0] - t[0]) + "," + (p[1] - t[1]) + "," + p[0] + "," + p[1];
}
}
if (quad) {
var lp = points[pi];
path += "Q" + (p[0] + t[0] * 2 / 3) + "," + (p[1] + t[1] * 2 / 3) + "," + lp[0] + "," + lp[1];
}
return path;
}
function d3_svg_lineCardinalTangents(points, tension) {
var tangents = [], a = (1 - tension) / 2, p0, p1 = points[0], p2 = points[1], i = 1, n = points.length;
while (++i < n) {
p0 = p1;
p1 = p2;
p2 = points[i];
tangents.push([ a * (p2[0] - p0[0]), a * (p2[1] - p0[1]) ]);
}
return tangents;
}
function d3_svg_lineBasis(points) {
if (points.length < 3) return d3_svg_lineLinear(points);
var i = 1, n = points.length, pi = points[0], x0 = pi[0], y0 = pi[1], px = [ x0, x0, x0, (pi = points[1])[0] ], py = [ y0, y0, y0, pi[1] ], path = [ x0, ",", y0, "L", d3_svg_lineDot4(d3_svg_lineBasisBezier3, px), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier3, py) ];
points.push(points[n - 1]);
while (++i <= n) {
pi = points[i];
px.shift();
px.push(pi[0]);
py.shift();
py.push(pi[1]);
d3_svg_lineBasisBezier(path, px, py);
}
points.pop();
path.push("L", pi);
return path.join("");
}
function d3_svg_lineBasisOpen(points) {
if (points.length < 4) return d3_svg_lineLinear(points);
var path = [], i = -1, n = points.length, pi, px = [ 0 ], py = [ 0 ];
while (++i < 3) {
pi = points[i];
px.push(pi[0]);
py.push(pi[1]);
}
path.push(d3_svg_lineDot4(d3_svg_lineBasisBezier3, px) + "," + d3_svg_lineDot4(d3_svg_lineBasisBezier3, py));
--i;
while (++i < n) {
pi = points[i];
px.shift();
px.push(pi[0]);
py.shift();
py.push(pi[1]);
d3_svg_lineBasisBezier(path, px, py);
}
return path.join("");
}
function d3_svg_lineBasisClosed(points) {
var path, i = -1, n = points.length, m = n + 4, pi, px = [], py = [];
while (++i < 4) {
pi = points[i % n];
px.push(pi[0]);
py.push(pi[1]);
}
path = [ d3_svg_lineDot4(d3_svg_lineBasisBezier3, px), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier3, py) ];
--i;
while (++i < m) {
pi = points[i % n];
px.shift();
px.push(pi[0]);
py.shift();
py.push(pi[1]);
d3_svg_lineBasisBezier(path, px, py);
}
return path.join("");
}
function d3_svg_lineBundle(points, tension) {
var n = points.length - 1;
if (n) {
var x0 = points[0][0], y0 = points[0][1], dx = points[n][0] - x0, dy = points[n][1] - y0, i = -1, p, t;
while (++i <= n) {
p = points[i];
t = i / n;
p[0] = tension * p[0] + (1 - tension) * (x0 + t * dx);
p[1] = tension * p[1] + (1 - tension) * (y0 + t * dy);
}
}
return d3_svg_lineBasis(points);
}
function d3_svg_lineDot4(a, b) {
return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3];
}
var d3_svg_lineBasisBezier1 = [ 0, 2 / 3, 1 / 3, 0 ], d3_svg_lineBasisBezier2 = [ 0, 1 / 3, 2 / 3, 0 ], d3_svg_lineBasisBezier3 = [ 0, 1 / 6, 2 / 3, 1 / 6 ];
function d3_svg_lineBasisBezier(path, x, y) {
path.push("C", d3_svg_lineDot4(d3_svg_lineBasisBezier1, x), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier1, y), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier2, x), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier2, y), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier3, x), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier3, y));
}
function d3_svg_lineSlope(p0, p1) {
return (p1[1] - p0[1]) / (p1[0] - p0[0]);
}
function d3_svg_lineFiniteDifferences(points) {
var i = 0, j = points.length - 1, m = [], p0 = points[0], p1 = points[1], d = m[0] = d3_svg_lineSlope(p0, p1);
while (++i < j) {
m[i] = (d + (d = d3_svg_lineSlope(p0 = p1, p1 = points[i + 1]))) / 2;
}
m[i] = d;
return m;
}
function d3_svg_lineMonotoneTangents(points) {
var tangents = [], d, a, b, s, m = d3_svg_lineFiniteDifferences(points), i = -1, j = points.length - 1;
while (++i < j) {
d = d3_svg_lineSlope(points[i], points[i + 1]);
if (abs(d) < ε) {
m[i] = m[i + 1] = 0;
} else {
a = m[i] / d;
b = m[i + 1] / d;
s = a * a + b * b;
if (s > 9) {
s = d * 3 / Math.sqrt(s);
m[i] = s * a;
m[i + 1] = s * b;
}
}
}
i = -1;
while (++i <= j) {
s = (points[Math.min(j, i + 1)][0] - points[Math.max(0, i - 1)][0]) / (6 * (1 + m[i] * m[i]));
tangents.push([ s || 0, m[i] * s || 0 ]);
}
return tangents;
}
function d3_svg_lineMonotone(points) {
return points.length < 3 ? d3_svg_lineLinear(points) : points[0] + d3_svg_lineHermite(points, d3_svg_lineMonotoneTangents(points));
}
d3.svg.line.radial = function() {
var line = d3_svg_line(d3_svg_lineRadial);
line.radius = line.x, delete line.x;
line.angle = line.y, delete line.y;
return line;
};
function d3_svg_lineRadial(points) {
var point, i = -1, n = points.length, r, a;
while (++i < n) {
point = points[i];
r = point[0];
a = point[1] - halfπ;
point[0] = r * Math.cos(a);
point[1] = r * Math.sin(a);
}
return points;
}
function d3_svg_area(projection) {
var x0 = d3_geom_pointX, x1 = d3_geom_pointX, y0 = 0, y1 = d3_geom_pointY, defined = d3_true, interpolate = d3_svg_lineLinear, interpolateKey = interpolate.key, interpolateReverse = interpolate, L = "L", tension = .7;
function area(data) {
var segments = [], points0 = [], points1 = [], i = -1, n = data.length, d, fx0 = d3_functor(x0), fy0 = d3_functor(y0), fx1 = x0 === x1 ? function() {
return x;
} : d3_functor(x1), fy1 = y0 === y1 ? function() {
return y;
} : d3_functor(y1), x, y;
function segment() {
segments.push("M", interpolate(projection(points1), tension), L, interpolateReverse(projection(points0.reverse()), tension), "Z");
}
while (++i < n) {
if (defined.call(this, d = data[i], i)) {
points0.push([ x = +fx0.call(this, d, i), y = +fy0.call(this, d, i) ]);
points1.push([ +fx1.call(this, d, i), +fy1.call(this, d, i) ]);
} else if (points0.length) {
segment();
points0 = [];
points1 = [];
}
}
if (points0.length) segment();
return segments.length ? segments.join("") : null;
}
area.x = function(_) {
if (!arguments.length) return x1;
x0 = x1 = _;
return area;
};
area.x0 = function(_) {
if (!arguments.length) return x0;
x0 = _;
return area;
};
area.x1 = function(_) {
if (!arguments.length) return x1;
x1 = _;
return area;
};
area.y = function(_) {
if (!arguments.length) return y1;
y0 = y1 = _;
return area;
};
area.y0 = function(_) {
if (!arguments.length) return y0;
y0 = _;
return area;
};
area.y1 = function(_) {
if (!arguments.length) return y1;
y1 = _;
return area;
};
area.defined = function(_) {
if (!arguments.length) return defined;
defined = _;
return area;
};
area.interpolate = function(_) {
if (!arguments.length) return interpolateKey;
if (typeof _ === "function") interpolateKey = interpolate = _; else interpolateKey = (interpolate = d3_svg_lineInterpolators.get(_) || d3_svg_lineLinear).key;
interpolateReverse = interpolate.reverse || interpolate;
L = interpolate.closed ? "M" : "L";
return area;
};
area.tension = function(_) {
if (!arguments.length) return tension;
tension = _;
return area;
};
return area;
}
d3_svg_lineStepBefore.reverse = d3_svg_lineStepAfter;
d3_svg_lineStepAfter.reverse = d3_svg_lineStepBefore;
d3.svg.area = function() {
return d3_svg_area(d3_identity);
};
d3.svg.area.radial = function() {
var area = d3_svg_area(d3_svg_lineRadial);
area.radius = area.x, delete area.x;
area.innerRadius = area.x0, delete area.x0;
area.outerRadius = area.x1, delete area.x1;
area.angle = area.y, delete area.y;
area.startAngle = area.y0, delete area.y0;
area.endAngle = area.y1, delete area.y1;
return area;
};
d3.svg.chord = function() {
var source = d3_source, target = d3_target, radius = d3_svg_chordRadius, startAngle = d3_svg_arcStartAngle, endAngle = d3_svg_arcEndAngle;
function chord(d, i) {
var s = subgroup(this, source, d, i), t = subgroup(this, target, d, i);
return "M" + s.p0 + arc(s.r, s.p1, s.a1 - s.a0) + (equals(s, t) ? curve(s.r, s.p1, s.r, s.p0) : curve(s.r, s.p1, t.r, t.p0) + arc(t.r, t.p1, t.a1 - t.a0) + curve(t.r, t.p1, s.r, s.p0)) + "Z";
}
function subgroup(self, f, d, i) {
var subgroup = f.call(self, d, i), r = radius.call(self, subgroup, i), a0 = startAngle.call(self, subgroup, i) - halfπ, a1 = endAngle.call(self, subgroup, i) - halfπ;
return {
r: r,
a0: a0,
a1: a1,
p0: [ r * Math.cos(a0), r * Math.sin(a0) ],
p1: [ r * Math.cos(a1), r * Math.sin(a1) ]
};
}
function equals(a, b) {
return a.a0 == b.a0 && a.a1 == b.a1;
}
function arc(r, p, a) {
return "A" + r + "," + r + " 0 " + +(a > π) + ",1 " + p;
}
function curve(r0, p0, r1, p1) {
return "Q 0,0 " + p1;
}
chord.radius = function(v) {
if (!arguments.length) return radius;
radius = d3_functor(v);
return chord;
};
chord.source = function(v) {
if (!arguments.length) return source;
source = d3_functor(v);
return chord;
};
chord.target = function(v) {
if (!arguments.length) return target;
target = d3_functor(v);
return chord;
};
chord.startAngle = function(v) {
if (!arguments.length) return startAngle;
startAngle = d3_functor(v);
return chord;
};
chord.endAngle = function(v) {
if (!arguments.length) return endAngle;
endAngle = d3_functor(v);
return chord;
};
return chord;
};
function d3_svg_chordRadius(d) {
return d.radius;
}
d3.svg.diagonal = function() {
var source = d3_source, target = d3_target, projection = d3_svg_diagonalProjection;
function diagonal(d, i) {
var p0 = source.call(this, d, i), p3 = target.call(this, d, i), m = (p0.y + p3.y) / 2, p = [ p0, {
x: p0.x,
y: m
}, {
x: p3.x,
y: m
}, p3 ];
p = p.map(projection);
return "M" + p[0] + "C" + p[1] + " " + p[2] + " " + p[3];
}
diagonal.source = function(x) {
if (!arguments.length) return source;
source = d3_functor(x);
return diagonal;
};
diagonal.target = function(x) {
if (!arguments.length) return target;
target = d3_functor(x);
return diagonal;
};
diagonal.projection = function(x) {
if (!arguments.length) return projection;
projection = x;
return diagonal;
};
return diagonal;
};
function d3_svg_diagonalProjection(d) {
return [ d.x, d.y ];
}
d3.svg.diagonal.radial = function() {
var diagonal = d3.svg.diagonal(), projection = d3_svg_diagonalProjection, projection_ = diagonal.projection;
diagonal.projection = function(x) {
return arguments.length ? projection_(d3_svg_diagonalRadialProjection(projection = x)) : projection;
};
return diagonal;
};
function d3_svg_diagonalRadialProjection(projection) {
return function() {
var d = projection.apply(this, arguments), r = d[0], a = d[1] - halfπ;
return [ r * Math.cos(a), r * Math.sin(a) ];
};
}
d3.svg.symbol = function() {
var type = d3_svg_symbolType, size = d3_svg_symbolSize;
function symbol(d, i) {
return (d3_svg_symbols.get(type.call(this, d, i)) || d3_svg_symbolCircle)(size.call(this, d, i));
}
symbol.type = function(x) {
if (!arguments.length) return type;
type = d3_functor(x);
return symbol;
};
symbol.size = function(x) {
if (!arguments.length) return size;
size = d3_functor(x);
return symbol;
};
return symbol;
};
function d3_svg_symbolSize() {
return 64;
}
function d3_svg_symbolType() {
return "circle";
}
function d3_svg_symbolCircle(size) {
var r = Math.sqrt(size / π);
return "M0," + r + "A" + r + "," + r + " 0 1,1 0," + -r + "A" + r + "," + r + " 0 1,1 0," + r + "Z";
}
var d3_svg_symbols = d3.map({
circle: d3_svg_symbolCircle,
cross: function(size) {
var r = Math.sqrt(size / 5) / 2;
return "M" + -3 * r + "," + -r + "H" + -r + "V" + -3 * r + "H" + r + "V" + -r + "H" + 3 * r + "V" + r + "H" + r + "V" + 3 * r + "H" + -r + "V" + r + "H" + -3 * r + "Z";
},
diamond: function(size) {
var ry = Math.sqrt(size / (2 * d3_svg_symbolTan30)), rx = ry * d3_svg_symbolTan30;
return "M0," + -ry + "L" + rx + ",0" + " 0," + ry + " " + -rx + ",0" + "Z";
},
square: function(size) {
var r = Math.sqrt(size) / 2;
return "M" + -r + "," + -r + "L" + r + "," + -r + " " + r + "," + r + " " + -r + "," + r + "Z";
},
"triangle-down": function(size) {
var rx = Math.sqrt(size / d3_svg_symbolSqrt3), ry = rx * d3_svg_symbolSqrt3 / 2;
return "M0," + ry + "L" + rx + "," + -ry + " " + -rx + "," + -ry + "Z";
},
"triangle-up": function(size) {
var rx = Math.sqrt(size / d3_svg_symbolSqrt3), ry = rx * d3_svg_symbolSqrt3 / 2;
return "M0," + -ry + "L" + rx + "," + ry + " " + -rx + "," + ry + "Z";
}
});
d3.svg.symbolTypes = d3_svg_symbols.keys();
var d3_svg_symbolSqrt3 = Math.sqrt(3), d3_svg_symbolTan30 = Math.tan(30 * d3_radians);
d3_selectionPrototype.transition = function(name) {
var id = d3_transitionInheritId || ++d3_transitionId, ns = d3_transitionNamespace(name), subgroups = [], subgroup, node, transition = d3_transitionInherit || {
time: Date.now(),
ease: d3_ease_cubicInOut,
delay: 0,
duration: 250
};
for (var j = -1, m = this.length; ++j < m; ) {
subgroups.push(subgroup = []);
for (var group = this[j], i = -1, n = group.length; ++i < n; ) {
if (node = group[i]) d3_transitionNode(node, i, ns, id, transition);
subgroup.push(node);
}
}
return d3_transition(subgroups, ns, id);
};
d3_selectionPrototype.interrupt = function(name) {
return this.each(name == null ? d3_selection_interrupt : d3_selection_interruptNS(d3_transitionNamespace(name)));
};
var d3_selection_interrupt = d3_selection_interruptNS(d3_transitionNamespace());
function d3_selection_interruptNS(ns) {
return function() {
var lock, active;
if ((lock = this[ns]) && (active = lock[lock.active])) {
if (--lock.count) delete lock[lock.active]; else delete this[ns];
lock.active += .5;
active.event && active.event.interrupt.call(this, this.__data__, active.index);
}
};
}
function d3_transition(groups, ns, id) {
d3_subclass(groups, d3_transitionPrototype);
groups.namespace = ns;
groups.id = id;
return groups;
}
var d3_transitionPrototype = [], d3_transitionId = 0, d3_transitionInheritId, d3_transitionInherit;
d3_transitionPrototype.call = d3_selectionPrototype.call;
d3_transitionPrototype.empty = d3_selectionPrototype.empty;
d3_transitionPrototype.node = d3_selectionPrototype.node;
d3_transitionPrototype.size = d3_selectionPrototype.size;
d3.transition = function(selection, name) {
return selection && selection.transition ? d3_transitionInheritId ? selection.transition(name) : selection : d3_selectionRoot.transition(selection);
};
d3.transition.prototype = d3_transitionPrototype;
d3_transitionPrototype.select = function(selector) {
var id = this.id, ns = this.namespace, subgroups = [], subgroup, subnode, node;
selector = d3_selection_selector(selector);
for (var j = -1, m = this.length; ++j < m; ) {
subgroups.push(subgroup = []);
for (var group = this[j], i = -1, n = group.length; ++i < n; ) {
if ((node = group[i]) && (subnode = selector.call(node, node.__data__, i, j))) {
if ("__data__" in node) subnode.__data__ = node.__data__;
d3_transitionNode(subnode, i, ns, id, node[ns][id]);
subgroup.push(subnode);
} else {
subgroup.push(null);
}
}
}
return d3_transition(subgroups, ns, id);
};
d3_transitionPrototype.selectAll = function(selector) {
var id = this.id, ns = this.namespace, subgroups = [], subgroup, subnodes, node, subnode, transition;
selector = d3_selection_selectorAll(selector);
for (var j = -1, m = this.length; ++j < m; ) {
for (var group = this[j], i = -1, n = group.length; ++i < n; ) {
if (node = group[i]) {
transition = node[ns][id];
subnodes = selector.call(node, node.__data__, i, j);
subgroups.push(subgroup = []);
for (var k = -1, o = subnodes.length; ++k < o; ) {
if (subnode = subnodes[k]) d3_transitionNode(subnode, k, ns, id, transition);
subgroup.push(subnode);
}
}
}
}
return d3_transition(subgroups, ns, id);
};
d3_transitionPrototype.filter = function(filter) {
var subgroups = [], subgroup, group, node;
if (typeof filter !== "function") filter = d3_selection_filter(filter);
for (var j = 0, m = this.length; j < m; j++) {
subgroups.push(subgroup = []);
for (var group = this[j], i = 0, n = group.length; i < n; i++) {
if ((node = group[i]) && filter.call(node, node.__data__, i, j)) {
subgroup.push(node);
}
}
}
return d3_transition(subgroups, this.namespace, this.id);
};
d3_transitionPrototype.tween = function(name, tween) {
var id = this.id, ns = this.namespace;
if (arguments.length < 2) return this.node()[ns][id].tween.get(name);
return d3_selection_each(this, tween == null ? function(node) {
node[ns][id].tween.remove(name);
} : function(node) {
node[ns][id].tween.set(name, tween);
});
};
function d3_transition_tween(groups, name, value, tween) {
var id = groups.id, ns = groups.namespace;
return d3_selection_each(groups, typeof value === "function" ? function(node, i, j) {
node[ns][id].tween.set(name, tween(value.call(node, node.__data__, i, j)));
} : (value = tween(value), function(node) {
node[ns][id].tween.set(name, value);
}));
}
d3_transitionPrototype.attr = function(nameNS, value) {
if (arguments.length < 2) {
for (value in nameNS) this.attr(value, nameNS[value]);
return this;
}
var interpolate = nameNS == "transform" ? d3_interpolateTransform : d3_interpolate, name = d3.ns.qualify(nameNS);
function attrNull() {
this.removeAttribute(name);
}
function attrNullNS() {
this.removeAttributeNS(name.space, name.local);
}
function attrTween(b) {
return b == null ? attrNull : (b += "", function() {
var a = this.getAttribute(name), i;
return a !== b && (i = interpolate(a, b), function(t) {
this.setAttribute(name, i(t));
});
});
}
function attrTweenNS(b) {
return b == null ? attrNullNS : (b += "", function() {
var a = this.getAttributeNS(name.space, name.local), i;
return a !== b && (i = interpolate(a, b), function(t) {
this.setAttributeNS(name.space, name.local, i(t));
});
});
}
return d3_transition_tween(this, "attr." + nameNS, value, name.local ? attrTweenNS : attrTween);
};
d3_transitionPrototype.attrTween = function(nameNS, tween) {
var name = d3.ns.qualify(nameNS);
function attrTween(d, i) {
var f = tween.call(this, d, i, this.getAttribute(name));
return f && function(t) {
this.setAttribute(name, f(t));
};
}
function attrTweenNS(d, i) {
var f = tween.call(this, d, i, this.getAttributeNS(name.space, name.local));
return f && function(t) {
this.setAttributeNS(name.space, name.local, f(t));
};
}
return this.tween("attr." + nameNS, name.local ? attrTweenNS : attrTween);
};
d3_transitionPrototype.style = function(name, value, priority) {
var n = arguments.length;
if (n < 3) {
if (typeof name !== "string") {
if (n < 2) value = "";
for (priority in name) this.style(priority, name[priority], value);
return this;
}
priority = "";
}
function styleNull() {
this.style.removeProperty(name);
}
function styleString(b) {
return b == null ? styleNull : (b += "", function() {
var a = d3_window.getComputedStyle(this, null).getPropertyValue(name), i;
return a !== b && (i = d3_interpolate(a, b), function(t) {
this.style.setProperty(name, i(t), priority);
});
});
}
return d3_transition_tween(this, "style." + name, value, styleString);
};
d3_transitionPrototype.styleTween = function(name, tween, priority) {
if (arguments.length < 3) priority = "";
function styleTween(d, i) {
var f = tween.call(this, d, i, d3_window.getComputedStyle(this, null).getPropertyValue(name));
return f && function(t) {
this.style.setProperty(name, f(t), priority);
};
}
return this.tween("style." + name, styleTween);
};
d3_transitionPrototype.text = function(value) {
return d3_transition_tween(this, "text", value, d3_transition_text);
};
function d3_transition_text(b) {
if (b == null) b = "";
return function() {
this.textContent = b;
};
}
d3_transitionPrototype.remove = function() {
var ns = this.namespace;
return this.each("end.transition", function() {
var p;
if (this[ns].count < 2 && (p = this.parentNode)) p.removeChild(this);
});
};
d3_transitionPrototype.ease = function(value) {
var id = this.id, ns = this.namespace;
if (arguments.length < 1) return this.node()[ns][id].ease;
if (typeof value !== "function") value = d3.ease.apply(d3, arguments);
return d3_selection_each(this, function(node) {
node[ns][id].ease = value;
});
};
d3_transitionPrototype.delay = function(value) {
var id = this.id, ns = this.namespace;
if (arguments.length < 1) return this.node()[ns][id].delay;
return d3_selection_each(this, typeof value === "function" ? function(node, i, j) {
node[ns][id].delay = +value.call(node, node.__data__, i, j);
} : (value = +value, function(node) {
node[ns][id].delay = value;
}));
};
d3_transitionPrototype.duration = function(value) {
var id = this.id, ns = this.namespace;
if (arguments.length < 1) return this.node()[ns][id].duration;
return d3_selection_each(this, typeof value === "function" ? function(node, i, j) {
node[ns][id].duration = Math.max(1, value.call(node, node.__data__, i, j));
} : (value = Math.max(1, value), function(node) {
node[ns][id].duration = value;
}));
};
d3_transitionPrototype.each = function(type, listener) {
var id = this.id, ns = this.namespace;
if (arguments.length < 2) {
var inherit = d3_transitionInherit, inheritId = d3_transitionInheritId;
try {
d3_transitionInheritId = id;
d3_selection_each(this, function(node, i, j) {
d3_transitionInherit = node[ns][id];
type.call(node, node.__data__, i, j);
});
} finally {
d3_transitionInherit = inherit;
d3_transitionInheritId = inheritId;
}
} else {
d3_selection_each(this, function(node) {
var transition = node[ns][id];
(transition.event || (transition.event = d3.dispatch("start", "end", "interrupt"))).on(type, listener);
});
}
return this;
};
d3_transitionPrototype.transition = function() {
var id0 = this.id, id1 = ++d3_transitionId, ns = this.namespace, subgroups = [], subgroup, group, node, transition;
for (var j = 0, m = this.length; j < m; j++) {
subgroups.push(subgroup = []);
for (var group = this[j], i = 0, n = group.length; i < n; i++) {
if (node = group[i]) {
transition = node[ns][id0];
d3_transitionNode(node, i, ns, id1, {
time: transition.time,
ease: transition.ease,
delay: transition.delay + transition.duration,
duration: transition.duration
});
}
subgroup.push(node);
}
}
return d3_transition(subgroups, ns, id1);
};
function d3_transitionNamespace(name) {
return name == null ? "__transition__" : "__transition_" + name + "__";
}
function d3_transitionNode(node, i, ns, id, inherit) {
var lock = node[ns] || (node[ns] = {
active: 0,
count: 0
}), transition = lock[id];
if (!transition) {
var time = inherit.time;
transition = lock[id] = {
tween: new d3_Map(),
time: time,
delay: inherit.delay,
duration: inherit.duration,
ease: inherit.ease,
index: i
};
inherit = null;
++lock.count;
d3.timer(function(elapsed) {
var delay = transition.delay, duration, ease, timer = d3_timer_active, tweened = [];
timer.t = delay + time;
if (delay <= elapsed) return start(elapsed - delay);
timer.c = start;
function start(elapsed) {
if (lock.active > id) return stop();
var active = lock[lock.active];
if (active) {
--lock.count;
delete lock[lock.active];
active.event && active.event.interrupt.call(node, node.__data__, active.index);
}
lock.active = id;
transition.event && transition.event.start.call(node, node.__data__, i);
transition.tween.forEach(function(key, value) {
if (value = value.call(node, node.__data__, i)) {
tweened.push(value);
}
});
ease = transition.ease;
duration = transition.duration;
d3.timer(function() {
timer.c = tick(elapsed || 1) ? d3_true : tick;
return 1;
}, 0, time);
}
function tick(elapsed) {
if (lock.active !== id) return 1;
var t = elapsed / duration, e = ease(t), n = tweened.length;
while (n > 0) {
tweened[--n].call(node, e);
}
if (t >= 1) {
transition.event && transition.event.end.call(node, node.__data__, i);
return stop();
}
}
function stop() {
if (--lock.count) delete lock[id]; else delete node[ns];
return 1;
}
}, 0, time);
}
}
d3.svg.axis = function() {
var scale = d3.scale.linear(), orient = d3_svg_axisDefaultOrient, innerTickSize = 6, outerTickSize = 6, tickPadding = 3, tickArguments_ = [ 10 ], tickValues = null, tickFormat_;
function axis(g) {
g.each(function() {
var g = d3.select(this);
var scale0 = this.__chart__ || scale, scale1 = this.__chart__ = scale.copy();
var ticks = tickValues == null ? scale1.ticks ? scale1.ticks.apply(scale1, tickArguments_) : scale1.domain() : tickValues, tickFormat = tickFormat_ == null ? scale1.tickFormat ? scale1.tickFormat.apply(scale1, tickArguments_) : d3_identity : tickFormat_, tick = g.selectAll(".tick").data(ticks, scale1), tickEnter = tick.enter().insert("g", ".domain").attr("class", "tick").style("opacity", ε), tickExit = d3.transition(tick.exit()).style("opacity", ε).remove(), tickUpdate = d3.transition(tick.order()).style("opacity", 1), tickSpacing = Math.max(innerTickSize, 0) + tickPadding, tickTransform;
var range = d3_scaleRange(scale1), path = g.selectAll(".domain").data([ 0 ]), pathUpdate = (path.enter().append("path").attr("class", "domain"),
d3.transition(path));
tickEnter.append("line");
tickEnter.append("text");
var lineEnter = tickEnter.select("line"), lineUpdate = tickUpdate.select("line"), text = tick.select("text").text(tickFormat), textEnter = tickEnter.select("text"), textUpdate = tickUpdate.select("text"), sign = orient === "top" || orient === "left" ? -1 : 1, x1, x2, y1, y2;
if (orient === "bottom" || orient === "top") {
tickTransform = d3_svg_axisX, x1 = "x", y1 = "y", x2 = "x2", y2 = "y2";
text.attr("dy", sign < 0 ? "0em" : ".71em").style("text-anchor", "middle");
pathUpdate.attr("d", "M" + range[0] + "," + sign * outerTickSize + "V0H" + range[1] + "V" + sign * outerTickSize);
} else {
tickTransform = d3_svg_axisY, x1 = "y", y1 = "x", x2 = "y2", y2 = "x2";
text.attr("dy", ".32em").style("text-anchor", sign < 0 ? "end" : "start");
pathUpdate.attr("d", "M" + sign * outerTickSize + "," + range[0] + "H0V" + range[1] + "H" + sign * outerTickSize);
}
lineEnter.attr(y2, sign * innerTickSize);
textEnter.attr(y1, sign * tickSpacing);
lineUpdate.attr(x2, 0).attr(y2, sign * innerTickSize);
textUpdate.attr(x1, 0).attr(y1, sign * tickSpacing);
if (scale1.rangeBand) {
var x = scale1, dx = x.rangeBand() / 2;
scale0 = scale1 = function(d) {
return x(d) + dx;
};
} else if (scale0.rangeBand) {
scale0 = scale1;
} else {
tickExit.call(tickTransform, scale1, scale0);
}
tickEnter.call(tickTransform, scale0, scale1);
tickUpdate.call(tickTransform, scale1, scale1);
});
}
axis.scale = function(x) {
if (!arguments.length) return scale;
scale = x;
return axis;
};
axis.orient = function(x) {
if (!arguments.length) return orient;
orient = x in d3_svg_axisOrients ? x + "" : d3_svg_axisDefaultOrient;
return axis;
};
axis.ticks = function() {
if (!arguments.length) return tickArguments_;
tickArguments_ = arguments;
return axis;
};
axis.tickValues = function(x) {
if (!arguments.length) return tickValues;
tickValues = x;
return axis;
};
axis.tickFormat = function(x) {
if (!arguments.length) return tickFormat_;
tickFormat_ = x;
return axis;
};
axis.tickSize = function(x) {
var n = arguments.length;
if (!n) return innerTickSize;
innerTickSize = +x;
outerTickSize = +arguments[n - 1];
return axis;
};
axis.innerTickSize = function(x) {
if (!arguments.length) return innerTickSize;
innerTickSize = +x;
return axis;
};
axis.outerTickSize = function(x) {
if (!arguments.length) return outerTickSize;
outerTickSize = +x;
return axis;
};
axis.tickPadding = function(x) {
if (!arguments.length) return tickPadding;
tickPadding = +x;
return axis;
};
axis.tickSubdivide = function() {
return arguments.length && axis;
};
return axis;
};
var d3_svg_axisDefaultOrient = "bottom", d3_svg_axisOrients = {
top: 1,
right: 1,
bottom: 1,
left: 1
};
function d3_svg_axisX(selection, x0, x1) {
selection.attr("transform", function(d) {
var v0 = x0(d);
return "translate(" + (isFinite(v0) ? v0 : x1(d)) + ",0)";
});
}
function d3_svg_axisY(selection, y0, y1) {
selection.attr("transform", function(d) {
var v0 = y0(d);
return "translate(0," + (isFinite(v0) ? v0 : y1(d)) + ")";
});
}
d3.svg.brush = function() {
var event = d3_eventDispatch(brush, "brushstart", "brush", "brushend"), x = null, y = null, xExtent = [ 0, 0 ], yExtent = [ 0, 0 ], xExtentDomain, yExtentDomain, xClamp = true, yClamp = true, resizes = d3_svg_brushResizes[0];
function brush(g) {
g.each(function() {
var g = d3.select(this).style("pointer-events", "all").style("-webkit-tap-highlight-color", "rgba(0,0,0,0)").on("mousedown.brush", brushstart).on("touchstart.brush", brushstart);
var background = g.selectAll(".background").data([ 0 ]);
background.enter().append("rect").attr("class", "background").style("visibility", "hidden").style("cursor", "crosshair");
g.selectAll(".extent").data([ 0 ]).enter().append("rect").attr("class", "extent").style("cursor", "move");
var resize = g.selectAll(".resize").data(resizes, d3_identity);
resize.exit().remove();
resize.enter().append("g").attr("class", function(d) {
return "resize " + d;
}).style("cursor", function(d) {
return d3_svg_brushCursor[d];
}).append("rect").attr("x", function(d) {
return /[ew]$/.test(d) ? -3 : null;
}).attr("y", function(d) {
return /^[ns]/.test(d) ? -3 : null;
}).attr("width", 6).attr("height", 6).style("visibility", "hidden");
resize.style("display", brush.empty() ? "none" : null);
var gUpdate = d3.transition(g), backgroundUpdate = d3.transition(background), range;
if (x) {
range = d3_scaleRange(x);
backgroundUpdate.attr("x", range[0]).attr("width", range[1] - range[0]);
redrawX(gUpdate);
}
if (y) {
range = d3_scaleRange(y);
backgroundUpdate.attr("y", range[0]).attr("height", range[1] - range[0]);
redrawY(gUpdate);
}
redraw(gUpdate);
});
}
brush.event = function(g) {
g.each(function() {
var event_ = event.of(this, arguments), extent1 = {
x: xExtent,
y: yExtent,
i: xExtentDomain,
j: yExtentDomain
}, extent0 = this.__chart__ || extent1;
this.__chart__ = extent1;
if (d3_transitionInheritId) {
d3.select(this).transition().each("start.brush", function() {
xExtentDomain = extent0.i;
yExtentDomain = extent0.j;
xExtent = extent0.x;
yExtent = extent0.y;
event_({
type: "brushstart"
});
}).tween("brush:brush", function() {
var xi = d3_interpolateArray(xExtent, extent1.x), yi = d3_interpolateArray(yExtent, extent1.y);
xExtentDomain = yExtentDomain = null;
return function(t) {
xExtent = extent1.x = xi(t);
yExtent = extent1.y = yi(t);
event_({
type: "brush",
mode: "resize"
});
};
}).each("end.brush", function() {
xExtentDomain = extent1.i;
yExtentDomain = extent1.j;
event_({
type: "brush",
mode: "resize"
});
event_({
type: "brushend"
});
});
} else {
event_({
type: "brushstart"
});
event_({
type: "brush",
mode: "resize"
});
event_({
type: "brushend"
});
}
});
};
function redraw(g) {
g.selectAll(".resize").attr("transform", function(d) {
return "translate(" + xExtent[+/e$/.test(d)] + "," + yExtent[+/^s/.test(d)] + ")";
});
}
function redrawX(g) {
g.select(".extent").attr("x", xExtent[0]);
g.selectAll(".extent,.n>rect,.s>rect").attr("width", xExtent[1] - xExtent[0]);
}
function redrawY(g) {
g.select(".extent").attr("y", yExtent[0]);
g.selectAll(".extent,.e>rect,.w>rect").attr("height", yExtent[1] - yExtent[0]);
}
function brushstart() {
var target = this, eventTarget = d3.select(d3.event.target), event_ = event.of(target, arguments), g = d3.select(target), resizing = eventTarget.datum(), resizingX = !/^(n|s)$/.test(resizing) && x, resizingY = !/^(e|w)$/.test(resizing) && y, dragging = eventTarget.classed("extent"), dragRestore = d3_event_dragSuppress(), center, origin = d3.mouse(target), offset;
var w = d3.select(d3_window).on("keydown.brush", keydown).on("keyup.brush", keyup);
if (d3.event.changedTouches) {
w.on("touchmove.brush", brushmove).on("touchend.brush", brushend);
} else {
w.on("mousemove.brush", brushmove).on("mouseup.brush", brushend);
}
g.interrupt().selectAll("*").interrupt();
if (dragging) {
origin[0] = xExtent[0] - origin[0];
origin[1] = yExtent[0] - origin[1];
} else if (resizing) {
var ex = +/w$/.test(resizing), ey = +/^n/.test(resizing);
offset = [ xExtent[1 - ex] - origin[0], yExtent[1 - ey] - origin[1] ];
origin[0] = xExtent[ex];
origin[1] = yExtent[ey];
} else if (d3.event.altKey) center = origin.slice();
g.style("pointer-events", "none").selectAll(".resize").style("display", null);
d3.select("body").style("cursor", eventTarget.style("cursor"));
event_({
type: "brushstart"
});
brushmove();
function keydown() {
if (d3.event.keyCode == 32) {
if (!dragging) {
center = null;
origin[0] -= xExtent[1];
origin[1] -= yExtent[1];
dragging = 2;
}
d3_eventPreventDefault();
}
}
function keyup() {
if (d3.event.keyCode == 32 && dragging == 2) {
origin[0] += xExtent[1];
origin[1] += yExtent[1];
dragging = 0;
d3_eventPreventDefault();
}
}
function brushmove() {
var point = d3.mouse(target), moved = false;
if (offset) {
point[0] += offset[0];
point[1] += offset[1];
}
if (!dragging) {
if (d3.event.altKey) {
if (!center) center = [ (xExtent[0] + xExtent[1]) / 2, (yExtent[0] + yExtent[1]) / 2 ];
origin[0] = xExtent[+(point[0] < center[0])];
origin[1] = yExtent[+(point[1] < center[1])];
} else center = null;
}
if (resizingX && move1(point, x, 0)) {
redrawX(g);
moved = true;
}
if (resizingY && move1(point, y, 1)) {
redrawY(g);
moved = true;
}
if (moved) {
redraw(g);
event_({
type: "brush",
mode: dragging ? "move" : "resize"
});
}
}
function move1(point, scale, i) {
var range = d3_scaleRange(scale), r0 = range[0], r1 = range[1], position = origin[i], extent = i ? yExtent : xExtent, size = extent[1] - extent[0], min, max;
if (dragging) {
r0 -= position;
r1 -= size + position;
}
min = (i ? yClamp : xClamp) ? Math.max(r0, Math.min(r1, point[i])) : point[i];
if (dragging) {
max = (min += position) + size;
} else {
if (center) position = Math.max(r0, Math.min(r1, 2 * center[i] - min));
if (position < min) {
max = min;
min = position;
} else {
max = position;
}
}
if (extent[0] != min || extent[1] != max) {
if (i) yExtentDomain = null; else xExtentDomain = null;
extent[0] = min;
extent[1] = max;
return true;
}
}
function brushend() {
brushmove();
g.style("pointer-events", "all").selectAll(".resize").style("display", brush.empty() ? "none" : null);
d3.select("body").style("cursor", null);
w.on("mousemove.brush", null).on("mouseup.brush", null).on("touchmove.brush", null).on("touchend.brush", null).on("keydown.brush", null).on("keyup.brush", null);
dragRestore();
event_({
type: "brushend"
});
}
}
brush.x = function(z) {
if (!arguments.length) return x;
x = z;
resizes = d3_svg_brushResizes[!x << 1 | !y];
return brush;
};
brush.y = function(z) {
if (!arguments.length) return y;
y = z;
resizes = d3_svg_brushResizes[!x << 1 | !y];
return brush;
};
brush.clamp = function(z) {
if (!arguments.length) return x && y ? [ xClamp, yClamp ] : x ? xClamp : y ? yClamp : null;
if (x && y) xClamp = !!z[0], yClamp = !!z[1]; else if (x) xClamp = !!z; else if (y) yClamp = !!z;
return brush;
};
brush.extent = function(z) {
var x0, x1, y0, y1, t;
if (!arguments.length) {
if (x) {
if (xExtentDomain) {
x0 = xExtentDomain[0], x1 = xExtentDomain[1];
} else {
x0 = xExtent[0], x1 = xExtent[1];
if (x.invert) x0 = x.invert(x0), x1 = x.invert(x1);
if (x1 < x0) t = x0, x0 = x1, x1 = t;
}
}
if (y) {
if (yExtentDomain) {
y0 = yExtentDomain[0], y1 = yExtentDomain[1];
} else {
y0 = yExtent[0], y1 = yExtent[1];
if (y.invert) y0 = y.invert(y0), y1 = y.invert(y1);
if (y1 < y0) t = y0, y0 = y1, y1 = t;
}
}
return x && y ? [ [ x0, y0 ], [ x1, y1 ] ] : x ? [ x0, x1 ] : y && [ y0, y1 ];
}
if (x) {
x0 = z[0], x1 = z[1];
if (y) x0 = x0[0], x1 = x1[0];
xExtentDomain = [ x0, x1 ];
if (x.invert) x0 = x(x0), x1 = x(x1);
if (x1 < x0) t = x0, x0 = x1, x1 = t;
if (x0 != xExtent[0] || x1 != xExtent[1]) xExtent = [ x0, x1 ];
}
if (y) {
y0 = z[0], y1 = z[1];
if (x) y0 = y0[1], y1 = y1[1];
yExtentDomain = [ y0, y1 ];
if (y.invert) y0 = y(y0), y1 = y(y1);
if (y1 < y0) t = y0, y0 = y1, y1 = t;
if (y0 != yExtent[0] || y1 != yExtent[1]) yExtent = [ y0, y1 ];
}
return brush;
};
brush.clear = function() {
if (!brush.empty()) {
xExtent = [ 0, 0 ], yExtent = [ 0, 0 ];
xExtentDomain = yExtentDomain = null;
}
return brush;
};
brush.empty = function() {
return !!x && xExtent[0] == xExtent[1] || !!y && yExtent[0] == yExtent[1];
};
return d3.rebind(brush, event, "on");
};
var d3_svg_brushCursor = {
n: "ns-resize",
e: "ew-resize",
s: "ns-resize",
w: "ew-resize",
nw: "nwse-resize",
ne: "nesw-resize",
se: "nwse-resize",
sw: "nesw-resize"
};
var d3_svg_brushResizes = [ [ "n", "e", "s", "w", "nw", "ne", "se", "sw" ], [ "e", "w" ], [ "n", "s" ], [] ];
var d3_time_format = d3_time.format = d3_locale_enUS.timeFormat;
var d3_time_formatUtc = d3_time_format.utc;
var d3_time_formatIso = d3_time_formatUtc("%Y-%m-%dT%H:%M:%S.%LZ");
d3_time_format.iso = Date.prototype.toISOString && +new Date("2000-01-01T00:00:00.000Z") ? d3_time_formatIsoNative : d3_time_formatIso;
function d3_time_formatIsoNative(date) {
return date.toISOString();
}
d3_time_formatIsoNative.parse = function(string) {
var date = new Date(string);
return isNaN(date) ? null : date;
};
d3_time_formatIsoNative.toString = d3_time_formatIso.toString;
d3_time.second = d3_time_interval(function(date) {
return new d3_date(Math.floor(date / 1e3) * 1e3);
}, function(date, offset) {
date.setTime(date.getTime() + Math.floor(offset) * 1e3);
}, function(date) {
return date.getSeconds();
});
d3_time.seconds = d3_time.second.range;
d3_time.seconds.utc = d3_time.second.utc.range;
d3_time.minute = d3_time_interval(function(date) {
return new d3_date(Math.floor(date / 6e4) * 6e4);
}, function(date, offset) {
date.setTime(date.getTime() + Math.floor(offset) * 6e4);
}, function(date) {
return date.getMinutes();
});
d3_time.minutes = d3_time.minute.range;
d3_time.minutes.utc = d3_time.minute.utc.range;
d3_time.hour = d3_time_interval(function(date) {
var timezone = date.getTimezoneOffset() / 60;
return new d3_date((Math.floor(date / 36e5 - timezone) + timezone) * 36e5);
}, function(date, offset) {
date.setTime(date.getTime() + Math.floor(offset) * 36e5);
}, function(date) {
return date.getHours();
});
d3_time.hours = d3_time.hour.range;
d3_time.hours.utc = d3_time.hour.utc.range;
d3_time.month = d3_time_interval(function(date) {
date = d3_time.day(date);
date.setDate(1);
return date;
}, function(date, offset) {
date.setMonth(date.getMonth() + offset);
}, function(date) {
return date.getMonth();
});
d3_time.months = d3_time.month.range;
d3_time.months.utc = d3_time.month.utc.range;
function d3_time_scale(linear, methods, format) {
function scale(x) {
return linear(x);
}
scale.invert = function(x) {
return d3_time_scaleDate(linear.invert(x));
};
scale.domain = function(x) {
if (!arguments.length) return linear.domain().map(d3_time_scaleDate);
linear.domain(x);
return scale;
};
function tickMethod(extent, count) {
var span = extent[1] - extent[0], target = span / count, i = d3.bisect(d3_time_scaleSteps, target);
return i == d3_time_scaleSteps.length ? [ methods.year, d3_scale_linearTickRange(extent.map(function(d) {
return d / 31536e6;
}), count)[2] ] : !i ? [ d3_time_scaleMilliseconds, d3_scale_linearTickRange(extent, count)[2] ] : methods[target / d3_time_scaleSteps[i - 1] < d3_time_scaleSteps[i] / target ? i - 1 : i];
}
scale.nice = function(interval, skip) {
var domain = scale.domain(), extent = d3_scaleExtent(domain), method = interval == null ? tickMethod(extent, 10) : typeof interval === "number" && tickMethod(extent, interval);
if (method) interval = method[0], skip = method[1];
function skipped(date) {
return !isNaN(date) && !interval.range(date, d3_time_scaleDate(+date + 1), skip).length;
}
return scale.domain(d3_scale_nice(domain, skip > 1 ? {
floor: function(date) {
while (skipped(date = interval.floor(date))) date = d3_time_scaleDate(date - 1);
return date;
},
ceil: function(date) {
while (skipped(date = interval.ceil(date))) date = d3_time_scaleDate(+date + 1);
return date;
}
} : interval));
};
scale.ticks = function(interval, skip) {
var extent = d3_scaleExtent(scale.domain()), method = interval == null ? tickMethod(extent, 10) : typeof interval === "number" ? tickMethod(extent, interval) : !interval.range && [ {
range: interval
}, skip ];
if (method) interval = method[0], skip = method[1];
return interval.range(extent[0], d3_time_scaleDate(+extent[1] + 1), skip < 1 ? 1 : skip);
};
scale.tickFormat = function() {
return format;
};
scale.copy = function() {
return d3_time_scale(linear.copy(), methods, format);
};
return d3_scale_linearRebind(scale, linear);
}
function d3_time_scaleDate(t) {
return new Date(t);
}
var d3_time_scaleSteps = [ 1e3, 5e3, 15e3, 3e4, 6e4, 3e5, 9e5, 18e5, 36e5, 108e5, 216e5, 432e5, 864e5, 1728e5, 6048e5, 2592e6, 7776e6, 31536e6 ];
var d3_time_scaleLocalMethods = [ [ d3_time.second, 1 ], [ d3_time.second, 5 ], [ d3_time.second, 15 ], [ d3_time.second, 30 ], [ d3_time.minute, 1 ], [ d3_time.minute, 5 ], [ d3_time.minute, 15 ], [ d3_time.minute, 30 ], [ d3_time.hour, 1 ], [ d3_time.hour, 3 ], [ d3_time.hour, 6 ], [ d3_time.hour, 12 ], [ d3_time.day, 1 ], [ d3_time.day, 2 ], [ d3_time.week, 1 ], [ d3_time.month, 1 ], [ d3_time.month, 3 ], [ d3_time.year, 1 ] ];
var d3_time_scaleLocalFormat = d3_time_format.multi([ [ ".%L", function(d) {
return d.getMilliseconds();
} ], [ ":%S", function(d) {
return d.getSeconds();
} ], [ "%I:%M", function(d) {
return d.getMinutes();
} ], [ "%I %p", function(d) {
return d.getHours();
} ], [ "%a %d", function(d) {
return d.getDay() && d.getDate() != 1;
} ], [ "%b %d", function(d) {
return d.getDate() != 1;
} ], [ "%B", function(d) {
return d.getMonth();
} ], [ "%Y", d3_true ] ]);
var d3_time_scaleMilliseconds = {
range: function(start, stop, step) {
return d3.range(Math.ceil(start / step) * step, +stop, step).map(d3_time_scaleDate);
},
floor: d3_identity,
ceil: d3_identity
};
d3_time_scaleLocalMethods.year = d3_time.year;
d3_time.scale = function() {
return d3_time_scale(d3.scale.linear(), d3_time_scaleLocalMethods, d3_time_scaleLocalFormat);
};
var d3_time_scaleUtcMethods = d3_time_scaleLocalMethods.map(function(m) {
return [ m[0].utc, m[1] ];
});
var d3_time_scaleUtcFormat = d3_time_formatUtc.multi([ [ ".%L", function(d) {
return d.getUTCMilliseconds();
} ], [ ":%S", function(d) {
return d.getUTCSeconds();
} ], [ "%I:%M", function(d) {
return d.getUTCMinutes();
} ], [ "%I %p", function(d) {
return d.getUTCHours();
} ], [ "%a %d", function(d) {
return d.getUTCDay() && d.getUTCDate() != 1;
} ], [ "%b %d", function(d) {
return d.getUTCDate() != 1;
} ], [ "%B", function(d) {
return d.getUTCMonth();
} ], [ "%Y", d3_true ] ]);
d3_time_scaleUtcMethods.year = d3_time.year.utc;
d3_time.scale.utc = function() {
return d3_time_scale(d3.scale.linear(), d3_time_scaleUtcMethods, d3_time_scaleUtcFormat);
};
d3.text = d3_xhrType(function(request) {
return request.responseText;
});
d3.json = function(url, callback) {
return d3_xhr(url, "application/json", d3_json, callback);
};
function d3_json(request) {
return JSON.parse(request.responseText);
}
d3.html = function(url, callback) {
return d3_xhr(url, "text/html", d3_html, callback);
};
function d3_html(request) {
var range = d3_document.createRange();
range.selectNode(d3_document.body);
return range.createContextualFragment(request.responseText);
}
d3.xml = d3_xhrType(function(request) {
return request.responseXML;
});
if (typeof define === "function" && define.amd) define(d3); else if (typeof module === "object" && module.exports) module.exports = d3;
this.d3 = d3;
}();
// start d3_clustergram closure
var d3_clustergram = (function() {
'use strict';
// initialize clustergram: size, scales, etc.
function initialize_visualization(network_data, params) {
// Define Visualization Dimensions
///////////////////////////////////////
// grey_border
///////////////////
// the outermost part of the visualization
params.grey_border_width = 3;
// the distance between labels and clustergram
// a universal margin for the clustergram
params.uni_margin = 4;
params.uni_margin_row = 2;
// Super Labels
///////////////////
// super label width - the labels are 20px wide if they are included
if (params.super_labels === 'yes') {
// include super labels
params.super_label_width = 20;
} else {
// do not include super labels
params.super_label_width = 0;
}
// Variable Label Widths
//////////////////////////
// based on the length of the row/col labels - longer labels mean more space given
// get row col data
var col_nodes = network_data.col_nodes;
var row_nodes = network_data.row_nodes;
// find the label with the most characters and use it to adjust the row and col margins
var row_max_char = _.max(row_nodes, function(inst) {
return inst.name.length;
}).name.length;
var col_max_char = _.max(col_nodes, function(inst) {
return inst.name.length;
}).name.length;
// define label scale parameters: the more characters in the longest name, the larger the margin
var min_num_char = 5;
var max_num_char = 60;
var min_label_width = 120;
var max_label_width = 320;
var label_scale = d3.scale.linear().domain([min_num_char, max_num_char])
.range([min_label_width, max_label_width]).clamp('true');
// Nomal Labels
// define the space needed for the classification of rows - includes classification triangles and rects
params.class_room = {};
if (_.has(params, 'group_colors')) {
// make room for group rects
params.class_room.row = 18;
params.class_room.col = 9;
// the width of the classification triangle or group rectangle
params.class_room.symbol_width = 9;
} else {
// do not make room for group rects
params.class_room.row = 9;
params.class_room.col = 0;
// the width of the classification triangle or group rectangle
params.class_room.symbol_width = 9;
}
// rotated column labels - approx trig
params.norm_label = {};
params.norm_label.width = {};
// allow the user to increase or decrease the overall size of the labels
params.norm_label.width.row = label_scale(row_max_char) * params.row_label_scale;
params.norm_label.width.col = 0.8 * label_scale(col_max_char) * params.col_label_scale;
// normal label margins
params.norm_label.margin = {};
params.norm_label.margin.left = params.grey_border_width + params.super_label_width;
params.norm_label.margin.top = params.grey_border_width + params.super_label_width;
// norm label background width, norm-label-width plus class-width plus maring
params.norm_label.background = {};
params.norm_label.background.row = params.norm_label.width.row + params
.class_room.row + params.uni_margin;
params.norm_label.background.col = params.norm_label.width.col + params
.class_room.col + params.uni_margin;
// clustergram dimensions
params.clust = {};
params.clust.margin = {};
// clust margin is the margin of the norm_label plus the width of the entire norm_label group
params.clust.margin.left = params.norm_label.margin.left + params.norm_label
.background.row;
params.clust.margin.top = params.norm_label.margin.top + params.norm_label
.background.col;
// calc clustergram dimensions
/////////////////////////////////////
// prevent narrow tiles and prevent stretched rows
// svg size: less than svg size
///////////////////////////////////
// 0.8 approximates the trigonometric distance required for hiding the spillover
params.spillover_x_offset = label_scale(col_max_char) * 0.8 * params.col_label_scale;
// get height and width from parent div
params.svg_dim = {};
params.svg_dim.width = Number(d3.select('#' + params.svg_div_id).style(
'width').replace('px', ''));
params.svg_dim.height = Number(d3.select('#' + params.svg_div_id).style(
'height').replace('px', ''));
// reduce width by row/col labels and by grey_border width (reduce width by less since this is less aparent with slanted col labels)
var ini_clust_width = params.svg_dim.width - (params.super_label_width +
label_scale(row_max_char)*params.row_label_scale + params.class_room.row) - params.grey_border_width -
params.spillover_x_offset;
// there is space between the clustergram and the border
var ini_clust_height = params.svg_dim.height - (params.super_label_width +
0.8 * label_scale(col_max_char)*params.col_label_scale + params.class_room.col) - 5 *
params.grey_border_width;
// the visualization dimensions can be smaller than the svg
// if there are not many rows the clustergram width will be reduced, but not the svg width
//!! needs to be improved
var prevent_col_stretch = d3.scale.linear().domain([1, 20]).range([0.05,
1
]).clamp('true');
// clust_dim - clustergram dimensions (the clustergram is smaller than the svg)
params.clust.dim = {};
params.clust.dim.width = ini_clust_width * prevent_col_stretch(
col_nodes.length);
// clustergram height
////////////////////////
// ensure that rects are never taller than they are wide
// force square tiles
if (ini_clust_width / col_nodes.length < ini_clust_height / row_nodes.length) {
// scale the height
params.clust.dim.height = ini_clust_width * (row_nodes.length /
col_nodes.length);
// keep track of whether or not a force square has occurred
// so that I can adjust the font accordingly
params.force_square = 1;
// make sure that force_square does not cause the entire visualization
// to be taller than the svg, if it does, then undo
if (params.clust.dim.height > ini_clust_height) {
// make the height equal to the width
params.clust.dim.height = ini_clust_height;
// keep track of whether or not a force square has occurred
params.force_square = 0;
}
}
// do not force square tiles
else {
// the height will be calculated normally - leading to wide tiles
params.clust.dim.height = ini_clust_height;
// keep track of whether or not a force square has occurred
params.force_square = 0;
}
// Define Orderings
////////////////////////////
// scaling functions to position rows and tiles, define rangeBands
params.x_scale = d3.scale.ordinal().rangeBands([0, params.clust.dim.width]);
params.y_scale = d3.scale.ordinal().rangeBands([0, params.clust.dim.height]);
// Define Orderings
params.orders = {
name: d3.range(col_nodes.length).sort(function(a, b) {
return d3.ascending(col_nodes[a].name, col_nodes[b].name);
}),
// rank
rank_row: d3.range(col_nodes.length).sort(function(a, b) {
return col_nodes[b].rank - col_nodes[a].rank;
}),
rank_col: d3.range(row_nodes.length).sort(function(a, b) {
return row_nodes[b].rank - row_nodes[a].rank;
}),
// clustered
clust_row: d3.range(col_nodes.length).sort(function(a, b) {
return col_nodes[b].clust - col_nodes[a].clust;
}),
clust_col: d3.range(row_nodes.length).sort(function(a, b) {
return row_nodes[b].clust - row_nodes[a].clust;
}),
// class
class_row: d3.range(col_nodes.length).sort(function(a, b) {
return col_nodes[b].cl - col_nodes[a].cl;
}),
class_col: d3.range(row_nodes.length).sort(function(a, b) {
return row_nodes[b].cl - row_nodes[a].cl;
})
};
// Assign initial ordering for x_scale and y_scale
if (params.inst_order === 'clust') {
params.x_scale.domain(params.orders.clust_row);
params.y_scale.domain(params.orders.clust_col);
} else if (params.inst_order === 'rank') {
params.x_scale.domain(params.orders.rank_row);
params.y_scale.domain(params.orders.rank_col);
} else if (params.inst_order === 'class') {
params.x_scale.domain(params.orders.class_row);
params.y_scale.domain(params.orders.class_col);
}
// visualization parameters
//////////////////////////////
// border_width - width of white borders around tiles
params.border_width = params.x_scale.rangeBand() / 16.66;
// zoom_switch from 1 to 2d zoom
params.zoom_switch = (params.clust.dim.width / col_nodes.length) / (
params.clust.dim.height / row_nodes.length);
// zoom_switch can not be less than 1
if (params.zoom_switch < 1) {
params.zoom_switch = 1;
}
// font size controls
////////////////////////////
// min and max number of expected nodes
var min_node_num = 10;
var max_node_num = 3000;
// min and max font sizes
var min_fs = 0.05;
var max_fs = 15;
// min and max expected screen widths
var min_viz_width = 400;
var max_viz_width = 2000;
// make a scale that will set the initial font size based on the number of nodes
d3
.scale
.log()
.domain([min_node_num, max_node_num])
.range([max_fs, min_fs])
.clamp('true');
// scale font offset, when the font size is the height of the rects then it should be almost the full width of the rects
// when the font size is small, then the offset should be almost equal to half the rect width
params.scale_font_offset = d3.scale.linear().domain([1, 0]).range([0.8,
0.5
]);
// controls how much the font size increases during zooming
// 1: do not increase font size while zooming
// 0: increase font size while zooming
// allow some increase in font size when zooming
var min_fs_zoom = 0.95;
// allow full increase in font size when zooming
var max_fs_zoom = 0.0;
// make a scale that will control how the font size changes with zooming based on the number of nodes
var scale_reduce_font_size_factor = d3.scale.log().domain([min_node_num,
max_node_num
]).range([min_fs_zoom, max_fs_zoom]).clamp('true');
// define screen width font size scale
// having a small screen width should reduce the font size of the columns
// this will be compensated by increasing the available real zoom
//!! this can be improved
// scale_fs_screen_width
d3
.scale
.linear()
.domain([min_viz_width, max_viz_width])
.range([0.75, 1.15])
.clamp('true');
// scale_fs_screen_height
d3
.scale
.linear()
.domain([min_viz_width, max_viz_width])
.range([0.75, 1.15])
.clamp('true');
// the default font sizes are set here
// params.default_fs_row = scale_font_size(row_nodes.length)* scale_fs_screen_height(params.clust.dim.height);
params.default_fs_row = params.y_scale.rangeBand() * 0.9;
// the colum font size is scaled by the width
//!! make this local later
// params.default_fs_col = scale_font_size(col_nodes.length)* scale_fs_screen_width(params.clust.dim.width);
params.default_fs_col = params.x_scale.rangeBand() * 0.7;
// font size zooming parameters
params.zoom_scale_font = {};
params.zoom_scale_font.row = 1;
params.zoom_scale_font.col = 1;
// // correct for forcing the tiles to be squares - if they are forced, then use the col font size for the row
// if (params.force_square === 1){
// // scale the row font size by the col scaling
// params.default_fs_row = params.default_fs_col;
// }
// calculate the reduce font-size factor: 0 for no reduction in font size and 1 for full reduction of font size
params.reduce_font_size = {};
params.reduce_font_size.row = scale_reduce_font_size_factor(row_nodes.length);
params.reduce_font_size.col = scale_reduce_font_size_factor(col_nodes.length);
// set up the real zoom (2d zoom) as a function of the number of col_nodes
// since these are the nodes that are zoomed into in 2d zooming
var real_zoom_scale_col = d3.scale.linear().domain([min_node_num,
max_node_num
]).range([2, 5]).clamp('true');
// scale the zoom based on the screen size
// smaller screens can zoom in more, compensates for reduced font size with small screen
var real_zoom_scale_screen = d3.scale.linear().domain([min_viz_width,
max_viz_width
]).range([2, 1]).clamp('true');
// calculate the zoom factor - the more nodes the more zooming allowed
params.real_zoom = real_zoom_scale_col(col_nodes.length) *
real_zoom_scale_screen(params.clust.dim.width);
// set opacity scale
var max_link = _.max(network_data.links, function(d) {
return Math.abs(d.value);
});
// set opacity_scale
// input domain of 0 means set the domain automatically
if (params.input_domain === 0) {
// set the domain using the maximum absolute value
if (params.opacity_scale === 'linear') {
params.opacity_scale = d3.scale.linear().domain([0, Math.abs(
max_link.value)]).clamp(true).range([0.0, 1.0]);
} else if (params.opacity_scale === 'log') {
params.opacity_scale = d3.scale.log().domain([0.001, Math.abs(
max_link.value)]).clamp(true).range([0.0, 1.0]);
}
} else {
// set the domain manually
if (params.opacity_scale === 'linear') {
params.opacity_scale = d3.scale.linear().domain([0, params.input_domain])
.clamp(true).range([0.0, 1.0]);
} else if (params.opacity_scale === 'log') {
params.opacity_scale = d3.scale.log().domain([0.001, params.input_domain])
.clamp(true).range([0.0, 1.0]);
}
}
// not running a transition
params.run_trans = 0;
// console.log(network_data.links[0])
// define tile type: rect, group
// rect is the default faster and simpler option
// group is the optional slower and more complex option that is activated with: highlighting or split tiles
// if ( _.has(network_data.links[0], 'value_up') || _.has(network_data.links[0], 'highlight') ){
if (_.has(network_data.links[0], 'value_up') || _.has(network_data.links[
0], 'highlight')) {
params.tile_type = 'group';
// console.log('making group tiles');
} else {
params.tile_type = 'simple';
// console.log('making group tiles');
}
// check if rects should be highlighted
if (_.has(d3_clustergram.network_data.links[0], 'highlight')) {
params.highlight = 1;
// console.log('found highlight');
} else {
params.highlight = 0;
}
return params;
}
// main function
function make_d3_clustergram(args) {
// initialize the parameters object
var params = {};
// save all arguments for remaking viz
params.args = args;
// Unload Arguments
/////////////////////////
// network_data - not an optional argument
var network_data = args.network_data;
// svg_div_id
if (typeof args.svg_div_id === 'undefined') {
params.svg_div_id = 'svg_div';
} else {
params.svg_div_id = args.svg_div_id;
}
// super-row/col labels
if (typeof args.row_label === 'undefined' || typeof args.col_label ===
'undefined') {
// do not put super labels
params.super_labels = 'no';
} else {
// make super labels
params.super_labels = 'yes';
params.super = {};
params.super.row = args.row_label;
params.super.col = args.col_label;
}
// row and column overflow sensitivity
params.label_overflow = {};
if (typeof args.row_overflow === 'undefined') {
// make sensitivity to overflow the max, 1
params.label_overflow.row = 1;
} else {
params.label_overflow.row = args.row_overflow;
}
// col and column overflow sensitivity
if (typeof args.col_overflow === 'undefined') {
// make sensitivity to overflow the max, 1
params.label_overflow.col = 1;
} else {
params.label_overflow.col = args.col_overflow;
}
// row and label overall scale
if (typeof args.row_label_scale == 'undefined'){
params.row_label_scale = 1;
} else {
params.row_label_scale = args.row_label_scale;
}
if (typeof args.col_label_scale == 'undefined'){
params.col_label_scale = 1;
} else {
params.col_label_scale = args.col_label_scale;
}
// transpose matrix - if requested
if (typeof args.transpose === 'undefined') {
params.transpose = false;
} else {
params.transpose = args.transpose;
}
// transpose network data and super-labels
if (params.transpose === true) {
network_data = transpose_network(network_data);
params.super.row = args.col_label;
params.super.col = args.row_label;
}
// add title to tile
if (typeof args.title_tile === 'undefined') {
params.title_tile = false;
} else {
params.title_tile = args.title_tile;
}
// tile colors
if (typeof args.tile_colors === 'undefined') {
// red/blue
params.tile_colors = ['#FF0000', '#1C86EE'];
} else {
params.tile_colors = args.tile_colors;
}
// background color
if (typeof args.background_color === 'undefined') {
params.background_color = '#FFFFFF';
params.super_border_color = '#f5f5f5';
} else {
params.background_color = args.background_color;
params.super_border_color = args.background_color;
}
// check if zooming is enabled
if (typeof args.zoom === 'undefined') {
params.do_zoom = true;
} else {
params.do_zoom = args.zoom;
}
// tile callback function - optional
if (typeof args.click_tile === 'undefined') {
// there is no callback function included
params.click_tile = 'none';
} else {
// transfer the callback function
params.click_tile = args.click_tile;
}
// group callback function - optional
if (typeof args.click_group === 'undefined') {
params.click_group = 'none';
} else {
// transfer the callback function
params.click_group = args.click_group;
}
// set input domain
if (typeof args.input_domain === 'undefined') {
// default domain is set to 0, which means that the domain will be set automatically
params.input_domain = 0;
} else {
params.input_domain = args.input_domain;
}
// set opacity scale type
if (typeof args.opacity_scale === 'undefined') {
params.opacity_scale = 'linear';
} else {
params.opacity_scale = args.opacity_scale;
}
// variable/fixed visualization size (needs to be in the arguments)
if (typeof args.resize === 'undefined') {
// default resize to yes
params.resize = true;
} else {
params.resize = args.resize;
}
// get outer_margins
if (typeof args.outer_margins === 'undefined') {
// default margins
params.outer_margins = {
'top': 0,
'bottom': 0,
'left': 0,
'right': 0
};
} else {
params.outer_margins = args.outer_margins;
}
// get initial ordering
if (typeof args.order === 'undefined') {
params.inst_order = 'clust';
}
// only use ordering if its defined correctly
else if (args.order === 'clust' || args.order === 'rank' ||
args.order === 'class') {
params.inst_order = args.order;
} else {
// backup
params.inst_order = 'clust';
}
// save global version of network_data
d3_clustergram.network_data = network_data;
// set local variables from network_data
var col_nodes = network_data.col_nodes;
var row_nodes = network_data.row_nodes;
// colors from http://graphicdesign.stackexchange.com/revisions/3815/8
params.rand_colors = ['#000000', '#FF34FF', '#FFFF00', '#FF4A46',
'#008941', '#006FA6', '#A30059', '#FFDBE5', '#7A4900', '#0000A6',
'#63FFAC', '#B79762', '#004D43', '#8FB0FF', '#997D87', '#5A0007',
'#809693', '#FEFFE6', '#1B4400', '#4FC601', '#3B5DFF', '#4A3B53',
'#FF2F80', '#61615A', '#BA0900', '#6B7900', '#00C2A0', '#FFAA92',
'#FF90C9', '#B903AA', '#D16100', '#DDEFFF', '#000035', '#7B4F4B',
'#A1C299', '#300018', '#0AA6D8', '#013349', '#00846F', '#372101',
'#FFB500', '#C2FFED', '#A079BF', '#CC0744', '#C0B9B2', '#C2FF99',
'#001E09', '#00489C', '#6F0062', '#0CBD66', '#EEC3FF', '#456D75',
'#B77B68', '#7A87A1', '#788D66', '#885578', '#FAD09F', '#FF8A9A',
'#D157A0', '#BEC459', '#456648', '#0086ED', '#886F4C', '#34362D',
'#B4A8BD', '#00A6AA', '#452C2C', '#636375', '#A3C8C9', '#FF913F',
'#938A81', '#575329', '#00FECF', '#B05B6F', '#8CD0FF', '#3B9700',
'#04F757', '#C8A1A1', '#1E6E00', '#7900D7', '#A77500', '#6367A9',
'#A05837', '#6B002C', '#772600', '#D790FF', '#9B9700', '#549E79',
'#FFF69F', '#201625', '#72418F', '#BC23FF', '#99ADC0', '#3A2465',
'#922329', '#5B4534', '#FDE8DC', '#404E55', '#0089A3', '#CB7E98',
'#A4E804', '#324E72', '#6A3A4C', '#83AB58', '#001C1E', '#D1F7CE',
'#004B28', '#C8D0F6', '#A3A489', '#806C66', '#222800', '#BF5650',
'#E83000', '#66796D', '#DA007C', '#FF1A59', '#8ADBB4', '#1E0200',
'#5B4E51', '#C895C5', '#320033', '#FF6832', '#66E1D3', '#CFCDAC',
'#D0AC94', '#7ED379', '#012C58', '#7A7BFF', '#D68E01', '#353339',
'#78AFA1', '#FEB2C6', '#75797C', '#837393', '#943A4D', '#B5F4FF',
'#D2DCD5', '#9556BD', '#6A714A', '#001325', '#02525F', '#0AA3F7',
'#E98176', '#DBD5DD', '#5EBCD1', '#3D4F44', '#7E6405', '#02684E',
'#962B75', '#8D8546', '#9695C5', '#E773CE', '#D86A78', '#3E89BE',
'#CA834E', '#518A87', '#5B113C', '#55813B', '#E704C4', '#00005F',
'#A97399', '#4B8160', '#59738A', '#FF5DA7', '#F7C9BF', '#643127',
'#513A01', '#6B94AA', '#51A058', '#A45B02', '#1D1702', '#E20027',
'#E7AB63', '#4C6001', '#9C6966', '#64547B', '#97979E', '#006A66',
'#391406', '#F4D749', '#0045D2', '#006C31', '#DDB6D0', '#7C6571',
'#9FB2A4', '#00D891', '#15A08A', '#BC65E9', '#FFFFFE', '#C6DC99',
'#203B3C', '#671190', '#6B3A64', '#F5E1FF', '#FFA0F2', '#CCAA35',
'#374527', '#8BB400', '#797868', '#C6005A', '#3B000A', '#C86240',
'#29607C', '#402334', '#7D5A44', '#CCB87C', '#B88183', '#AA5199',
'#B5D6C3', '#A38469', '#9F94F0', '#A74571', '#B894A6', '#71BB8C',
'#00B433', '#789EC9', '#6D80BA', '#953F00', '#5EFF03', '#E4FFFC',
'#1BE177', '#BCB1E5', '#76912F', '#003109', '#0060CD', '#D20096',
'#895563', '#29201D', '#5B3213', '#A76F42', '#89412E', '#1A3A2A',
'#494B5A', '#A88C85', '#F4ABAA', '#A3F3AB', '#00C6C8', '#EA8B66',
'#958A9F', '#BDC9D2', '#9FA064', '#BE4700', '#658188', '#83A485',
'#453C23', '#47675D', '#3A3F00', '#061203', '#DFFB71', '#868E7E',
'#98D058', '#6C8F7D', '#D7BFC2', '#3C3E6E', '#D83D66', '#2F5D9B',
'#6C5E46', '#D25B88', '#5B656C', '#00B57F', '#545C46', '#866097',
'#365D25', '#252F99', '#00CCFF', '#674E60', '#FC009C', '#92896B',
'#1CE6FF'
];
// get the total number of colors
var num_colors = params.rand_colors.length;
// row groups - only add if the rows have a group attribute
if (_.has(row_nodes[0], 'group') === true || _.has(col_nodes[0],
'group')) {
// initialize group colors
/////////////////////////
params.group_colors = {};
// initailize group at 5
params.group_level = {};
params.group_level.row = 5;
params.group_level.col = 5;
}
// check if row/col have class information
if (_.has(row_nodes[0], 'cl') || _.has(col_nodes[0], 'cl')) {
// gather classes
params.class_colors = {};
}
// gather class information from row
if (_.has(row_nodes[0], 'cl') === true) {
var class_rows = _.uniq(_.pluck(row_nodes, 'cl'));
// associate classes with colors
params.class_colors.row = {};
_.each(class_rows, function(c_row, i) {
params.class_colors.row[c_row] = params.rand_colors[i + 50 % num_colors];
});
}
// gather class information from col
if (_.has(col_nodes[0], 'cl') === true) {
var class_cols = _.uniq(_.pluck(col_nodes, 'cl'));
// associate classes with colors
params.class_colors.col = {};
_.each(class_cols, function(c_col, i) {
if (i === 0) {
params.class_colors.col[c_col] = '#eee';
} else {
params.class_colors.col[c_col] = params.rand_colors[i + 50 % num_colors];
}
});
}
// get row groups and make color dictionary
if (_.has(row_nodes[0], 'group') === true) {
params.group_colors.row = {};
// generate random colors for the groups
for (var i = 0; i < 200; i++) {
// grab colors from the list
if (i === 1) {
params.group_colors.row[i] = '#eee';
} else {
params.group_colors.row[i] = params.rand_colors[i % num_colors];
}
}
}
// get col groups and make color dictionary
if (_.has(col_nodes[0], 'group') === true) {
params.group_colors.col = {};
// generate random colors for the groups
for (var j = 0; j < 200; j++) {
// grab colors from the list
if (j === 1) {
params.group_colors.col[j] = '#eee';
} else {
params.group_colors.col[j] = params.rand_colors[j % num_colors];
}
}
}
// Begin Making Visualization
/////////////////////////////////
// might save global data to specific object in case a user wants
// to have more than one clustergram
// // initialize an object with the name svg_div_id
// d3_clustergram['params_'+svg_div_id] = {}
// remove any previous visualizations
d3.select('#main_svg').remove();
// size and position the outer div first
//////////////////////////////////////////
// only resize if allowed
parent_div_size_pos(params);
// initialize clustergram variables
params = initialize_visualization(network_data, params);
// display col and row title
d3.select('#row_title').style('display', 'block');
d3.select('#col_title').style('display', 'block');
// display clust_instruct_container
d3.select('#clust_instruct_container').style('display', 'block');
// shift the footer left
d3.select('#footer_div')
.style('margin-left', '0px');
// !! need to set up
// highlight resource types - set up type/color association
params = highlight_resource_types(params);
// define the variable zoom, a d3 method
params.zoom = d3.behavior.zoom().scaleExtent([1, params.real_zoom *
params.zoom_switch
]).on('zoom', zoomed);
// initialize matrix
/////////////////////////
params.matrix = [];
_.each(row_nodes, function(tmp, row_index) {
params.matrix[row_index] = d3.range(col_nodes.length).map(function(col_index) {
return {
pos_x: col_index,
pos_y: row_index,
value: 0
};
});
});
_.each(network_data.links, function(link) {
params.matrix[link.source][link.target].value = link.value;
// transfer additional link information is necessary
if (params.tile_type === 'group') {
params.matrix[link.source][link.target].value_up = link.value_up;
params.matrix[link.source][link.target].value_dn = link.value_dn;
}
if (params.highlight === 1) {
params.matrix[link.source][link.target].highlight = link.highlight;
}
if (_.has(link, 'info')) {
params.matrix[link.source][link.target].info = link.info;
}
});
// save params to the global object d3_clustergram
d3_clustergram.params = params;
// make clustergram visualization
///////////////////////////////////////
// make outer group for clust_group - this will position clust_group once
var outer_group = d3.select('#' + params.svg_div_id)
.append('svg')
.attr('id', 'main_svg')
// leave room for the light grey border
.attr('width', params.svg_dim.width)
// the height is reduced by more than the width because the tiles go right up to the bottom border
.attr('height', params.svg_dim.height);
// append background rect if necessary to control background color
if (params.background_color !== '#FFFFFF') {
outer_group
.append('rect')
.attr('width', params.svg_dim.width)
.attr('height', params.svg_dim.height)
.style('fill', params.background_color);
console.log('change the background color ');
}
// call zoomingoom on the entire svg
if (params.do_zoom === true) {
outer_group
.call(params.zoom);
}
params.clust_group = outer_group
// append a group that will hold clust_group and position it once
.append('g')
.attr('transform', 'translate(' + params.clust.margin.left + ',' +
params.clust.margin.top + ')')
.append('g')
.attr('id', 'clust_group');
// grey background rect for clustergram
params.clust_group
.append('rect')
.attr('class', 'background')
.attr('id', 'grey_background')
.style('fill', '#eee')
.attr('width', params.clust.dim.width)
.attr('height', params.clust.dim.height);
// make rows: make rects or groups
// use matrix for the data join, which contains a two dimensional
// array of objects, each row of this matrix will be passed into the row function
var row_obj = params.clust_group.selectAll('.row')
.data(params.matrix)
.enter()
.append('g')
.attr('class', 'row')
.attr('transform', function(d, index) {
return 'translate(0,' + params.y_scale(index) + ')';
});
if (params.tile_type === 'simple') {
row_obj = row_obj.each(row_function);
} else {
row_obj = row_obj.each(row_group_function);
}
// white lines in clustergram
/////////////////////////////////
// horizontal lines
row_obj.append('line')
//!! find ouw what 20 represents
.attr('x2', 20 * params.clust.dim.width)
.style('stroke-width', params.border_width / params.zoom_switch +
'px')
.style('stroke', 'white');
// append vertical line groups
var vert_lines = params.clust_group
.selectAll('.vert_lines')
.data(col_nodes)
.enter()
.append('g')
.attr('class', 'vert_lines')
.attr('transform', function(d, index) {
return 'translate(' + params.x_scale(index) + ') rotate(-90)';
});
// add vertical lines
vert_lines
.append('line')
.attr('x1', 0)
.attr('x2', -params.clust.dim.height)
.style('stroke-width', params.border_width + 'px')
.style('stroke', 'white');
// Row
//////////////////////////////////
// make container to pre-position zoomable elements
var container_all_row = d3.select('#main_svg')
.append('g')
.attr('transform', 'translate(' + params.norm_label.margin.left + ',' +
params.clust.margin.top + ')');
// white background rect for row labels
container_all_row
.append('rect')
.attr('fill', params.background_color)
.attr('width', params.norm_label.background.row)
.attr('height', 30 * params.clust.dim.height + 'px')
.attr('class', 'white_bars');
// row_labels
container_all_row
.append('g')
// position the outer row label group
.attr('transform', 'translate(' + params.norm_label.width.row + ',0)')
.append('g')
.attr('id', 'row_labels');
// generate and position the row labels
var row_labels = d3.select('#row_labels')
.selectAll('.row_label_text')
.data(row_nodes)
.enter()
.append('g')
.attr('class', 'row_label_text')
.attr('transform', function(d, index) {
return 'translate(0,' + params.y_scale(index) + ')';
})
.on('dblclick', reorder_click_row)
.on('mouseover', function() {
// highlight text
d3
.select(this)
.select('text')
.classed('active',true);
})
.on('mouseout', function mouseout() {
d3.select(this)
.select('text')
.classed('active',false)
});
// append row label text
row_labels
.append('text')
.attr('y', params.y_scale.rangeBand() * 0.75)
// .attr('dy', params.y_scale.rangeBand()/4)
.attr('text-anchor', 'end')
.style('font-size', params.default_fs_row + 'px')
.text(function(d) {
return d.name;
});
// append rectangle behind text
row_labels
.insert('rect', 'text')
.attr('x', -10)
.attr('y', 0)
.attr('width', 10)
.attr('height', 10)
.style('opacity', 0);
// change the size of the highlighting rects
row_labels
.each(function() {
// get the bounding box of the row label text
var bbox = d3.select(this)
.select('text')[0][0]
.getBBox();
// use the bounding box to set the size of the rect
d3.select(this)
.select('rect')
.attr('x', bbox.x * 0.5)
.attr('y', 0)
.attr('width', bbox.width * 0.5)
.attr('height', params.y_scale.rangeBand())
.style('fill', function() {
var inst_hl = 'yellow';
return inst_hl;
})
.style('opacity', function(d) {
var inst_opacity = 0;
// highlight target genes
if (d.target === 1) {
inst_opacity = 1;
}
return inst_opacity;
});
});
// row triangles
///////////////////////
var row_triangle_zoom = container_all_row
.append('g')
// shift by the width of the normal row labels
.attr('transform', 'translate(' + params.norm_label.width.row + ',0)')
.append('g')
.attr('id', 'row_label_triangles');
// append triangle background rect to zoomable group
row_triangle_zoom
.append('rect')
.attr('fill', params.background_color) //!! prog_colors
.attr('width', params.class_room.row + 'px')
.attr('height', function() {
var inst_height = params.clust.dim.height;
return inst_height;
});
// append groups - each holds one triangle
var row_triangle_ini_group = row_triangle_zoom
.selectAll('g')
.data(row_nodes)
.enter()
.append('g')
.attr('class', 'row_triangle_group')
.attr('transform', function(d, index) {
return 'translate(0, ' + params.y_scale(index) + ')';
});
// add triangles
row_triangle_ini_group
.append('path')
.attr('d', function() {
var origin_x = params.class_room.symbol_width - 1;
var origin_y = 0;
var mid_x = 1;
var mid_y = params.y_scale.rangeBand() / 2;
var final_x = params.class_room.symbol_width - 1;
var final_y = params.y_scale.rangeBand();
var output_string = 'M ' + origin_x + ',' + origin_y + ' L ' +
mid_x + ',' + mid_y + ', L ' + final_x + ',' + final_y + ' Z';
return output_string;
})
.attr('fill', function(d) {
// initailize color
var inst_color = '#eee';
if (_.has(params, 'class_colors')) {
inst_color = params.class_colors.row[d.cl];
}
return inst_color;
});
// add row group labels if necessary
//////////////////////////////////////
if (_.has(params, 'group_colors')) {
// add rects for highlighting automatically identified groups
var row_class_rect = row_triangle_ini_group
.append('rect')
.attr('class', 'row_class_rect')
.attr('width', function() {
var inst_width = params.class_room.symbol_width - 1;
return inst_width + 'px';
})
.attr('height', params.y_scale.rangeBand())
.style('fill', function(d) {
var inst_level = params.group_level.row;
return params.group_colors.row[d.group[inst_level]];
})
.attr('x', function() {
var inst_offset = params.class_room.symbol_width + 1;
return inst_offset + 'px';
});
// optional row callback on click
if (typeof params.click_group === 'function') {
// only add click functionality to row rect
row_class_rect
.on('click', function(d) {
var inst_level = params.group_level.row;
var inst_group = d.group[inst_level];
// find all row names that are in the same group at the same group_level
// get row_nodes
row_nodes = d3_clustergram.network_data.row_nodes;
var group_nodes = [];
_.each(row_nodes, function(node) {
// check that the node is in the group
if (node.group[inst_level] === inst_group) {
// make a list of genes that are in inst_group at this group_level
group_nodes.push(node.name);
}
});
// return the following information to the user
// row or col, distance cutoff level, nodes
var group_info = {};
group_info.type = 'row';
group_info.nodes = group_nodes;
group_info.info = {
'type': 'distance',
'cutoff': inst_level / 10
};
// pass information to group_click callback
params.click_group(group_info);
});
}
}
// col labels
//////////////////////////////////
// make container to pre-position zoomable elements
var container_all_col = d3.select('#main_svg')
.append('g')
.attr('transform', 'translate(' + params.clust.margin.left + ',' +
params.norm_label.margin.top + ')');
// white background rect for col labels
container_all_col
.append('rect')
.attr('fill', params.background_color) //!! prog_colors
.attr('width', 30 * params.clust.dim.width + 'px')
.attr('height', params.norm_label.background.col)
.attr('class', 'white_bars');
// col labels
container_all_col
.append('g')
// position the outer col label group
.attr('transform', 'translate(0,' + params.norm_label.width.col + ')')
.append('g')
.attr('id', 'col_labels');
// offset click group column label
var x_offset_click = params.x_scale.rangeBand() / 2 + params.border_width;
// reduce width of rotated rects
var reduce_rect_width = params.x_scale.rangeBand() * 0.36;
// add main column label group
var col_label_obj = d3.select('#col_labels')
.selectAll('.col_label_text')
.data(col_nodes)
.enter()
.append('g')
.attr('class', 'col_label_text')
.attr('transform', function(d, index) {
return 'translate(' + params.x_scale(index) + ') rotate(-90)';
});
// append group for individual column label
var col_label_click = col_label_obj
// append new group for rect and label (not white lines)
.append('g')
.attr('class', 'col_label_click')
// rotate column labels
.attr('transform', 'translate(' + params.x_scale.rangeBand() / 2 +
',' + x_offset_click + ') rotate(45)')
.on('dblclick', reorder_click_col)
.on('mouseover', function() {
d3.select(this).select('text')
.classed('active',true);
})
.on('mouseout', function mouseout() {
d3.select(this).select('text')
.classed('active',false);
});
// add column label
col_label_click
.append('text')
.attr('x', 0)
.attr('y', params.x_scale.rangeBand() * 0.60)
// offset label to make room for triangle
.attr('dx', 2 * params.border_width)
.attr('text-anchor', 'start')
.attr('full_name', function(d) {
return d.name;
})
// original font size
.style('font-size', params.default_fs_col + 'px')
// // !! simple font size
// .style('font-size', params.x_scale.rangeBand()*0.7+'px')
.text(function(d) {
return d.name.replace(/_/g, ' ');
});
// label the widest row and col labels
////////////////////////////////////////
params.bounding_width_max = {};
params.bounding_width_max.row = 0;
d3.selectAll('.row_label_text').each(function() {
var tmp_width = d3.select(this).select('text').node().getBBox().width;
if (tmp_width > params.bounding_width_max.row) {
params.bounding_width_max.row = tmp_width;
}
});
params.bounding_width_max.col = 0;
d3.selectAll('.col_label_click').each(function() {
var tmp_width = d3.select(this).select('text').node().getBBox().width;
if (tmp_width > params.bounding_width_max.col) {
// increase the apparent width of the column label since its rotated
// this will give more room for text
params.bounding_width_max.col = tmp_width * 1.2;
}
});
// optionally turn down sensitivity to row/col overflow
params.bounding_width_max.col = params.bounding_width_max.col * params.label_overflow
.col;
params.bounding_width_max.row = params.bounding_width_max.row * params.label_overflow
.row;
// check if widest row or col are wider than the allowed label width
////////////////////////////////////////////////////////////////////////
params.ini_scale_font = {};
params.ini_scale_font.row = 1;
params.ini_scale_font.col = 1;
if (params.bounding_width_max.row * params.zoom.scale() > params.norm_label
.width.row) {
params.ini_scale_font.row = params.norm_label.width.row / params.bounding_width_max
.row;
// redefine bounding_width_max.row
params.bounding_width_max.row = params.ini_scale_font.row * params.bounding_width_max
.row;
// redefine default fs
params.default_fs_row = params.default_fs_row * params.ini_scale_font
.row;
// reduce font size
d3.selectAll('.row_label_text').each(function() {
d3.select(this).select('text')
.style('font-size', params.default_fs_row + 'px');
});
}
if (params.bounding_width_max.col * params.zoom.scale() > params.norm_label
.width.col) {
params.ini_scale_font.col = params.norm_label.width.col / params.bounding_width_max
.col;
// redefine bounding_width_max.col
params.bounding_width_max.col = params.ini_scale_font.col * params.bounding_width_max
.col;
// redefine default fs
params.default_fs_col = params.default_fs_col * params.ini_scale_font
.col;
// reduce font size
d3.selectAll('.col_label_click').each(function() {
d3.select(this).select('text')
.style('font-size', params.default_fs_col + 'px');
});
}
// append rectangle behind text
col_label_click
.insert('rect', 'text')
.attr('x', 10)
.attr('y', 0)
.attr('width', 10)
.attr('height', 10)
.style('opacity', 0);
// change the size of the highlighting rects
col_label_click
.each(function() {
// get the bounding box of the row label text
var bbox = d3.select(this)
.select('text')[0][0]
.getBBox();
// use the bounding box to set the size of the rect
d3.select(this)
.select('rect')
.attr('x', bbox.x * 1.25)
.attr('y', 0)
.attr('width', bbox.width * 1.25)
// used a reduced rect width for the columsn
// because the rects are slanted
.attr('height', params.x_scale.rangeBand() * 0.6)
.style('fill', 'yellow')
.style('opacity', 0);
});
// add triangle under rotated labels
col_label_click
.append('path')
.style('stroke-width', 0)
.attr('d', function() {
// x and y are flipped since its rotated
var origin_y = -params.border_width;
var start_x = 0;
var final_x = params.x_scale.rangeBand() - reduce_rect_width;
var start_y = -(params.x_scale.rangeBand() - reduce_rect_width +
params.border_width);
var final_y = -params.border_width;
var output_string = 'M ' + origin_y + ',0 L ' + start_y + ',' +
start_x + ', L ' + final_y + ',' + final_x + ' Z';
return output_string;
})
.attr('fill', function(d) {
var inst_color = '#eee';
if (_.has(params, 'class_colors')) {
inst_color = params.class_colors.col[d.cl];
}
return inst_color;
});
//!! get the abs maximum value from row/col use this to make red/blue bars
// // get the max abs nl_pval (find obj and get nl_pval)
// enr_max = _.max( col_nodes, function(d) { return Math.abs(d.nl_pval) } ).nl_pval ;
// the enrichment bar should be 3/4ths of the height of the column labels
params.bar_scale_col = d3.scale.linear()
// .domain([0, enr_max])
.domain([0, 1])
.range([0, params.norm_label.width.col]);
// append column value bars
if (_.has(d3_clustergram.network_data.col_nodes[0], 'value')) {
col_label_click
.append('rect')
.attr('class', 'col_bars')
// column is rotated - effectively width and height are switched
.attr('width', function(d) {
return params.bar_scale_col(d.value);
})
// rotate labels - reduce width if rotating
.attr('height', params.x_scale.rangeBand() * 0.66)
.attr('fill', function() {
// return d.color;
return 'red';
})
.attr('opacity', 0.4);
}
// add group labels if necessary
//////////////////////////////////
if (_.has(params, 'group_colors')) {
// add class label under column label
var col_class = container_all_col
.append('g')
// .attr('transform','translate(0,'+params.norm_label.width.col+')')
.attr('transform', function() {
var inst_offset = params.norm_label.width.col + 2;
return 'translate(0,' + inst_offset + ')';
})
.append('g')
// shift down 1px
// .attr('transform','translate(0,2)')
.attr('id', 'col_class');
// append groups - each will hold a classification rect
var col_class_ini_group = col_class
.selectAll('g')
.data(col_nodes)
.enter()
.append('g')
.attr('class', 'col_class_group')
.attr('transform', function(d, index) {
return 'translate(' + params.x_scale(index) + ',0)';
});
// add rects for highlighting - dendrogram-like
col_class_ini_group
.append('rect')
.attr('class', 'col_class_rect')
.attr('width', params.x_scale.rangeBand())
.attr('height', function() {
var inst_height = params.class_room.col - 1;
return inst_height;
})
.style('fill', function(d) {
var inst_level = params.group_level.col;
return params.group_colors.col[d.group[inst_level]];
});
// optional column callback on click
if (typeof params.click_group === 'function') {
col_class_ini_group
.on('click', function(d) {
var inst_level = params.group_level.col;
var inst_group = d.group[inst_level];
// find all column names that are in the same group at the same group_level
// get col_nodes
col_nodes = d3_clustergram.network_data.col_nodes;
var group_nodes = [];
_.each(col_nodes, function(node) {
// check that the node is in the group
if (node.group[inst_level] === inst_group) {
// make a list of genes that are in inst_group at this group_level
group_nodes.push(node.name);
}
});
// return the following information to the user
// row or col, distance cutoff level, nodes
var group_info = {};
group_info.type = 'col';
group_info.nodes = group_nodes;
group_info.info = {
'type': 'distance',
'cutoff': inst_level / 10
};
// pass information to group_click callback
params.click_group(group_info);
});
}
}
// hide spillover from slanted column labels on right side
container_all_col
.append('path')
.style('stroke-width', '0')
// mini-language for drawing path in d3, used to draw triangle
.attr('d', 'M 0,0 L 500,-500, L 500,0 Z')
.attr('fill', params.background_color) //!! prog_colors
.attr('id', 'right_slant_triangle')
.attr('transform', 'translate(' + params.clust.dim.width + ',' +
params.norm_label.width.col + ')');
// hide spillover from slanted column labels on left side
container_all_col
.append('path')
.style('stroke-width', '0')
// mini-language for drawing path in d3, used to draw triangle
.attr('d', 'M 0,0 L 500,-500, L 0,-500 Z')
.attr('fill', params.background_color)
.attr('id', 'left_slant_triangle')
// shift left by 1 px to prevent cutting off labels
.attr('transform', 'translate(-1,' + params.norm_label.width.col +
')');
// top corner rect
///////////////////////////////
// white rect to cover excess labels
d3.select('#main_svg')
.append('rect')
.attr('fill', params.background_color) //!! prog_colors
.attr('width', params.clust.margin.left)
.attr('height', params.clust.margin.top)
.attr('id', 'top_left_white');
// hide spillover from right
d3.select('#main_svg')
.append('rect')
.attr('fill', params.background_color) //!! prog_colors
.attr('width', '300px')
.attr('height', '3000px')
.attr('transform', function() {
var tmp_left = params.clust.margin.left + params.clust.dim.width;
var tmp_top = params.norm_label.margin.top + params.norm_label.width
.col;
return 'translate(' + tmp_left + ',' + tmp_top + ')';
})
.attr('class', 'white_bars');
// only make the super titles if they are requested
if (params.super_labels === 'yes') {
// super col title
/////////////////////////////////////
// add super column title background
d3.select('#main_svg')
.append('rect')
.attr('fill', params.background_color) //!! prog_colors
.attr('height', params.super_label_width + 'px')
.attr('width', '3000px')
.attr('class', 'white_bars')
.attr('transform', 'translate(0,' + params.grey_border_width + ')');
// super col title
d3.select('#main_svg')
.append('text')
.text(params.super.col)
.attr('text-anchor', 'center')
.attr('transform', function() {
var inst_x = params.clust.dim.width / 2 + params.norm_label.width
.row;
var inst_y = params.super_label_width - params.uni_margin;
return 'translate(' + inst_x + ',' + inst_y + ')';
})
.style('font-size', '14px')
.style('font-weight', 300);
// super row title
/////////////////////////////////////
// add super row title background
d3.select('#main_svg')
.append('rect')
.attr('fill', params.background_color) //!! prog_colors
.attr('width', params.super_label_width + 'px')
.attr('height', '3000px')
.attr('class', 'white_bars')
.attr('transform', 'translate(' + params.grey_border_width + ',0)');
// append super title row group
// this is used to separate translation from rotation
d3.select('#main_svg')
.append('g')
.attr('id', 'super_row_label')
.attr('transform', function() {
// position in the middle of the clustergram
var inst_x = params.super_label_width - params.uni_margin;
var inst_y = params.clust.dim.height / 2 + params.norm_label.width
.col;
return 'translate(' + inst_x + ',' + inst_y + ')';
});
// super row label (rotate the already translated title )
d3.select('#super_row_label')
.append('text')
.text(params.super.row)
.attr('text-anchor', 'center')
.attr('transform', 'rotate(-90)')
.style('font-size', '14px')
.style('font-weight', 300);
}
// white border bottom - prevent clustergram from hitting border
///////////////////////////////////////////////////////////////////
d3.select('#main_svg')
.append('rect')
.attr('fill', params.background_color) //!! prog_colors
.attr('width', params.svg_dim.width)
// make this border twice the width of the grey border
.attr('height', 2 * params.grey_border_width)
.attr('transform', function() {
// shift up enough to show the entire border width
var inst_offset = params.svg_dim.height - 3 * params.grey_border_width;
return 'translate(0,' + inst_offset + ')';
});
// add border to svg in four separate lines - to not interfere with clicking anything
///////////////////////////////////////////////////////////////////////////////////////
// left border
d3.select('#main_svg')
.append('rect')
.attr('fill', params.super_border_color) //!! prog_colors
.attr('width', params.grey_border_width)
.attr('height', params.svg_dim.height)
.attr('transform', 'translate(0,0)');
// right border
d3.select('#main_svg')
.append('rect')
.attr('fill', params.super_border_color) //!! prog_colors
.attr('width', params.grey_border_width)
.attr('height', params.svg_dim.height)
.attr('transform', function() {
var inst_offset = params.svg_dim.width - params.grey_border_width;
return 'translate(' + inst_offset + ',0)';
});
// top border
d3.select('#main_svg')
.append('rect')
.attr('fill', params.super_border_color) //!! prog_colors
.attr('width', params.svg_dim.width)
.attr('height', params.grey_border_width)
.attr('transform', function() {
var inst_offset = 0;
return 'translate(' + inst_offset + ',0)';
});
// bottom border
d3.select('#main_svg')
.append('rect')
.attr('fill', params.super_border_color) //!! prog_colors
.attr('width', params.svg_dim.width)
.attr('height', params.grey_border_width)
.attr('transform', function() {
var inst_offset = params.svg_dim.height - params.grey_border_width;
return 'translate(0,' + inst_offset + ')';
});
// initialize zoom and translate
///////////////////////////////////
// initialize translate vector to compensate for label margins
params.zoom.translate([params.clust.margin.left, params.clust.margin.top]);
// resize window
d3.select(window).on('resize', timeout_resize);
// disable double-click zoom: double click should reset zoom level
// do this for all svg elements
d3.selectAll('svg').on('dblclick.zoom', null);
// double click to reset zoom - add transition
d3.select('#main_svg')
.on('dblclick', function() {
// apply the following two translate zoom to reset zoom
// programatically
two_translate_zoom(0, 0, 1);
});
}
// parent_div: size and position svg container - svg_div
//////////////////////////////////////////////
function parent_div_size_pos(params) {
if (params.resize === true) {
// get outer_margins
var outer_margins = params.outer_margins;
// get the size of the window
var screen_width = window.innerWidth;
var screen_height = window.innerHeight;
// define width and height of clustergram container
var container_dim = {};
container_dim.width = screen_width - outer_margins.left -
outer_margins.right;
container_dim.height = screen_height - outer_margins.top -
outer_margins.bottom;
// size the svg container div - svg_div
d3.select('#' + params.svg_div_id)
.style('margin-left', outer_margins.left + 'px')
.style('margin-top', outer_margins.top + 'px')
.style('width', container_dim.width + 'px')
.style('height', container_dim.height + 'px');
} else {
// get outer_margins
outer_margins = params.outer_margins;
// size the svg container div - svg_div
d3.select('#' + params.svg_div_id)
.style('margin-left', outer_margins.left + 'px')
.style('margin-top', outer_margins.top + 'px');
}
}
//!! this needs to be improved
//!! I will have to generalize this
function highlight_resource_types(params) {
// var col_nodes = d3_clustergram.network_data.col_nodes;
var row_nodes = d3_clustergram.network_data.row_nodes;
// // This will set up the resource type color key
// // and generate an array of genes for later use
// //////////////////////////////////////////////////////
// // res_hexcodes = ['#097054','#FFDE00','#6599FF','#FF9900','#834C24','#003366','#1F1209']
// var res_hexcodes = ['#0000FF','#FF0000','#C0C0C0', '#FFA500'];
// define cell line groups
// var all_groups = ['TF group 1','TF group 2','TF group 3'];
// var all_groups = _.keys(params.class_colors.row);
// // generate an object to associate group with color
// var res_color_dict = {};
// // initialize the cell line color associations
// var blue_cl = ['H1437','H1792','HCC15','A549','H1944','H1299','H1355','H838','CAL-12T','H23','H460','H661'];
// var red_cl = ['H441','HCC78','H1734','H2228','H1781','H1975','H358','HCC827','H1703','H2342','H1650','LOU-NH91'];
// var grey_cl = ['CALU-3','H2405','H2106', 'HCC44','H1666'];
// var orange_cl = [] //['HCC44','H1666'];
// for (var i=0; i<col_nodes.length;i++){
// // add blue cell line
// if ( $.inArray(col_nodes[i]['name'],blue_cl) > -1 ){
// res_color_dict[col_nodes[i]['name']]=res_hexcodes[0];
// };
// // add red cell line
// if ( $.inArray(col_nodes[i]['name'],red_cl) > -1 ){
// res_color_dict[col_nodes[i]['name']]=res_hexcodes[1];
// };
// // add grey cell line
// if ( $.inArray(col_nodes[i]['name'],grey_cl) > -1 ){
// res_color_dict[col_nodes[i]['name']]=res_hexcodes[2];
// };
// // add orange cell line
// if ( $.inArray(col_nodes[i]['name'],orange_cl) > -1 ){
// res_color_dict[col_nodes[i]['name']]=res_hexcodes[3];
// };
// }
// // export to global variable
// params.res_color_dict = res_color_dict;
// // define association between tf groups and colors
// var res_color_key = {}
// res_color_key['TF group 1'] = res_hexcodes[0];
// res_color_key['TF group 2'] = res_hexcodes[1];
// res_color_key['TF group 3'] = res_hexcodes[2];
// res_color_key['TF group 4'] = res_hexcodes[3];
// // add color key
// ////////////////////
// // add keys
// var key_divs = d3.select('#res_color_key_div')
// .selectAll('row')
// .data(all_groups)
// .enter()
// .append('row')
// .style('padding-top','15px');
// // add color
// key_divs
// .append('div')
// .attr('class','col-xs-2')
// // get rid of excess padding
// .style('padding-left','5px')
// .style('padding-right','0px')
// .style('padding-top','1px')
// .append('div')
// .style('width','12px')
// .style('height','12px')
// .style('background-color', function(d){
// return params.class_colors.row[d];
// })
// // add names
// key_divs
// .append('div')
// .attr('class','col-xs-10 res_names_in_key')
// .append('text')
// .text(function(d){
// var inst_res = d.replace(/_/g, ' ');
// return inst_res ;
// })
// generate a list of genes for auto complete
////////////////////////////////////////////////
// get all genes
params.all_genes = [];
// loop through row_nodes
for (var i = 0; i < row_nodes.length; i++) {
params.all_genes.push(row_nodes[i].name);
}
// use Jquery autocomplete
////////////////////////////////
$('#gene_search_box').autocomplete({
source: params.all_genes
});
return params;
}
// make each row in the clustergram
function row_function(inp_row_data) {
// remove zero values to make visualization faster
var row_data = _.filter(inp_row_data, function(num) {
return num.value !== 0;
});
// load parameters
var params = d3_clustergram.params;
// generate tiles in the current row
var tile = d3.select(this)
// data join
.selectAll('rect')
.data(row_data)
.enter()
.append('rect')
.attr('class', 'tile')
.attr('transform', function(d) {
return 'translate(' + params.x_scale(d.pos_x) + ',0)';
})
.attr('width', params.x_scale.rangeBand())
.attr('height', params.y_scale.rangeBand() * 0.98)
.style('fill-opacity', function(d) {
// calculate output opacity using the opacity scale
var output_opacity = params.opacity_scale(Math.abs(d.value));
return output_opacity;
})
// switch the color based on up/dn value
.style('fill', function(d) {
return d.value > 0 ? params.tile_colors[0] : params.tile_colors[1];
})
.on('mouseover', function(p) {
// highlight row - set text to active if
d3.selectAll('.row_label_text text')
.classed('active', function(d, i) {
return i === p.pos_y;
});
d3.selectAll('.col_label_text text')
.classed('active', function(d, i) {
return i === p.pos_x;
});
})
.on('mouseout', function mouseout() {
d3.selectAll('text').classed('active', false);
})
.attr('title', function(d) {
return d.value;
});
// add callback function to tile group - if one is supplied by the user
if (typeof params.click_tile === 'function') {
d3.selectAll('.tile')
.on('click', function(d) {
// export row/col name and value from tile
var tile_info = {};
tile_info.row = d3_clustergram.network_data.row_nodes[d.pos_y].name;
tile_info.col = d3_clustergram.network_data.col_nodes[d.pos_x].name;
tile_info.value = d.value;
if (_.has(d, 'value_up')) {
tile_info.value_up = d.value_up;
}
if (_.has(d, 'value_dn')) {
tile_info.value_dn = d.value_dn;
}
if (_.has(d, 'info')) {
tile_info.info = d.info;
}
// run the user supplied callback function
params.click_tile(tile_info);
});
}
// append title to group
if (params.title_tile === true) {
tile
.append('title')
.text(function(d) {
var inst_string = 'value: ' + d.value;
return inst_string;
});
}
}
// make each row in the clustergram
function row_group_function(inp_row_data) {
// remove zero values to make visualization faster
var row_data = _.filter(inp_row_data, function(num) {
return num.value !== 0;
});
// load parameters
var params = d3_clustergram.params;
// generate groups
var tile = d3.select(this)
// data join
.selectAll('g')
.data(row_data)
.enter()
.append('g')
.attr('class', 'tile')
.attr('transform', function(d) {
return 'translate(' + params.x_scale(d.pos_x) + ',0)';
});
// append rect
tile
.append('rect')
// .attr('class','tile')
.attr('width', params.x_scale.rangeBand())
.attr('height', params.y_scale.rangeBand() * 0.98)
.style('fill-opacity', function(d) {
// calculate output opacity using the opacity scale
var output_opacity = params.opacity_scale(Math.abs(d.value));
if (Math.abs(d.value_up) > 0 && Math.abs(d.value_dn) > 0) {
output_opacity = 0;
}
return output_opacity;
})
// switch the color based on up/dn value
.style('fill', function(d) {
// normal rule
return d.value > 0 ? params.tile_colors[0] : params.tile_colors[1];
// //!! special rule for LDRgram
// return d.value_dn < 0 ? params.tile_colors[0] : params.tile_colors[1] ;
});
tile
.on('mouseover', function(p) {
// highlight row - set text to active if
d3.selectAll('.row_label_text text')
.classed('active', function(d, i) {
return i === p.pos_y;
});
d3.selectAll('.col_label_text text')
.classed('active', function(d, i) {
return i === p.pos_x;
});
})
.on('mouseout', function mouseout() {
d3.selectAll('text').classed('active', false);
})
.attr('title', function(d) {
return d.value;
});
// // append evidence highlighting - black rects
if (params.highlight === 1) {
// console.log(row_data[0])
tile
.append('rect')
.attr('width', params.x_scale.rangeBand() * 0.80)
.attr('height', params.y_scale.rangeBand() * 0.80)
.attr('class', 'highlighting_rect')
.attr('transform', 'translate(' + params.x_scale.rangeBand() / 10 +
' , ' + params.y_scale.rangeBand() / 10 + ')')
.attr('class', 'cell_highlight')
.attr('stroke', 'black')
.attr('stroke-width', 1.0)
.attr('fill-opacity', 0.0)
.attr('stroke-opacity', function(d) {
// initialize opacity to 0
var inst_opacity = 0;
// set opacity to 1 if there is evidence
if (d.highlight === 1) {
inst_opacity = 1;
}
return inst_opacity;
});
}
// add callback function to tile group - if one is supplied by the user
if (typeof params.click_tile === 'function') {
// d3.selectAll('.tile')
tile
.on('click', function(d) {
// export row/col name and value from tile
var tile_info = {};
tile_info.row = d3_clustergram.network_data.row_nodes[d.pos_y].name;
tile_info.col = d3_clustergram.network_data.col_nodes[d.pos_x].name;
tile_info.value = d.value;
if (_.has(d, 'value_up')) {
tile_info.value_up = d.value_up;
}
if (_.has(d, 'value_dn')) {
tile_info.value_dn = d.value_dn;
}
if (_.has(d, 'info')) {
tile_info.info = d.info;
}
// run the user supplied callback function
params.click_tile(tile_info);
});
}
// split-up
tile
.append('path')
.style('stroke', 'black')
.style('stroke-width', 0)
.attr('d', function() {
var start_x = 0;
var final_x = params.x_scale.rangeBand();
var start_y = 0;
var final_y = params.y_scale.rangeBand() - params.y_scale.rangeBand() /
60;
var output_string = 'M' + start_x + ',' + start_y + ', L' +
start_x + ', ' + final_y + ', L' + final_x + ',0 Z';
return output_string;
})
.style('fill-opacity', function(d) {
// calculate output opacity using the opacity scale
var output_opacity = 0;
if (Math.abs(d.value_dn) > 0) {
output_opacity = params.opacity_scale(Math.abs(d.value_up));
}
return output_opacity;
})
// switch the color based on up/dn value
.style('fill', function() {
// rl_t (released) blue
return params.tile_colors[0];
});
// split-dn
tile
.append('path')
.style('stroke', 'black')
.style('stroke-width', 0)
.attr('d', function() {
var start_x = 0;
var final_x = params.x_scale.rangeBand();
var start_y = params.y_scale.rangeBand() - params.y_scale.rangeBand() /
60;
var final_y = params.y_scale.rangeBand() - params.y_scale.rangeBand() /
60;
var output_string = 'M' + start_x + ', ' + start_y + ' , L' +
final_x + ', ' + final_y + ', L' + final_x + ',0 Z';
return output_string;
})
.style('fill-opacity', function(d) {
// calculate output opacity using the opacity scale
var output_opacity = 0;
if (Math.abs(d.value_up) > 0) {
output_opacity = params.opacity_scale(Math.abs(d.value_dn));
}
return output_opacity;
})
// switch the color based on up/dn value
.style('fill', function() {
// rl_f (not released) orange
return params.tile_colors[1];
});
// append title to group
if (params.title_tile === true) {
tile
.append('title')
.text(function(d) {
var inst_string = 'value: ' + d.value;
return inst_string;
});
}
}
// reorder the matrix using the toggle switch
function reorder(inst_order) {
// load parameters from d3_clustergram
var params = d3_clustergram.params;
// set running transition value
d3_clustergram.params.run_trans = 1;
// load orders
if (inst_order === 'clust') {
params.x_scale.domain(params.orders.clust_row);
params.y_scale.domain(params.orders.clust_col);
} else if (inst_order === 'rank') {
params.x_scale.domain(params.orders.rank_row);
params.y_scale.domain(params.orders.rank_col);
} else if (inst_order === 'class') {
params.x_scale.domain(params.orders.class_row);
params.y_scale.domain(params.orders.class_col);
}
// define the t variable as the transition function
var t = params.clust_group.transition().duration(2500);
// reorder matrix
t.selectAll('.row')
.attr('transform', function(d, i) {
return 'translate(0,' + params.y_scale(i) + ')';
})
.selectAll('.tile')
.attr('transform', function(d) {
return 'translate(' + params.x_scale(d.pos_x) + ' , 0)';
});
// Move Row Labels
d3.select('#row_labels').selectAll('.row_label_text')
.transition().duration(2500)
.attr('transform', function(d, i) {
return 'translate(0,' + params.y_scale(i) + ')';
});
// t.selectAll('.column')
d3.select('#col_labels').selectAll('.col_label_text')
.transition().duration(2500)
.attr('transform', function(d, i) {
return 'translate(' + params.x_scale(i) + ')rotate(-90)';
});
// reorder row_label_triangle groups
d3.selectAll('.row_triangle_group')
.transition().duration(2500)
.attr('transform', function(d, i) {
return 'translate(0,' + params.y_scale(i) + ')';
});
// reorder col_class groups
d3.selectAll('.col_class_group')
.transition().duration(2500)
.attr('transform', function(d, i) {
return 'translate(' + params.x_scale(i) + ',0)';
})
.each('end', function() {
// set running transition to 0
console.log('finished with transition ');
d3_clustergram.params.run_trans = 0;
});
// backup allow programmatic zoom
setTimeout(end_reorder, 2500);
}
// tmp backup function to allow programmatic zoom after reordering
function end_reorder() {
d3_clustergram.params.run_trans = 0;
}
// recalculate the size of the visualization
// and remake the clustergram
function reset_visualization_size() {
// remake the clustergram
d3_clustergram.make_clust(d3_clustergram.params.args);
// reset zoom and translate
d3_clustergram.params.zoom.scale(1).translate([d3_clustergram.params.clust
.margin.left, d3_clustergram.params.clust.margin.top
]);
// // turn off the wait sign
// $.unblockUI();
}
// define zoomed function
function zoomed() {
// gather transformation components
/////////////////////////////////////
// gather zoom components
var zoom_x = d3.event.scale;
var zoom_y = d3.event.scale;
// gather translate vector components
var trans_x = d3.event.translate[0] - d3_clustergram.params.clust.margin
.left;
var trans_y = d3.event.translate[1] - d3_clustergram.params.clust.margin
.top;
// apply transformation
apply_transformation(trans_x, trans_y, zoom_x, zoom_y);
// reset highlighted col
d3.select('#clicked_col')
.style('font-weight', 'bold');
}
// apply transformation
function apply_transformation(trans_x, trans_y, zoom_x, zoom_y) {
// load parameters
var params = d3_clustergram.params;
// define d3 scale
var d3_scale = zoom_x;
// y - rules
///////////////////////////////////////////////////
// available panning room in the y direction
// multiple extra room (zoom - 1) by the width
// always defined in the same way
var pan_room_y = (d3_scale - 1) * params.clust.dim.height;
// do not translate if translate in y direction is positive
if (trans_y >= 0) {
// restrict transformation parameters
// no panning in either direction
trans_y = 0;
}
// restrict y pan to pan_room_y if necessary
else if (trans_y <= -pan_room_y) {
trans_y = -pan_room_y;
}
// x - rules
///////////////////////////////////////////////////
// zoom in y direction only - translate in y only
if (d3_scale < params.zoom_switch) {
// no x translate or zoom
trans_x = 0;
zoom_x = 1;
}
// zoom in both directions
// scale is greater than params.zoom_switch
else {
// available panning room in the x direction
// multiple extra room (zoom - 1) by the width
var pan_room_x = (d3_scale / params.zoom_switch - 1) * params.clust.dim
.width;
// no panning in the positive direction
if (trans_x > 0) {
// restrict transformation parameters
// no panning in the x direction
trans_x = 0;
// set zoom_x
zoom_x = d3_scale / params.zoom_switch;
}
// restrict panning to pan_room_x
else if (trans_x <= -pan_room_x) {
// restrict transformation parameters
// no panning in the x direction
trans_x = -pan_room_x;
// set zoom_x
zoom_x = d3_scale / params.zoom_switch;
}
// allow two dimensional panning
else {
// restrict transformation parameters
// set zoom_x
zoom_x = d3_scale / params.zoom_switch;
}
}
// apply transformation and reset translate vector
// the zoom vector (zoom.scale) never gets reset
///////////////////////////////////////////////////
// translate clustergram
params.clust_group
.attr('transform', 'translate(' + [trans_x, trans_y] + ') scale(' +
zoom_x + ',' + zoom_y + ')');
// transform row labels
d3.select('#row_labels')
.attr('transform', 'translate(' + [0, trans_y] + ') scale(' + zoom_y +
')');
// transform row_label_triangles
// use the offset saved in params, only zoom in the y direction
d3.select('#row_label_triangles')
.attr('transform', 'translate(' + [0, trans_y] + ') scale( 1,' +
zoom_y + ')');
// transform col labels
// move down col labels as zooming occurs, subtract trans_x - 20 almost works
d3.select('#col_labels')
.attr('transform', 'translate(' + [trans_x, 0] + ') scale(' + zoom_x +
')');
// transform col_class
d3.select('#col_class')
.attr('transform', 'translate(' + [trans_x, 0] + ') scale(' + zoom_x +
',1)');
// reset translate vector - add back margins to trans_x and trans_y
params.zoom
.translate([trans_x + params.clust.margin.left, trans_y + params.clust
.margin.top
]);
// // Font Sizes
// ////////////////////////////////////////////////////////
// // reduce the font size by dividing by some part of the zoom
// // if reduce_font_size_factor_ is 1, then the font will be divided by the whole zoom - and the labels will not increase in size
// // if reduce_font_size_factor_ is 0, then the font will be divided 1 - and the labels will increase cuction of the font size
// var reduce_fs_scale_row = d3.scale.linear().domain([0,1]).range([1,zoom_y]).clamp('true');
// // scale down the font to compensate for zooming
// // var fin_font_row = params.default_fs_row/(reduce_fs_scale_row( params.reduce_font_size.row ));
// var fin_font_row = (params.y_scale.rangeBand()*0.75)/(reduce_fs_scale_row( params.reduce_font_size.row ));
// // add back the 'px' to the font size
// fin_font_row = fin_font_row + 'px';
// // change the font size of the labels
// d3.selectAll('.row_label_text')
// .select('text')
// .style('font-size', fin_font_row);
// // console.log('zoom x')
// // console.log(zoom_x)
// // console.log(zoom_y)
// // console.log('real font size')
// // reduce font-size to compensate for zoom
// // calculate the recuction of the font size
// var reduce_fs_scale_col = d3.scale.linear().domain([0,1]).range([1,zoom_x]).clamp('true');
// // scale down the font to compensate for zooming
// // var fin_font_col = params.default_fs_col/(reduce_fs_scale_col( params.reduce_font_size.col ));
// var fin_font_col = (params.x_scale.rangeBand()*0.6)/(reduce_fs_scale_col( params.reduce_font_size.col ));
// // add back the 'px' to the font size
// fin_font_col = fin_font_col + 'px';
// // change the font size of the labels
// d3.selectAll('.col_label_text')
// .select('text')
// .style('font-size', fin_font_col);
// console.log( d3_clustergram.params.zoom.scale()* d3.select('.row_label_text').select('text').node().getBBox().width )
// check if widest row or col are wider than the allowed label width
////////////////////////////////////////////////////////////////////////
if (params.bounding_width_max.row * params.zoom.scale() > params.norm_label.width.row) {
params.zoom_scale_font.row = params.norm_label.width.row / (params.bounding_width_max
.row * params.zoom.scale());
// reduce font size
d3.selectAll('.row_label_text').each(function() {
d3.select(this).select('text')
.style('font-size', params.default_fs_row * params.zoom_scale_font.row + 'px')
.attr('y', params.y_scale.rangeBand() * params.scale_font_offset(
params.zoom_scale_font.row));
});
} else {
// reset font size
d3.selectAll('.row_label_text').each(function() {
d3.select(this).select('text')
.style('font-size', params.default_fs_row + 'px')
.attr('y', params.y_scale.rangeBand() * 0.75);
});
}
if (params.bounding_width_max.col * (params.zoom.scale() / params.zoom_switch) >
params.norm_label.width.col) {
params.zoom_scale_font.col = params.norm_label.width.col / (params.bounding_width_max
.col * (params.zoom.scale() / params.zoom_switch));
// reduce font size
d3.selectAll('.col_label_click').each(function() {
d3.select(this).select('text')
.style('font-size', params.default_fs_col * params.zoom_scale_font
.col + 'px');
});
} else {
// reset font size
d3.selectAll('.col_label_click').each(function() {
d3.select(this).select('text')
.style('font-size', params.default_fs_col + 'px');
});
}
// column value bars
///////////////////////
if (_.has(d3_clustergram.network_data.col_nodes[0], 'value')) {
d3.selectAll('.col_bars')
// column is rotated - effectively width and height are switched
.attr('width', function(d) {
return params.bar_scale_col(d.value) / (zoom_x);
});
}
// //!! change the size of the highlighting rects
// //////////////////////////////////////////////
// // re-size of the highlighting rects
// d3.select('#row_labels')
// .each(function(){
// // get the bounding box of the row label text
// var bbox = d3.select(this)
// .select('text')[0][0]
// .getBBox();
// // use the bounding box to set the size of the rect
// d3.select(this)
// .select('rect')
// .attr('x', bbox.x*0.5)
// .attr('y', 0)
// .attr('width', bbox.width*0.5)
// .attr('height', params.y_scale.rangeBand())
// .style('fill','yellow');
// });
// // col_label_click
// d3.select('#col_labels')
// .each(function(){
// // get the bounding box of the row label text
// var bbox = d3.select(this)
// .select('text')[0][0]
// .getBBox();
// // use the bounding box to set the size of the rect
// d3.select(this)
// .select('rect')
// .attr('x', bbox.x*1.25)
// .attr('y', 0)
// .attr('width', bbox.width * 1.25)
// // used thd reduced rect width for the columsn
// // reduced because thee rects are slanted
// .attr('height', params.x_scale.rangeBand()*0.6)
// .style('fill','yellow')
// .style('opacity',0);
// });
}
function two_translate_zoom(pan_dx, pan_dy, fin_zoom) {
// get parameters
var params = d3_clustergram.params;
if (d3_clustergram.params.run_trans === 0) {
// define the commonly used variable half_height
var half_height = params.clust.dim.height / 2;
// y pan room, the pan room has to be less than half_height since
// zooming in on a gene that is near the top of the clustergram also causes
// panning out of the visible region
var y_pan_room = half_height / params.zoom_switch;
// prevent visualization from panning down too much
// when zooming into genes near the top of the clustergram
if (pan_dy >= half_height - y_pan_room) {
// explanation of panning rules
/////////////////////////////////
// prevent the clustergram from panning down too much
// if the amount of panning is equal to the half_height then it needs to be reduced
// effectively, the the visualization needs to be moved up (negative) by some factor
// of the half-width-of-the-visualization.
//
// If there was no zooming involved, then the
// visualization would be centered first, then panned to center the top term
// this would require a
// correction to re-center it. However, because of the zooming the offset is
// reduced by the zoom factor (this is because the panning is occurring on something
// that will be zoomed into - this is why the pan_dy value is not scaled in the two
// translate transformations, but it has to be scaled afterwards to set the translate
// vector)
// pan_dy = half_height - (half_height)/params.zoom_switch
// if pan_dy is greater than the pan room, then panning has to be restricted
// start by shifting back up (negative) by half_height/params.zoom_switch then shift back down
// by the difference between half_height and pan_dy (so that the top of the clustergram is
// visible)
var shift_top_viz = half_height - pan_dy;
var shift_up_viz = -half_height / params.zoom_switch +
shift_top_viz;
// reduce pan_dy so that the visualization does not get panned to far down
pan_dy = pan_dy + shift_up_viz;
}
// prevent visualization from panning up too much
// when zooming into genes at the bottom of the clustergram
if (pan_dy < -(half_height - y_pan_room)) {
// console.log('restricting pan up')
shift_top_viz = half_height + pan_dy;
shift_up_viz = half_height / params.zoom_switch - shift_top_viz; //- move_up_one_row;
// reduce pan_dy so that the visualization does not get panned to far down
pan_dy = pan_dy + shift_up_viz;
}
// will improve this !!
var zoom_y = fin_zoom;
var zoom_x = 1;
// search duration - the duration of zooming and panning
var search_duration = 700;
// center_y
var center_y = -(zoom_y - 1) * half_height;
// transform clust group
////////////////////////////
params.clust_group
.transition()
.duration(search_duration)
// first apply the margin transformation
// then zoom, then apply the final transformation
.attr('transform', 'translate(' + [0, 0 + center_y] + ')' +
' scale(' + 1 + ',' + zoom_y + ')' + 'translate(' + [pan_dx,
pan_dy
] + ')');
// transform row labels
d3.select('#row_labels')
.transition()
.duration(search_duration)
.attr('transform', 'translate(' + [0, center_y] + ')' + ' scale(' +
zoom_y + ',' + zoom_y + ')' + 'translate(' + [0, pan_dy] + ')');
// transform row_label_triangles
// use the offset saved in params, only zoom in the y direction
d3.select('#row_label_triangles')
.transition()
.duration(search_duration)
.attr('transform', 'translate(' + [0, center_y] + ')' + ' scale(' +
1 + ',' + zoom_y + ')' + 'translate(' + [0, pan_dy] + ')');
// transform col labels
d3.select('#col_labels')
.transition()
.duration(search_duration)
.attr('transform', ' scale(' + 1 + ',' + 1 + ')' + 'translate(' + [
pan_dx, 0
] + ')');
// transform col_class
d3.select('#col_class')
.transition()
.duration(search_duration)
.attr('transform', ' scale(' + 1 + ',' + 1 + ')' + 'translate(' + [
pan_dx, 0
] + ')');
// set y translate: center_y is positive, positive moves the visualization down
// the translate vector has the initial margin, the first y centering, and pan_dy
// times the scaling zoom_y
var net_y_offset = params.clust.margin.top + center_y + pan_dy *
zoom_y;
// reset the zoom translate and zoom
params.zoom.scale(zoom_y);
params.zoom.translate([pan_dx, net_y_offset]);
// // Font Sizes
// /////////////////////////////////////////////////
// // reduce font-size to compensate for zoom
// // calculate the recuction of the font size
// var reduce_fs_scale_row = d3.scale.linear().domain([0,1]).range([1,zoom_y]).clamp('true');
// // scale down the font to compensate for zooming
// var fin_font_row = params.default_fs_row/(reduce_fs_scale_row( params.reduce_font_size.row ));
// // add back the 'px' to the font size
// fin_font_row = fin_font_row + 'px';
// // change the font size of the labels
// d3.selectAll('.row_label_text')
// .transition()
// .duration(search_duration)
// .select('text')
// .style('font-size', fin_font_row);
// // reduce font-size to compensate for zoom
// // calculate the recuction of the font size
// var reduce_fs_scale_col = d3.scale.linear().domain([0,1]).range([1,zoom_x]).clamp('true');
// // scale down the font to compensate for zooming
// var fin_font_col = params.default_fs_col/(reduce_fs_scale_col( params.reduce_font_size.col ));
// // add back the 'px' to the font size
// fin_font_col = fin_font_col + 'px';
// // change the font size of the labels
// d3.selectAll('.col_label_text')
// .transition()
// .duration(search_duration)
// .select('text')
// .style('font-size', fin_font_col);
// check if widest row or col are wider than the allowed label width
////////////////////////////////////////////////////////////////////////
if (params.bounding_width_max.row * params.zoom.scale() > params.norm_label
.width.row) {
params.zoom_scale_font.row = params.norm_label.width.row / (params.bounding_width_max
.row * params.zoom.scale());
// reduce font size
d3.selectAll('.row_label_text').each(function() {
d3.select(this).select('text')
.transition()
.duration(search_duration)
.style('font-size', params.default_fs_row * params.zoom_scale_font
.row + 'px')
.attr('y', params.y_scale.rangeBand() * params.scale_font_offset(
params.zoom_scale_font.row));
});
} else {
// reset font size
d3.selectAll('.row_label_text').each(function() {
d3.select(this).select('text')
.transition()
.duration(search_duration)
.style('font-size', params.default_fs_row + 'px')
.attr('y', params.y_scale.rangeBand() * 0.75);
});
}
if (params.bounding_width_max.col * (params.zoom.scale() / params.zoom_switch) >
params.norm_label.width.col) {
params.zoom_scale_font.col = params.norm_label.width.col / (params.bounding_width_max
.col * (params.zoom.scale() / params.zoom_switch));
// reduce font size
d3.selectAll('.col_label_click').each(function() {
d3.select(this).select('text')
.transition()
.duration(search_duration)
.style('font-size', params.default_fs_col * params.zoom_scale_font
.col + 'px');
});
} else {
// reset font size
d3.selectAll('.col_label_click').each(function() {
d3.select(this).select('text')
.transition()
.duration(search_duration)
.style('font-size', params.default_fs_col + 'px');
});
}
// re-size of the highlighting rects
/////////////////////////////////////////
d3.select('#row_labels')
.each(function() {
// get the bounding box of the row label text
var bbox = d3.select(this)
.select('text')[0][0]
.getBBox();
// use the bounding box to set the size of the rect
d3.select(this)
.select('rect')
.attr('x', bbox.x * 0.5)
.attr('y', 0)
.attr('width', bbox.width * 0.5)
.attr('height', params.y_scale.rangeBand())
.style('fill', 'yellow');
});
// column value bars
///////////////////////
// reduce the height of the column value bars based on the zoom applied
// recalculate the height and divide by the zooming scale
// col_label_obj.select('rect')
if (_.has(d3_clustergram.network_data.col_nodes[0], 'value')) {
d3.selectAll('.col_bars')
.transition()
.duration(search_duration)
// column is rotated - effectively width and height are switched
.attr('width', function(d) {
return params.bar_scale_col(d.value) / (zoom_x);
});
}
}
}
// reorder columns with row click
function reorder_click_row() {
// set running transition value
d3_clustergram.params.run_trans = 1;
// get parameters
var params = d3_clustergram.params;
// get row_nodes from global variable
var row_nodes = d3_clustergram.network_data.row_nodes;
var col_nodes = d3_clustergram.network_data.col_nodes;
// get inst row (gene)
var inst_gene = d3.select(this).select('text').text();
// highlight clicked column
// first un-highlight all others
d3.selectAll('.rol_label_text').select('text')
.style('font-weight', 'normal');
// remove previous id
d3.select('#clicked_row')
.attr('id', '');
// find the row number of this term from row_nodes
// gather row node names
var tmp_arr = [];
_.each(row_nodes, function(node) {
tmp_arr.push(node.name);
});
// find index
var inst_row = _.indexOf(tmp_arr, inst_gene);
// gather the values of the input genes
tmp_arr = [];
_.each(col_nodes, function(node, index) {
tmp_arr.push(params.matrix[inst_row][index].value);
});
// sort the rows
var tmp_sort = d3.range(tmp_arr.length).sort(function(a, b) {
return tmp_arr[b] - tmp_arr[a];
});
// resort the columns (resort x)
///////////////////////////////////
params.x_scale.domain(tmp_sort);
// reorder
////////////////////
// define the t variable as the transition function
var t = params.clust_group.transition().duration(2500);
// reorder matrix
t.selectAll('.tile')
.attr('transform', function(data) {
return 'translate(' + params.x_scale(data.pos_x) + ',0)';
});
// Move Col Labels
d3.select('#col_labels').selectAll('.col_label_text')
.transition().duration(2500)
.attr('transform', function(data, index) {
return 'translate(' + params.x_scale(index) + ')rotate(-90)';
});
// reorder col_class groups
d3.selectAll('.col_class_group')
.transition().duration(2500)
.attr('transform', function(data, index) {
return 'translate(' + params.x_scale(index) + ',0)';
})
.each('end', function() {
// set running transition to 0
d3_clustergram.params.run_trans = 0;
});
// highlight selected row
///////////////////////////////
d3.selectAll('.row_label_text')
.select('rect')
.style('opacity', 0);
// highlight column name
d3.select(this)
.select('rect')
.style('opacity', 1);
// backup allow programmatic zoom
setTimeout(end_reorder, 2500);
}
// reorder rows with column click
function reorder_click_col() {
// set running transition value
d3_clustergram.params.run_trans = 1;
// get parameters
var params = d3_clustergram.params;
// get row_nodes from global variable
var row_nodes = d3_clustergram.network_data.row_nodes;
var col_nodes = d3_clustergram.network_data.col_nodes;
// get inst col (term)
var inst_term = d3.select(this).select('text').attr('full_name');
// find the column number of this term from col_nodes
// gather column node names
var tmp_arr = [];
_.each(col_nodes, function(node) {
tmp_arr.push(node.name);
});
// find index
var inst_col = _.indexOf(tmp_arr, inst_term);
// gather the values of the input genes
tmp_arr = [];
_.each(row_nodes, function(node, index) {
tmp_arr.push(params.matrix[index][inst_col].value);
});
// sort the rows
var tmp_sort = d3.range(tmp_arr.length).sort(function(a, b) {
return tmp_arr[b] - tmp_arr[a];
});
// resort rows - y axis
////////////////////////////
params.y_scale.domain(tmp_sort);
// reorder
// define the t variable as the transition function
var t = params.clust_group.transition().duration(2500);
// reorder matrix
t.selectAll('.row')
.attr('transform', function(data, index) {
return 'translate(0,' + params.y_scale(index) + ')';
});
// reorder row_label_triangle groups
d3.selectAll('.row_triangle_group')
.transition().duration(2500)
.attr('transform', function(data, index) {
return 'translate(0,' + params.y_scale(index) + ')';
});
// Move Row Labels
d3.select('#row_labels').selectAll('.row_label_text')
.transition().duration(2500)
.attr('transform', function(data, index) {
return 'translate(0,' + params.y_scale(index) + ')';
});
// t.selectAll('.column')
d3.select('#col_labels').selectAll('.col_label_text')
.transition().duration(2500)
.attr('transform', function(data, index) {
return 'translate(' + params.x_scale(index) + ')rotate(-90)';
})
.each('end', function() {
// set running transition to 0
d3_clustergram.params.run_trans = 0;
});
// highlight selected column
///////////////////////////////
// unhilight and unbold all columns (already unbolded earlier)
d3.selectAll('.col_label_text')
.select('rect')
.style('opacity', 0);
// highlight column name
d3.select(this)
.select('rect')
.style('opacity', 1);
// backup allow programmatic zoom
setTimeout(end_reorder, 2500);
}
// resize clustergram with screensize change
var doit;
function timeout_resize() {
// get params
var params = d3_clustergram.params;
// only resize if allowed
if (params.resize === true) {
// clear timeout
clearTimeout(doit);
// // set up wait message before request is made
// $.blockUI({ css: {
// border: 'none',
// padding: '15px',
// backgroundColor: '#000',
// '-webkit-border-radius': '10px',
// '-moz-border-radius': '10px',
// opacity: .8,
// color: '#fff'
// } });
doit = setTimeout(reset_visualization_size, 500);
}
}
// zoom into and highlight the found the gene
function zoom_and_highlight_found_gene(search_gene) {
// get parameters
var params = d3_clustergram.params;
// unhighlight and unbold all genes
d3.selectAll('.row_label_text')
.select('text')
.style('font-weight', 'normal');
d3.selectAll('.row_label_text')
.select('rect')
.style('opacity', 0);
// find the index of the gene
var inst_gene_index = _.indexOf(params.all_genes, search_gene);
// get y position
var inst_y_pos = params.y_scale(inst_gene_index);
// highlight row name
d3.selectAll('.row_label_text')
.filter(function(d) {
return d.name === search_gene;
})
.select('rect')
.style('opacity', 1);
// calculate the y panning required to center the found gene
var pan_dy = params.clust.dim.height / 2 - inst_y_pos;
// use two translate method to control zooming
// pan_x, pan_y, zoom
two_translate_zoom(0, pan_dy, params.zoom_switch);
}
// submit genes button
$('#gene_search_box').keyup(function(e) {
if (e.keyCode === 13) {
find_row();
}
});
// find gene in clustergram
function find_row() {
// get the searched gene
var search_gene = $('#gene_search_box').val();
if (d3_clustergram.params.all_genes.indexOf(search_gene) !== -1) {
// zoom and highlight found gene
zoom_and_highlight_found_gene(search_gene);
}
}
// transpose matrix funciton
function transpose_network(net) {
var tnet = {};
tnet.row_nodes = net.col_nodes;
tnet.col_nodes = net.row_nodes;
tnet.links = [];
for (var i = 0; i < net.links.length; i++) {
var inst_link = {};
inst_link.source = net.links[i].target;
inst_link.target = net.links[i].source;
inst_link.value = net.links[i].value;
// optional highlight
if (_.has(net.links[i], 'highlight')) {
inst_link.highlight = net.links[i].highlight;
}
if (_.has(net.links[i], 'value_up')) {
inst_link.value_up = net.links[i].value_up;
}
if (_.has(net.links[i], 'value_dn')) {
inst_link.value_dn = net.links[i].value_dn;
}
if (_.has(net.links[i], 'info')) {
inst_link.info = net.links[i].info;
}
tnet.links.push(inst_link);
}
return tnet;
}
// return d3_clustergram modules
return {
'make_clust': make_d3_clustergram,
'reorder': reorder,
'find_row': find_row
};
// end closure
}());
# define a class for networks
class Network(object):
'''
Networks have two states: the data state where they are stored as: matrix and nodes;
and a viz state where they are stored as: viz.links, viz.row_nodes, viz.col_nodes.
The goal is to start in a data-state and produce a viz-state of the network that will be
used as input to d3_clustergram.js.
'''
def __init__(self):
# network: data-state
self.dat = {}
self.dat['nodes'] = {}
self.dat['nodes']['row'] = []
self.dat['nodes']['col'] = []
# node_info holds the orderings (ini, clust, rank), classification ('cl'), and other general information
self.dat['node_info'] = {}
for inst_rc in self.dat['nodes']:
self.dat['node_info'][inst_rc] = {}
self.dat['node_info'][inst_rc]['ini'] = []
self.dat['node_info'][inst_rc]['clust'] = []
self.dat['node_info'][inst_rc]['rank'] = []
self.dat['node_info'][inst_rc]['info'] = []
# classification is specifically used to color the class triangles
self.dat['node_info'][inst_rc]['cl'] = []
# initialize matrix
self.dat['mat'] = []
# mat_info is an optional dictionary
# so I'm not including it by default
# network: viz-state
self.viz = {}
self.viz['row_nodes'] = []
self.viz['col_nodes'] = []
self.viz['links'] = []
def load_tsv_to_net(self, filename):
f = open(filename,'r')
lines = f.readlines()
f.close()
self.load_lines_from_tsv_to_net(lines)
def load_lines_from_tsv_to_net(self, lines):
import numpy as np
# get row/col labels and data from lines
for i in range(len(lines)):
# get inst_line
inst_line = lines[i].split('\t')
# strip each element
inst_line = [z.strip() for z in inst_line]
# get column labels from first row
if i == 0:
tmp_col_labels = inst_line
# add the labels
for inst_elem in range(len(tmp_col_labels)):
# skip the first element
if inst_elem > 0:
# get the column label
inst_col_label = tmp_col_labels[inst_elem]
# add to network data
self.dat['nodes']['col'].append(inst_col_label)
# get row info
if i > 0:
# save row labels
self.dat['nodes']['row'].append(inst_line[0])
# get data - still strings
inst_data_row = inst_line[1:]
# convert to float
inst_data_row = [float(tmp_dat) for tmp_dat in inst_data_row]
# save the row data as an array
inst_data_row = np.asarray(inst_data_row)
# initailize matrix
if i == 1:
self.dat['mat'] = inst_data_row
# add rows to matrix
if i > 1:
self.dat['mat'] = np.vstack( ( self.dat['mat'], inst_data_row ) )
def load_hgram(self, filename):
import numpy as np
# example data format
###########################
# # # DatasetName Achilles Cell Line Gene Essentiality Profiles
# # # DatasetGroup disease or phenotype associations
# GeneSym NA NA/DatasetID 1
# 1060P11.3 na na 0
# 3.8-1.2 na na 0
# 3.8-1.5 na na 0
# A1BG na na 0
# A1BG-AS1 na na 0
# A1CF na na 0
# A2M na na 0
# processing steps
# line 1 has dataset names starting on 4th column
# line 2 has dataset groups starting on 4th column
# line 3 has column labels and dataset numbers, but no information that I need
# line 4 and after have gene symbols (first column) and values (4th and after columns)
# load gene classes for harmonogram
gc = self.load_json_to_dict('gene_classes_harmonogram.json')
f = open(filename,'r')
lines = f.readlines()
f.close()
# loop through the lines of the file
for i in range(len(lines)):
# get the inst_line and make list
inst_line = lines[i].strip().split('\t')
if i%1000 == 0:
print(i)
# line 1: get dataset names
if i ==0:
# gather column information
for j in range(len(inst_line)):
# skip the first three columns
if j > 2:
# get inst label
inst_col = inst_line[j]
# gather column labels
self.dat['nodes']['col'].append(inst_col)
# line 2: get dataset groups - do not save as 'cl', save as 'info' to sidestep d3_clustergram.js code
if i ==1:
# gather column classification information
for j in range(len(inst_line)):
# skip the first three columns
if j > 2:
# get inst label
inst_col = inst_line[j]
# gather column labels
self.dat['node_info']['col']['info'].append(inst_col)
# line 3: no information
# line 4: get gene symbol and data
if i > 2:
# get gene
inst_gene = inst_line[0]
# add gene to rows
self.dat['nodes']['row'].append(inst_gene)
# not going to do this here
############################
# # add protein type to classification and initialize class to other
# inst_prot_class = 'other'
# for inst_gc in gc:
# if inst_gene in gc[inst_gc]:
# inst_prot_class = inst_gc
# # add class to node_info
# self.dat['node_info']['row']['cl'].append(inst_prot_class)
# grab data, convert to float, and make numpy array
inst_data_row = inst_line[3:]
inst_data_row = [float(tmp_dat) for tmp_dat in inst_data_row]
inst_data_row = np.asarray(inst_data_row)
# initialize matrix
if i == 3:
self.dat['mat'] = inst_data_row
# add rows to matrix
if i > 3:
self.dat['mat'] = np.vstack( ( self.dat['mat'], inst_data_row ) )
print('\nthere are ' + str(len(self.dat['nodes']['row'])) + ' genes' )
print('there are ' + str(len(self.dat['nodes']['col'])) + ' resources\n' )
print('matrix shape')
print(self.dat['mat'].shape)
def load_cst_kea_enr_to_net(self, enr, pval_cutoff):
import scipy
import numpy as np
# enr - data structure
# cell line
# up_genes, dn_genes
# name, pval, pval_bon, pval_bh, int_genes
print('loading cst enriched kinases ')
# the columns are the cell lines
all_col = sorted(enr.keys())
# the rows are the enriched terms
all_row = []
# gather all genes with significantly enriched pval_bh
#######################################################
updn = ['up','dn']
# loop through cell lines
for inst_cl in enr:
# loop through up/dn genes
for inst_updn in updn:
# get inst_enr: the enrichment results from a cell line in either up/dn
inst_enr = enr[inst_cl][inst_updn]
# loop through enriched terms
for i in range(len(inst_enr)):
# append name if pval is significant
if inst_enr[i]['pval_bh'] <= pval_cutoff:
# append name to all terms
all_row.append(inst_enr[i]['name'])
# get unique terms, sort them
all_row = sorted(list(set(all_row)))
# save row and column data to nodes
nodes = {}
nodes['row'] = all_row
nodes['col'] = all_col
# gather data into matrix
#############################
# initialize data_mat
data_mat = {}
data_mat['value'] = scipy.zeros([ len(all_row), len(all_col) ])
data_mat['value_up'] = scipy.zeros([ len(all_row), len(all_col) ])
data_mat['value_dn'] = scipy.zeros([ len(all_row), len(all_col) ])
# save additional informaiton in a dictionary
mat_info = {}
# loop through the rows (genes)
for i in range(len(all_row)):
# get inst row: gene
inst_gene = all_row[i]
# loop through the columns (cell lines)
for j in range(len(all_col)):
# get inst col: cell line
inst_cl = all_col[j]
# initialize pval_nl negative log up/dn
pval_nl = {}
# ini list of substrates
substrates = []
# get enrichment from up/dn genes
for inst_updn in updn:
# initialize pval_nl[inst_updn] = np.nan
pval_nl[inst_updn] = np.nan
# gather the current set of enrichment results
# from the cell line
inst_enr = enr[inst_cl][inst_updn]
# check if kinase is in list of enriched results
if any(d['name'] == inst_gene for d in inst_enr):
# get the dict from the list
inst_dict = self.find_dict_in_list( inst_enr, 'name', inst_gene)
# only include significant pvalues
if inst_dict['pval_bh'] <= 0.05:
# retrieve the negative log pval_
pval_nl[inst_updn] = -np.log2( inst_dict['pval_bh'] )
# save ranks of substrates
substrates.extend( inst_dict['ranks'] )
else:
# set nan pval
pval_nl[inst_updn] = np.nan
# set value for data_mat
###########################
# now that the enrichment results have been gathered
# for up/dn genes save the results
# there is both up and down enrichment
if np.isnan(pval_nl['up']) == False and np.isnan(pval_nl['dn']) == False:
# set value of data_mat['merge'] as the mean of up/dn enrichment
data_mat['value'][i,j] = np.mean([ pval_nl['up'], -pval_nl['dn'] ])
# set values of up/dn
data_mat['value_up'][i,j] = pval_nl['up']
data_mat['value_dn'][i,j] = -pval_nl['dn']
# there is only up enrichment
elif np.isnan(pval_nl['up']) == False:
# set value of data_mat as up enrichment
data_mat['value'][i,j] = pval_nl['up']
data_mat['value_up'][i,j] = pval_nl['up']
# there is only dn enrichment
elif np.isnan(pval_nl['dn']) == False:
# set value of data_mat as the mean of up/dn enrichment
data_mat['value'][i,j] = -pval_nl['dn']
data_mat['value_dn'][i,j] = -pval_nl['dn']
# save substrates to mat_info
mat_info[(i,j)] = substrates
# save nodes and data_mat to self.dat
self.dat['nodes'] = nodes
self.dat['mat'] = data_mat['value']
# add up and dn values into self.dat
self.dat['mat_up'] = data_mat['value_up']
self.dat['mat_dn'] = data_mat['value_dn']
# add mat_info with substrate information
self.dat['mat_info'] = mat_info
def load_ccle_to_net(self, prot_type):
import scipy
import numpy as np
# load ccle data
ccle = self.load_json_to_dict('CCLE/nsclc_allzc.json')
ccle['data_z'] = np.asarray(ccle['data_z'], dtype = float)
# load protein type lists
gs_list = self.load_json_to_dict('gene_classes_harmonogram.json')
# generate node lists
# find the protein-types that are in ccle
self.dat['nodes']['row'] = sorted(list(set(gs_list[prot_type]).intersection(ccle['gene'])))
self.dat['nodes']['col'] = ccle['cell_lines']
# initialize mat
self.dat['mat'] = scipy.zeros([ len(self.dat['nodes']['row']), len(self.dat['nodes']['col']) ])
# loop through rows and cols
for i in range(len(self.dat['nodes']['row'])):
for j in range(len(self.dat['nodes']['col'])):
# get inst_row and inst_col
inst_row = self.dat['nodes']['row'][i]
inst_col = self.dat['nodes']['col'][j]
# find gene and cl index in zscored data
index_x = ccle['gene'].index(inst_row)
index_y = ccle['cell_lines'].index(inst_col)
# map primary data to mat
self.dat['mat'][i,j] = ccle['data_z'][index_x, index_y]
def load_g2e_to_net(self, g2e):
import numpy as np
# get all signatures
sigs = g2e['gene_signatures']
# get all genes from signatures
all_genes = []
all_sigs = []
for inst_sig in sigs:
# get gene data
gene_data = inst_sig['genes']
# gather sig names
all_sigs.append(inst_sig['name'])
# gather genes
for inst_gene_data in gene_data:
# add genes - the gene name is the first element of the list
all_genes.append( inst_gene_data[0] )
# get unique sorted list of genes
all_genes = sorted(list(set(all_genes)))
print( 'found ' + str(len(all_genes)) + ' genes' )
print( 'found ' + str(len(all_sigs)) + ' siguatures\n' )
# save genes adn sigs to nodes
self.dat['nodes']['row'] = all_genes
self.dat['nodes']['col'] = all_sigs
# initialize numpy matrix of nans
self.dat['mat'] = np.empty((len(all_genes),len(all_sigs)))
self.dat['mat'][:] = np.nan
# loop through all signatures and genes
# and place information into self.dat
for inst_sig in sigs:
# get sig name
inst_sig_name = inst_sig['name']
# get gene data
gene_data = inst_sig['genes']
# loop through genes
for inst_gene_data in gene_data:
# add gene data to signature matrix
inst_gene = inst_gene_data[0]
inst_value = inst_gene_data[1]
# find index of gene and sig in matrix
row_index = all_genes.index(inst_gene)
col_index = all_sigs.index(inst_sig_name)
# save inst_value to matrix
self.dat['mat'][row_index, col_index] = inst_value
def load_data_file_to_net(self, filename):
# load json from file to new dictionary
inst_dat = self.load_json_to_dict(filename)
# convert dat['mat'] to numpy array and add to network
self.load_data_to_net(inst_dat)
def load_data_to_net(self, inst_net):
''' load data into nodes and mat, also convert mat to numpy array'''
self.dat = inst_net
# convert to numpy array
self.mat_to_numpy_arr()
def export_net_json(self, net_type, indent='no-indent'):
''' export json string of dat '''
import json
from copy import deepcopy
if net_type == 'dat':
exp_dict = deepcopy(self.dat)
# convert numpy array to list
exp_dict['mat'] = exp_dict['mat'].tolist()
elif net_type == 'viz':
exp_dict = self.viz
# make json
if indent == 'indent':
exp_json = json.dumps(exp_dict, indent=2)
else:
exp_json = json.dumps(exp_dict)
return exp_json
def write_json_to_file(self, net_type, filename, indent='no-indent'):
import json
# get dat or viz representation as json string
if net_type == 'dat':
exp_json = self.export_net_json('dat', indent)
elif net_type == 'viz':
exp_json = self.export_net_json('viz', indent)
# save to file
fw = open(filename, 'w')
fw.write( exp_json )
fw.close()
def set_node_names(self, row_name, col_name):
'''give names to the rows and columns'''
self.dat['node_names'] = {}
self.dat['node_names']['row'] = row_name
self.dat['node_names']['col'] = col_name
def mat_to_numpy_arr(self):
''' convert list to numpy array - numpy arrays can not be saved as json '''
import numpy as np
self.dat['mat'] = np.asarray( self.dat['mat'] )
def swap_nan_for_zero(self):
import numpy as np
self.dat['mat'][ np.isnan( self.dat['mat'] ) ] = 0
def filter_network_thresh( self, cutoff, min_num_meet ):
'''
remove rows and columns from matrix that do not have at least
min_num_meet instances of a value with an absolute value above cutoff
'''
import scipy
import numpy as np
print('\nfiltering network using cutoff of ' + str(cutoff) + ' and min_num_meet of ' + str(min_num_meet))
# transfer the nodes
nodes = {}
nodes['row'] = []
nodes['col'] = []
# transfer the 'info' part of node_info if necessary
node_info = {}
node_info['row'] = []
node_info['col'] = []
print( 'initial mat shape' + str(self.dat['mat'].shape ))
# add rows with non-zero values
#################################
for i in range(len(self.dat['nodes']['row'])):
# get row name
inst_nodes_row = self.dat['nodes']['row'][i]
# get node info - disregard ini, clust, and rank orders
if len(self.dat['node_info']['row']['info']) > 0:
inst_node_info = self.dat['node_info']['row']['info'][i]
# get row vect
row_vect = np.absolute(self.dat['mat'][i,:])
# check if there are nonzero values
found_tuple = np.where(row_vect >= cutoff)
if len(found_tuple[0])>=min_num_meet:
# add name
nodes['row'].append(inst_nodes_row)
# add info if necessary
if len(self.dat['node_info']['row']['info']) > 0:
node_info['row'].append(inst_node_info)
# add cols with non-zero values
#################################
for i in range(len(self.dat['nodes']['col'])):
# get col name
inst_nodes_col = self.dat['nodes']['col'][i]
# get node info - disregard ini, clust, and rank orders
if len(self.dat['node_info']['col']['info']) > 0:
inst_node_info = self.dat['node_info']['col']['info'][i]
# get col vect
col_vect = np.absolute(self.dat['mat'][:,i])
# check if there are nonzero values
found_tuple = np.where(col_vect >= cutoff)
if len(found_tuple[0])>=min_num_meet:
# add name
nodes['col'].append(inst_nodes_col)
# add info if necessary
if len(self.dat['node_info']['col']['info']) > 0:
node_info['col'].append(inst_node_info)
# cherrypick data from self.dat['mat']
##################################
# filtered matrix
filt_mat = scipy.zeros([ len(nodes['row']), len(nodes['col']) ])
if 'mat_up' in self.dat:
filt_mat_up = scipy.zeros([ len(nodes['row']), len(nodes['col']) ])
filt_mat_dn = scipy.zeros([ len(nodes['row']), len(nodes['col']) ])
if 'mat_info' in self.dat:
# initialize filtered mat_info dictionary with tuple keys
filt_mat_info = {}
# loop through the rows
for i in range(len(nodes['row'])):
inst_row = nodes['row'][i]
# loop through the cols
for j in range(len(nodes['col'])):
inst_col = nodes['col'][j]
# get row and col index
pick_row = self.dat['nodes']['row'].index(inst_row)
pick_col = self.dat['nodes']['col'].index(inst_col)
# cherrypick
###############
filt_mat[i,j] = self.dat['mat'][pick_row, pick_col]
if 'mat_up' in self.dat:
filt_mat_up[i,j] = self.dat['mat_up'][pick_row, pick_col]
filt_mat_dn[i,j] = self.dat['mat_dn'][pick_row, pick_col]
if 'mat_info' in self.dat:
filt_mat_info[(i,j)] = self.dat['mat_info'][(pick_row,pick_col)]
# save nodes array - list of node names
self.dat['nodes'] = nodes
# save node_info array - list of node infos
self.dat['node_info']['row']['info'] = node_info['row']
self.dat['node_info']['col']['info'] = node_info['col']
# overwrite with new filtered data
self.dat['mat'] = filt_mat
# overwrite with up/dn data if necessary
if 'mat_up' in self.dat:
self.dat['mat_up'] = filt_mat_up
self.dat['mat_dn'] = filt_mat_dn
# overwrite mat_info if necessary
if 'mat_info' in self.dat:
self.dat['mat_info'] = filt_mat_info
print( 'final mat shape' + str(self.dat['mat'].shape ) + '\n')
def cluster_row_and_col(self, dist_type, cutoff, min_num_comp, dendro=True):
'''
cluster net.dat and make visualization json, net.viz.
optionally leave out dendrogram colorbar groups with dendro argument
'''
import scipy
import numpy as np
print('\nclustering the matrix using dist_type ' + dist_type + ' with a comparison requirement of at least ' + str(cutoff) + ' instances above abs-value of ' + str(min_num_comp) +' in order to compare')
# make distance matrices
##########################
# get number of rows and columns from self.dat
num_row = len(self.dat['nodes']['row'])
num_col = len(self.dat['nodes']['col'])
# initialize distance matrices
row_dm = scipy.zeros([num_row,num_row])
col_dm = scipy.zeros([num_col,num_col])
# row dist mat
for i in range(num_row):
for j in range(num_row):
# calculate distance of two rows
row_dm[i,j] = self.calc_thresh_col_dist( self.dat['mat'][i,:], self.dat['mat'][j,:], cutoff, min_num_comp )
# col dist mat
for i in range(num_col):
for j in range(num_col):
col_dm[i,j] = self.calc_thresh_col_dist( self.dat['mat'][:,i], self.dat['mat'][:,j], cutoff, min_num_comp )
# replace nans with the maximum distance in the distance matries
row_dm[ np.isnan(row_dm) ] = np.nanmax(row_dm)
col_dm[ np.isnan(col_dm) ] = np.nanmax(col_dm)
# initialize clust order
clust_order = self.ini_clust_order()
# initial ordering
###################
clust_order['row']['ini'] = range(num_row)
clust_order['col']['ini'] = range(num_col)
# cluster
##############
# cluster rows
cluster_method = 'centroid'
clust_order['row']['clust'], clust_order['row']['group'] = self.clust_and_group_nodes(row_dm, cluster_method)
clust_order['col']['clust'], clust_order['col']['group'] = self.clust_and_group_nodes(col_dm, cluster_method)
# rank
############
clust_order['row']['rank'] = self.sort_rank_nodes('row')
clust_order['col']['rank'] = self.sort_rank_nodes('col')
# save clustering orders to node_info
# row
self.dat['node_info']['row']['ini'] = clust_order['row']['ini']
self.dat['node_info']['row']['clust'] = clust_order['row']['clust']
self.dat['node_info']['row']['rank'] = clust_order['row']['rank']
self.dat['node_info']['row']['group'] = clust_order['row']['group']
# col
self.dat['node_info']['col']['ini'] = clust_order['col']['ini']
self.dat['node_info']['col']['clust'] = clust_order['col']['clust']
self.dat['node_info']['col']['rank'] = clust_order['col']['rank']
self.dat['node_info']['col']['group'] = clust_order['col']['group']
# make the viz json - can optionally leave out dendrogram
self.viz_json(dendro)
def clust_and_group_nodes( self, dm, cluster_method ):
import scipy.cluster.hierarchy as hier
# calculate linkage
Y = hier.linkage( dm, method=cluster_method )
Z = hier.dendrogram( Y, no_plot=True )
# get ordering
inst_clust_order = Z['leaves']
all_dist = self.group_cutoffs()
# generate distance cutoffs
inst_groups = {}
for inst_dist in all_dist:
# inst_groups[inst_dist] = hier.fcluster(Y, inst_dist*dm.max(), 'inconsistent')
inst_groups[inst_dist] = hier.fcluster(Y, inst_dist*dm.max(), 'distance')
return inst_clust_order, inst_groups
def sort_rank_nodes( self, rowcol ):
import numpy as np
from operator import itemgetter
from copy import deepcopy
# make a copy of node information
inst_nodes = deepcopy(self.dat['nodes'][rowcol])
inst_mat = deepcopy(self.dat['mat'])
sum_term = []
for i in range(len(inst_nodes)):
inst_dict = {}
# get name of the node
inst_dict['name'] = inst_nodes[i]
# sum values of the node
if rowcol == 'row':
inst_dict['total'] = np.sum(inst_mat[i,:])
else:
inst_dict['total'] = np.sum(inst_mat[:,i])
# add this to the list of dicts
sum_term.append(inst_dict)
# sort dictionary by number of terms
sum_term = sorted( sum_term, key=itemgetter('total'), reverse=False )
# get list of sorted nodes
tmp_sort_nodes = []
for inst_dict in sum_term:
tmp_sort_nodes.append(inst_dict['name'])
# get the sorted index
sort_index = []
for inst_node in inst_nodes:
sort_index.append( tmp_sort_nodes.index(inst_node) )
# save the sorted ranks
return sort_index
def calc_thresh_col_dist( self, vect_row, vect_col, cutoff, min_num_meet):
import scipy.spatial
import numpy as np
# apply cutoff
vect_row, vect_col = self.threshold_vect_comparison(vect_row, vect_col, cutoff)
# check min_num_meet
if len(vect_row) >= min_num_meet:
inst_dist = scipy.spatial.distance.cosine(vect_row, vect_col)
else:
# later the nans will be replaced with the maximum distance
inst_dist = np.nan
return inst_dist
def viz_json(self, dendro=True):
''' make the dictionary for the d3_clustergram.js visualization '''
# get dendrogram cutoff distances
all_dist = self.group_cutoffs()
# make nodes for viz
#####################
# make rows and cols
for inst_rc in self.dat['nodes']:
for i in range(len( self.dat['nodes'][inst_rc] )):
inst_dict = {}
inst_dict['name'] = self.dat['nodes'][inst_rc][i]
inst_dict['ini'] = self.dat['node_info'][inst_rc]['ini'][i]
#!! clean this up so I do not have to get the index here
inst_dict['clust'] = self.dat['node_info'][inst_rc]['clust'].index(i)
inst_dict['rank'] = self.dat['node_info'][inst_rc]['rank'][i]
# add node class 'cl' - this could potentially be a list of several classes
# if 'cl' in self.dat['node_info'][inst_rc]:
if len(self.dat['node_info'][inst_rc]['cl']) > 0:
inst_dict['cl'] = self.dat['node_info'][inst_rc]['cl'][i]
# add node information
# if 'info' in self.dat['node_info'][inst_rc]:
if len(self.dat['node_info'][inst_rc]['info']) > 0:
inst_dict['info'] = self.dat['node_info'][inst_rc]['info'][i]
# group info
if dendro==True:
inst_dict['group'] = []
for tmp_dist in all_dist:
inst_dict['group'].append( float( self.dat['node_info'][inst_rc]['group'][tmp_dist][i] ) )
# append dictionary to list of nodes
self.viz[inst_rc+'_nodes'].append(inst_dict)
# links
########
for i in range(len( self.dat['nodes']['row'] )):
for j in range(len( self.dat['nodes']['col'] )):
if abs( self.dat['mat'][i,j] ) > 0:
inst_dict = {}
inst_dict['source'] = i
inst_dict['target'] = j
inst_dict['value'] = self.dat['mat'][i,j]
# add up/dn values if necessary
if 'mat_up' in self.dat:
inst_dict['value_up'] = self.dat['mat_up'][i,j]
if 'mat_up' in self.dat:
inst_dict['value_dn'] = self.dat['mat_dn'][i,j]
# add information if necessary - use dictionary with tuple key
# each element of the matrix needs to have information
if 'mat_info' in self.dat:
inst_dict['info'] = self.dat['mat_info'][(i,j)]
# add highlight if necessary - use dictionary with tuple key
if 'mat_hl' in self.dat:
inst_dict['highlight'] = self.dat['mat_hl'][i,j]
# append link
self.viz['links'].append( inst_dict )
@staticmethod
def load_json_to_dict(filename):
''' load json to python dict and return dict '''
import json
f = open(filename, 'r')
inst_dict = json.load(f)
f.close()
return inst_dict
@staticmethod
def save_dict_to_json(inst_dict, filename, indent='no-indent'):
import json
# save as a json
fw = open(filename, 'w')
if indent == 'indent':
fw.write( json.dumps(inst_dict, indent=2) )
else:
fw.write( json.dumps(inst_dict) )
fw.close()
@staticmethod
def ini_clust_order():
rowcol = ['row','col']
orderings = ['clust','rank','group','ini']
clust_order = {}
for inst_node in rowcol:
clust_order[inst_node] = {}
for inst_order in orderings:
clust_order[inst_node][inst_order] = []
return clust_order
@staticmethod
def threshold_vect_comparison(x, y, cutoff):
import numpy as np
# x vector
############
# take absolute value of x
x_abs = np.absolute(x)
# this returns a tuple
found_tuple = np.where(x_abs >= cutoff)
# get index array
found_index_x = found_tuple[0]
# y vector
############
# take absolute value of y
y_abs = np.absolute(y)
# this returns a tuple
found_tuple = np.where(y_abs >= cutoff)
# get index array
found_index_y = found_tuple[0]
# get common intersection
found_common = np.intersect1d(found_index_x, found_index_y)
# apply cutoff
thresh_x = x[found_common]
thresh_y = y[found_common]
# return the threshold data
return thresh_x, thresh_y
@staticmethod
def group_cutoffs():
# generate distance cutoffs
all_dist = []
for i in range(11):
all_dist.append(float(i)/10)
return all_dist
@staticmethod
def find_dict_in_list(list_dict, search_value, search_string):
''' find a dict in a list of dicts by searching for a value '''
# get all the possible values of search_value
all_values = [d[search_value] for d in list_dict]
# check if the search value is in the keys
if search_string in all_values:
# find the dict
found_dict = (item for item in list_dict if item[search_value] == search_string).next()
else:
found_dict = {}
# return the found dictionary
return found_dict
{
"folders":
[
{
"path": "."
}
]
}
{
"row_nodes": [
{
"rank": 30,
"group": [
16.0,
16.0,
16.0,
15.0,
14.0,
14.0,
13.0,
7.0,
4.0,
3.0,
2.0
],
"name": "CDK4",
"clust": 25,
"ini": 0
},
{
"rank": 28,
"group": [
24.0,
24.0,
24.0,
23.0,
22.0,
22.0,
20.0,
12.0,
5.0,
3.0,
2.0
],
"name": "LMTK3",
"clust": 29,
"ini": 1
},
{
"rank": 9,
"group": [
32.0,
32.0,
32.0,
31.0,
30.0,
30.0,
26.0,
17.0,
6.0,
3.0,
2.0
],
"name": "LRRK2",
"clust": 31,
"ini": 2
},
{
"rank": 26,
"group": [
37.0,
37.0,
37.0,
36.0,
35.0,
35.0,
31.0,
22.0,
11.0,
5.0,
3.0
],
"name": "UHMK1",
"clust": 6,
"ini": 3
},
{
"rank": 33,
"group": [
19.0,
19.0,
19.0,
18.0,
17.0,
17.0,
15.0,
7.0,
4.0,
3.0,
2.0
],
"name": "EGFR",
"clust": 23,
"ini": 4
},
{
"rank": 36,
"group": [
11.0,
11.0,
11.0,
10.0,
9.0,
9.0,
8.0,
5.0,
4.0,
3.0,
2.0
],
"name": "STK32A",
"clust": 19,
"ini": 5
},
{
"rank": 35,
"group": [
17.0,
17.0,
17.0,
16.0,
15.0,
15.0,
13.0,
7.0,
4.0,
3.0,
2.0
],
"name": "NRK",
"clust": 26,
"ini": 6
},
{
"rank": 24,
"group": [
15.0,
15.0,
15.0,
14.0,
13.0,
13.0,
12.0,
6.0,
4.0,
3.0,
2.0
],
"name": "ERBB2",
"clust": 16,
"ini": 7
},
{
"rank": 6,
"group": [
8.0,
8.0,
8.0,
7.0,
6.0,
6.0,
5.0,
3.0,
2.0,
2.0,
2.0
],
"name": "ERBB4",
"clust": 7,
"ini": 8
},
{
"rank": 18,
"group": [
13.0,
13.0,
13.0,
12.0,
11.0,
11.0,
10.0,
5.0,
4.0,
3.0,
2.0
],
"name": "AAK1",
"clust": 18,
"ini": 9
},
{
"rank": 8,
"group": [
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0
],
"name": "SRPK3",
"clust": 3,
"ini": 10
},
{
"rank": 7,
"group": [
38.0,
38.0,
38.0,
37.0,
36.0,
36.0,
32.0,
23.0,
12.0,
6.0,
4.0
],
"name": "STK39",
"clust": 5,
"ini": 11
},
{
"rank": 1,
"group": [
3.0,
3.0,
3.0,
2.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0
],
"name": "GRK4",
"clust": 2,
"ini": 12
},
{
"rank": 34,
"group": [
18.0,
18.0,
18.0,
17.0,
16.0,
16.0,
14.0,
7.0,
4.0,
3.0,
2.0
],
"name": "TBK1",
"clust": 24,
"ini": 13
},
{
"rank": 13,
"group": [
26.0,
26.0,
26.0,
25.0,
24.0,
24.0,
21.0,
13.0,
6.0,
3.0,
2.0
],
"name": "INSRR",
"clust": 33,
"ini": 14
},
{
"rank": 20,
"group": [
33.0,
33.0,
33.0,
32.0,
31.0,
31.0,
27.0,
18.0,
7.0,
3.0,
2.0
],
"name": "IRAK1",
"clust": 15,
"ini": 15
},
{
"rank": 19,
"group": [
12.0,
12.0,
12.0,
11.0,
10.0,
10.0,
9.0,
5.0,
4.0,
3.0,
2.0
],
"name": "KDR",
"clust": 20,
"ini": 16
},
{
"rank": 27,
"group": [
31.0,
31.0,
31.0,
30.0,
29.0,
29.0,
25.0,
16.0,
6.0,
3.0,
2.0
],
"name": "NPR1",
"clust": 35,
"ini": 17
},
{
"rank": 11,
"group": [
22.0,
22.0,
22.0,
21.0,
20.0,
20.0,
18.0,
10.0,
4.0,
3.0,
2.0
],
"name": "PAK3",
"clust": 27,
"ini": 18
},
{
"rank": 2,
"group": [
9.0,
9.0,
9.0,
8.0,
7.0,
7.0,
6.0,
4.0,
3.0,
3.0,
2.0
],
"name": "PDGFRA",
"clust": 11,
"ini": 19
},
{
"rank": 22,
"group": [
27.0,
27.0,
27.0,
26.0,
25.0,
25.0,
21.0,
13.0,
6.0,
3.0,
2.0
],
"name": "PDK4",
"clust": 34,
"ini": 20
},
{
"rank": 16,
"group": [
6.0,
6.0,
6.0,
5.0,
4.0,
4.0,
4.0,
2.0,
2.0,
2.0,
2.0
],
"name": "ULK4",
"clust": 8,
"ini": 21
},
{
"rank": 14,
"group": [
25.0,
25.0,
25.0,
24.0,
23.0,
23.0,
20.0,
12.0,
5.0,
3.0,
2.0
],
"name": "PRKCE",
"clust": 30,
"ini": 22
},
{
"rank": 25,
"group": [
5.0,
5.0,
5.0,
4.0,
3.0,
3.0,
3.0,
1.0,
1.0,
1.0,
1.0
],
"name": "PRKG2",
"clust": 0,
"ini": 23
},
{
"rank": 10,
"group": [
29.0,
29.0,
29.0,
28.0,
27.0,
27.0,
23.0,
15.0,
6.0,
3.0,
2.0
],
"name": "MAPK4",
"clust": 36,
"ini": 24
},
{
"rank": 17,
"group": [
10.0,
10.0,
10.0,
9.0,
8.0,
8.0,
7.0,
4.0,
3.0,
3.0,
2.0
],
"name": "MAPK11",
"clust": 12,
"ini": 25
},
{
"rank": 37,
"group": [
21.0,
21.0,
21.0,
20.0,
19.0,
19.0,
17.0,
9.0,
4.0,
3.0,
2.0
],
"name": "STK31",
"clust": 21,
"ini": 26
},
{
"rank": 15,
"group": [
30.0,
30.0,
30.0,
29.0,
28.0,
28.0,
24.0,
15.0,
6.0,
3.0,
2.0
],
"name": "GRK1",
"clust": 37,
"ini": 27
},
{
"rank": 31,
"group": [
14.0,
14.0,
14.0,
13.0,
12.0,
12.0,
11.0,
5.0,
4.0,
3.0,
2.0
],
"name": "ROS1",
"clust": 17,
"ini": 28
},
{
"rank": 23,
"group": [
20.0,
20.0,
20.0,
19.0,
18.0,
18.0,
16.0,
8.0,
4.0,
3.0,
2.0
],
"name": "MAP2K4",
"clust": 22,
"ini": 29
},
{
"rank": 21,
"group": [
23.0,
23.0,
23.0,
22.0,
21.0,
21.0,
19.0,
11.0,
4.0,
3.0,
2.0
],
"name": "SRC",
"clust": 28,
"ini": 30
},
{
"rank": 12,
"group": [
35.0,
35.0,
35.0,
34.0,
33.0,
33.0,
29.0,
20.0,
9.0,
3.0,
2.0
],
"name": "TGFBR1",
"clust": 13,
"ini": 31
},
{
"rank": 3,
"group": [
2.0,
2.0,
2.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0
],
"name": "CAMK2B",
"clust": 4,
"ini": 32
},
{
"rank": 0,
"group": [
34.0,
34.0,
34.0,
33.0,
32.0,
32.0,
28.0,
19.0,
8.0,
3.0,
2.0
],
"name": "STK24",
"clust": 14,
"ini": 33
},
{
"rank": 5,
"group": [
4.0,
4.0,
4.0,
3.0,
2.0,
2.0,
2.0,
1.0,
1.0,
1.0,
1.0
],
"name": "DCLK3",
"clust": 1,
"ini": 34
},
{
"rank": 29,
"group": [
28.0,
28.0,
28.0,
27.0,
26.0,
26.0,
22.0,
14.0,
6.0,
3.0,
2.0
],
"name": "LATS1",
"clust": 32,
"ini": 35
},
{
"rank": 4,
"group": [
36.0,
36.0,
36.0,
35.0,
34.0,
34.0,
30.0,
21.0,
10.0,
4.0,
2.0
],
"name": "NEK9",
"clust": 10,
"ini": 36
},
{
"rank": 32,
"group": [
7.0,
7.0,
7.0,
6.0,
5.0,
5.0,
4.0,
2.0,
2.0,
2.0,
2.0
],
"name": "MYLK3",
"clust": 9,
"ini": 37
}
],
"col_nodes": [
{
"rank": 6,
"group": [
27.0,
27.0,
27.0,
27.0,
27.0,
27.0,
26.0,
25.0,
21.0,
9.0,
1.0
],
"name": "Col-1",
"clust": 2,
"ini": 0
},
{
"rank": 17,
"group": [
9.0,
9.0,
9.0,
9.0,
9.0,
9.0,
9.0,
9.0,
6.0,
4.0,
1.0
],
"name": "Col-2",
"clust": 13,
"ini": 1
},
{
"rank": 10,
"group": [
14.0,
14.0,
14.0,
14.0,
14.0,
14.0,
14.0,
14.0,
11.0,
4.0,
1.0
],
"name": "Col-3",
"clust": 15,
"ini": 2
},
{
"rank": 4,
"group": [
24.0,
24.0,
24.0,
24.0,
24.0,
24.0,
23.0,
22.0,
18.0,
6.0,
1.0
],
"name": "Col-4",
"clust": 24,
"ini": 3
},
{
"rank": 0,
"group": [
25.0,
25.0,
25.0,
25.0,
25.0,
25.0,
24.0,
23.0,
19.0,
7.0,
1.0
],
"name": "Col-5",
"clust": 21,
"ini": 4
},
{
"rank": 24,
"group": [
11.0,
11.0,
11.0,
11.0,
11.0,
11.0,
11.0,
11.0,
8.0,
4.0,
1.0
],
"name": "Col-6",
"clust": 12,
"ini": 5
},
{
"rank": 9,
"group": [
12.0,
12.0,
12.0,
12.0,
12.0,
12.0,
12.0,
12.0,
9.0,
4.0,
1.0
],
"name": "Col-7",
"clust": 16,
"ini": 6
},
{
"rank": 28,
"group": [
18.0,
18.0,
18.0,
18.0,
18.0,
18.0,
18.0,
18.0,
15.0,
6.0,
1.0
],
"name": "Col-8",
"clust": 22,
"ini": 7
},
{
"rank": 1,
"group": [
28.0,
28.0,
28.0,
28.0,
28.0,
28.0,
27.0,
26.0,
22.0,
10.0,
1.0
],
"name": "Col-9",
"clust": 1,
"ini": 8
},
{
"rank": 25,
"group": [
23.0,
23.0,
23.0,
23.0,
23.0,
23.0,
22.0,
21.0,
17.0,
6.0,
1.0
],
"name": "Col-10",
"clust": 25,
"ini": 9
},
{
"rank": 18,
"group": [
17.0,
17.0,
17.0,
17.0,
17.0,
17.0,
17.0,
17.0,
14.0,
5.0,
1.0
],
"name": "Col-11",
"clust": 9,
"ini": 10
},
{
"rank": 3,
"group": [
6.0,
6.0,
6.0,
6.0,
6.0,
6.0,
6.0,
6.0,
4.0,
3.0,
1.0
],
"name": "Col-12",
"clust": 6,
"ini": 11
},
{
"rank": 7,
"group": [
4.0,
4.0,
4.0,
4.0,
4.0,
4.0,
4.0,
4.0,
3.0,
3.0,
1.0
],
"name": "Col-13",
"clust": 7,
"ini": 12
},
{
"rank": 11,
"group": [
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0
],
"name": "Col-14",
"clust": 4,
"ini": 13
},
{
"rank": 8,
"group": [
26.0,
26.0,
26.0,
26.0,
26.0,
26.0,
25.0,
24.0,
20.0,
8.0,
1.0
],
"name": "Col-15",
"clust": 20,
"ini": 14
},
{
"rank": 26,
"group": [
5.0,
5.0,
5.0,
5.0,
5.0,
5.0,
5.0,
5.0,
3.0,
3.0,
1.0
],
"name": "Col-16",
"clust": 8,
"ini": 15
},
{
"rank": 2,
"group": [
22.0,
22.0,
22.0,
22.0,
22.0,
22.0,
21.0,
20.0,
16.0,
6.0,
1.0
],
"name": "Col-17",
"clust": 26,
"ini": 16
},
{
"rank": 12,
"group": [
2.0,
2.0,
2.0,
2.0,
2.0,
2.0,
2.0,
2.0,
1.0,
1.0,
1.0
],
"name": "Col-18",
"clust": 5,
"ini": 17
},
{
"rank": 20,
"group": [
15.0,
15.0,
15.0,
15.0,
15.0,
15.0,
15.0,
15.0,
12.0,
4.0,
1.0
],
"name": "Col-19",
"clust": 18,
"ini": 18
},
{
"rank": 5,
"group": [
16.0,
16.0,
16.0,
16.0,
16.0,
16.0,
16.0,
16.0,
13.0,
4.0,
1.0
],
"name": "Col-20",
"clust": 19,
"ini": 19
},
{
"rank": 22,
"group": [
29.0,
29.0,
29.0,
29.0,
29.0,
29.0,
28.0,
27.0,
23.0,
11.0,
2.0
],
"name": "Col-21",
"clust": 0,
"ini": 20
},
{
"rank": 27,
"group": [
20.0,
20.0,
20.0,
20.0,
20.0,
20.0,
20.0,
19.0,
16.0,
6.0,
1.0
],
"name": "Col-22",
"clust": 27,
"ini": 21
},
{
"rank": 23,
"group": [
7.0,
7.0,
7.0,
7.0,
7.0,
7.0,
7.0,
7.0,
5.0,
4.0,
1.0
],
"name": "Col-23",
"clust": 10,
"ini": 22
},
{
"rank": 16,
"group": [
13.0,
13.0,
13.0,
13.0,
13.0,
13.0,
13.0,
13.0,
10.0,
4.0,
1.0
],
"name": "Col-24",
"clust": 17,
"ini": 23
},
{
"rank": 19,
"group": [
19.0,
19.0,
19.0,
19.0,
19.0,
19.0,
19.0,
18.0,
15.0,
6.0,
1.0
],
"name": "Col-25",
"clust": 23,
"ini": 24
},
{
"rank": 15,
"group": [
3.0,
3.0,
3.0,
3.0,
3.0,
3.0,
3.0,
3.0,
2.0,
2.0,
1.0
],
"name": "Col-26",
"clust": 3,
"ini": 25
},
{
"rank": 14,
"group": [
10.0,
10.0,
10.0,
10.0,
10.0,
10.0,
10.0,
10.0,
7.0,
4.0,
1.0
],
"name": "Col-27",
"clust": 14,
"ini": 26
},
{
"rank": 21,
"group": [
8.0,
8.0,
8.0,
8.0,
8.0,
8.0,
8.0,
8.0,
5.0,
4.0,
1.0
],
"name": "Col-28",
"clust": 11,
"ini": 27
},
{
"rank": 13,
"group": [
21.0,
21.0,
21.0,
21.0,
21.0,
21.0,
20.0,
19.0,
16.0,
6.0,
1.0
],
"name": "Col-29",
"clust": 28,
"ini": 28
}
],
"links": [
{
"source": 0,
"target": 0,
"value": -0.79280357099999998
},
{
"source": 0,
"target": 1,
"value": 0.52768712699999998
},
{
"source": 0,
"target": 2,
"value": 0.00062253600000000003
},
{
"source": 0,
"target": 3,
"value": 0.356722594
},
{
"source": 0,
"target": 4,
"value": 0.93328608800000001
},
{
"source": 0,
"target": 5,
"value": -0.13172853800000001
},
{
"source": 0,
"target": 6,
"value": 0.80845194399999998
},
{
"source": 0,
"target": 7,
"value": 4.240884801
},
{
"source": 0,
"target": 8,
"value": -0.54023139099999995
},
{
"source": 0,
"target": 9,
"value": -0.98145695200000005
},
{
"source": 0,
"target": 10,
"value": -0.84689892
},
{
"source": 0,
"target": 11,
"value": -0.25279592099999998
},
{
"source": 0,
"target": 12,
"value": 0.114189581
},
{
"source": 0,
"target": 13,
"value": -0.066498840000000004
},
{
"source": 0,
"target": 14,
"value": 0.14921880900000001
},
{
"source": 0,
"target": 15,
"value": 1.3512639239999999
},
{
"source": 0,
"target": 16,
"value": 0.64586721199999997
},
{
"source": 0,
"target": 17,
"value": 0.60561098000000002
},
{
"source": 0,
"target": 18,
"value": 3.2324545730000001
},
{
"source": 0,
"target": 19,
"value": 0.34263457200000003
},
{
"source": 0,
"target": 20,
"value": -0.43091232400000001
},
{
"source": 0,
"target": 21,
"value": -0.40590567
},
{
"source": 0,
"target": 22,
"value": 0.199563989
},
{
"source": 0,
"target": 23,
"value": -1.1225362940000001
},
{
"source": 0,
"target": 24,
"value": 2.2103345710000002
},
{
"source": 0,
"target": 25,
"value": 0.40512631500000001
},
{
"source": 0,
"target": 26,
"value": -0.089763158999999995
},
{
"source": 0,
"target": 27,
"value": 0.40512631500000001
},
{
"source": 0,
"target": 28,
"value": 0.34001277299999999
},
{
"source": 1,
"target": 0,
"value": 0.17762053999999999
},
{
"source": 1,
"target": 1,
"value": -0.016061489000000002
},
{
"source": 1,
"target": 2,
"value": 5.422113833
},
{
"source": 1,
"target": 3,
"value": 1.307039675
},
{
"source": 1,
"target": 4,
"value": 0.35581498499999997
},
{
"source": 1,
"target": 5,
"value": 0.27690499400000002
},
{
"source": 1,
"target": 6,
"value": 0.48315391499999999
},
{
"source": 1,
"target": 7,
"value": -0.240495821
},
{
"source": 1,
"target": 8,
"value": 1.3364459959999999
},
{
"source": 1,
"target": 9,
"value": 1.149618502
},
{
"source": 1,
"target": 10,
"value": 0.361412978
},
{
"source": 1,
"target": 11,
"value": -0.38051893799999997
},
{
"source": 1,
"target": 12,
"value": -0.21354100400000001
},
{
"source": 1,
"target": 13,
"value": -0.47193863899999999
},
{
"source": 1,
"target": 14,
"value": -0.620858723
},
{
"source": 1,
"target": 15,
"value": -0.163637058
},
{
"source": 1,
"target": 16,
"value": -0.487256142
},
{
"source": 1,
"target": 17,
"value": -0.029569688
},
{
"source": 1,
"target": 18,
"value": -0.23205777799999999
},
{
"source": 1,
"target": 19,
"value": -0.66903693900000005
},
{
"source": 1,
"target": 20,
"value": -0.44924169800000002
},
{
"source": 1,
"target": 21,
"value": 1.1589304060000001
},
{
"source": 1,
"target": 22,
"value": 0.51196202199999996
},
{
"source": 1,
"target": 23,
"value": 2.3708341549999998
},
{
"source": 1,
"target": 24,
"value": 0.26289388499999999
},
{
"source": 1,
"target": 25,
"value": -0.51312889500000003
},
{
"source": 1,
"target": 26,
"value": -0.50121006800000001
},
{
"source": 1,
"target": 27,
"value": 0.43927756099999998
},
{
"source": 1,
"target": 28,
"value": -0.342460508
},
{
"source": 2,
"target": 0,
"value": -0.697876151
},
{
"source": 2,
"target": 1,
"value": -0.55561026499999999
},
{
"source": 2,
"target": 2,
"value": -0.36049755900000002
},
{
"source": 2,
"target": 3,
"value": -0.46023673100000001
},
{
"source": 2,
"target": 4,
"value": -0.68076069699999997
},
{
"source": 2,
"target": 5,
"value": -0.16946351800000001
},
{
"source": 2,
"target": 6,
"value": 1.715708875
},
{
"source": 2,
"target": 7,
"value": -0.51710482300000005
},
{
"source": 2,
"target": 8,
"value": 0.184987709
},
{
"source": 2,
"target": 9,
"value": 0.81065969999999998
},
{
"source": 2,
"target": 10,
"value": -0.44033444799999999
},
{
"source": 2,
"target": 11,
"value": -0.62105202599999998
},
{
"source": 2,
"target": 12,
"value": -0.086803357999999997
},
{
"source": 2,
"target": 13,
"value": -0.75396622499999999
},
{
"source": 2,
"target": 14,
"value": -0.401972037
},
{
"source": 2,
"target": 15,
"value": -0.56208675200000002
},
{
"source": 2,
"target": 16,
"value": -0.56064459700000002
},
{
"source": 2,
"target": 17,
"value": 0.54230138100000003
},
{
"source": 2,
"target": 18,
"value": -0.38263914500000001
},
{
"source": 2,
"target": 19,
"value": -0.37785352300000002
},
{
"source": 2,
"target": 20,
"value": -0.71347292299999998
},
{
"source": 2,
"target": 21,
"value": -0.377609368
},
{
"source": 2,
"target": 22,
"value": 4.3089045810000002
},
{
"source": 2,
"target": 23,
"value": -0.63813194900000003
},
{
"source": 2,
"target": 24,
"value": -0.55611406299999999
},
{
"source": 2,
"target": 25,
"value": -0.31814576300000003
},
{
"source": 2,
"target": 26,
"value": -0.48958271399999997
},
{
"source": 2,
"target": 27,
"value": 1.6773765270000001
},
{
"source": 2,
"target": 28,
"value": -0.68279046399999999
},
{
"source": 3,
"target": 0,
"value": 0.85054651800000003
},
{
"source": 3,
"target": 1,
"value": -0.26327990699999998
},
{
"source": 3,
"target": 2,
"value": 0.17925303100000001
},
{
"source": 3,
"target": 3,
"value": 0.39864672099999998
},
{
"source": 3,
"target": 4,
"value": 1.537663802
},
{
"source": 3,
"target": 5,
"value": 0.50529141099999997
},
{
"source": 3,
"target": 6,
"value": 0.90236649099999999
},
{
"source": 3,
"target": 7,
"value": -0.16628803
},
{
"source": 3,
"target": 8,
"value": 0.63073056400000005
},
{
"source": 3,
"target": 9,
"value": 0.39944828300000002
},
{
"source": 3,
"target": 10,
"value": 0.84717136699999995
},
{
"source": 3,
"target": 11,
"value": -0.442268094
},
{
"source": 3,
"target": 12,
"value": 0.44368676000000001
},
{
"source": 3,
"target": 13,
"value": 1.552969029
},
{
"source": 3,
"target": 14,
"value": 1.1102834829999999
},
{
"source": 3,
"target": 15,
"value": -0.32669807200000001
},
{
"source": 3,
"target": 16,
"value": -0.40526737400000001
},
{
"source": 3,
"target": 17,
"value": 0.66374718300000002
},
{
"source": 3,
"target": 18,
"value": 0.42447003300000002
},
{
"source": 3,
"target": 19,
"value": 0.283221899
},
{
"source": 3,
"target": 20,
"value": -4.2439739210000003
},
{
"source": 3,
"target": 21,
"value": 0.71831557800000001
},
{
"source": 3,
"target": 22,
"value": 1.747343933
},
{
"source": 3,
"target": 23,
"value": -1.020927175
},
{
"source": 3,
"target": 24,
"value": 0.30502851399999997
},
{
"source": 3,
"target": 25,
"value": 1.4717461300000001
},
{
"source": 3,
"target": 26,
"value": 0.048902278
},
{
"source": 3,
"target": 27,
"value": -0.25528355600000002
},
{
"source": 3,
"target": 28,
"value": 0.54822457300000005
},
{
"source": 4,
"target": 0,
"value": 1.412416216
},
{
"source": 4,
"target": 1,
"value": 0.018987506000000001
},
{
"source": 4,
"target": 2,
"value": 0.90225162199999998
},
{
"source": 4,
"target": 3,
"value": -0.17813746999999999
},
{
"source": 4,
"target": 4,
"value": 0.78181902199999997
},
{
"source": 4,
"target": 5,
"value": 0.211815895
},
{
"source": 4,
"target": 6,
"value": -0.023427175000000001
},
{
"source": 4,
"target": 7,
"value": 3.557295952
},
{
"source": 4,
"target": 8,
"value": 1.1737835560000001
},
{
"source": 4,
"target": 9,
"value": -0.012362164
},
{
"source": 4,
"target": 10,
"value": 0.76978248400000004
},
{
"source": 4,
"target": 11,
"value": -0.68103174300000002
},
{
"source": 4,
"target": 12,
"value": -1.0473753889999999
},
{
"source": 4,
"target": 13,
"value": 0.65206549899999999
},
{
"source": 4,
"target": 14,
"value": 0.17231669099999999
},
{
"source": 4,
"target": 15,
"value": 2.0724334689999999
},
{
"source": 4,
"target": 16,
"value": 1.135709377
},
{
"source": 4,
"target": 17,
"value": -0.169977181
},
{
"source": 4,
"target": 18,
"value": 0.88106713599999997
},
{
"source": 4,
"target": 19,
"value": -0.48615902500000002
},
{
"source": 4,
"target": 20,
"value": -1.4518380259999999
},
{
"source": 4,
"target": 21,
"value": 0.37123773700000001
},
{
"source": 4,
"target": 22,
"value": -0.58166532500000001
},
{
"source": 4,
"target": 23,
"value": -0.126356157
},
{
"source": 4,
"target": 24,
"value": 0.241004724
},
{
"source": 4,
"target": 25,
"value": 1.06526919
},
{
"source": 4,
"target": 26,
"value": 0.97453179599999995
},
{
"source": 4,
"target": 27,
"value": 0.66864509100000002
},
{
"source": 4,
"target": 28,
"value": 0.056964889999999997
},
{
"source": 5,
"target": 0,
"value": -0.38803966499999998
},
{
"source": 5,
"target": 1,
"value": -0.59262661400000005
},
{
"source": 5,
"target": 2,
"value": -0.24413651
},
{
"source": 5,
"target": 3,
"value": 0.74036473400000002
},
{
"source": 5,
"target": 4,
"value": 3.0233484150000001
},
{
"source": 5,
"target": 5,
"value": -0.43398541200000001
},
{
"source": 5,
"target": 6,
"value": -0.63012445699999997
},
{
"source": 5,
"target": 7,
"value": 1.156531983
},
{
"source": 5,
"target": 8,
"value": 0.433696213
},
{
"source": 5,
"target": 9,
"value": 3.8495078199999999
},
{
"source": 5,
"target": 10,
"value": -0.22542574200000001
},
{
"source": 5,
"target": 11,
"value": -0.65610680799999999
},
{
"source": 5,
"target": 12,
"value": -0.31195335699999999
},
{
"source": 5,
"target": 13,
"value": -0.39745022600000002
},
{
"source": 5,
"target": 14,
"value": 1.0440255380000001
},
{
"source": 5,
"target": 15,
"value": -0.247816912
},
{
"source": 5,
"target": 16,
"value": 3.6405243450000002
},
{
"source": 5,
"target": 17,
"value": -0.59251039000000005
},
{
"source": 5,
"target": 18,
"value": 0.51466624500000002
},
{
"source": 5,
"target": 19,
"value": -0.45396994000000002
},
{
"source": 5,
"target": 20,
"value": 1.649737631
},
{
"source": 5,
"target": 21,
"value": 3.3660203129999999
},
{
"source": 5,
"target": 22,
"value": -0.43050223700000001
},
{
"source": 5,
"target": 23,
"value": -0.295312303
},
{
"source": 5,
"target": 24,
"value": 2.8245514969999999
},
{
"source": 5,
"target": 25,
"value": -0.014275115
},
{
"source": 5,
"target": 26,
"value": -0.41047779400000001
},
{
"source": 5,
"target": 27,
"value": -0.22971778400000001
},
{
"source": 5,
"target": 28,
"value": 3.7098286159999998
},
{
"source": 6,
"target": 0,
"value": 1.408537135
},
{
"source": 6,
"target": 1,
"value": -0.017369325000000001
},
{
"source": 6,
"target": 2,
"value": -0.36712796199999997
},
{
"source": 6,
"target": 3,
"value": 0.31325354799999999
},
{
"source": 6,
"target": 4,
"value": -0.16288685999999999
},
{
"source": 6,
"target": 5,
"value": 0.027411932999999999
},
{
"source": 6,
"target": 6,
"value": -0.281351556
},
{
"source": 6,
"target": 7,
"value": 5.8138464890000003
},
{
"source": 6,
"target": 8,
"value": -0.16170658399999999
},
{
"source": 6,
"target": 9,
"value": 0.47238675200000002
},
{
"source": 6,
"target": 10,
"value": -0.33979584000000002
},
{
"source": 6,
"target": 11,
"value": 0.66995662499999997
},
{
"source": 6,
"target": 12,
"value": -0.25963910000000001
},
{
"source": 6,
"target": 13,
"value": -0.38660129500000001
},
{
"source": 6,
"target": 14,
"value": -0.29365459300000002
},
{
"source": 6,
"target": 15,
"value": 4.3904997210000003
},
{
"source": 6,
"target": 16,
"value": -0.42094221399999998
},
{
"source": 6,
"target": 17,
"value": -0.40295515399999998
},
{
"source": 6,
"target": 18,
"value": -0.346809494
},
{
"source": 6,
"target": 19,
"value": -0.22272513199999999
},
{
"source": 6,
"target": 20,
"value": 0.36849943000000002
},
{
"source": 6,
"target": 21,
"value": 1.4930324800000001
},
{
"source": 6,
"target": 22,
"value": -0.34174717999999998
},
{
"source": 6,
"target": 23,
"value": -0.34342045100000002
},
{
"source": 6,
"target": 24,
"value": 5.2848086070000004
},
{
"source": 6,
"target": 25,
"value": -0.358156896
},
{
"source": 6,
"target": 26,
"value": -0.222931558
},
{
"source": 6,
"target": 27,
"value": -0.40139116699999999
},
{
"source": 6,
"target": 28,
"value": -0.412478715
},
{
"source": 7,
"target": 0,
"value": 0.90664240600000001
},
{
"source": 7,
"target": 1,
"value": -0.68477142300000005
},
{
"source": 7,
"target": 2,
"value": 0.015261254
},
{
"source": 7,
"target": 3,
"value": 0.16056792
},
{
"source": 7,
"target": 4,
"value": 0.36500211300000002
},
{
"source": 7,
"target": 5,
"value": -0.564392699
},
{
"source": 7,
"target": 6,
"value": 0.16907282700000001
},
{
"source": 7,
"target": 7,
"value": -0.035192495999999997
},
{
"source": 7,
"target": 8,
"value": -0.031210405
},
{
"source": 7,
"target": 9,
"value": 0.44774244299999999
},
{
"source": 7,
"target": 10,
"value": 0.54407510299999995
},
{
"source": 7,
"target": 11,
"value": 0.28000847699999998
},
{
"source": 7,
"target": 12,
"value": -0.066278221999999998
},
{
"source": 7,
"target": 13,
"value": -0.22581431800000001
},
{
"source": 7,
"target": 14,
"value": 4.103496507
},
{
"source": 7,
"target": 15,
"value": 1.2196915660000001
},
{
"source": 7,
"target": 16,
"value": -0.24502200099999999
},
{
"source": 7,
"target": 17,
"value": -0.68155265799999998
},
{
"source": 7,
"target": 18,
"value": -0.30481733300000002
},
{
"source": 7,
"target": 19,
"value": -0.51121229499999998
},
{
"source": 7,
"target": 20,
"value": -1.100056017
},
{
"source": 7,
"target": 21,
"value": 1.3359832949999999
},
{
"source": 7,
"target": 22,
"value": -0.50056154399999997
},
{
"source": 7,
"target": 23,
"value": 0.72125981900000002
},
{
"source": 7,
"target": 24,
"value": 0.28474707199999999
},
{
"source": 7,
"target": 25,
"value": 0.232812724
},
{
"source": 7,
"target": 26,
"value": -0.79693010099999995
},
{
"source": 7,
"target": 27,
"value": -0.156381455
},
{
"source": 7,
"target": 28,
"value": 1.503853721
},
{
"source": 8,
"target": 0,
"value": -0.45290705199999998
},
{
"source": 8,
"target": 1,
"value": -0.39279053600000002
},
{
"source": 8,
"target": 2,
"value": -0.37417351500000001
},
{
"source": 8,
"target": 3,
"value": -0.52741849299999999
},
{
"source": 8,
"target": 4,
"value": -0.32010333400000002
},
{
"source": 8,
"target": 5,
"value": -0.56065721899999998
},
{
"source": 8,
"target": 6,
"value": -0.31284750900000002
},
{
"source": 8,
"target": 7,
"value": -0.46390362299999999
},
{
"source": 8,
"target": 8,
"value": -0.304652329
},
{
"source": 8,
"target": 9,
"value": -0.30897113999999998
},
{
"source": 8,
"target": 10,
"value": -0.33193587600000002
},
{
"source": 8,
"target": 11,
"value": 4.0989308209999997
},
{
"source": 8,
"target": 12,
"value": -0.41394214899999998
},
{
"source": 8,
"target": 13,
"value": -0.50141891699999996
},
{
"source": 8,
"target": 14,
"value": 1.2561648759999999
},
{
"source": 8,
"target": 15,
"value": -0.12356019
},
{
"source": 8,
"target": 16,
"value": -0.42557792700000002
},
{
"source": 8,
"target": 17,
"value": -0.36998587999999999
},
{
"source": 8,
"target": 18,
"value": -0.054684880999999998
},
{
"source": 8,
"target": 19,
"value": -0.48473063100000002
},
{
"source": 8,
"target": 20,
"value": -0.419739472
},
{
"source": 8,
"target": 21,
"value": -0.43241243200000001
},
{
"source": 8,
"target": 22,
"value": 0.14324561899999999
},
{
"source": 8,
"target": 23,
"value": -0.266932489
},
{
"source": 8,
"target": 24,
"value": -0.34086030699999997
},
{
"source": 8,
"target": 25,
"value": -0.23184729100000001
},
{
"source": 8,
"target": 26,
"value": -0.44829253899999999
},
{
"source": 8,
"target": 27,
"value": -0.42868169
},
{
"source": 8,
"target": 28,
"value": -0.61593688899999999
},
{
"source": 9,
"target": 0,
"value": 3.5790517350000002
},
{
"source": 9,
"target": 1,
"value": 0.92330807000000004
},
{
"source": 9,
"target": 2,
"value": -0.65109436700000001
},
{
"source": 9,
"target": 3,
"value": 0.95274383299999998
},
{
"source": 9,
"target": 4,
"value": -0.21273339699999999
},
{
"source": 9,
"target": 5,
"value": 0.0060745269999999997
},
{
"source": 9,
"target": 6,
"value": -0.121038246
},
{
"source": 9,
"target": 7,
"value": 0.083769063000000005
},
{
"source": 9,
"target": 8,
"value": -0.72267821399999999
},
{
"source": 9,
"target": 9,
"value": 1.669410989
},
{
"source": 9,
"target": 10,
"value": -0.24760088299999999
},
{
"source": 9,
"target": 11,
"value": -0.28462364899999998
},
{
"source": 9,
"target": 12,
"value": -0.68771671700000003
},
{
"source": 9,
"target": 13,
"value": -0.32088388499999998
},
{
"source": 9,
"target": 14,
"value": -0.93370414999999995
},
{
"source": 9,
"target": 15,
"value": -0.309230053
},
{
"source": 9,
"target": 16,
"value": 0.544870152
},
{
"source": 9,
"target": 17,
"value": 0.824029397
},
{
"source": 9,
"target": 18,
"value": -0.087291924000000007
},
{
"source": 9,
"target": 19,
"value": -0.97390586700000004
},
{
"source": 9,
"target": 20,
"value": -0.30828298300000001
},
{
"source": 9,
"target": 21,
"value": 0.82214570399999998
},
{
"source": 9,
"target": 22,
"value": -0.72904307999999995
},
{
"source": 9,
"target": 23,
"value": -0.088865731000000003
},
{
"source": 9,
"target": 24,
"value": -0.29848499000000001
},
{
"source": 9,
"target": 25,
"value": -0.45136711200000001
},
{
"source": 9,
"target": 26,
"value": -1.134040733
},
{
"source": 9,
"target": 27,
"value": 0.37923044299999997
},
{
"source": 9,
"target": 28,
"value": 1.4916125769999999
},
{
"source": 10,
"target": 0,
"value": -0.58276133500000005
},
{
"source": 10,
"target": 1,
"value": -0.70637942499999995
},
{
"source": 10,
"target": 2,
"value": 0.36431330099999998
},
{
"source": 10,
"target": 3,
"value": -0.48301141399999997
},
{
"source": 10,
"target": 4,
"value": -0.71307719000000003
},
{
"source": 10,
"target": 5,
"value": -0.048548064000000002
},
{
"source": 10,
"target": 6,
"value": -0.52794454899999999
},
{
"source": 10,
"target": 7,
"value": 0.33750176900000001
},
{
"source": 10,
"target": 8,
"value": -0.65678163499999997
},
{
"source": 10,
"target": 9,
"value": -0.323318624
},
{
"source": 10,
"target": 10,
"value": -0.43295062299999998
},
{
"source": 10,
"target": 11,
"value": -0.41479909799999998
},
{
"source": 10,
"target": 12,
"value": -1.02570516
},
{
"source": 10,
"target": 13,
"value": -0.86141543300000001
},
{
"source": 10,
"target": 14,
"value": 0.11344713100000001
},
{
"source": 10,
"target": 15,
"value": -0.11011773499999999
},
{
"source": 10,
"target": 16,
"value": -0.49351082499999999
},
{
"source": 10,
"target": 17,
"value": 0.14884150199999999
},
{
"source": 10,
"target": 18,
"value": -0.34109691399999997
},
{
"source": 10,
"target": 19,
"value": -0.37376052500000001
},
{
"source": 10,
"target": 20,
"value": 5.1601380199999998
},
{
"source": 10,
"target": 21,
"value": -0.20490693200000001
},
{
"source": 10,
"target": 22,
"value": -0.46557486300000001
},
{
"source": 10,
"target": 23,
"value": -0.17040549099999999
},
{
"source": 10,
"target": 24,
"value": 0.046286803000000001
},
{
"source": 10,
"target": 25,
"value": -0.100887639
},
{
"source": 10,
"target": 26,
"value": 0.93615090599999995
},
{
"source": 10,
"target": 27,
"value": -0.15980844
},
{
"source": 10,
"target": 28,
"value": -0.84685767700000003
},
{
"source": 11,
"target": 0,
"value": -0.58688790999999996
},
{
"source": 11,
"target": 1,
"value": -0.18668590199999999
},
{
"source": 11,
"target": 2,
"value": -3.5185292100000001
},
{
"source": 11,
"target": 3,
"value": 0.25062883400000002
},
{
"source": 11,
"target": 4,
"value": -0.47777353700000003
},
{
"source": 11,
"target": 5,
"value": -0.62381107000000002
},
{
"source": 11,
"target": 6,
"value": -0.92202388000000002
},
{
"source": 11,
"target": 7,
"value": -0.55383453000000005
},
{
"source": 11,
"target": 8,
"value": 0.018847867000000001
},
{
"source": 11,
"target": 9,
"value": 1.2676445569999999
},
{
"source": 11,
"target": 10,
"value": 0.243732055
},
{
"source": 11,
"target": 11,
"value": -0.23352827300000001
},
{
"source": 11,
"target": 12,
"value": 0.070726356000000004
},
{
"source": 11,
"target": 13,
"value": -0.25636019799999998
},
{
"source": 11,
"target": 14,
"value": 1.7410016070000001
},
{
"source": 11,
"target": 15,
"value": 0.168247379
},
{
"source": 11,
"target": 16,
"value": -0.24597429900000001
},
{
"source": 11,
"target": 17,
"value": 0.014972759
},
{
"source": 11,
"target": 18,
"value": -0.53762378700000002
},
{
"source": 11,
"target": 19,
"value": 0.25936495700000001
},
{
"source": 11,
"target": 20,
"value": 1.3031904919999999
},
{
"source": 11,
"target": 21,
"value": 1.0432080239999999
},
{
"source": 11,
"target": 22,
"value": -1.0210949460000001
},
{
"source": 11,
"target": 23,
"value": -0.097444212000000002
},
{
"source": 11,
"target": 24,
"value": -0.67929059300000005
},
{
"source": 11,
"target": 25,
"value": 0.13259257599999999
},
{
"source": 11,
"target": 26,
"value": -0.440607517
},
{
"source": 11,
"target": 27,
"value": -0.21005683999999999
},
{
"source": 11,
"target": 28,
"value": 0.65131199500000003
},
{
"source": 12,
"target": 0,
"value": -0.69363978500000001
},
{
"source": 12,
"target": 1,
"value": -0.357559299
},
{
"source": 12,
"target": 2,
"value": -0.90386126200000005
},
{
"source": 12,
"target": 3,
"value": -0.810450279
},
{
"source": 12,
"target": 4,
"value": 0.29377546100000002
},
{
"source": 12,
"target": 5,
"value": 1.012469252
},
{
"source": 12,
"target": 6,
"value": -0.10446229999999999
},
{
"source": 12,
"target": 7,
"value": -0.57375716099999996
},
{
"source": 12,
"target": 8,
"value": -0.62946799799999997
},
{
"source": 12,
"target": 9,
"value": -1.1311389380000001
},
{
"source": 12,
"target": 10,
"value": -0.401984075
},
{
"source": 12,
"target": 11,
"value": -0.67255456400000002
},
{
"source": 12,
"target": 12,
"value": -1.1827919739999999
},
{
"source": 12,
"target": 13,
"value": -1.0013804100000001
},
{
"source": 12,
"target": 14,
"value": -1.0202160929999999
},
{
"source": 12,
"target": 15,
"value": -0.43779921300000002
},
{
"source": 12,
"target": 16,
"value": -0.103783602
},
{
"source": 12,
"target": 17,
"value": -0.387565928
},
{
"source": 12,
"target": 18,
"value": 0.38647177199999999
},
{
"source": 12,
"target": 19,
"value": -0.52474217499999998
},
{
"source": 12,
"target": 20,
"value": 3.6270702479999999
},
{
"source": 12,
"target": 21,
"value": -0.84655080599999999
},
{
"source": 12,
"target": 22,
"value": -0.473736661
},
{
"source": 12,
"target": 23,
"value": 0.44338891899999999
},
{
"source": 12,
"target": 24,
"value": 0.76613525699999996
},
{
"source": 12,
"target": 25,
"value": 0.19368301499999999
},
{
"source": 12,
"target": 26,
"value": -0.61475726799999997
},
{
"source": 12,
"target": 27,
"value": -0.38290617100000002
},
{
"source": 12,
"target": 28,
"value": -0.86441041100000005
},
{
"source": 13,
"target": 0,
"value": 0.32720359399999999
},
{
"source": 13,
"target": 1,
"value": 0.85731930099999998
},
{
"source": 13,
"target": 2,
"value": -1.3973565960000001
},
{
"source": 13,
"target": 3,
"value": -0.22668358499999999
},
{
"source": 13,
"target": 4,
"value": -0.98605145500000002
},
{
"source": 13,
"target": 5,
"value": 0.43834350500000002
},
{
"source": 13,
"target": 6,
"value": 0.095527129000000002
},
{
"source": 13,
"target": 7,
"value": 5.598772308
},
{
"source": 13,
"target": 8,
"value": 0.53502579699999997
},
{
"source": 13,
"target": 9,
"value": -0.057479225000000002
},
{
"source": 13,
"target": 10,
"value": -0.089086931999999994
},
{
"source": 13,
"target": 11,
"value": -0.47329101099999998
},
{
"source": 13,
"target": 12,
"value": 2.070252907
},
{
"source": 13,
"target": 13,
"value": 0.20140988800000001
},
{
"source": 13,
"target": 14,
"value": 1.1347281330000001
},
{
"source": 13,
"target": 15,
"value": 0.095734104
},
{
"source": 13,
"target": 16,
"value": 0.22916067000000001
},
{
"source": 13,
"target": 17,
"value": 0.56664970199999998
},
{
"source": 13,
"target": 18,
"value": 1.0118896630000001
},
{
"source": 13,
"target": 19,
"value": 0.90234255600000002
},
{
"source": 13,
"target": 20,
"value": 0.73551030399999995
},
{
"source": 13,
"target": 21,
"value": -0.49353851700000001
},
{
"source": 13,
"target": 22,
"value": 3.1769186020000002
},
{
"source": 13,
"target": 23,
"value": 0.49004573699999998
},
{
"source": 13,
"target": 24,
"value": -0.69349568900000003
},
{
"source": 13,
"target": 25,
"value": -0.18370487799999999
},
{
"source": 13,
"target": 26,
"value": -0.18235684399999999
},
{
"source": 13,
"target": 27,
"value": 0.74472876899999996
},
{
"source": 13,
"target": 28,
"value": -0.31106439200000002
},
{
"source": 14,
"target": 0,
"value": 0.331108191
},
{
"source": 14,
"target": 1,
"value": -0.46797839699999999
},
{
"source": 14,
"target": 2,
"value": 0.68111232899999996
},
{
"source": 14,
"target": 3,
"value": -1.1959141209999999
},
{
"source": 14,
"target": 4,
"value": -0.53846195699999999
},
{
"source": 14,
"target": 5,
"value": 3.6165422039999999
},
{
"source": 14,
"target": 6,
"value": 0.094919880999999998
},
{
"source": 14,
"target": 7,
"value": 0.52735755299999998
},
{
"source": 14,
"target": 8,
"value": -0.16047831200000001
},
{
"source": 14,
"target": 9,
"value": -0.94044493900000004
},
{
"source": 14,
"target": 10,
"value": -1.0256896760000001
},
{
"source": 14,
"target": 11,
"value": 0.053722043999999997
},
{
"source": 14,
"target": 12,
"value": 0.081275610999999998
},
{
"source": 14,
"target": 13,
"value": -0.61633793599999998
},
{
"source": 14,
"target": 14,
"value": -0.48042056999999999
},
{
"source": 14,
"target": 15,
"value": 0.62090338199999995
},
{
"source": 14,
"target": 16,
"value": -0.72379306399999999
},
{
"source": 14,
"target": 17,
"value": -0.75964299099999999
},
{
"source": 14,
"target": 18,
"value": -0.74490074399999995
},
{
"source": 14,
"target": 19,
"value": -0.43363818999999998
},
{
"source": 14,
"target": 20,
"value": -0.80492984899999998
},
{
"source": 14,
"target": 21,
"value": 0.42902226900000001
},
{
"source": 14,
"target": 22,
"value": 0.76501298900000003
},
{
"source": 14,
"target": 23,
"value": 0.40035652500000002
},
{
"source": 14,
"target": 24,
"value": 0.20774184900000001
},
{
"source": 14,
"target": 25,
"value": 1.4743730079999999
},
{
"source": 14,
"target": 26,
"value": 0.88873428200000004
},
{
"source": 14,
"target": 27,
"value": 0.38771558099999998
},
{
"source": 14,
"target": 28,
"value": -0.62367829799999996
},
{
"source": 15,
"target": 0,
"value": 0.14118383700000001
},
{
"source": 15,
"target": 1,
"value": 0.78860835200000001
},
{
"source": 15,
"target": 2,
"value": 0.51421388000000001
},
{
"source": 15,
"target": 3,
"value": 0.52825559700000002
},
{
"source": 15,
"target": 4,
"value": 0.90623459699999998
},
{
"source": 15,
"target": 5,
"value": 0.050158065000000002
},
{
"source": 15,
"target": 6,
"value": -0.84334138199999997
},
{
"source": 15,
"target": 7,
"value": 1.44384296
},
{
"source": 15,
"target": 8,
"value": -0.25369934300000002
},
{
"source": 15,
"target": 9,
"value": 0.562537497
},
{
"source": 15,
"target": 10,
"value": -0.50592365900000003
},
{
"source": 15,
"target": 11,
"value": -6.6216301560000002
},
{
"source": 15,
"target": 12,
"value": -1.253907087
},
{
"source": 15,
"target": 13,
"value": 0.94788355599999996
},
{
"source": 15,
"target": 14,
"value": 0.39465766200000002
},
{
"source": 15,
"target": 15,
"value": 0.61312269799999997
},
{
"source": 15,
"target": 16,
"value": -0.223205762
},
{
"source": 15,
"target": 17,
"value": 0.90537373600000004
},
{
"source": 15,
"target": 18,
"value": 0.67930155400000003
},
{
"source": 15,
"target": 19,
"value": 0.85978922199999996
},
{
"source": 15,
"target": 20,
"value": -0.022354552999999999
},
{
"source": 15,
"target": 21,
"value": 1.0467260519999999
},
{
"source": 15,
"target": 22,
"value": 0.194471
},
{
"source": 15,
"target": 23,
"value": 0.35991283400000001
},
{
"source": 15,
"target": 24,
"value": -0.806348234
},
{
"source": 15,
"target": 25,
"value": 1.5866198760000001
},
{
"source": 15,
"target": 26,
"value": 0.31198582400000002
},
{
"source": 15,
"target": 27,
"value": 0.54447002700000002
},
{
"source": 15,
"target": 28,
"value": 1.479598537
},
{
"source": 16,
"target": 0,
"value": -0.52430994900000005
},
{
"source": 16,
"target": 1,
"value": -0.28599474899999999
},
{
"source": 16,
"target": 2,
"value": -0.484871681
},
{
"source": 16,
"target": 3,
"value": 0.17665518899999999
},
{
"source": 16,
"target": 4,
"value": -0.139711627
},
{
"source": 16,
"target": 5,
"value": -0.352978397
},
{
"source": 16,
"target": 6,
"value": -0.192529854
},
{
"source": 16,
"target": 7,
"value": -0.60125797299999995
},
{
"source": 16,
"target": 8,
"value": -0.42732342699999998
},
{
"source": 16,
"target": 9,
"value": 0.45940379100000001
},
{
"source": 16,
"target": 10,
"value": -0.38300099999999998
},
{
"source": 16,
"target": 11,
"value": -0.57131675299999995
},
{
"source": 16,
"target": 12,
"value": -0.38798257200000003
},
{
"source": 16,
"target": 13,
"value": -0.353945118
},
{
"source": 16,
"target": 14,
"value": -0.24031472000000001
},
{
"source": 16,
"target": 15,
"value": -0.30568552199999999
},
{
"source": 16,
"target": 16,
"value": 0.45686491499999998
},
{
"source": 16,
"target": 17,
"value": -0.134886653
},
{
"source": 16,
"target": 18,
"value": 2.1365831819999999
},
{
"source": 16,
"target": 19,
"value": -0.46312785899999998
},
{
"source": 16,
"target": 20,
"value": -0.60040839300000004
},
{
"source": 16,
"target": 21,
"value": 4.4309559180000004
},
{
"source": 16,
"target": 22,
"value": -0.37477277399999998
},
{
"source": 16,
"target": 23,
"value": -0.20685310600000001
},
{
"source": 16,
"target": 24,
"value": 1.7561045209999999
},
{
"source": 16,
"target": 25,
"value": 0.83288728899999998
},
{
"source": 16,
"target": 26,
"value": -0.31439217600000002
},
{
"source": 16,
"target": 27,
"value": -0.31373741999999999
},
{
"source": 16,
"target": 28,
"value": 0.49342028300000002
},
{
"source": 17,
"target": 0,
"value": 0.50959217400000001
},
{
"source": 17,
"target": 1,
"value": 0.46477431499999999
},
{
"source": 17,
"target": 2,
"value": 0.27549570400000001
},
{
"source": 17,
"target": 3,
"value": -0.018822530000000001
},
{
"source": 17,
"target": 4,
"value": -0.0055377919999999997
},
{
"source": 17,
"target": 5,
"value": -0.45719786600000001
},
{
"source": 17,
"target": 6,
"value": 3.408253083
},
{
"source": 17,
"target": 7,
"value": -0.43040764300000001
},
{
"source": 17,
"target": 8,
"value": -0.75418608200000004
},
{
"source": 17,
"target": 9,
"value": -0.83653085500000002
},
{
"source": 17,
"target": 10,
"value": -0.27705395700000002
},
{
"source": 17,
"target": 11,
"value": -0.54257842999999994
},
{
"source": 17,
"target": 12,
"value": 0.85043957699999995
},
{
"source": 17,
"target": 13,
"value": -0.29898144900000001
},
{
"source": 17,
"target": 14,
"value": -0.16939480900000001
},
{
"source": 17,
"target": 15,
"value": 0.25478336899999998
},
{
"source": 17,
"target": 16,
"value": -0.42782175500000003
},
{
"source": 17,
"target": 17,
"value": -0.1389465
},
{
"source": 17,
"target": 18,
"value": 0.61806913500000005
},
{
"source": 17,
"target": 19,
"value": 1.9263498969999999
},
{
"source": 17,
"target": 20,
"value": -0.30539991799999999
},
{
"source": 17,
"target": 21,
"value": -0.53593921499999997
},
{
"source": 17,
"target": 22,
"value": -0.078661666000000005
},
{
"source": 17,
"target": 23,
"value": 6.2678544650000001
},
{
"source": 17,
"target": 24,
"value": -0.57293844000000005
},
{
"source": 17,
"target": 25,
"value": -0.30216860899999998
},
{
"source": 17,
"target": 26,
"value": 0.72307511999999996
},
{
"source": 17,
"target": 27,
"value": 0.61186300299999996
},
{
"source": 17,
"target": 28,
"value": -0.2145995
},
{
"source": 18,
"target": 0,
"value": -0.55444711099999999
},
{
"source": 18,
"target": 1,
"value": -0.14575348499999999
},
{
"source": 18,
"target": 2,
"value": 0.019807701
},
{
"source": 18,
"target": 3,
"value": -0.63491572699999999
},
{
"source": 18,
"target": 4,
"value": -0.49376688699999999
},
{
"source": 18,
"target": 5,
"value": -0.58764496799999999
},
{
"source": 18,
"target": 6,
"value": -0.223714996
},
{
"source": 18,
"target": 7,
"value": 1.3850494760000001
},
{
"source": 18,
"target": 8,
"value": -0.34610075499999998
},
{
"source": 18,
"target": 9,
"value": 0.25453660900000002
},
{
"source": 18,
"target": 10,
"value": 0.057887318
},
{
"source": 18,
"target": 11,
"value": -0.59308136600000005
},
{
"source": 18,
"target": 12,
"value": -0.47065184999999998
},
{
"source": 18,
"target": 13,
"value": -0.75394409500000004
},
{
"source": 18,
"target": 14,
"value": -0.044570502999999997
},
{
"source": 18,
"target": 15,
"value": -0.33459763599999998
},
{
"source": 18,
"target": 16,
"value": 0.339587788
},
{
"source": 18,
"target": 17,
"value": -0.13520117300000001
},
{
"source": 18,
"target": 18,
"value": -0.111896921
},
{
"source": 18,
"target": 19,
"value": 4.913848539
},
{
"source": 18,
"target": 20,
"value": -0.54275004599999999
},
{
"source": 18,
"target": 21,
"value": -0.27783299
},
{
"source": 18,
"target": 22,
"value": -0.68909758200000004
},
{
"source": 18,
"target": 23,
"value": -0.21668800599999999
},
{
"source": 18,
"target": 24,
"value": 1.1276998570000001
},
{
"source": 18,
"target": 25,
"value": 0.035887469999999998
},
{
"source": 18,
"target": 26,
"value": -0.070416155999999994
},
{
"source": 18,
"target": 27,
"value": -0.553268062
},
{
"source": 18,
"target": 28,
"value": -0.97742768899999999
},
{
"source": 19,
"target": 0,
"value": -0.53083174300000002
},
{
"source": 19,
"target": 1,
"value": -0.26087360700000001
},
{
"source": 19,
"target": 2,
"value": -0.46113461700000002
},
{
"source": 19,
"target": 3,
"value": -0.38905618800000002
},
{
"source": 19,
"target": 4,
"value": -0.51255542399999998
},
{
"source": 19,
"target": 5,
"value": -0.51320226800000002
},
{
"source": 19,
"target": 6,
"value": -0.337550397
},
{
"source": 19,
"target": 7,
"value": -0.44995376799999998
},
{
"source": 19,
"target": 8,
"value": -0.18484542100000001
},
{
"source": 19,
"target": 9,
"value": -0.56588065700000001
},
{
"source": 19,
"target": 10,
"value": -0.37635620199999997
},
{
"source": 19,
"target": 11,
"value": -0.28526610400000002
},
{
"source": 19,
"target": 12,
"value": -0.57050587900000005
},
{
"source": 19,
"target": 13,
"value": 3.5989506549999999
},
{
"source": 19,
"target": 14,
"value": -0.47705297099999999
},
{
"source": 19,
"target": 15,
"value": -0.36444969100000002
},
{
"source": 19,
"target": 16,
"value": -0.64891712700000004
},
{
"source": 19,
"target": 17,
"value": -0.39036308600000003
},
{
"source": 19,
"target": 18,
"value": 1.117877995
},
{
"source": 19,
"target": 19,
"value": -0.46408658600000002
},
{
"source": 19,
"target": 20,
"value": -0.45643101600000002
},
{
"source": 19,
"target": 21,
"value": -0.57101005599999999
},
{
"source": 19,
"target": 22,
"value": -0.45666879399999999
},
{
"source": 19,
"target": 23,
"value": -0.58230495000000004
},
{
"source": 19,
"target": 24,
"value": -0.42619270399999998
},
{
"source": 19,
"target": 25,
"value": -0.41116161299999998
},
{
"source": 19,
"target": 26,
"value": -0.45561860799999998
},
{
"source": 19,
"target": 27,
"value": -0.297498019
},
{
"source": 19,
"target": 28,
"value": -0.47141323000000002
},
{
"source": 20,
"target": 0,
"value": -0.64324633099999995
},
{
"source": 20,
"target": 1,
"value": 0.052021432999999999
},
{
"source": 20,
"target": 2,
"value": -0.735006626
},
{
"source": 20,
"target": 3,
"value": 0.041068843000000001
},
{
"source": 20,
"target": 4,
"value": -0.062094125
},
{
"source": 20,
"target": 5,
"value": 5.4777147160000004
},
{
"source": 20,
"target": 6,
"value": 1.256686967
},
{
"source": 20,
"target": 7,
"value": -0.13640185099999999
},
{
"source": 20,
"target": 8,
"value": 0.57726687099999996
},
{
"source": 20,
"target": 9,
"value": -0.60002564999999997
},
{
"source": 20,
"target": 10,
"value": 0.087671916000000003
},
{
"source": 20,
"target": 11,
"value": -0.56095977900000005
},
{
"source": 20,
"target": 12,
"value": -0.56490393000000005
},
{
"source": 20,
"target": 13,
"value": -0.62926160200000003
},
{
"source": 20,
"target": 14,
"value": -0.21422648699999999
},
{
"source": 20,
"target": 15,
"value": 0.09929963
},
{
"source": 20,
"target": 16,
"value": -0.095715004000000006
},
{
"source": 20,
"target": 17,
"value": -0.63285634499999999
},
{
"source": 20,
"target": 18,
"value": 1.09320354
},
{
"source": 20,
"target": 19,
"value": 0.38697641900000002
},
{
"source": 20,
"target": 20,
"value": -0.37472007600000001
},
{
"source": 20,
"target": 21,
"value": -0.56495722900000001
},
{
"source": 20,
"target": 22,
"value": 1.6808954890000001
},
{
"source": 20,
"target": 23,
"value": 0.50849889100000001
},
{
"source": 20,
"target": 24,
"value": 0.91660424699999998
},
{
"source": 20,
"target": 25,
"value": -0.607497709
},
{
"source": 20,
"target": 26,
"value": 0.58989289
},
{
"source": 20,
"target": 27,
"value": -0.122764837
},
{
"source": 20,
"target": 28,
"value": -0.53365106399999995
},
{
"source": 21,
"target": 0,
"value": -0.69386802700000005
},
{
"source": 21,
"target": 1,
"value": 0.57619653000000004
},
{
"source": 21,
"target": 2,
"value": -0.48854103700000001
},
{
"source": 21,
"target": 3,
"value": -0.60094857999999995
},
{
"source": 21,
"target": 4,
"value": 1.1395984969999999
},
{
"source": 21,
"target": 5,
"value": -0.024286993
},
{
"source": 21,
"target": 6,
"value": -0.28819455900000002
},
{
"source": 21,
"target": 7,
"value": -0.499250839
},
{
"source": 21,
"target": 8,
"value": 0.103697413
},
{
"source": 21,
"target": 9,
"value": -1.0447161570000001
},
{
"source": 21,
"target": 10,
"value": -1.0242750700000001
},
{
"source": 21,
"target": 11,
"value": 3.023003444
},
{
"source": 21,
"target": 12,
"value": 3.8590288730000002
},
{
"source": 21,
"target": 13,
"value": 0.74297844199999996
},
{
"source": 21,
"target": 14,
"value": -0.35272281900000002
},
{
"source": 21,
"target": 15,
"value": 0.069205382999999995
},
{
"source": 21,
"target": 16,
"value": -1.117741919
},
{
"source": 21,
"target": 17,
"value": 0.651553716
},
{
"source": 21,
"target": 18,
"value": -0.36476851100000002
},
{
"source": 21,
"target": 19,
"value": -0.54726909999999995
},
{
"source": 21,
"target": 20,
"value": -0.73572871900000003
},
{
"source": 21,
"target": 21,
"value": -0.62379767100000005
},
{
"source": 21,
"target": 22,
"value": -0.10537063300000001
},
{
"source": 21,
"target": 23,
"value": -0.13943154899999999
},
{
"source": 21,
"target": 24,
"value": -0.055372647999999997
},
{
"source": 21,
"target": 25,
"value": 0.77444983099999998
},
{
"source": 21,
"target": 26,
"value": 0.53898734100000001
},
{
"source": 21,
"target": 27,
"value": 0.35514519
},
{
"source": 21,
"target": 28,
"value": -1.4538640700000001
},
{
"source": 22,
"target": 0,
"value": 0.0065318859999999998
},
{
"source": 22,
"target": 1,
"value": 0.564826732
},
{
"source": 22,
"target": 2,
"value": 3.6953185240000002
},
{
"source": 22,
"target": 3,
"value": 0.31625503300000002
},
{
"source": 22,
"target": 4,
"value": -0.26873777399999998
},
{
"source": 22,
"target": 5,
"value": 0.93646150500000003
},
{
"source": 22,
"target": 6,
"value": 0.22915170000000001
},
{
"source": 22,
"target": 7,
"value": 0.64957900700000004
},
{
"source": 22,
"target": 8,
"value": -0.33010359500000003
},
{
"source": 22,
"target": 9,
"value": -0.50453450499999997
},
{
"source": 22,
"target": 10,
"value": 0.26472923700000001
},
{
"source": 22,
"target": 11,
"value": -0.97722804299999999
},
{
"source": 22,
"target": 12,
"value": 0.49363216900000001
},
{
"source": 22,
"target": 13,
"value": -0.401821398
},
{
"source": 22,
"target": 14,
"value": -0.28623177900000002
},
{
"source": 22,
"target": 15,
"value": 0.14337127799999999
},
{
"source": 22,
"target": 16,
"value": -0.36023153200000002
},
{
"source": 22,
"target": 17,
"value": 0.34076271699999999
},
{
"source": 22,
"target": 18,
"value": 0.63316251199999996
},
{
"source": 22,
"target": 19,
"value": -0.71053050200000001
},
{
"source": 22,
"target": 20,
"value": -1.334690191
},
{
"source": 22,
"target": 21,
"value": 0.158108045
},
{
"source": 22,
"target": 22,
"value": -0.34782043499999998
},
{
"source": 22,
"target": 23,
"value": -0.074497061000000003
},
{
"source": 22,
"target": 24,
"value": -0.97050771599999996
},
{
"source": 22,
"target": 25,
"value": -0.26479443000000003
},
{
"source": 22,
"target": 26,
"value": -0.298648517
},
{
"source": 22,
"target": 27,
"value": -0.10090871999999999
},
{
"source": 22,
"target": 28,
"value": -0.11742112
},
{
"source": 23,
"target": 0,
"value": -0.18569540500000001
},
{
"source": 23,
"target": 1,
"value": -0.17375879899999999
},
{
"source": 23,
"target": 2,
"value": 0.084357105000000002
},
{
"source": 23,
"target": 3,
"value": 1.8265026559999999
},
{
"source": 23,
"target": 4,
"value": 0.0081671899999999995
},
{
"source": 23,
"target": 5,
"value": -1.102148634
},
{
"source": 23,
"target": 6,
"value": 0.29900253599999999
},
{
"source": 23,
"target": 7,
"value": 0.45884818599999999
},
{
"source": 23,
"target": 8,
"value": 0.29250880600000001
},
{
"source": 23,
"target": 9,
"value": 0.110508201
},
{
"source": 23,
"target": 10,
"value": 0.083592283000000003
},
{
"source": 23,
"target": 11,
"value": -0.49433306300000002
},
{
"source": 23,
"target": 12,
"value": -0.117947546
},
{
"source": 23,
"target": 13,
"value": -0.53971248100000002
},
{
"source": 23,
"target": 14,
"value": -0.106334279
},
{
"source": 23,
"target": 15,
"value": -0.40308300200000002
},
{
"source": 23,
"target": 16,
"value": -0.78947338099999997
},
{
"source": 23,
"target": 17,
"value": 1.0417873630000001
},
{
"source": 23,
"target": 18,
"value": 1.70041072
},
{
"source": 23,
"target": 19,
"value": -0.29395186699999998
},
{
"source": 23,
"target": 20,
"value": 4.8395247579999996
},
{
"source": 23,
"target": 21,
"value": 1.0154808150000001
},
{
"source": 23,
"target": 22,
"value": 0.84118853400000004
},
{
"source": 23,
"target": 23,
"value": -0.62038976400000001
},
{
"source": 23,
"target": 24,
"value": -0.56558376399999999
},
{
"source": 23,
"target": 25,
"value": -0.262366184
},
{
"source": 23,
"target": 26,
"value": 0.22642531499999999
},
{
"source": 23,
"target": 27,
"value": -0.048000565000000002
},
{
"source": 23,
"target": 28,
"value": 1.1262493730000001
},
{
"source": 24,
"target": 0,
"value": 0.184462349
},
{
"source": 24,
"target": 1,
"value": -0.52603787099999999
},
{
"source": 24,
"target": 2,
"value": 0.43208727200000002
},
{
"source": 24,
"target": 3,
"value": -0.882311913
},
{
"source": 24,
"target": 4,
"value": 0.246356093
},
{
"source": 24,
"target": 5,
"value": 0.85875452100000005
},
{
"source": 24,
"target": 6,
"value": 0.052858018999999999
},
{
"source": 24,
"target": 7,
"value": -1.118340603
},
{
"source": 24,
"target": 8,
"value": -0.84694881600000005
},
{
"source": 24,
"target": 9,
"value": -0.77882407499999995
},
{
"source": 24,
"target": 10,
"value": 3.525192777
},
{
"source": 24,
"target": 11,
"value": -1.872745007
},
{
"source": 24,
"target": 12,
"value": -0.77975643500000003
},
{
"source": 24,
"target": 13,
"value": -1.0396393989999999
},
{
"source": 24,
"target": 14,
"value": -0.59333431000000003
},
{
"source": 24,
"target": 15,
"value": 0.40215600699999998
},
{
"source": 24,
"target": 16,
"value": -1.387426464
},
{
"source": 24,
"target": 17,
"value": -0.14543505100000001
},
{
"source": 24,
"target": 18,
"value": -0.46497242999999999
},
{
"source": 24,
"target": 19,
"value": -0.22106446099999999
},
{
"source": 24,
"target": 20,
"value": -0.86148364799999999
},
{
"source": 24,
"target": 21,
"value": 0.125415634
},
{
"source": 24,
"target": 22,
"value": -0.19184911599999999
},
{
"source": 24,
"target": 23,
"value": 2.3744602970000002
},
{
"source": 24,
"target": 24,
"value": -0.74142143999999999
},
{
"source": 24,
"target": 25,
"value": 0.76543939999999999
},
{
"source": 24,
"target": 26,
"value": 1.029796862
},
{
"source": 24,
"target": 27,
"value": 0.033078660000000003
},
{
"source": 24,
"target": 28,
"value": 0.44066581999999999
},
{
"source": 25,
"target": 0,
"value": 1.7603014480000001
},
{
"source": 25,
"target": 1,
"value": -0.91225965200000003
},
{
"source": 25,
"target": 2,
"value": -1.1633458889999999
},
{
"source": 25,
"target": 3,
"value": -0.96589166400000004
},
{
"source": 25,
"target": 4,
"value": -0.79515341399999995
},
{
"source": 25,
"target": 5,
"value": -0.61630033900000003
},
{
"source": 25,
"target": 6,
"value": -1.3607439969999999
},
{
"source": 25,
"target": 7,
"value": -1.4482918769999999
},
{
"source": 25,
"target": 8,
"value": -0.024088934999999999
},
{
"source": 25,
"target": 9,
"value": -1.1888687929999999
},
{
"source": 25,
"target": 10,
"value": -0.229906845
},
{
"source": 25,
"target": 11,
"value": 2.1814891429999999
},
{
"source": 25,
"target": 12,
"value": -1.1544356840000001
},
{
"source": 25,
"target": 13,
"value": 6.28292787
},
{
"source": 25,
"target": 14,
"value": -0.303782002
},
{
"source": 25,
"target": 15,
"value": -0.16556892500000001
},
{
"source": 25,
"target": 16,
"value": -1.126153349
},
{
"source": 25,
"target": 17,
"value": 1.678721355
},
{
"source": 25,
"target": 18,
"value": -1.6835607930000001
},
{
"source": 25,
"target": 19,
"value": -0.86406354799999996
},
{
"source": 25,
"target": 20,
"value": -0.025445472
},
{
"source": 25,
"target": 21,
"value": 1.8909462189999999
},
{
"source": 25,
"target": 22,
"value": 0.66780598800000002
},
{
"source": 25,
"target": 23,
"value": -0.62576438099999998
},
{
"source": 25,
"target": 24,
"value": -1.0633403130000001
},
{
"source": 25,
"target": 25,
"value": 3.2228168030000002
},
{
"source": 25,
"target": 26,
"value": -0.0013596190000000001
},
{
"source": 25,
"target": 27,
"value": -0.203661756
},
{
"source": 25,
"target": 28,
"value": 0.18766992399999999
},
{
"source": 26,
"target": 0,
"value": -0.073643550000000002
},
{
"source": 26,
"target": 1,
"value": -0.103789279
},
{
"source": 26,
"target": 2,
"value": -0.17130483599999999
},
{
"source": 26,
"target": 3,
"value": 0.35191006499999999
},
{
"source": 26,
"target": 4,
"value": 0.63677969000000001
},
{
"source": 26,
"target": 5,
"value": -0.136732984
},
{
"source": 26,
"target": 6,
"value": 0.35683081500000002
},
{
"source": 26,
"target": 7,
"value": 3.8891158240000001
},
{
"source": 26,
"target": 8,
"value": 0.64544252599999996
},
{
"source": 26,
"target": 9,
"value": 1.366358918
},
{
"source": 26,
"target": 10,
"value": 0.99531924400000005
},
{
"source": 26,
"target": 11,
"value": 5.6086854019999999
},
{
"source": 26,
"target": 12,
"value": 1.101919141
},
{
"source": 26,
"target": 13,
"value": -0.55490056799999998
},
{
"source": 26,
"target": 14,
"value": 0.087820649000000001
},
{
"source": 26,
"target": 15,
"value": 0.061305127000000001
},
{
"source": 26,
"target": 16,
"value": 1.931275557
},
{
"source": 26,
"target": 17,
"value": -0.69241757400000004
},
{
"source": 26,
"target": 18,
"value": -0.481807702
},
{
"source": 26,
"target": 19,
"value": -0.16288734999999999
},
{
"source": 26,
"target": 20,
"value": -0.53829818900000004
},
{
"source": 26,
"target": 21,
"value": 2.4404122450000001
},
{
"source": 26,
"target": 22,
"value": 0.80427460500000003
},
{
"source": 26,
"target": 23,
"value": -0.60552619500000004
},
{
"source": 26,
"target": 24,
"value": 1.788457016
},
{
"source": 26,
"target": 25,
"value": -0.37652092199999998
},
{
"source": 26,
"target": 26,
"value": 0.35819202
},
{
"source": 26,
"target": 27,
"value": 0.164487781
},
{
"source": 26,
"target": 28,
"value": 3.7193067630000001
},
{
"source": 27,
"target": 0,
"value": -0.75152674100000005
},
{
"source": 27,
"target": 1,
"value": 0.49762292000000002
},
{
"source": 27,
"target": 2,
"value": -0.14253465800000001
},
{
"source": 27,
"target": 3,
"value": -0.882124083
},
{
"source": 27,
"target": 4,
"value": -1.151282849
},
{
"source": 27,
"target": 5,
"value": 2.3079071880000002
},
{
"source": 27,
"target": 6,
"value": -0.12032084999999999
},
{
"source": 27,
"target": 7,
"value": -0.351269532
},
{
"source": 27,
"target": 8,
"value": -1.5261785640000001
},
{
"source": 27,
"target": 9,
"value": -0.75326842800000005
},
{
"source": 27,
"target": 10,
"value": 3.600861739
},
{
"source": 27,
"target": 11,
"value": -1.2239958529999999
},
{
"source": 27,
"target": 12,
"value": -0.60722942400000002
},
{
"source": 27,
"target": 13,
"value": -0.027417898
},
{
"source": 27,
"target": 14,
"value": 0.190161632
},
{
"source": 27,
"target": 15,
"value": 0.61055040800000004
},
{
"source": 27,
"target": 16,
"value": 0.149796331
},
{
"source": 27,
"target": 17,
"value": -0.122879865
},
{
"source": 27,
"target": 18,
"value": 0.24786596299999999
},
{
"source": 27,
"target": 19,
"value": -0.40483370800000001
},
{
"source": 27,
"target": 20,
"value": 0.73692975400000005
},
{
"source": 27,
"target": 21,
"value": -0.94427506800000005
},
{
"source": 27,
"target": 22,
"value": -0.078919294000000001
},
{
"source": 27,
"target": 23,
"value": 0.66164800499999998
},
{
"source": 27,
"target": 24,
"value": -0.24494877900000001
},
{
"source": 27,
"target": 25,
"value": 3.0515346019999998
},
{
"source": 27,
"target": 26,
"value": -0.10736522799999999
},
{
"source": 27,
"target": 27,
"value": 0.36753640799999998
},
{
"source": 27,
"target": 28,
"value": -1.5179858239999999
},
{
"source": 28,
"target": 0,
"value": -0.31236414000000001
},
{
"source": 28,
"target": 1,
"value": 0.70125708899999994
},
{
"source": 28,
"target": 2,
"value": 0.47520812000000001
},
{
"source": 28,
"target": 3,
"value": -0.58529705399999998
},
{
"source": 28,
"target": 4,
"value": -0.122694283
},
{
"source": 28,
"target": 5,
"value": -0.86687513699999996
},
{
"source": 28,
"target": 6,
"value": 0.36793952299999999
},
{
"source": 28,
"target": 7,
"value": -0.48110370600000002
},
{
"source": 28,
"target": 8,
"value": 2.0722377110000001
},
{
"source": 28,
"target": 9,
"value": 10.29186436
},
{
"source": 28,
"target": 10,
"value": 1.298805701
},
{
"source": 28,
"target": 11,
"value": -0.62817591699999997
},
{
"source": 28,
"target": 12,
"value": -0.17308437500000001
},
{
"source": 28,
"target": 13,
"value": -0.027107550000000001
},
{
"source": 28,
"target": 14,
"value": 0.355169073
},
{
"source": 28,
"target": 15,
"value": 0.47045690499999998
},
{
"source": 28,
"target": 16,
"value": 0.121400231
},
{
"source": 28,
"target": 17,
"value": 0.374924602
},
{
"source": 28,
"target": 18,
"value": -0.27830734099999999
},
{
"source": 28,
"target": 19,
"value": -0.55374626599999999
},
{
"source": 28,
"target": 20,
"value": -0.93515655799999997
},
{
"source": 28,
"target": 21,
"value": -0.042420296000000003
},
{
"source": 28,
"target": 22,
"value": -0.47947990200000001
},
{
"source": 28,
"target": 23,
"value": -0.33240088600000001
},
{
"source": 28,
"target": 24,
"value": -0.71001701100000003
},
{
"source": 28,
"target": 25,
"value": 1.8739317550000001
},
{
"source": 28,
"target": 26,
"value": 0.20455442900000001
},
{
"source": 28,
"target": 27,
"value": -0.32315245999999997
},
{
"source": 28,
"target": 28,
"value": 0.18757252099999999
},
{
"source": 29,
"target": 0,
"value": 0.11931136000000001
},
{
"source": 29,
"target": 1,
"value": 0.593670684
},
{
"source": 29,
"target": 2,
"value": 0.48915277099999999
},
{
"source": 29,
"target": 3,
"value": 0.84168334499999997
},
{
"source": 29,
"target": 4,
"value": 1.0646737479999999
},
{
"source": 29,
"target": 5,
"value": 0.095113499000000004
},
{
"source": 29,
"target": 6,
"value": 1.050152022
},
{
"source": 29,
"target": 7,
"value": 1.8914884270000001
},
{
"source": 29,
"target": 8,
"value": -5.5283552
},
{
"source": 29,
"target": 9,
"value": 0.64306832000000003
},
{
"source": 29,
"target": 10,
"value": -1.100026181
},
{
"source": 29,
"target": 11,
"value": 0.76571093499999998
},
{
"source": 29,
"target": 12,
"value": 1.165406655
},
{
"source": 29,
"target": 13,
"value": 0.30638632999999998
},
{
"source": 29,
"target": 14,
"value": -1.3658942620000001
},
{
"source": 29,
"target": 15,
"value": 0.63549229100000004
},
{
"source": 29,
"target": 16,
"value": -0.37779861599999998
},
{
"source": 29,
"target": 17,
"value": 0.52166530899999997
},
{
"source": 29,
"target": 18,
"value": -0.60849743300000003
},
{
"source": 29,
"target": 19,
"value": 0.39848412799999999
},
{
"source": 29,
"target": 20,
"value": -0.988354968
},
{
"source": 29,
"target": 21,
"value": 1.36349214
},
{
"source": 29,
"target": 22,
"value": 1.3626978300000001
},
{
"source": 29,
"target": 23,
"value": -0.112291585
},
{
"source": 29,
"target": 24,
"value": -0.26271999499999998
},
{
"source": 29,
"target": 25,
"value": 0.50352405899999997
},
{
"source": 29,
"target": 26,
"value": 0.498006014
},
{
"source": 29,
"target": 27,
"value": 1.5259420050000001
},
{
"source": 29,
"target": 28,
"value": 0.33918921200000002
},
{
"source": 30,
"target": 0,
"value": -0.29426382400000001
},
{
"source": 30,
"target": 1,
"value": -0.618071649
},
{
"source": 30,
"target": 2,
"value": -0.25253411399999998
},
{
"source": 30,
"target": 3,
"value": -0.78660675999999996
},
{
"source": 30,
"target": 4,
"value": -0.22802666399999999
},
{
"source": 30,
"target": 5,
"value": 0.97786079400000003
},
{
"source": 30,
"target": 6,
"value": -1.2004498320000001
},
{
"source": 30,
"target": 7,
"value": -0.22037930999999999
},
{
"source": 30,
"target": 8,
"value": -0.240489906
},
{
"source": 30,
"target": 9,
"value": -0.201675468
},
{
"source": 30,
"target": 10,
"value": 1.4759893799999999
},
{
"source": 30,
"target": 11,
"value": -0.55700056799999997
},
{
"source": 30,
"target": 12,
"value": -0.50255320400000003
},
{
"source": 30,
"target": 13,
"value": -0.437501309
},
{
"source": 30,
"target": 14,
"value": 0.966927023
},
{
"source": 30,
"target": 15,
"value": 0.37967009699999998
},
{
"source": 30,
"target": 16,
"value": 0.048795578999999999
},
{
"source": 30,
"target": 17,
"value": 0.25062286900000003
},
{
"source": 30,
"target": 18,
"value": 2.9610247140000001
},
{
"source": 30,
"target": 19,
"value": 2.299033235
},
{
"source": 30,
"target": 20,
"value": -1.210659274
},
{
"source": 30,
"target": 21,
"value": 0.41865514100000001
},
{
"source": 30,
"target": 22,
"value": 1.1619540049999999
},
{
"source": 30,
"target": 23,
"value": -0.15700654
},
{
"source": 30,
"target": 24,
"value": -1.2541429369999999
},
{
"source": 30,
"target": 25,
"value": -0.57455805500000001
},
{
"source": 30,
"target": 26,
"value": -0.66243827499999997
},
{
"source": 30,
"target": 27,
"value": 3.702617515
},
{
"source": 30,
"target": 28,
"value": -0.35302723000000003
},
{
"source": 31,
"target": 0,
"value": -0.00086380199999999999
},
{
"source": 31,
"target": 1,
"value": 0.73563838299999995
},
{
"source": 31,
"target": 2,
"value": -0.680289747
},
{
"source": 31,
"target": 3,
"value": 0.040925843000000003
},
{
"source": 31,
"target": 4,
"value": 0.35933022799999997
},
{
"source": 31,
"target": 5,
"value": -1.5874002949999999
},
{
"source": 31,
"target": 6,
"value": -1.0416860809999999
},
{
"source": 31,
"target": 7,
"value": 0.071551407999999997
},
{
"source": 31,
"target": 8,
"value": -0.16832266500000001
},
{
"source": 31,
"target": 9,
"value": -1.3773033079999999
},
{
"source": 31,
"target": 10,
"value": 3.6045390890000002
},
{
"source": 31,
"target": 11,
"value": -0.0046010679999999998
},
{
"source": 31,
"target": 12,
"value": 1.527568732
},
{
"source": 31,
"target": 13,
"value": -0.30015470700000002
},
{
"source": 31,
"target": 14,
"value": -0.78613550899999995
},
{
"source": 31,
"target": 15,
"value": -0.13805092399999999
},
{
"source": 31,
"target": 16,
"value": -0.36648041799999997
},
{
"source": 31,
"target": 17,
"value": -0.79697020600000001
},
{
"source": 31,
"target": 18,
"value": -0.030155543999999999
},
{
"source": 31,
"target": 19,
"value": 0.80310005600000001
},
{
"source": 31,
"target": 20,
"value": 0.68314556100000001
},
{
"source": 31,
"target": 21,
"value": -0.90070815400000004
},
{
"source": 31,
"target": 22,
"value": 0.15251076999999999
},
{
"source": 31,
"target": 23,
"value": 0.14009201099999999
},
{
"source": 31,
"target": 24,
"value": 0.37681542099999998
},
{
"source": 31,
"target": 25,
"value": -1.214319621
},
{
"source": 31,
"target": 26,
"value": 1.3261974649999999
},
{
"source": 31,
"target": 27,
"value": 1.5230702789999999
},
{
"source": 31,
"target": 28,
"value": -1.312001824
},
{
"source": 32,
"target": 0,
"value": -0.27673681900000002
},
{
"source": 32,
"target": 1,
"value": -0.42608088700000002
},
{
"source": 32,
"target": 2,
"value": -0.160160461
},
{
"source": 32,
"target": 3,
"value": -0.890032771
},
{
"source": 32,
"target": 4,
"value": -0.43740543399999998
},
{
"source": 32,
"target": 5,
"value": 0.143897214
},
{
"source": 32,
"target": 6,
"value": -0.57342595799999996
},
{
"source": 32,
"target": 7,
"value": -0.48641938099999998
},
{
"source": 32,
"target": 8,
"value": -0.53696348199999999
},
{
"source": 32,
"target": 9,
"value": -0.65704100200000004
},
{
"source": 32,
"target": 10,
"value": -0.47334541800000002
},
{
"source": 32,
"target": 11,
"value": -0.23747527900000001
},
{
"source": 32,
"target": 12,
"value": -0.66939653799999999
},
{
"source": 32,
"target": 13,
"value": -0.55943530200000002
},
{
"source": 32,
"target": 14,
"value": 0.038953301000000003
},
{
"source": 32,
"target": 15,
"value": 0.033709720999999998
},
{
"source": 32,
"target": 16,
"value": -0.34358780100000003
},
{
"source": 32,
"target": 17,
"value": -0.51321808700000004
},
{
"source": 32,
"target": 18,
"value": -0.59230331300000005
},
{
"source": 32,
"target": 19,
"value": -0.431221835
},
{
"source": 32,
"target": 20,
"value": 5.3392028969999998
},
{
"source": 32,
"target": 21,
"value": -0.49377858699999999
},
{
"source": 32,
"target": 22,
"value": -0.64500036100000002
},
{
"source": 32,
"target": 23,
"value": -0.47798486699999998
},
{
"source": 32,
"target": 24,
"value": -0.40157974600000002
},
{
"source": 32,
"target": 25,
"value": -0.62178212399999999
},
{
"source": 32,
"target": 26,
"value": -0.24939462700000001
},
{
"source": 32,
"target": 27,
"value": -0.303365249
},
{
"source": 32,
"target": 28,
"value": -0.92234330200000003
},
{
"source": 33,
"target": 0,
"value": -0.31807579000000002
},
{
"source": 33,
"target": 1,
"value": -0.81411080899999999
},
{
"source": 33,
"target": 2,
"value": 0.64654518800000005
},
{
"source": 33,
"target": 3,
"value": 0.26837169
},
{
"source": 33,
"target": 4,
"value": -9.4251209609999993
},
{
"source": 33,
"target": 5,
"value": -1.073853473
},
{
"source": 33,
"target": 6,
"value": -2.0495896259999999
},
{
"source": 33,
"target": 7,
"value": -0.34692102400000002
},
{
"source": 33,
"target": 8,
"value": 0.99728318100000002
},
{
"source": 33,
"target": 9,
"value": 0.30061925299999998
},
{
"source": 33,
"target": 10,
"value": -0.54310386399999999
},
{
"source": 33,
"target": 11,
"value": -1.1507921720000001
},
{
"source": 33,
"target": 12,
"value": -2.2830611670000001
},
{
"source": 33,
"target": 13,
"value": -0.162802216
},
{
"source": 33,
"target": 14,
"value": -1.053859713
},
{
"source": 33,
"target": 15,
"value": -1.3775417430000001
},
{
"source": 33,
"target": 16,
"value": -0.28834947399999999
},
{
"source": 33,
"target": 17,
"value": -0.92226688400000001
},
{
"source": 33,
"target": 18,
"value": -1.123953091
},
{
"source": 33,
"target": 19,
"value": -0.76295389300000005
},
{
"source": 33,
"target": 20,
"value": -0.68735714800000003
},
{
"source": 33,
"target": 21,
"value": 0.28991073000000001
},
{
"source": 33,
"target": 22,
"value": 0.317576672
},
{
"source": 33,
"target": 23,
"value": -0.34556551499999999
},
{
"source": 33,
"target": 24,
"value": 0.54168300000000003
},
{
"source": 33,
"target": 25,
"value": 0.0097540990000000004
},
{
"source": 33,
"target": 26,
"value": 0.73792005999999999
},
{
"source": 33,
"target": 27,
"value": -0.62427175199999996
},
{
"source": 33,
"target": 28,
"value": 0.100532547
},
{
"source": 34,
"target": 0,
"value": -0.67017771400000004
},
{
"source": 34,
"target": 1,
"value": 3.2245335009999998
},
{
"source": 34,
"target": 2,
"value": 0.14550955199999999
},
{
"source": 34,
"target": 3,
"value": 0.107432319
},
{
"source": 34,
"target": 4,
"value": -1.1204927389999999
},
{
"source": 34,
"target": 5,
"value": 0.288890539
},
{
"source": 34,
"target": 6,
"value": 1.549545918
},
{
"source": 34,
"target": 7,
"value": -0.342665051
},
{
"source": 34,
"target": 8,
"value": -0.017402854999999998
},
{
"source": 34,
"target": 9,
"value": -0.42000224400000002
},
{
"source": 34,
"target": 10,
"value": -0.36138745300000003
},
{
"source": 34,
"target": 11,
"value": -1.2642720750000001
},
{
"source": 34,
"target": 12,
"value": -0.79450776499999998
},
{
"source": 34,
"target": 13,
"value": -0.61994467799999997
},
{
"source": 34,
"target": 14,
"value": -0.33876780200000001
},
{
"source": 34,
"target": 15,
"value": -0.14852947799999999
},
{
"source": 34,
"target": 16,
"value": -1.078879645
},
{
"source": 34,
"target": 17,
"value": 0.13093901399999999
},
{
"source": 34,
"target": 18,
"value": -1.3078153130000001
},
{
"source": 34,
"target": 19,
"value": -1.8187984740000001
},
{
"source": 34,
"target": 20,
"value": 3.6836943369999999
},
{
"source": 34,
"target": 21,
"value": 0.920647357
},
{
"source": 34,
"target": 22,
"value": -0.84705697400000002
},
{
"source": 34,
"target": 23,
"value": -0.34379849800000001
},
{
"source": 34,
"target": 24,
"value": -1.21552566
},
{
"source": 34,
"target": 25,
"value": -0.85384533399999996
},
{
"source": 34,
"target": 26,
"value": -0.357215055
},
{
"source": 34,
"target": 27,
"value": -0.043911540999999998
},
{
"source": 34,
"target": 28,
"value": -0.95584730900000003
},
{
"source": 35,
"target": 0,
"value": -0.69525288799999996
},
{
"source": 35,
"target": 1,
"value": 4.2998771339999999
},
{
"source": 35,
"target": 2,
"value": -0.17558712600000001
},
{
"source": 35,
"target": 3,
"value": -0.061022136999999997
},
{
"source": 35,
"target": 4,
"value": -0.39164601799999998
},
{
"source": 35,
"target": 5,
"value": 3.3854510379999998
},
{
"source": 35,
"target": 6,
"value": 0.34511428799999999
},
{
"source": 35,
"target": 7,
"value": -0.50573499300000002
},
{
"source": 35,
"target": 8,
"value": -0.48295386400000001
},
{
"source": 35,
"target": 9,
"value": -0.081815585999999996
},
{
"source": 35,
"target": 10,
"value": -0.92848687900000004
},
{
"source": 35,
"target": 11,
"value": 0.976209137
},
{
"source": 35,
"target": 12,
"value": 0.099021487000000005
},
{
"source": 35,
"target": 13,
"value": 2.4946905560000001
},
{
"source": 35,
"target": 14,
"value": -1.0887427789999999
},
{
"source": 35,
"target": 15,
"value": 0.43717475099999997
},
{
"source": 35,
"target": 16,
"value": -0.50716946699999998
},
{
"source": 35,
"target": 17,
"value": 2.0287243190000002
},
{
"source": 35,
"target": 18,
"value": -0.50795424700000003
},
{
"source": 35,
"target": 19,
"value": 0.14350628100000001
},
{
"source": 35,
"target": 20,
"value": -1.19702953
},
{
"source": 35,
"target": 21,
"value": 0.61037951800000001
},
{
"source": 35,
"target": 22,
"value": 0.095879150999999996
},
{
"source": 35,
"target": 23,
"value": -0.66311872699999996
},
{
"source": 35,
"target": 24,
"value": 0.50821983999999998
},
{
"source": 35,
"target": 25,
"value": -0.74181541900000003
},
{
"source": 35,
"target": 26,
"value": 2.3853102599999998
},
{
"source": 35,
"target": 27,
"value": 0.35475035500000002
},
{
"source": 35,
"target": 28,
"value": 0.65843763399999999
},
{
"source": 36,
"target": 0,
"value": -0.33784902500000003
},
{
"source": 36,
"target": 1,
"value": -0.53526591800000001
},
{
"source": 36,
"target": 2,
"value": 0.80316045899999999
},
{
"source": 36,
"target": 3,
"value": 0.27591146500000002
},
{
"source": 36,
"target": 4,
"value": 0.98134304900000002
},
{
"source": 36,
"target": 5,
"value": -0.74845114400000001
},
{
"source": 36,
"target": 6,
"value": -0.092431408000000007
},
{
"source": 36,
"target": 7,
"value": -0.32647710400000002
},
{
"source": 36,
"target": 8,
"value": -0.38124391699999999
},
{
"source": 36,
"target": 9,
"value": -0.57534382399999995
},
{
"source": 36,
"target": 10,
"value": -0.63351617000000005
},
{
"source": 36,
"target": 11,
"value": -0.38096141100000003
},
{
"source": 36,
"target": 12,
"value": -1.720616197
},
{
"source": 36,
"target": 13,
"value": -0.85605361000000002
},
{
"source": 36,
"target": 14,
"value": -0.58095037400000005
},
{
"source": 36,
"target": 15,
"value": 0.37329311599999998
},
{
"source": 36,
"target": 16,
"value": 0.90549088600000005
},
{
"source": 36,
"target": 17,
"value": 0.13570555500000001
},
{
"source": 36,
"target": 18,
"value": 1.1077806560000001
},
{
"source": 36,
"target": 19,
"value": -0.54518314400000001
},
{
"source": 36,
"target": 20,
"value": 0.475561701
},
{
"source": 36,
"target": 21,
"value": 0.016687595999999999
},
{
"source": 36,
"target": 22,
"value": -0.17217821899999999
},
{
"source": 36,
"target": 23,
"value": 0.58518668600000001
},
{
"source": 36,
"target": 24,
"value": -0.40480013999999997
},
{
"source": 36,
"target": 25,
"value": -3.9973181489999998
},
{
"source": 36,
"target": 26,
"value": 0.71102976500000004
},
{
"source": 36,
"target": 27,
"value": -0.47088406100000002
},
{
"source": 36,
"target": 28,
"value": 0.35438629599999999
},
{
"source": 37,
"target": 0,
"value": -0.368173217
},
{
"source": 37,
"target": 1,
"value": 0.209192446
},
{
"source": 37,
"target": 2,
"value": 0.26631755499999998
},
{
"source": 37,
"target": 3,
"value": -0.10065679900000001
},
{
"source": 37,
"target": 4,
"value": -0.33679171800000002
},
{
"source": 37,
"target": 5,
"value": -0.060827204000000003
},
{
"source": 37,
"target": 6,
"value": -0.19902159899999999
},
{
"source": 37,
"target": 7,
"value": -0.76588267099999996
},
{
"source": 37,
"target": 8,
"value": -0.071476548000000001
},
{
"source": 37,
"target": 9,
"value": -0.4402703
},
{
"source": 37,
"target": 10,
"value": -0.35486839999999997
},
{
"source": 37,
"target": 11,
"value": 3.468121376
},
{
"source": 37,
"target": 12,
"value": 5.8537267140000004
},
{
"source": 37,
"target": 13,
"value": -0.46513540799999997
},
{
"source": 37,
"target": 14,
"value": 0.074434691999999997
},
{
"source": 37,
"target": 15,
"value": 7.085199705
},
{
"source": 37,
"target": 16,
"value": -0.39905057500000002
},
{
"source": 37,
"target": 17,
"value": -0.334999773
},
{
"source": 37,
"target": 18,
"value": -0.62307114699999999
},
{
"source": 37,
"target": 19,
"value": -0.40623083300000001
},
{
"source": 37,
"target": 20,
"value": 0.939058116
},
{
"source": 37,
"target": 21,
"value": -0.26953388499999997
},
{
"source": 37,
"target": 22,
"value": 0.117950503
},
{
"source": 37,
"target": 23,
"value": 0.19754730000000001
},
{
"source": 37,
"target": 24,
"value": -0.36540793100000002
},
{
"source": 37,
"target": 25,
"value": -0.056856472999999998
},
{
"source": 37,
"target": 26,
"value": 0.0019832119999999998
},
{
"source": 37,
"target": 27,
"value": 0.081609958999999996
},
{
"source": 37,
"target": 28,
"value": -0.60329985500000005
}
]
}
This file has been truncated, but you can view the full file.
{
"row_nodes": [
{
"group": [
46.0,
46.0,
46.0,
46.0,
25.0,
24.0,
9.0,
1.0,
1.0,
1.0,
1.0
],
"name": "ATF7",
"clust": 67,
"value": 0.6912280941908925,
"rank": 66,
"cl": "1.0"
},
{
"group": [
52.0,
52.0,
52.0,
52.0,
30.0,
28.0,
9.0,
1.0,
1.0,
1.0,
1.0
],
"name": "SOX30",
"clust": 73,
"value": 0.7919143465708082,
"rank": 42,
"cl": "0.0"
},
{
"group": [
48.0,
48.0,
48.0,
48.0,
27.0,
26.0,
9.0,
1.0,
1.0,
1.0,
1.0
],
"name": "KLF8",
"clust": 69,
"value": 0.765876362557045,
"rank": 64,
"cl": "0.0"
},
{
"group": [
4.0,
4.0,
4.0,
4.0,
3.0,
3.0,
2.0,
1.0,
1.0,
1.0,
1.0
],
"name": "DACH2",
"clust": 19,
"value": 0.76883972133099,
"rank": 39,
"cl": "0.0"
},
{
"group": [
40.0,
40.0,
40.0,
40.0,
24.0,
23.0,
9.0,
1.0,
1.0,
1.0,
1.0
],
"name": "TWIST2",
"clust": 61,
"value": 0.27228975805024913,
"rank": 58,
"cl": "1.0"
},
{
"group": [
46.0,
46.0,
46.0,
46.0,
25.0,
24.0,
9.0,
1.0,
1.0,
1.0,
1.0
],
"name": "ZFP42",
"clust": 68,
"value": 0.5739360993994435,
"rank": 48,
"cl": "1.0"
},
{
"group": [
37.0,
37.0,
37.0,
37.0,
22.0,
22.0,
9.0,
1.0,
1.0,
1.0,
1.0
],
"name": "FOXR2",
"clust": 52,
"value": 0.32059027136788076,
"rank": 32,
"cl": "1.0"
},
{
"group": [
47.0,
47.0,
47.0,
47.0,
26.0,
25.0,
9.0,
1.0,
1.0,
1.0,
1.0
],
"name": "CTCFL",
"clust": 55,
"value": 0.668307265281483,
"rank": 25,
"cl": "1.0"
},
{
"group": [
18.0,
18.0,
18.0,
18.0,
16.0,
16.0,
9.0,
1.0,
1.0,
1.0,
1.0
],
"name": "ZNF540",
"clust": 24,
"value": 0.817172687163869,
"rank": 51,
"cl": "0.0"
},
{
"group": [
48.0,
48.0,
48.0,
48.0,
27.0,
26.0,
9.0,
1.0,
1.0,
1.0,
1.0
],
"name": "ARX",
"clust": 70,
"value": 0.9832888767535856,
"rank": 34,
"cl": "0.0"
},
{
"group": [
13.0,
13.0,
13.0,
13.0,
11.0,
11.0,
5.0,
1.0,
1.0,
1.0,
1.0
],
"name": "DLX3",
"clust": 3,
"value": 0.5924057583760832,
"rank": 28,
"cl": "1.0"
},
{
"group": [
16.0,
16.0,
16.0,
16.0,
14.0,
14.0,
8.0,
1.0,
1.0,
1.0,
1.0
],
"name": "DLX4",
"clust": 0,
"value": 0.012374248133596777,
"rank": 53,
"cl": "1.0"
},
{
"group": [
39.0,
39.0,
39.0,
39.0,
23.0,
23.0,
9.0,
1.0,
1.0,
1.0,
1.0
],
"name": "NR0B1",
"clust": 56,
"value": 0.754519592191063,
"rank": 75,
"cl": "0.0"
},
{
"group": [
50.0,
50.0,
50.0,
50.0,
29.0,
27.0,
9.0,
1.0,
1.0,
1.0,
1.0
],
"name": "EGR4",
"clust": 54,
"value": 0.1596323978189058,
"rank": 14,
"cl": "1.0"
},
{
"group": [
21.0,
21.0,
21.0,
21.0,
17.0,
17.0,
9.0,
1.0,
1.0,
1.0,
1.0
],
"name": "EP300",
"clust": 28,
"value": 0.550286237123798,
"rank": 1,
"cl": "0.0"
},
{
"group": [
12.0,
12.0,
12.0,
12.0,
10.0,
10.0,
4.0,
1.0,
1.0,
1.0,
1.0
],
"name": "ESRRG",
"clust": 4,
"value": 0.13267360643997617,
"rank": 6,
"cl": "0.0"
},
{
"group": [
14.0,
14.0,
14.0,
14.0,
12.0,
12.0,
6.0,
1.0,
1.0,
1.0,
1.0
],
"name": "ATOH7",
"clust": 2,
"value": 0.6951682828347473,
"rank": 31,
"cl": "0.0"
},
{
"group": [
58.0,
58.0,
58.0,
58.0,
34.0,
31.0,
9.0,
1.0,
1.0,
1.0,
1.0
],
"name": "FOXL1",
"clust": 42,
"value": 0.2047074905681715,
"rank": 29,
"cl": "0.0"
},
{
"group": [
27.0,
27.0,
27.0,
27.0,
19.0,
19.0,
9.0,
1.0,
1.0,
1.0,
1.0
],
"name": "FOXE3",
"clust": 38,
"value": 0.05898306288044686,
"rank": 67,
"cl": "1.0"
},
{
"group": [
32.0,
32.0,
32.0,
32.0,
20.0,
20.0,
9.0,
1.0,
1.0,
1.0,
1.0
],
"name": "SPDEF",
"clust": 46,
"value": 0.0773386334180386,
"rank": 46,
"cl": "0.0"
},
{
"group": [
33.0,
33.0,
33.0,
33.0,
20.0,
20.0,
9.0,
1.0,
1.0,
1.0,
1.0
],
"name": "ZNF500",
"clust": 45,
"value": 0.0661011427545507,
"rank": 2,
"cl": "0.0"
},
{
"group": [
44.0,
44.0,
44.0,
44.0,
24.0,
23.0,
9.0,
1.0,
1.0,
1.0,
1.0
],
"name": "GBX2",
"clust": 64,
"value": 0.8247121360420798,
"rank": 76,
"cl": "1.0"
},
{
"group": [
11.0,
11.0,
11.0,
11.0,
9.0,
9.0,
3.0,
1.0,
1.0,
1.0,
1.0
],
"name": "GFI1",
"clust": 5,
"value": 0.5511236449631609,
"rank": 4,
"cl": "0.0"
},
{
"group": [
42.0,
42.0,
42.0,
42.0,
24.0,
23.0,
9.0,
1.0,
1.0,
1.0,
1.0
],
"name": "ZNF283",
"clust": 59,
"value": 0.2617596823460723,
"rank": 79,
"cl": "1.0"
},
{
"group": [
49.0,
49.0,
49.0,
49.0,
28.0,
26.0,
9.0,
1.0,
1.0,
1.0,
1.0
],
"name": "GSC2",
"clust": 71,
"value": 0.0026170476588313063,
"rank": 33,
"cl": "0.0"
},
{
"group": [
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0
],
"name": "TLX3",
"clust": 6,
"value": 0.4416666453420065,
"rank": 52,
"cl": "0.0"
},
{
"group": [
54.0,
54.0,
54.0,
54.0,
31.0,
28.0,
9.0,
1.0,
1.0,
1.0,
1.0
],
"name": "ZNF354C",
"clust": 76,
"value": 0.9414179826362925,
"rank": 56,
"cl": "1.0"
},
{
"group": [
38.0,
38.0,
38.0,
38.0,
23.0,
23.0,
9.0,
1.0,
1.0,
1.0,
1.0
],
"name": "NR4A1",
"clust": 57,
"value": 0.6682656485877041,
"rank": 70,
"cl": "1.0"
},
{
"group": [
31.0,
31.0,
31.0,
31.0,
19.0,
19.0,
9.0,
1.0,
1.0,
1.0,
1.0
],
"name": "ZNF546",
"clust": 34,
"value": 0.014917334662992943,
"rank": 24,
"cl": "0.0"
},
{
"group": [
53.0,
53.0,
53.0,
53.0,
31.0,
28.0,
9.0,
1.0,
1.0,
1.0,
1.0
],
"name": "ZNF677",
"clust": 77,
"value": 0.9619532913540707,
"rank": 77,
"cl": "1.0"
},
{
"group": [
24.0,
24.0,
24.0,
24.0,
18.0,
18.0,
9.0,
1.0,
1.0,
1.0,
1.0
],
"name": "ZFP57",
"clust": 32,
"value": 0.7459394658259323,
"rank": 18,
"cl": "1.0"
},
{
"group": [
3.0,
3.0,
3.0,
3.0,
3.0,
3.0,
2.0,
1.0,
1.0,
1.0,
1.0
],
"name": "INSM1",
"clust": 17,
"value": 0.3995691657508571,
"rank": 5,
"cl": "0.0"
},
{
"group": [
35.0,
35.0,
35.0,
35.0,
20.0,
20.0,
9.0,
1.0,
1.0,
1.0,
1.0
],
"name": "AR",
"clust": 43,
"value": 0.2004782945074085,
"rank": 23,
"cl": "0.0"
},
{
"group": [
56.0,
56.0,
56.0,
56.0,
32.0,
29.0,
9.0,
1.0,
1.0,
1.0,
1.0
],
"name": "ZNF470",
"clust": 49,
"value": 0.7589333729613841,
"rank": 74,
"cl": "0.0"
},
{
"group": [
24.0,
24.0,
24.0,
24.0,
18.0,
18.0,
9.0,
1.0,
1.0,
1.0,
1.0
],
"name": "LHX1",
"clust": 33,
"value": 0.23083194044187139,
"rank": 12,
"cl": "0.0"
},
{
"group": [
38.0,
38.0,
38.0,
38.0,
23.0,
23.0,
9.0,
1.0,
1.0,
1.0,
1.0
],
"name": "SMAD2",
"clust": 58,
"value": 0.9434517938049531,
"rank": 69,
"cl": "1.0"
},
{
"group": [
17.0,
17.0,
17.0,
17.0,
15.0,
15.0,
9.0,
1.0,
1.0,
1.0,
1.0
],
"name": "MYC",
"clust": 21,
"value": 0.23522056503073163,
"rank": 11,
"cl": "0.0"
},
{
"group": [
5.0,
5.0,
5.0,
5.0,
3.0,
3.0,
2.0,
1.0,
1.0,
1.0,
1.0
],
"name": "MYCN",
"clust": 16,
"value": 0.4801680296853006,
"rank": 21,
"cl": "0.0"
},
{
"group": [
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0
],
"name": "ATOH1",
"clust": 7,
"value": 0.052056997197504784,
"rank": 72,
"cl": "1.0"
},
{
"group": [
2.0,
2.0,
2.0,
2.0,
2.0,
2.0,
2.0,
1.0,
1.0,
1.0,
1.0
],
"name": "NEUROD2",
"clust": 14,
"value": 0.6174087939080508,
"rank": 38,
"cl": "0.0"
},
{
"group": [
17.0,
17.0,
17.0,
17.0,
15.0,
15.0,
9.0,
1.0,
1.0,
1.0,
1.0
],
"name": "NFKB1",
"clust": 22,
"value": 0.19171850631035658,
"rank": 16,
"cl": "1.0"
},
{
"group": [
2.0,
2.0,
2.0,
2.0,
2.0,
2.0,
2.0,
1.0,
1.0,
1.0,
1.0
],
"name": "NHLH1",
"clust": 15,
"value": 0.5126261962000757,
"rank": 63,
"cl": "1.0"
},
{
"group": [
6.0,
6.0,
6.0,
6.0,
4.0,
4.0,
2.0,
1.0,
1.0,
1.0,
1.0
],
"name": "NHLH2",
"clust": 12,
"value": 0.4149864897058968,
"rank": 15,
"cl": "0.0"
},
{
"group": [
45.0,
45.0,
45.0,
45.0,
24.0,
23.0,
9.0,
1.0,
1.0,
1.0,
1.0
],
"name": "PHF20",
"clust": 63,
"value": 0.8376004577414633,
"rank": 60,
"cl": "0.0"
},
{
"group": [
20.0,
20.0,
20.0,
20.0,
17.0,
17.0,
9.0,
1.0,
1.0,
1.0,
1.0
],
"name": "PITX2",
"clust": 29,
"value": 0.7227547653056289,
"rank": 7,
"cl": "0.0"
},
{
"group": [
51.0,
51.0,
51.0,
51.0,
30.0,
28.0,
9.0,
1.0,
1.0,
1.0,
1.0
],
"name": "TAF7L",
"clust": 74,
"value": 0.7907206684171891,
"rank": 45,
"cl": "0.0"
},
{
"group": [
10.0,
10.0,
10.0,
10.0,
8.0,
8.0,
2.0,
1.0,
1.0,
1.0,
1.0
],
"name": "POU4F1",
"clust": 8,
"value": 0.37669168701200895,
"rank": 9,
"cl": "1.0"
},
{
"group": [
4.0,
4.0,
4.0,
4.0,
3.0,
3.0,
2.0,
1.0,
1.0,
1.0,
1.0
],
"name": "POU4F2",
"clust": 20,
"value": 0.12586714128487986,
"rank": 27,
"cl": "0.0"
},
{
"group": [
7.0,
7.0,
7.0,
7.0,
5.0,
5.0,
2.0,
1.0,
1.0,
1.0,
1.0
],
"name": "POU4F3",
"clust": 11,
"value": 0.8145340500725029,
"rank": 71,
"cl": "1.0"
},
{
"group": [
19.0,
19.0,
19.0,
19.0,
17.0,
17.0,
9.0,
1.0,
1.0,
1.0,
1.0
],
"name": "HES2",
"clust": 30,
"value": 0.9983336080732753,
"rank": 47,
"cl": "0.0"
},
{
"group": [
17.0,
17.0,
17.0,
17.0,
15.0,
15.0,
9.0,
1.0,
1.0,
1.0,
1.0
],
"name": "MED1",
"clust": 23,
"value": 0.017635710046313147,
"rank": 36,
"cl": "1.0"
},
{
"group": [
29.0,
29.0,
29.0,
29.0,
19.0,
19.0,
9.0,
1.0,
1.0,
1.0,
1.0
],
"name": "SALL4",
"clust": 36,
"value": 0.8448996487817312,
"rank": 50,
"cl": "1.0"
},
{
"group": [
53.0,
53.0,
53.0,
53.0,
31.0,
28.0,
9.0,
1.0,
1.0,
1.0,
1.0
],
"name": "ZNF471",
"clust": 78,
"value": 0.6575011178049699,
"rank": 57,
"cl": "1.0"
},
{
"group": [
36.0,
36.0,
36.0,
36.0,
21.0,
21.0,
9.0,
1.0,
1.0,
1.0,
1.0
],
"name": "RARB",
"clust": 50,
"value": 0.9340505333531529,
"rank": 26,
"cl": "0.0"
},
{
"group": [
32.0,
32.0,
32.0,
32.0,
20.0,
20.0,
9.0,
1.0,
1.0,
1.0,
1.0
],
"name": "RORC",
"clust": 47,
"value": 0.6017330369449404,
"rank": 59,
"cl": "1.0"
},
{
"group": [
51.0,
51.0,
51.0,
51.0,
30.0,
28.0,
9.0,
1.0,
1.0,
1.0,
1.0
],
"name": "DMRTC2",
"clust": 75,
"value": 0.30314802325549894,
"rank": 62,
"cl": "1.0"
},
{
"group": [
30.0,
30.0,
30.0,
30.0,
19.0,
19.0,
9.0,
1.0,
1.0,
1.0,
1.0
],
"name": "SIX3",
"clust": 35,
"value": 0.43094144960699,
"rank": 43,
"cl": "1.0"
},
{
"group": [
22.0,
22.0,
22.0,
22.0,
17.0,
17.0,
9.0,
1.0,
1.0,
1.0,
1.0
],
"name": "SMARCA4",
"clust": 27,
"value": 0.4392898841063635,
"rank": 0,
"cl": "0.0"
},
{
"group": [
25.0,
25.0,
25.0,
25.0,
19.0,
19.0,
9.0,
1.0,
1.0,
1.0,
1.0
],
"name": "SOX3",
"clust": 40,
"value": 0.5769850370554801,
"rank": 37,
"cl": "0.0"
},
{
"group": [
57.0,
57.0,
57.0,
57.0,
33.0,
30.0,
9.0,
1.0,
1.0,
1.0,
1.0
],
"name": "T",
"clust": 48,
"value": 0.4150707775057402,
"rank": 73,
"cl": "0.0"
},
{
"group": [
18.0,
18.0,
18.0,
18.0,
16.0,
16.0,
9.0,
1.0,
1.0,
1.0,
1.0
],
"name": "TCF15",
"clust": 25,
"value": 0.8576780689869996,
"rank": 35,
"cl": "0.0"
},
{
"group": [
3.0,
3.0,
3.0,
3.0,
3.0,
3.0,
2.0,
1.0,
1.0,
1.0,
1.0
],
"name": "TFAP2B",
"clust": 18,
"value": 0.04576799632813555,
"rank": 10,
"cl": "0.0"
},
{
"group": [
55.0,
55.0,
55.0,
55.0,
31.0,
28.0,
9.0,
1.0,
1.0,
1.0,
1.0
],
"name": "NKX2-1",
"clust": 79,
"value": 0.2121939586432774,
"rank": 78,
"cl": "0.0"
},
{
"group": [
26.0,
26.0,
26.0,
26.0,
19.0,
19.0,
9.0,
1.0,
1.0,
1.0,
1.0
],
"name": "NR2E1",
"clust": 39,
"value": 0.7477537478657128,
"rank": 40,
"cl": "0.0"
},
{
"group": [
8.0,
8.0,
8.0,
8.0,
6.0,
6.0,
2.0,
1.0,
1.0,
1.0,
1.0
],
"name": "TP73",
"clust": 10,
"value": 0.3666473715230162,
"rank": 20,
"cl": "0.0"
},
{
"group": [
55.0,
55.0,
55.0,
55.0,
31.0,
28.0,
9.0,
1.0,
1.0,
1.0,
1.0
],
"name": "ZNF90",
"clust": 80,
"value": 0.365648781313494,
"rank": 41,
"cl": "0.0"
},
{
"group": [
41.0,
41.0,
41.0,
41.0,
24.0,
23.0,
9.0,
1.0,
1.0,
1.0,
1.0
],
"name": "ZNF229",
"clust": 60,
"value": 0.9228178030650733,
"rank": 80,
"cl": "1.0"
},
{
"group": [
19.0,
19.0,
19.0,
19.0,
17.0,
17.0,
9.0,
1.0,
1.0,
1.0,
1.0
],
"name": "ZNF750",
"clust": 31,
"value": 0.17901029910316346,
"rank": 30,
"cl": "0.0"
},
{
"group": [
43.0,
43.0,
43.0,
43.0,
24.0,
23.0,
9.0,
1.0,
1.0,
1.0,
1.0
],
"name": "NR4A3",
"clust": 65,
"value": 0.48128095131897397,
"rank": 68,
"cl": "0.0"
},
{
"group": [
2.0,
2.0,
2.0,
2.0,
2.0,
2.0,
2.0,
1.0,
1.0,
1.0,
1.0
],
"name": "LHX3",
"clust": 13,
"value": 0.08440690372670001,
"rank": 49,
"cl": "1.0"
},
{
"group": [
25.0,
25.0,
25.0,
25.0,
19.0,
19.0,
9.0,
1.0,
1.0,
1.0,
1.0
],
"name": "ESX1",
"clust": 41,
"value": 0.13640162795420108,
"rank": 19,
"cl": "1.0"
},
{
"group": [
49.0,
49.0,
49.0,
49.0,
28.0,
26.0,
9.0,
1.0,
1.0,
1.0,
1.0
],
"name": "TFAP2D",
"clust": 72,
"value": 0.3208951650271069,
"rank": 54,
"cl": "0.0"
},
{
"group": [
37.0,
37.0,
37.0,
37.0,
22.0,
22.0,
9.0,
1.0,
1.0,
1.0,
1.0
],
"name": "ZNF644",
"clust": 53,
"value": 0.9590787094259996,
"rank": 8,
"cl": "1.0"
},
{
"group": [
15.0,
15.0,
15.0,
15.0,
13.0,
13.0,
7.0,
1.0,
1.0,
1.0,
1.0
],
"name": "FOXN1",
"clust": 1,
"value": 0.41730396828005656,
"rank": 44,
"cl": "0.0"
},
{
"group": [
43.0,
43.0,
43.0,
43.0,
24.0,
23.0,
9.0,
1.0,
1.0,
1.0,
1.0
],
"name": "HES7",
"clust": 66,
"value": 0.9433267464643487,
"rank": 61,
"cl": "1.0"
},
{
"group": [
9.0,
9.0,
9.0,
9.0,
7.0,
7.0,
2.0,
1.0,
1.0,
1.0,
1.0
],
"name": "ZSCAN10",
"clust": 9,
"value": 0.23295267677063924,
"rank": 55,
"cl": "1.0"
},
{
"group": [
23.0,
23.0,
23.0,
23.0,
17.0,
17.0,
9.0,
1.0,
1.0,
1.0,
1.0
],
"name": "RFXANK",
"clust": 26,
"value": 0.5299832300017657,
"rank": 3,
"cl": "1.0"
},
{
"group": [
40.0,
40.0,
40.0,
40.0,
24.0,
23.0,
9.0,
1.0,
1.0,
1.0,
1.0
],
"name": "TBX18",
"clust": 62,
"value": 0.7771205192045835,
"rank": 65,
"cl": "0.0"
},
{
"group": [
28.0,
28.0,
28.0,
28.0,
19.0,
19.0,
9.0,
1.0,
1.0,
1.0,
1.0
],
"name": "FOXP2",
"clust": 37,
"value": 0.7536028740398171,
"rank": 17,
"cl": "1.0"
},
{
"group": [
34.0,
34.0,
34.0,
34.0,
20.0,
20.0,
9.0,
1.0,
1.0,
1.0,
1.0
],
"name": "ONECUT2",
"clust": 44,
"value": 0.9043313930606264,
"rank": 13,
"cl": "1.0"
},
{
"group": [
36.0,
36.0,
36.0,
36.0,
21.0,
21.0,
9.0,
1.0,
1.0,
1.0,
1.0
],
"name": "NR1H4",
"clust": 51,
"value": 0.5507895747277078,
"rank": 22,
"cl": "0.0"
}
],
"col_nodes": [
{
"group": [
10.0,
10.0,
10.0,
10.0,
10.0,
10.0,
2.0,
2.0,
2.0,
1.0,
1.0
],
"name": "Col-0",
"clust": 4,
"value": 0.13977366189382578,
"rank": 10,
"cl": "1.0"
},
{
"group": [
11.0,
11.0,
11.0,
11.0,
11.0,
11.0,
3.0,
3.0,
3.0,
1.0,
1.0
],
"name": "Col-1",
"clust": 16,
"value": 0.8036715880162402,
"rank": 26,
"cl": "0.0"
},
{
"group": [
11.0,
11.0,
11.0,
11.0,
11.0,
11.0,
3.0,
3.0,
3.0,
1.0,
1.0
],
"name": "Col-2",
"clust": 17,
"value": 0.32536568728259063,
"rank": 9,
"cl": "0.0"
},
{
"group": [
3.0,
3.0,
3.0,
3.0,
3.0,
3.0,
2.0,
2.0,
2.0,
1.0,
1.0
],
"name": "Col-3",
"clust": 8,
"value": 0.09508355428231885,
"rank": 11,
"cl": "0.0"
},
{
"group": [
2.0,
2.0,
2.0,
2.0,
2.0,
2.0,
2.0,
2.0,
2.0,
1.0,
1.0
],
"name": "Col-4",
"clust": 9,
"value": 0.9348324163253852,
"rank": 15,
"cl": "1.0"
},
{
"group": [
13.0,
13.0,
13.0,
12.0,
12.0,
12.0,
3.0,
3.0,
3.0,
1.0,
1.0
],
"name": "Col-5",
"clust": 24,
"value": 0.141654131780512,
"rank": 12,
"cl": "1.0"
},
{
"group": [
12.0,
12.0,
12.0,
12.0,
12.0,
12.0,
3.0,
3.0,
3.0,
1.0,
1.0
],
"name": "Col-6",
"clust": 20,
"value": 0.49171738308103674,
"rank": 23,
"cl": "1.0"
},
{
"group": [
4.0,
4.0,
4.0,
4.0,
4.0,
4.0,
2.0,
2.0,
2.0,
1.0,
1.0
],
"name": "Col-7",
"clust": 7,
"value": 0.49581815714822375,
"rank": 4,
"cl": "0.0"
},
{
"group": [
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0
],
"name": "Col-8",
"clust": 1,
"value": 0.05976172899376042,
"rank": 1,
"cl": "0.0"
},
{
"group": [
6.0,
6.0,
6.0,
6.0,
6.0,
6.0,
2.0,
2.0,
2.0,
1.0,
1.0
],
"name": "Col-9",
"clust": 13,
"value": 0.8898949011014855,
"rank": 0,
"cl": "1.0"
},
{
"group": [
17.0,
17.0,
17.0,
16.0,
16.0,
16.0,
3.0,
3.0,
3.0,
1.0,
1.0
],
"name": "Col-10",
"clust": 27,
"value": 0.5621268569872878,
"rank": 6,
"cl": "0.0"
},
{
"group": [
16.0,
16.0,
16.0,
15.0,
15.0,
15.0,
3.0,
3.0,
3.0,
1.0,
1.0
],
"name": "Col-11",
"clust": 15,
"value": 0.5586499810207868,
"rank": 27,
"cl": "0.0"
},
{
"group": [
14.0,
14.0,
14.0,
13.0,
13.0,
13.0,
3.0,
3.0,
3.0,
1.0,
1.0
],
"name": "Col-12",
"clust": 19,
"value": 0.9349240489079221,
"rank": 24,
"cl": "0.0"
},
{
"group": [
5.0,
5.0,
5.0,
5.0,
5.0,
5.0,
2.0,
2.0,
2.0,
1.0,
1.0
],
"name": "Col-13",
"clust": 6,
"value": 0.6745246379191717,
"rank": 17,
"cl": "1.0"
},
{
"group": [
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0,
1.0
],
"name": "Col-14",
"clust": 2,
"value": 0.39018308852700034,
"rank": 8,
"cl": "1.0"
},
{
"group": [
9.0,
9.0,
9.0,
9.0,
9.0,
9.0,
2.0,
2.0,
2.0,
1.0,
1.0
],
"name": "Col-15",
"clust": 5,
"value": 0.19349487548866218,
"rank": 21,
"cl": "1.0"
},
{
"group": [
8.0,
8.0,
8.0,
8.0,
8.0,
8.0,
2.0,
2.0,
2.0,
1.0,
1.0
],
"name": "Col-16",
"clust": 11,
"value": 0.9330507941250482,
"rank": 3,
"cl": "0.0"
},
{
"group": [
12.0,
12.0,
12.0,
12.0,
12.0,
12.0,
3.0,
3.0,
3.0,
1.0,
1.0
],
"name": "Col-17",
"clust": 21,
"value": 0.15479866234290085,
"rank": 20,
"cl": "1.0"
},
{
"group": [
13.0,
13.0,
13.0,
12.0,
12.0,
12.0,
3.0,
3.0,
3.0,
1.0,
1.0
],
"name": "Col-18",
"clust": 25,
"value": 0.47040745572281795,
"rank": 19,
"cl": "0.0"
},
{
"group": [
15.0,
15.0,
15.0,
14.0,
14.0,
14.0,
3.0,
3.0,
3.0,
1.0,
1.0
],
"name": "Col-19",
"clust": 18,
"value": 0.8308572747867247,
"rank": 18,
"cl": "0.0"
},
{
"group": [
20.0,
20.0,
20.0,
19.0,
19.0,
19.0,
5.0,
5.0,
5.0,
1.0,
1.0
],
"name": "Col-20",
"clust": 0,
"value": 0.20924984773611022,
"rank": 28,
"cl": "0.0"
},
{
"group": [
6.0,
6.0,
6.0,
6.0,
6.0,
6.0,
2.0,
2.0,
2.0,
1.0,
1.0
],
"name": "Col-21",
"clust": 14,
"value": 0.04870332933462784,
"rank": 5,
"cl": "0.0"
},
{
"group": [
13.0,
13.0,
13.0,
12.0,
12.0,
12.0,
3.0,
3.0,
3.0,
1.0,
1.0
],
"name": "Col-22",
"clust": 22,
"value": 0.48677879061560825,
"rank": 13,
"cl": "0.0"
},
{
"group": [
18.0,
18.0,
18.0,
17.0,
17.0,
17.0,
3.0,
3.0,
3.0,
1.0,
1.0
],
"name": "Col-23",
"clust": 26,
"value": 0.15568202648487406,
"rank": 22,
"cl": "1.0"
},
{
"group": [
7.0,
7.0,
7.0,
7.0,
7.0,
7.0,
2.0,
2.0,
2.0,
1.0,
1.0
],
"name": "Col-24",
"clust": 12,
"value": 0.013321473047599897,
"rank": 2,
"cl": "1.0"
},
{
"group": [
19.0,
19.0,
19.0,
18.0,
18.0,
18.0,
4.0,
4.0,
4.0,
1.0,
1.0
],
"name": "Col-25",
"clust": 3,
"value": 0.6017303136562109,
"rank": 25,
"cl": "1.0"
},
{
"group": [
17.0,
17.0,
17.0,
16.0,
16.0,
16.0,
3.0,
3.0,
3.0,
1.0,
1.0
],
"name": "Col-26",
"clust": 28,
"value": 0.5115196931590885,
"rank": 14,
"cl": "0.0"
},
{
"group": [
13.0,
13.0,
13.0,
12.0,
12.0,
12.0,
3.0,
3.0,
3.0,
1.0,
1.0
],
"name": "Col-27",
"clust": 23,
"value": 0.8629678158614535,
"rank": 7,
"cl": "1.0"
},
{
"group": [
2.0,
2.0,
2.0,
2.0,
2.0,
2.0,
2.0,
2.0,
2.0,
1.0,
1.0
],
"name": "Col-28",
"clust": 10,
"value": 0.8682509873124353,
"rank": 16,
"cl": "1.0"
}
],
"links": [
{
"source": 0,
"target": 0,
"value": 0.023191294265036619
},
{
"source": 0,
"target": 1,
"value": 1.0677251322500791
},
{
"source": 0,
"target": 2,
"value": 0.62307946411603177
},
{
"source": 0,
"target": 3,
"value": 0.99090658767530493
},
{
"source": 0,
"target": 4,
"value": 0.71655081326284886
},
{
"source": 0,
"target": 5,
"value": 1.9292389590495871
},
{
"source": 0,
"target": 6,
"value": 1.2419704766015558
},
{
"source": 0,
"target": 7,
"value": -0.0097837011592335002
},
{
"source": 0,
"target": 8,
"value": -0.74292707110835976
},
{
"source": 0,
"target": 9,
"value": -0.086402686101326662
},
{
"source": 0,
"target": 10,
"value": 0.31492364923075444
},
{
"source": 0,
"target": 11,
"value": -1.3757068383281745
},
{
"source": 0,
"target": 12,
"value": 0.018946928943061062
},
{
"source": 0,
"target": 13,
"value": -1.6893460753592473
},
{
"source": 0,
"target": 14,
"value": -1.2013721389172913
},
{
"source": 0,
"target": 15,
"value": 0.42677235559622767
},
{
"source": 0,
"target": 16,
"value": 0.093162262787025302
},
{
"source": 0,
"target": 17,
"value": 0.50484484950472297
},
{
"source": 0,
"target": 18,
"value": 4.3682359401791286
},
{
"source": 0,
"target": 19,
"value": 0.79266940987224488
},
{
"source": 0,
"target": 20,
"value": -1.3403341488097371
},
{
"source": 0,
"target": 21,
"value": 0.31467643356638658
},
{
"source": 0,
"target": 22,
"value": 0.85064892942141301
},
{
"source": 0,
"target": 23,
"value": 1.0517216411097499
},
{
"source": 0,
"target": 24,
"value": 0.18198119184056238
},
{
"source": 0,
"target": 25,
"value": -0.65431961569542674
},
{
"source": 0,
"target": 26,
"value": -0.03578304494556165
},
{
"source": 0,
"target": 27,
"value": 1.5711396229580823
},
{
"source": 0,
"target": 28,
"value": 0.97950190359261002
},
{
"source": 1,
"target": 0,
"value": -0.02913572195623074
},
{
"source": 1,
"target": 1,
"value": 0.25920102114088062
},
{
"source": 1,
"target": 2,
"value": -0.1274984731639599
},
{
"source": 1,
"target": 3,
"value": 0.71452612843169061
},
{
"source": 1,
"target": 4,
"value": 0.059303983950838142
},
{
"source": 1,
"target": 5,
"value": 5.3470015753439686
},
{
"source": 1,
"target": 6,
"value": 0.1128003408429735
},
{
"source": 1,
"target": 7,
"value": -0.35325904705285532
},
{
"source": 1,
"target": 8,
"value": -0.14616064959719854
},
{
"source": 1,
"target": 9,
"value": -0.54651938892231211
},
{
"source": 1,
"target": 10,
"value": -0.092572064097375464
},
{
"source": 1,
"target": 11,
"value": -0.55737789581523733
},
{
"source": 1,
"target": 12,
"value": -0.55836982390200729
},
{
"source": 1,
"target": 13,
"value": 0.13526835900571335
},
{
"source": 1,
"target": 14,
"value": -0.19472559930273875
},
{
"source": 1,
"target": 15,
"value": -0.70064656788471202
},
{
"source": 1,
"target": 16,
"value": 0.16033007148262457
},
{
"source": 1,
"target": 17,
"value": -0.57042165604542872
},
{
"source": 1,
"target": 18,
"value": -0.44243093517198007
},
{
"source": 1,
"target": 19,
"value": -0.50955265718768694
},
{
"source": 1,
"target": 20,
"value": 0.26450887162416153
},
{
"source": 1,
"target": 21,
"value": -0.010283441658165514
},
{
"source": 1,
"target": 22,
"value": -0.74332959107952423
},
{
"source": 1,
"target": 23,
"value": -0.22984587666711628
},
{
"source": 1,
"target": 24,
"value": -0.74323171582238545
},
{
"source": 1,
"target": 25,
"value": 4.2945056443543494
},
{
"source": 1,
"target": 26,
"value": -0.28385043200977772
},
{
"source": 1,
"target": 27,
"value": -0.54857853375518817
},
{
"source": 1,
"target": 28,
"value": -0.28666058121954324
},
{
"source": 2,
"target": 0,
"value": 2.5638855061008123
},
{
"source": 2,
"target": 1,
"value": 0.41941637116038921
},
{
"source": 2,
"target": 2,
"value": 0.72890384096112937
},
{
"source": 2,
"target": 3,
"value": -0.25484354814864962
},
{
"source": 2,
"target": 4,
"value": 0.052771271951831282
},
{
"source": 2,
"target": 5,
"value": -0.27230518526597502
},
{
"source": 2,
"target": 6,
"value": 0.55704716408299593
},
{
"source": 2,
"target": 7,
"value": 0.51493345260213652
},
{
"source": 2,
"target": 8,
"value": 0.04462808310373613
},
{
"source": 2,
"target": 9,
"value": 0.26438068808107223
},
{
"source": 2,
"target": 10,
"value": 0.34410419437932888
},
{
"source": 2,
"target": 11,
"value": -0.8013317122712128
},
{
"source": 2,
"target": 12,
"value": -0.74359466652870565
},
{
"source": 2,
"target": 13,
"value": -0.80090611006660872
},
{
"source": 2,
"target": 14,
"value": -0.43112798129573571
},
{
"source": 2,
"target": 15,
"value": 6.8325904978406653
},
{
"source": 2,
"target": 16,
"value": 0.74265303218145029
},
{
"source": 2,
"target": 17,
"value": -0.71826162863780452
},
{
"source": 2,
"target": 18,
"value": 0.37537475635972573
},
{
"source": 2,
"target": 19,
"value": -0.76930253302787166
},
{
"source": 2,
"target": 20,
"value": -0.88934027481909994
},
{
"source": 2,
"target": 21,
"value": 0.4370512358416942
},
{
"source": 2,
"target": 22,
"value": 0.75978165424043609
},
{
"source": 2,
"target": 23,
"value": 1.682209472383686
},
{
"source": 2,
"target": 24,
"value": 0.7965596580825195
},
{
"source": 2,
"target": 25,
"value": -0.007384986322110567
},
{
"source": 2,
"target": 26,
"value": -0.43170142426614977
},
{
"source": 2,
"target": 27,
"value": -0.4500411459319219
},
{
"source": 2,
"target": 28,
"value": -0.56818682458899672
},
{
"source": 3,
"target": 0,
"value": -0.19915250515041083
},
{
"source": 3,
"target": 1,
"value": -0.030544028640047866
},
{
"source": 3,
"target": 2,
"value": -0.6124642154055403
},
{
"source": 3,
"target": 3,
"value": -0.24804355109606743
},
{
"source": 3,
"target": 4,
"value": -0.56721238861889001
},
{
"source": 3,
"target": 5,
"value": 0.14307111458982222
},
{
"source": 3,
"target": 6,
"value": 0.084496950497817747
},
{
"source": 3,
"target": 7,
"value": -0.1247608915209189
},
{
"source": 3,
"target": 8,
"value": -0.33550401726268386
},
{
"source": 3,
"target": 9,
"value": -0.0036951960268218108
},
{
"source": 3,
"target": 10,
"value": -0.24626367696671916
},
{
"source": 3,
"target": 11,
"value": 0.61584898128353427
},
{
"source": 3,
"target": 12,
"value": 0.0062372963239454857
},
{
"source": 3,
"target": 13,
"value": -0.46985505498785274
},
{
"source": 3,
"target": 14,
"value": -0.33817451355067485
},
{
"source": 3,
"target": 15,
"value": -0.15918960379815977
},
{
"source": 3,
"target": 16,
"value": -0.60792067220852808
},
{
"source": 3,
"target": 17,
"value": -0.37543266391652569
},
{
"source": 3,
"target": 18,
"value": -0.19121500643500322
},
{
"source": 3,
"target": 19,
"value": -0.24515108436238467
},
{
"source": 3,
"target": 20,
"value": 8.1354143425270351
},
{
"source": 3,
"target": 21,
"value": -0.33885686714298835
},
{
"source": 3,
"target": 22,
"value": -0.010189886845229153
},
{
"source": 3,
"target": 23,
"value": -0.0039336087277505481
},
{
"source": 3,
"target": 24,
"value": -0.23778495401644406
},
{
"source": 3,
"target": 25,
"value": -0.16571169837529476
},
{
"source": 3,
"target": 26,
"value": -0.33851020959508626
},
{
"source": 3,
"target": 27,
"value": -0.32616344610043024
},
{
"source": 3,
"target": 28,
"value": -0.24652812323843898
},
{
"source": 4,
"target": 0,
"value": -0.21575178537668779
},
{
"source": 4,
"target": 1,
"value": -0.4819087028742452
},
{
"source": 4,
"target": 2,
"value": -0.22141068798376193
},
{
"source": 4,
"target": 3,
"value": -0.28701098948110015
},
{
"source": 4,
"target": 4,
"value": -0.44375975413844521
},
{
"source": 4,
"target": 5,
"value": 0.90681883150861298
},
{
"source": 4,
"target": 6,
"value": 3.7250293492797191
},
{
"source": 4,
"target": 7,
"value": 2.2095034814088343
},
{
"source": 4,
"target": 8,
"value": -0.48459830307467028
},
{
"source": 4,
"target": 9,
"value": -0.44510759448003012
},
{
"source": 4,
"target": 10,
"value": 0.064080137812105115
},
{
"source": 4,
"target": 11,
"value": -0.34299399410502546
},
{
"source": 4,
"target": 12,
"value": 2.4150947371210791
},
{
"source": 4,
"target": 13,
"value": 1.0397827744990467
},
{
"source": 4,
"target": 14,
"value": -0.51434402465827467
},
{
"source": 4,
"target": 15,
"value": 0.13457725474593696
},
{
"source": 4,
"target": 16,
"value": 1.328384780632256
},
{
"source": 4,
"target": 17,
"value": 1.6775119119991513
},
{
"source": 4,
"target": 18,
"value": 0.30317890709890244
},
{
"source": 4,
"target": 19,
"value": 1.241910181874796
},
{
"source": 4,
"target": 20,
"value": -0.29292932601858485
},
{
"source": 4,
"target": 21,
"value": -0.7735793259655882
},
{
"source": 4,
"target": 22,
"value": -0.078685543361641394
},
{
"source": 4,
"target": 23,
"value": -0.48286941914779596
},
{
"source": 4,
"target": 24,
"value": -0.7186664863046055
},
{
"source": 4,
"target": 25,
"value": -0.9227254603653634
},
{
"source": 4,
"target": 26,
"value": 0.088572322304901446
},
{
"source": 4,
"target": 27,
"value": 0.66047212679097878
},
{
"source": 4,
"target": 28,
"value": -0.68795194113712566
},
{
"source": 5,
"target": 0,
"value": 6.3228465794155877
},
{
"source": 5,
"target": 1,
"value": 0.057114218672091231
},
{
"source": 5,
"target": 2,
"value": -0.13467593903386579
},
{
"source": 5,
"target": 3,
"value": -0.34401565256965755
},
{
"source": 5,
"target": 4,
"value": -0.52281989626282599
},
{
"source": 5,
"target": 5,
"value": 2.6777949983771157
},
{
"source": 5,
"target": 6,
"value": -0.05671718059774554
},
{
"source": 5,
"target": 7,
"value": -0.44109807165832338
},
{
"source": 5,
"target": 8,
"value": -0.23589466564062903
},
{
"source": 5,
"target": 9,
"value": -0.12480758199526588
},
{
"source": 5,
"target": 10,
"value": -0.26384809870648041
},
{
"source": 5,
"target": 11,
"value": -0.45100970305631016
},
{
"source": 5,
"target": 12,
"value": -0.22080994519755878
},
{
"source": 5,
"target": 13,
"value": -0.47619718331799371
},
{
"source": 5,
"target": 14,
"value": -0.35666979649381075
},
{
"source": 5,
"target": 15,
"value": 0.25000426634580736
},
{
"source": 5,
"target": 16,
"value": -0.36406971194902921
},
{
"source": 5,
"target": 17,
"value": -0.28796273547502244
},
{
"source": 5,
"target": 18,
"value": 3.2084937109191953
},
{
"source": 5,
"target": 19,
"value": -0.33348736155040282
},
{
"source": 5,
"target": 20,
"value": -0.66864006261137499
},
{
"source": 5,
"target": 21,
"value": -0.14004015649957574
},
{
"source": 5,
"target": 22,
"value": -0.51729520304772081
},
{
"source": 5,
"target": 23,
"value": -0.04330753848262351
},
{
"source": 5,
"target": 24,
"value": -0.21459827152718125
},
{
"source": 5,
"target": 25,
"value": -0.18962716306243374
},
{
"source": 5,
"target": 26,
"value": -0.044746410932249507
},
{
"source": 5,
"target": 27,
"value": -0.15485441219647553
},
{
"source": 5,
"target": 28,
"value": -0.46015501767348138
},
{
"source": 6,
"target": 0,
"value": -0.40418538517264047
},
{
"source": 6,
"target": 1,
"value": 0.019854642606331879
},
{
"source": 6,
"target": 2,
"value": -0.34781660781599044
},
{
"source": 6,
"target": 3,
"value": 3.7895778987424777
},
{
"source": 6,
"target": 4,
"value": -0.32248810103393516
},
{
"source": 6,
"target": 5,
"value": -0.23508245701436595
},
{
"source": 6,
"target": 6,
"value": 0.22711995920288294
},
{
"source": 6,
"target": 7,
"value": -0.50742489167232319
},
{
"source": 6,
"target": 8,
"value": -0.30833804019627836
},
{
"source": 6,
"target": 9,
"value": -0.3562367506655012
},
{
"source": 6,
"target": 10,
"value": -0.30435546353521081
},
{
"source": 6,
"target": 11,
"value": -0.4377195883686103
},
{
"source": 6,
"target": 12,
"value": 4.5130702484053007
},
{
"source": 6,
"target": 13,
"value": -0.21053571528059478
},
{
"source": 6,
"target": 14,
"value": -0.27868202703664158
},
{
"source": 6,
"target": 15,
"value": -0.18829682566323677
},
{
"source": 6,
"target": 16,
"value": -0.35670535583958124
},
{
"source": 6,
"target": 17,
"value": -0.36319661540595377
},
{
"source": 6,
"target": 18,
"value": -0.40138169658873746
},
{
"source": 6,
"target": 19,
"value": -0.41895041938645056
},
{
"source": 6,
"target": 20,
"value": -0.40826213672341427
},
{
"source": 6,
"target": 21,
"value": -0.027516461553091207
},
{
"source": 6,
"target": 22,
"value": 0.019678773836398801
},
{
"source": 6,
"target": 23,
"value": -0.060831679764563711
},
{
"source": 6,
"target": 24,
"value": -0.33229250129840393
},
{
"source": 6,
"target": 25,
"value": -0.30996964852636799
},
{
"source": 6,
"target": 26,
"value": -0.13130967101875687
},
{
"source": 6,
"target": 27,
"value": -0.21025999843482832
},
{
"source": 6,
"target": 28,
"value": -0.1705476955466895
},
{
"source": 7,
"target": 0,
"value": -0.17849946716814707
},
{
"source": 7,
"target": 1,
"value": -0.15493824181486524
},
{
"source": 7,
"target": 2,
"value": 0.17327770063464928
},
{
"source": 7,
"target": 3,
"value": -0.35243931040630788
},
{
"source": 7,
"target": 4,
"value": -0.24072425966224884
},
{
"source": 7,
"target": 5,
"value": -0.26649607608677411
},
{
"source": 7,
"target": 6,
"value": 0.017449619897545673
},
{
"source": 7,
"target": 7,
"value": -0.30355242348189937
},
{
"source": 7,
"target": 8,
"value": -0.34743600240748229
},
{
"source": 7,
"target": 9,
"value": 0.072147142650739057
},
{
"source": 7,
"target": 10,
"value": -0.31102976637016611
},
{
"source": 7,
"target": 11,
"value": 0.024728317648703615
},
{
"source": 7,
"target": 12,
"value": 0.014248989961141635
},
{
"source": 7,
"target": 13,
"value": -0.32261173390969844
},
{
"source": 7,
"target": 14,
"value": 0.13193295527959592
},
{
"source": 7,
"target": 15,
"value": -0.06386741350163018
},
{
"source": 7,
"target": 16,
"value": -0.27736950722817127
},
{
"source": 7,
"target": 17,
"value": 5.7383977004148381
},
{
"source": 7,
"target": 18,
"value": -0.12615912922374209
},
{
"source": 7,
"target": 19,
"value": -0.3558768273243974
},
{
"source": 7,
"target": 20,
"value": -0.30803627975855435
},
{
"source": 7,
"target": 21,
"value": -0.2078893869990415
},
{
"source": 7,
"target": 22,
"value": -0.22618067371491912
},
{
"source": 7,
"target": 23,
"value": -0.38656803214437102
},
{
"source": 7,
"target": 24,
"value": -0.30217996617096893
},
{
"source": 7,
"target": 25,
"value": -0.098370055497779524
},
{
"source": 7,
"target": 26,
"value": -0.29058418907645039
},
{
"source": 7,
"target": 27,
"value": -0.20292219629787184
},
{
"source": 7,
"target": 28,
"value": -0.24707665495587494
},
{
"source": 8,
"target": 0,
"value": -0.26007721550230278
},
{
"source": 8,
"target": 1,
"value": -0.097584420723704796
},
{
"source": 8,
"target": 2,
"value": -0.57539740474896706
},
{
"source": 8,
"target": 3,
"value": 0.093512607562523567
},
{
"source": 8,
"target": 4,
"value": -0.40642658547861199
},
{
"source": 8,
"target": 5,
"value": -0.028997162862051066
},
{
"source": 8,
"target": 6,
"value": 0.93799586048325145
},
{
"source": 8,
"target": 7,
"value": -0.22384252633427015
},
{
"source": 8,
"target": 8,
"value": -0.39226881600966684
},
{
"source": 8,
"target": 9,
"value": -0.5298493818188712
},
{
"source": 8,
"target": 10,
"value": -0.41120999631709104
},
{
"source": 8,
"target": 11,
"value": 1.7173491490482551
},
{
"source": 8,
"target": 12,
"value": -0.26843996958351068
},
{
"source": 8,
"target": 13,
"value": -0.33923820536952598
},
{
"source": 8,
"target": 14,
"value": 0.19732764426359858
},
{
"source": 8,
"target": 15,
"value": 1.362372183782478
},
{
"source": 8,
"target": 16,
"value": -0.55421003986233619
},
{
"source": 8,
"target": 17,
"value": 0.4552821101033554
},
{
"source": 8,
"target": 18,
"value": 0.64601298917917882
},
{
"source": 8,
"target": 19,
"value": -0.16873707016850784
},
{
"source": 8,
"target": 20,
"value": 1.6677946087966267
},
{
"source": 8,
"target": 21,
"value": 0.032879706585857364
},
{
"source": 8,
"target": 22,
"value": -0.59015368735030327
},
{
"source": 8,
"target": 23,
"value": -0.2212278454343351
},
{
"source": 8,
"target": 24,
"value": -0.39551017536586991
},
{
"source": 8,
"target": 25,
"value": 4.8174030753586106
},
{
"source": 8,
"target": 26,
"value": -0.42674317243537169
},
{
"source": 8,
"target": 27,
"value": 0.060613162163618582
},
{
"source": 8,
"target": 28,
"value": -0.05997901912698142
},
{
"source": 9,
"target": 0,
"value": -0.42208086400519224
},
{
"source": 9,
"target": 1,
"value": -0.38672755594277108
},
{
"source": 9,
"target": 2,
"value": -0.11962958427927478
},
{
"source": 9,
"target": 3,
"value": -0.26451123390101405
},
{
"source": 9,
"target": 4,
"value": -0.39578516297040928
},
{
"source": 9,
"target": 5,
"value": -0.33620152012842464
},
{
"source": 9,
"target": 6,
"value": -0.18794862678427773
},
{
"source": 9,
"target": 7,
"value": -0.35756693704426795
},
{
"source": 9,
"target": 8,
"value": -0.28009737586415778
},
{
"source": 9,
"target": 9,
"value": -0.11233303655138259
},
{
"source": 9,
"target": 10,
"value": -0.26693375593870927
},
{
"source": 9,
"target": 11,
"value": 0.50181806762564152
},
{
"source": 9,
"target": 12,
"value": -0.3537106774740596
},
{
"source": 9,
"target": 13,
"value": -0.28525013649676334
},
{
"source": 9,
"target": 14,
"value": -0.23403621353096798
},
{
"source": 9,
"target": 15,
"value": 3.5467594937220381
},
{
"source": 9,
"target": 16,
"value": 1.7419942140462246
},
{
"source": 9,
"target": 17,
"value": -0.012808466503108979
},
{
"source": 9,
"target": 18,
"value": -0.48487976128988752
},
{
"source": 9,
"target": 19,
"value": 0.2100328745491534
},
{
"source": 9,
"target": 20,
"value": -0.74632461326513799
},
{
"source": 9,
"target": 21,
"value": -0.44742954815613323
},
{
"source": 9,
"target": 22,
"value": 1.6544458701167459
},
{
"source": 9,
"target": 23,
"value": 0.38317074620732883
},
{
"source": 9,
"target": 24,
"value": -0.41763303853274575
},
{
"source": 9,
"target": 25,
"value": -0.193294029915307
},
{
"source": 9,
"target": 26,
"value": -0.66928807150626246
},
{
"source": 9,
"target": 27,
"value": 0.52800039940250276
},
{
"source": 9,
"target": 28,
"value": 0.53841928992563626
},
{
"source": 10,
"target": 0,
"value": 2.2768852753989703
},
{
"source": 10,
"target": 1,
"value": 0.29996114292921972
},
{
"source": 10,
"target": 2,
"value": -0.4045189660861368
},
{
"source": 10,
"target": 3,
"value": 0.17643129913627217
},
{
"source": 10,
"target": 4,
"value": 0.49832236954714304
},
{
"source": 10,
"target": 5,
"value": -0.65089948978675627
},
{
"source": 10,
"target": 6,
"value": -0.14348324840179344
},
{
"source": 10,
"target": 7,
"value": -0.2871327905915127
},
{
"source": 10,
"target": 8,
"value": -0.4836947291709936
},
{
"source": 10,
"target": 9,
"value": -0.36824395806760207
},
{
"source": 10,
"target": 10,
"value": -0.1521932771016781
},
{
"source": 10,
"target": 11,
"value": 0.11947511276570785
},
{
"source": 10,
"target": 12,
"value": -0.50225617890405483
},
{
"source": 10,
"target": 13,
"value": -0.60807813592622806
},
{
"source": 10,
"target": 14,
"value": -0.37176171506001909
},
{
"source": 10,
"target": 15,
"value": 1.2506998380791552
},
{
"source": 10,
"target": 16,
"value": -0.33058935409839479
},
{
"source": 10,
"target": 17,
"value": -0.2693681886737434
},
{
"source": 10,
"target": 18,
"value": -0.55519126135261432
},
{
"source": 10,
"target": 19,
"value": -0.39258751703688816
},
{
"source": 10,
"target": 20,
"value": 4.0915587153430453
},
{
"source": 10,
"target": 21,
"value": -0.37400621700237935
},
{
"source": 10,
"target": 22,
"value": -0.50584199407286634
},
{
"source": 10,
"target": 23,
"value": 0.82297404973803656
},
{
"source": 10,
"target": 24,
"value": -0.92111455401237485
},
{
"source": 10,
"target": 25,
"value": -0.029036335400228656
},
{
"source": 10,
"target": 26,
"value": -0.4241806896709161
},
{
"source": 10,
"target": 27,
"value": -0.17256252214523235
},
{
"source": 10,
"target": 28,
"value": -0.38918886185316259
},
{
"source": 11,
"target": 0,
"value": 0.42351593795927256
},
{
"source": 11,
"target": 1,
"value": 0.58899764722856796
},
{
"source": 11,
"target": 2,
"value": 0.32792988900350439
},
{
"source": 11,
"target": 3,
"value": 0.25740840530998493
},
{
"source": 11,
"target": 4,
"value": 0.10705264379900588
},
{
"source": 11,
"target": 5,
"value": -0.16536578829279305
},
{
"source": 11,
"target": 6,
"value": 1.9040559047103207
},
{
"source": 11,
"target": 7,
"value": -0.390332348723959
},
{
"source": 11,
"target": 8,
"value": -0.83359378568333442
},
{
"source": 11,
"target": 9,
"value": -0.72205940734355245
},
{
"source": 11,
"target": 10,
"value": -0.62440610787264261
},
{
"source": 11,
"target": 11,
"value": 1.1317717794773876
},
{
"source": 11,
"target": 12,
"value": -0.17397368388042303
},
{
"source": 11,
"target": 13,
"value": 0.21104099293598366
},
{
"source": 11,
"target": 14,
"value": -0.45640077147175101
},
{
"source": 11,
"target": 15,
"value": 0.98168713278806807
},
{
"source": 11,
"target": 16,
"value": -0.69495470304832763
},
{
"source": 11,
"target": 17,
"value": -0.39667191697038851
},
{
"source": 11,
"target": 18,
"value": -1.2488445429851112
},
{
"source": 11,
"target": 19,
"value": -0.59163736309495407
},
{
"source": 11,
"target": 20,
"value": 5.4657794291440629
},
{
"source": 11,
"target": 21,
"value": 0.017137413196243838
},
{
"source": 11,
"target": 22,
"value": -0.52336387313101396
},
{
"source": 11,
"target": 23,
"value": 0.31707174039611435
},
{
"source": 11,
"target": 24,
"value": 0.54006819978990284
},
{
"source": 11,
"target": 25,
"value": -0.30514129388857986
},
{
"source": 11,
"target": 26,
"value": -0.013123519481113977
},
{
"source": 11,
"target": 27,
"value": 0.67800464317877829
},
{
"source": 11,
"target": 28,
"value": 0.79635981857343108
},
{
"source": 12,
"target": 0,
"value": -0.46324828402645996
},
{
"source": 12,
"target": 1,
"value": 0.11952440666923711
},
{
"source": 12,
"target": 2,
"value": -0.35704925987498737
},
{
"source": 12,
"target": 3,
"value": -0.47416287313362815
},
{
"source": 12,
"target": 4,
"value": -0.4398019960578668
},
{
"source": 12,
"target": 5,
"value": 3.1977884077074132
},
{
"source": 12,
"target": 6,
"value": -0.015058801183714325
},
{
"source": 12,
"target": 7,
"value": -0.45598211094106972
},
{
"source": 12,
"target": 8,
"value": 0.44095412639579512
},
{
"source": 12,
"target": 9,
"value": -0.4869662945262514
},
{
"source": 12,
"target": 10,
"value": -0.42535801982533017
},
{
"source": 12,
"target": 11,
"value": -0.42373970775898856
},
{
"source": 12,
"target": 12,
"value": 0.74420789317813385
},
{
"source": 12,
"target": 13,
"value": 0.68130172258150989
},
{
"source": 12,
"target": 14,
"value": -0.50858987737406181
},
{
"source": 12,
"target": 15,
"value": -0.39860477246708431
},
{
"source": 12,
"target": 16,
"value": -0.45235894347307548
},
{
"source": 12,
"target": 17,
"value": 1.1285503962177825
},
{
"source": 12,
"target": 18,
"value": 2.7566925661658677
},
{
"source": 12,
"target": 19,
"value": 3.8365305294256205
},
{
"source": 12,
"target": 20,
"value": 0.49960230874357137
},
{
"source": 12,
"target": 21,
"value": -0.46825891964048533
},
{
"source": 12,
"target": 22,
"value": 3.3824473127424546
},
{
"source": 12,
"target": 23,
"value": 3.6820454496305053
},
{
"source": 12,
"target": 24,
"value": -0.56938358563742986
},
{
"source": 12,
"target": 25,
"value": -0.39068514276352445
},
{
"source": 12,
"target": 26,
"value": -0.21537541650104824
},
{
"source": 12,
"target": 27,
"value": 2.9592713316710326
},
{
"source": 12,
"target": 28,
"value": -0.34204380389877947
},
{
"source": 13,
"target": 0,
"value": 0.060900003615309721
},
{
"source": 13,
"target": 1,
"value": 4.5634576838271768
},
{
"source": 13,
"target": 2,
"value": -0.2560699696127382
},
{
"source": 13,
"target": 3,
"value": -0.22154094979215463
},
{
"source": 13,
"target": 4,
"value": 0.12670702579337489
},
{
"source": 13,
"target": 5,
"value": 0.24434423271273953
},
{
"source": 13,
"target": 6,
"value": -0.62918695996370366
},
{
"source": 13,
"target": 7,
"value": -0.89092911094564875
},
{
"source": 13,
"target": 8,
"value": 0.37634738410261409
},
{
"source": 13,
"target": 9,
"value": -0.94505446326280618
},
{
"source": 13,
"target": 10,
"value": 0.52585189316245062
},
{
"source": 13,
"target": 11,
"value": -1.2950308635706942
},
{
"source": 13,
"target": 12,
"value": -0.65210761994422894
},
{
"source": 13,
"target": 13,
"value": 0.1315680440989983
},
{
"source": 13,
"target": 14,
"value": -0.50418491556505074
},
{
"source": 13,
"target": 15,
"value": -0.55811289474914916
},
{
"source": 13,
"target": 16,
"value": 0.016679962961528332
},
{
"source": 13,
"target": 17,
"value": 0.86065875838666006
},
{
"source": 13,
"target": 18,
"value": 0.33203429611467583
},
{
"source": 13,
"target": 19,
"value": -0.60247673582844496
},
{
"source": 13,
"target": 20,
"value": -0.68378318818401573
},
{
"source": 13,
"target": 21,
"value": -0.11046498973890982
},
{
"source": 13,
"target": 22,
"value": -1.0490390886068595
},
{
"source": 13,
"target": 23,
"value": -0.1547949954239673
},
{
"source": 13,
"target": 24,
"value": -0.96493839661040914
},
{
"source": 13,
"target": 25,
"value": 0.19699723770806454
},
{
"source": 13,
"target": 26,
"value": 0.78203376102450595
},
{
"source": 13,
"target": 27,
"value": 0.32188931707544144
},
{
"source": 13,
"target": 28,
"value": -0.56378032328412919
},
{
"source": 14,
"target": 0,
"value": 0.27900034538733337
},
{
"source": 14,
"target": 1,
"value": 0.41911842492223089
},
{
"source": 14,
"target": 2,
"value": -0.91650982032414419
},
{
"source": 14,
"target": 3,
"value": 0.66371625786870758
},
{
"source": 14,
"target": 4,
"value": 0.20723896425970934
},
{
"source": 14,
"target": 5,
"value": -3.4749187803404329
},
{
"source": 14,
"target": 6,
"value": 0.28592055326839499
},
{
"source": 14,
"target": 7,
"value": -1.334485082373027
},
{
"source": 14,
"target": 8,
"value": -0.99017868404485165
},
{
"source": 14,
"target": 9,
"value": -0.20613220060222856
},
{
"source": 14,
"target": 10,
"value": -0.029447696301579986
},
{
"source": 14,
"target": 11,
"value": 0.45938070060987801
},
{
"source": 14,
"target": 12,
"value": -0.3348914115472687
},
{
"source": 14,
"target": 13,
"value": 1.315886707117925
},
{
"source": 14,
"target": 14,
"value": -0.178046049706508
},
{
"source": 14,
"target": 15,
"value": 0.95871596824871486
},
{
"source": 14,
"target": 16,
"value": -1.6489335051244824
},
{
"source": 14,
"target": 17,
"value": -1.6570068052582585
},
{
"source": 14,
"target": 18,
"value": -1.2564950178430114
},
{
"source": 14,
"target": 19,
"value": -0.49270126805565179
},
{
"source": 14,
"target": 20,
"value": 0.088619355060551117
},
{
"source": 14,
"target": 21,
"value": -0.88193855948489863
},
{
"source": 14,
"target": 22,
"value": -0.57263355683916151
},
{
"source": 14,
"target": 23,
"value": 0.38642652247478354
},
{
"source": 14,
"target": 24,
"value": -0.19713576492036927
},
{
"source": 14,
"target": 25,
"value": -4.0056174955071659
},
{
"source": 14,
"target": 26,
"value": -0.7565972661784599
},
{
"source": 14,
"target": 27,
"value": -1.0754992389217453
},
{
"source": 14,
"target": 28,
"value": 1.0274994927696193
},
{
"source": 15,
"target": 0,
"value": -0.47931699742613437
},
{
"source": 15,
"target": 1,
"value": -0.62507254023672554
},
{
"source": 15,
"target": 2,
"value": -0.41749922782895738
},
{
"source": 15,
"target": 3,
"value": -0.21370487046813635
},
{
"source": 15,
"target": 4,
"value": -0.54596228458176843
},
{
"source": 15,
"target": 5,
"value": -0.26980028797843619
},
{
"source": 15,
"target": 6,
"value": -0.31687546751591544
},
{
"source": 15,
"target": 7,
"value": -0.65578830903665908
},
{
"source": 15,
"target": 8,
"value": -0.35374647416604865
},
{
"source": 15,
"target": 9,
"value": 0.08016567200789973
},
{
"source": 15,
"target": 10,
"value": -0.46328416305067038
},
{
"source": 15,
"target": 11,
"value": 0.46292999431629811
},
{
"source": 15,
"target": 12,
"value": -0.59595600135040594
},
{
"source": 15,
"target": 13,
"value": -0.38051120435587676
},
{
"source": 15,
"target": 14,
"value": -0.14421217395411642
},
{
"source": 15,
"target": 15,
"value": -0.48003439468054393
},
{
"source": 15,
"target": 16,
"value": -0.47698430912554929
},
{
"source": 15,
"target": 17,
"value": -0.44494923300807143
},
{
"source": 15,
"target": 18,
"value": -0.48214299194110549
},
{
"source": 15,
"target": 19,
"value": -0.48652385705118789
},
{
"source": 15,
"target": 20,
"value": 3.5358797187357425
},
{
"source": 15,
"target": 21,
"value": -0.29708126885773756
},
{
"source": 15,
"target": 22,
"value": 0.71507983292449284
},
{
"source": 15,
"target": 23,
"value": 0.65418749048918723
},
{
"source": 15,
"target": 24,
"value": -0.44234885916479622
},
{
"source": 15,
"target": 25,
"value": -0.46959542333146659
},
{
"source": 15,
"target": 26,
"value": -0.48947834062665019
},
{
"source": 15,
"target": 27,
"value": -0.43873051544346275
},
{
"source": 15,
"target": 28,
"value": -0.10407769813067255
},
{
"source": 16,
"target": 0,
"value": -0.4856321742985974
},
{
"source": 16,
"target": 1,
"value": 0.99448271653877729
},
{
"source": 16,
"target": 2,
"value": 0.17351343806309574
},
{
"source": 16,
"target": 3,
"value": -0.41688754276678863
},
{
"source": 16,
"target": 4,
"value": -0.10289907559493035
},
{
"source": 16,
"target": 5,
"value": 0.091534106326730647
},
{
"source": 16,
"target": 6,
"value": -0.093475402761216977
},
{
"source": 16,
"target": 7,
"value": 0.082827427258412328
},
{
"source": 16,
"target": 8,
"value": -0.41264038224565736
},
{
"source": 16,
"target": 9,
"value": -0.46404929190842076
},
{
"source": 16,
"target": 10,
"value": -0.49870931854833689
},
{
"source": 16,
"target": 11,
"value": 0.51799240762133114
},
{
"source": 16,
"target": 12,
"value": 0.99281353678558004
},
{
"source": 16,
"target": 13,
"value": -0.050537979944364812
},
{
"source": 16,
"target": 14,
"value": -0.34995366300554764
},
{
"source": 16,
"target": 15,
"value": -0.69982835316132697
},
{
"source": 16,
"target": 16,
"value": -0.42276506490732146
},
{
"source": 16,
"target": 17,
"value": -0.16139571980478512
},
{
"source": 16,
"target": 18,
"value": -0.30037833930970331
},
{
"source": 16,
"target": 19,
"value": 0.05582142323507179
},
{
"source": 16,
"target": 20,
"value": 4.0898681064101599
},
{
"source": 16,
"target": 21,
"value": 0.013144310256611393
},
{
"source": 16,
"target": 22,
"value": -0.39397342672939684
},
{
"source": 16,
"target": 23,
"value": 0.28822787368705766
},
{
"source": 16,
"target": 24,
"value": -0.12255018497388269
},
{
"source": 16,
"target": 25,
"value": -0.071323948881920826
},
{
"source": 16,
"target": 26,
"value": -0.37423098056504422
},
{
"source": 16,
"target": 27,
"value": 0.071446863797490018
},
{
"source": 16,
"target": 28,
"value": -0.47965189827448867
},
{
"source": 17,
"target": 0,
"value": -0.5885909972249368
},
{
"source": 17,
"target": 1,
"value": -0.07182440107354747
},
{
"source": 17,
"target": 2,
"value": -0.28352600668137729
},
{
"source": 17,
"target": 3,
"value": -0.50744996704226508
},
{
"source": 17,
"target": 4,
"value": 0.073407531048699293
},
{
"source": 17,
"target": 5,
"value": -0.66177333746368172
},
{
"source": 17,
"target": 6,
"value": -0.60582236520487331
},
{
"source": 17,
"target": 7,
"value": 0.0011336549908594262
},
{
"source": 17,
"target": 8,
"value": 0.82699782583046888
},
{
"source": 17,
"target": 9,
"value": 0.031047273556081903
},
{
"source": 17,
"target": 10,
"value": 1.0220661545899288
},
{
"source": 17,
"target": 11,
"value": -0.58971015259991599
},
{
"source": 17,
"target": 12,
"value": 0.11709990060708197
},
{
"source": 17,
"target": 13,
"value": -1.0338449242132084
},
{
"source": 17,
"target": 14,
"value": 1.3737142884944473
},
{
"source": 17,
"target": 15,
"value": -0.079064928560252296
},
{
"source": 17,
"target": 16,
"value": -0.66304201562155263
},
{
"source": 17,
"target": 17,
"value": -0.62299709576704798
},
{
"source": 17,
"target": 18,
"value": 4.4094662875619095
},
{
"source": 17,
"target": 19,
"value": 0.16583979683642089
},
{
"source": 17,
"target": 20,
"value": -0.55504352193609907
},
{
"source": 17,
"target": 21,
"value": -0.75606784154742035
},
{
"source": 17,
"target": 22,
"value": 0.18176850420783053
},
{
"source": 17,
"target": 23,
"value": -0.098178924306600093
},
{
"source": 17,
"target": 24,
"value": -0.84884446283513626
},
{
"source": 17,
"target": 25,
"value": -0.66089205924330319
},
{
"source": 17,
"target": 26,
"value": 3.2365393481597988
},
{
"source": 17,
"target": 27,
"value": -0.43165777459304366
},
{
"source": 17,
"target": 28,
"value": -1.1554318671681412
},
{
"source": 18,
"target": 0,
"value": -0.59827806375068315
},
{
"source": 18,
"target": 1,
"value": 0.77781418071927777
},
{
"source": 18,
"target": 2,
"value": -0.36408030157251225
},
{
"source": 18,
"target": 3,
"value": -0.73847467444941484
},
{
"source": 18,
"target": 4,
"value": 0.69387698574519074
},
{
"source": 18,
"target": 5,
"value": -0.34017365772300329
},
{
"source": 18,
"target": 6,
"value": -0.8209763314766988
},
{
"source": 18,
"target": 7,
"value": -0.1496686576558118
},
{
"source": 18,
"target": 8,
"value": 0.53990984437158929
},
{
"source": 18,
"target": 9,
"value": -0.2261053567438322
},
{
"source": 18,
"target": 10,
"value": -1.1735528061938814
},
{
"source": 18,
"target": 11,
"value": 11.985077919994957
},
{
"source": 18,
"target": 12,
"value": 5.4722929048397999
},
{
"source": 18,
"target": 13,
"value": -0.59210676966721243
},
{
"source": 18,
"target": 14,
"value": -0.76109009369069136
},
{
"source": 18,
"target": 15,
"value": 0.14632179746523138
},
{
"source": 18,
"target": 16,
"value": -1.2735087817489419
},
{
"source": 18,
"target": 17,
"value": -0.63490326999129942
},
{
"source": 18,
"target": 18,
"value": -0.51330409137057476
},
{
"source": 18,
"target": 19,
"value": -0.58009838081063525
},
{
"source": 18,
"target": 20,
"value": 0.32882880040024387
},
{
"source": 18,
"target": 21,
"value": 1.3516343966184936
},
{
"source": 18,
"target": 22,
"value": 1.076968136130493
},
{
"source": 18,
"target": 23,
"value": -0.51446239579854935
},
{
"source": 18,
"target": 24,
"value": -1.3305961003106304
},
{
"source": 18,
"target": 25,
"value": -0.072548369069313431
},
{
"source": 18,
"target": 26,
"value": 0.114728569477292
},
{
"source": 18,
"target": 27,
"value": -0.21018151914875788
},
{
"source": 18,
"target": 28,
"value": -0.33585944844372617
},
{
"source": 19,
"target": 0,
"value": -0.32810824083643514
},
{
"source": 19,
"target": 1,
"value": -0.062366406530917427
},
{
"source": 19,
"target": 2,
"value": -0.41377562600444601
},
{
"source": 19,
"target": 3,
"value": -0.065964209075450184
},
{
"source": 19,
"target": 4,
"value": -0.27290131047014798
},
{
"source": 19,
"target": 5,
"value": -0.30578816681996224
},
{
"source": 19,
"target": 6,
"value": -0.062134745112876234
},
{
"source": 19,
"target": 7,
"value": -0.20145692914629901
},
{
"source": 19,
"target": 8,
"value": -0.34635208111894389
},
{
"source": 19,
"target": 9,
"value": -0.53365839539355808
},
{
"source": 19,
"target": 10,
"value": -0.1387985589075445
},
{
"source": 19,
"target": 11,
"value": -0.32271556591386336
},
{
"source": 19,
"target": 12,
"value": -0.68071404189532425
},
{
"source": 19,
"target": 13,
"value": -0.60584711492580778
},
{
"source": 19,
"target": 14,
"value": 0.84939653035934226
},
{
"source": 19,
"target": 15,
"value": 0.093771374781613265
},
{
"source": 19,
"target": 16,
"value": 0.33033092097886035
},
{
"source": 19,
"target": 17,
"value": 0.13406938206162655
},
{
"source": 19,
"target": 18,
"value": -0.8390828233859452
},
{
"source": 19,
"target": 19,
"value": -0.19622843166346904
},
{
"source": 19,
"target": 20,
"value": 0.80786971034015487
},
{
"source": 19,
"target": 21,
"value": 0.37488847668015779
},
{
"source": 19,
"target": 22,
"value": 0.13338547726662733
},
{
"source": 19,
"target": 23,
"value": 3.6798639382440483
},
{
"source": 19,
"target": 24,
"value": 0.13169132724425719
},
{
"source": 19,
"target": 25,
"value": -0.22530193962761697
},
{
"source": 19,
"target": 26,
"value": 0.95471988323635415
},
{
"source": 19,
"target": 27,
"value": 0.34177298058297378
},
{
"source": 19,
"target": 28,
"value": 2.4525136876742977
},
{
"source": 20,
"target": 0,
"value": -0.88105035711675872
},
{
"source": 20,
"target": 1,
"value": -0.59374078445602363
},
{
"source": 20,
"target": 2,
"value": -1.6322134116701763
},
{
"source": 20,
"target": 3,
"value": -0.31710334398728379
},
{
"source": 20,
"target": 4,
"value": -0.60958877752635532
},
{
"source": 20,
"target": 5,
"value": 0.98218337758183816
},
{
"source": 20,
"target": 6,
"value": -1.1533790614517163
},
{
"source": 20,
"target": 7,
"value": -0.41744334478971395
},
{
"source": 20,
"target": 8,
"value": 1.0894088417951437
},
{
"source": 20,
"target": 9,
"value": -0.23627925151831849
},
{
"source": 20,
"target": 10,
"value": 0.65907746146123913
},
{
"source": 20,
"target": 11,
"value": -0.83947542265896147
},
{
"source": 20,
"target": 12,
"value": -0.96518610429489393
},
{
"source": 20,
"target": 13,
"value": -0.68603019299184742
},
{
"source": 20,
"target": 14,
"value": -0.29064819706498707
},
{
"source": 20,
"target": 15,
"value": -1.5608044566084671
},
{
"source": 20,
"target": 16,
"value": 0.88892377521038013
},
{
"source": 20,
"target": 17,
"value": -1.5852094248711635
},
{
"source": 20,
"target": 18,
"value": -1.3050205820248657
},
{
"source": 20,
"target": 19,
"value": -0.48991435961606772
},
{
"source": 20,
"target": 20,
"value": 0.60439258674407437
},
{
"source": 20,
"target": 21,
"value": -0.14950627998789023
},
{
"source": 20,
"target": 22,
"value": 0.1994722186271411
},
{
"source": 20,
"target": 23,
"value": 4.0019262551096118
},
{
"source": 20,
"target": 24,
"value": -1.9300405128862814
},
{
"source": 20,
"target": 25,
"value": 0.25544097571802316
},
{
"source": 20,
"target": 26,
"value": -1.6788790629745431
},
{
"source": 20,
"target": 27,
"value": -1.0065750662622575
},
{
"source": 20,
"target": 28,
"value": -1.089763025928904
},
{
"source": 21,
"target": 0,
"value": 1.2712138451753605
},
{
"source": 21,
"target": 1,
"value": 4.19426493708007
},
{
"source": 21,
"target": 2,
"value": 0.97761066972111432
},
{
"source": 21,
"target": 3,
"value": 0.53742709512996645
},
{
"source": 21,
"target": 4,
"value": -0.54525814992037092
},
{
"source": 21,
"target": 5,
"value": -0.04476686640340681
},
{
"source": 21,
"target": 6,
"value": 1.2360338913007489
},
{
"source": 21,
"target": 7,
"value": -0.76154403106021884
},
{
"source": 21,
"target": 8,
"value": -0.72677537828312766
},
{
"source": 21,
"target": 9,
"value": -0.33803917297475944
},
{
"source": 21,
"target": 10,
"value": -0.23565810377988208
},
{
"source": 21,
"target": 11,
"value": 3.4056033086058908
},
{
"source": 21,
"target": 12,
"value": 0.76912305739026054
},
{
"source": 21,
"target": 13,
"value": 1.7456853072607199
},
{
"source": 21,
"target": 14,
"value": -0.17579825604914415
},
{
"source": 21,
"target": 15,
"value": -0.58854530542833794
},
{
"source": 21,
"target": 16,
"value": 0.49314367696355976
},
{
"source": 21,
"target": 17,
"value": 3.8431179960753465
},
{
"source": 21,
"target": 18,
"value": -0.064070597913716915
},
{
"source": 21,
"target": 19,
"value": 0.36936581067321139
},
{
"source": 21,
"target": 20,
"value": -0.95381724012436397
},
{
"source": 21,
"target": 21,
"value": -0.77692303609774094
},
{
"source": 21,
"target": 22,
"value": -0.74826174761761388
},
{
"source": 21,
"target": 23,
"value": -0.56406466410389988
},
{
"source": 21,
"target": 24,
"value": 0.47772445581872536
},
{
"source": 21,
"target": 25,
"value": 2.1574781380936652
},
{
"source": 21,
"target": 26,
"value": 1.3071359690303876
},
{
"source": 21,
"target": 27,
"value": 0.37268729553630153
},
{
"source": 21,
"target": 28,
"value": 0.031152004179421041
},
{
"source": 22,
"target": 0,
"value": -0.69310635578631552
},
{
"source": 22,
"target": 1,
"value": -0.32676796945682657
},
{
"source": 22,
"target": 2,
"value": 0.27309149638625219
},
{
"source": 22,
"target": 3,
"value": -0.49329829554142335
},
{
"source": 22,
"target": 4,
"value": -0.67209915873358606
},
{
"source": 22,
"target": 5,
"value": -0.56420755306050063
},
{
"source": 22,
"target": 6,
"value": -0.72939168489820494
},
{
"source": 22,
"target": 7,
"value": -0.38811784065127874
},
{
"source": 22,
"target": 8,
"value": -0.40018949749379784
},
{
"source": 22,
"target": 9,
"value": -0.53287546828561005
},
{
"source": 22,
"target": 10,
"value": -0.50997515625711087
},
{
"source": 22,
"target": 11,
"value": -0.42712933037743323
},
{
"source": 22,
"target": 12,
"value": 0.1400753093053064
},
{
"source": 22,
"target": 13,
"value": -0.80570917226629635
},
{
"source": 22,
"target": 14,
"value": -0.36249042989405744
},
{
"source": 22,
"target": 15,
"value": -0.52975999017137299
},
{
"source": 22,
"target": 16,
"value": -0.57357650215019862
},
{
"source": 22,
"target": 17,
"value": -0.43755272011765889
},
{
"source": 22,
"target": 18,
"value": 0.64482873142017805
},
{
"source": 22,
"target": 19,
"value": -0.53031910638820068
},
{
"source": 22,
"target": 20,
"value": 3.7262195187201215
},
{
"source": 22,
"target": 21,
"value": -0.53232854755673331
},
{
"source": 22,
"target": 22,
"value": -0.73164878828358748
},
{
"source": 22,
"target": 23,
"value": -0.62616438430912658
},
{
"source": 22,
"target": 24,
"value": 0.38558361536021618
},
{
"source": 22,
"target": 25,
"value": -0.45675498495364925
},
{
"source": 22,
"target": 26,
"value": 0.7504979439428181
},
{
"source": 22,
"target": 27,
"value": -0.6123891116113066
},
{
"source": 22,
"target": 28,
"value": -0.60102666929885784
},
{
"source": 23,
"target": 0,
"value": 0.2807468420507277
},
{
"source": 23,
"target": 1,
"value": 0.023280502273844653
},
{
"source": 23,
"target": 2,
"value": -0.019960330385736816
},
{
"source": 23,
"target": 3,
"value": 0.78403602937081274
},
{
"source": 23,
"target": 4,
"value": 0.83757306928291875
},
{
"source": 23,
"target": 5,
"value": 0.38910704839233301
},
{
"source": 23,
"target": 6,
"value": 2.5761732857209951
},
{
"source": 23,
"target": 7,
"value": -0.15519968155167382
},
{
"source": 23,
"target": 8,
"value": -0.14843087863566184
},
{
"source": 23,
"target": 9,
"value": -0.48880650993654373
},
{
"source": 23,
"target": 10,
"value": 0.34960587591409337
},
{
"source": 23,
"target": 11,
"value": 1.9151330362347383
},
{
"source": 23,
"target": 12,
"value": 3.6526827661187489
},
{
"source": 23,
"target": 13,
"value": 1.6612318751396344
},
{
"source": 23,
"target": 14,
"value": 0.17576474144291807
},
{
"source": 23,
"target": 15,
"value": 2.7448375361123722
},
{
"source": 23,
"target": 16,
"value": 0.27511126949269821
},
{
"source": 23,
"target": 17,
"value": 1.3867634824363242
},
{
"source": 23,
"target": 18,
"value": 0.47964675766007858
},
{
"source": 23,
"target": 19,
"value": 1.0960844992788306
},
{
"source": 23,
"target": 20,
"value": -0.51056992914484178
},
{
"source": 23,
"target": 21,
"value": -0.58049204101069563
},
{
"source": 23,
"target": 22,
"value": 1.7148858356442294
},
{
"source": 23,
"target": 23,
"value": -1.5531076816999707
},
{
"source": 23,
"target": 24,
"value": 1.1915978306732764
},
{
"source": 23,
"target": 25,
"value": 0.57650557525733626
},
{
"source": 23,
"target": 26,
"value": 1.7836801134871394
},
{
"source": 23,
"target": 27,
"value": 0.77215509839545804
},
{
"source": 23,
"target": 28,
"value": 1.5419638769078641
},
{
"source": 24,
"target": 0,
"value": 0.018684285454513803
},
{
"source": 24,
"target": 1,
"value": 0.042530578070932794
},
{
"source": 24,
"target": 2,
"value": 0.40417500743600271
},
{
"source": 24,
"target": 3,
"value": 0.060627736665686015
},
{
"source": 24,
"target": 4,
"value": 0.85027726939184445
},
{
"source": 24,
"target": 5,
"value": -1.2123208223620277
},
{
"source": 24,
"target": 6,
"value": 2.2700212689357651
},
{
"source": 24,
"target": 7,
"value": -1.7123959014034713
},
{
"source": 24,
"target": 8,
"value": -2.2767271792851984
},
{
"source": 24,
"target": 9,
"value": -0.88130082168279633
},
{
"source": 24,
"target": 10,
"value": 0.99087214272995217
},
{
"source": 24,
"target": 11,
"value": -1.1302994010714282
},
{
"source": 24,
"target": 12,
"value": 0.56048373785179961
},
{
"source": 24,
"target": 13,
"value": -0.91282811668150532
},
{
"source": 24,
"target": 14,
"value": 0.7247788519027708
},
{
"source": 24,
"target": 15,
"value": -0.01806104573475989
},
{
"source": 24,
"target": 16,
"value": 0.29941596025140566
},
{
"source": 24,
"target": 17,
"value": 0.45134313356062333
},
{
"source": 24,
"target": 18,
"value": -1.1355439921535457
},
{
"source": 24,
"target": 19,
"value": -0.81411694604856866
},
{
"source": 24,
"target": 20,
"value": -0.56617392359925223
},
{
"source": 24,
"target": 21,
"value": 0.84375140479219757
},
{
"source": 24,
"target": 22,
"value": -0.78677868519266447
},
{
"source": 24,
"target": 23,
"value": 1.2199877470667562
},
{
"source": 24,
"target": 24,
"value": 1.0569075193044264
},
{
"source": 24,
"target": 25,
"value": 0.28110636252421495
},
{
"source": 24,
"target": 26,
"value": 3.5408786302535198
},
{
"source": 24,
"target": 27,
"value": -0.48121154806893202
},
{
"source": 24,
"target": 28,
"value": -0.019873417083390497
},
{
"source": 25,
"target": 0,
"value": 0.082311601686230806
},
{
"source": 25,
"target": 1,
"value": 0.043985823314904901
},
{
"source": 25,
"target": 2,
"value": 0.0317239768372099
},
{
"source": 25,
"target": 3,
"value": -0.26291643843770063
},
{
"source": 25,
"target": 4,
"value": -0.34753733731902153
},
{
"source": 25,
"target": 5,
"value": -0.16717278343551759
},
{
"source": 25,
"target": 6,
"value": 1.024137679906419
},
{
"source": 25,
"target": 7,
"value": -0.41403361393126614
},
{
"source": 25,
"target": 8,
"value": -0.45245378020409965
},
{
"source": 25,
"target": 9,
"value": 0.0287293061439176
},
{
"source": 25,
"target": 10,
"value": -0.7988058944278057
},
{
"source": 25,
"target": 11,
"value": 0.063897380173891405
},
{
"source": 25,
"target": 12,
"value": 0.59245675754008353
},
{
"source": 25,
"target": 13,
"value": -0.22243260940917406
},
{
"source": 25,
"target": 14,
"value": -0.12260024212803963
},
{
"source": 25,
"target": 15,
"value": -0.42199008499245699
},
{
"source": 25,
"target": 16,
"value": -0.55387358037422885
},
{
"source": 25,
"target": 17,
"value": 0.095828378218063698
},
{
"source": 25,
"target": 18,
"value": -0.5449946820937559
},
{
"source": 25,
"target": 19,
"value": -0.68960981828118184
},
{
"source": 25,
"target": 20,
"value": 9.2613097794637476
},
{
"source": 25,
"target": 21,
"value": -0.23273590693058285
},
{
"source": 25,
"target": 22,
"value": -0.26831371026028378
},
{
"source": 25,
"target": 23,
"value": -0.52073055586751338
},
{
"source": 25,
"target": 24,
"value": -0.52792977853706202
},
{
"source": 25,
"target": 25,
"value": 2.8546194152837892
},
{
"source": 25,
"target": 26,
"value": -0.056756100108031421
},
{
"source": 25,
"target": 27,
"value": -0.63933324447122142
},
{
"source": 25,
"target": 28,
"value": -0.5935358056237211
},
{
"source": 26,
"target": 0,
"value": 0.043263197895282497
},
{
"source": 26,
"target": 1,
"value": -0.49582275089062505
},
{
"source": 26,
"target": 2,
"value": -0.15847263614555218
},
{
"source": 26,
"target": 3,
"value": 0.57372623698610081
},
{
"source": 26,
"target": 4,
"value": 1.2823709184269372
},
{
"source": 26,
"target": 5,
"value": -0.0041942529466539383
},
{
"source": 26,
"target": 6,
"value": -0.26511431764451848
},
{
"source": 26,
"target": 7,
"value": 0.74327868013723941
},
{
"source": 26,
"target": 8,
"value": 0.78902853070039058
},
{
"source": 26,
"target": 9,
"value": -0.29804930423703124
},
{
"source": 26,
"target": 10,
"value": -0.93902521440911224
},
{
"source": 26,
"target": 11,
"value": -0.29789206664229845
},
{
"source": 26,
"target": 12,
"value": -0.64587144279123876
},
{
"source": 26,
"target": 13,
"value": 4.3411987570448094
},
{
"source": 26,
"target": 14,
"value": 0.48030509245217889
},
{
"source": 26,
"target": 15,
"value": -0.39178806871230965
},
{
"source": 26,
"target": 16,
"value": 1.4459734909934285
},
{
"source": 26,
"target": 17,
"value": 1.1596092387160728
},
{
"source": 26,
"target": 18,
"value": -0.84634308657042945
},
{
"source": 26,
"target": 19,
"value": -0.84822050345152644
},
{
"source": 26,
"target": 20,
"value": -0.12503763400179244
},
{
"source": 26,
"target": 21,
"value": 0.4742357212955341
},
{
"source": 26,
"target": 22,
"value": -0.30586401269519803
},
{
"source": 26,
"target": 23,
"value": -0.31464415998501999
},
{
"source": 26,
"target": 24,
"value": -1.7206690215801095
},
{
"source": 26,
"target": 25,
"value": 2.918318025294476
},
{
"source": 26,
"target": 26,
"value": -0.9032096350811134
},
{
"source": 26,
"target": 27,
"value": -0.12267278057702735
},
{
"source": 26,
"target": 28,
"value": 1.750479816950933
},
{
"source": 27,
"target": 0,
"value": -0.78383574050768645
},
{
"source": 27,
"target": 1,
"value": 2.4683011877752055
},
{
"source": 27,
"target": 2,
"value": 1.6262398163544223
},
{
"source": 27,
"target": 3,
"value": -0.68629058219543082
},
{
"source": 27,
"target": 4,
"value": -0.65234855096637956
},
{
"source": 27,
"target": 5,
"value": 0.91984052621643597
},
{
"source": 27,
"target": 6,
"value": 3.4934342131511156
},
{
"source": 27,
"target": 7,
"value": -0.8649395250483799
},
{
"source": 27,
"target": 8,
"value": -0.95320817073349429
},
{
"source": 27,
"target": 9,
"value": -0.18297291857807393
},
{
"source": 27,
"target": 10,
"value": -0.024641705357159791
},
{
"source": 27,
"target": 11,
"value": 0.17836730432754647
},
{
"source": 27,
"target": 12,
"value": 1.4498535218969857
},
{
"source": 27,
"target": 13,
"value": -0.60099692148678907
},
{
"source": 27,
"target": 14,
"value": -0.45935951199088382
},
{
"source": 27,
"target": 15,
"value": -0.70887557081573382
},
{
"source": 27,
"target": 16,
"value": -0.71863619568236214
},
{
"source": 27,
"target": 17,
"value": 0.94494059318569723
},
{
"source": 27,
"target": 18,
"value": -0.66466459686859058
},
{
"source": 27,
"target": 19,
"value": 1.5452985552084142
},
{
"source": 27,
"target": 20,
"value": 0.15605895127266589
},
{
"source": 27,
"target": 21,
"value": -0.70619451112752196
},
{
"source": 27,
"target": 22,
"value": 2.7436457872249265
},
{
"source": 27,
"target": 23,
"value": 3.5733415488713587
},
{
"source": 27,
"target": 24,
"value": 0.69714313281103002
},
{
"source": 27,
"target": 25,
"value": -0.51200210744244257
},
{
"source": 27,
"target": 26,
"value": 0.7315727342241376
},
{
"source": 27,
"target": 27,
"value": 0.19855593736238394
},
{
"source": 27,
"target": 28,
"value": -0.19930018017890011
},
{
"source": 28,
"target": 0,
"value": -1.2182228261211283
},
{
"source": 28,
"target": 1,
"value": 0.18524274600351884
},
{
"source": 28,
"target": 2,
"value": -0.78638377785050173
},
{
"source": 28,
"target": 3,
"value": -1.421783689175625
},
{
"source": 28,
"target": 4,
"value": -0.23484593969867476
},
{
"source": 28,
"target": 5,
"value": 0.04063016487593548
},
{
"source": 28,
"target": 6,
"value": 2.6107272730935964
},
{
"source": 28,
"target": 7,
"value": -1.123736309365059
},
{
"source": 28,
"target": 8,
"value": 0.13255691615286994
},
{
"source": 28,
"target": 9,
"value": -0.80143822146912647
},
{
"source": 28,
"target": 10,
"value": -0.38275882362481961
},
{
"source": 28,
"target": 11,
"value": 3.9247805204008892
},
{
"source": 28,
"target": 12,
"value": 0.60632889013595903
},
{
"source": 28,
"target": 13,
"value": 0.86741930163040637
},
{
"source": 28,
"target": 14,
"value": -0.75812245566018743
},
{
"source": 28,
"target": 15,
"value": -0.76603600369863745
},
{
"source": 28,
"target": 16,
"value": 0.17488466916063805
},
{
"source": 28,
"target": 17,
"value": 0.03476631834660885
},
{
"source": 28,
"target": 18,
"value": 0.78808735216114656
},
{
"source": 28,
"target": 19,
"value": -0.65431877038522335
},
{
"source": 28,
"target": 20,
"value": 0.49855804064978843
},
{
"source": 28,
"target": 21,
"value": -1.105083081069125
},
{
"source": 28,
"target": 22,
"value": 0.81299358690427093
},
{
"source": 28,
"target": 23,
"value": -0.60809375082139816
},
{
"source": 28,
"target": 24,
"value": 0.21519672492394998
},
{
"source": 28,
"target": 25,
"value": -0.37195302396381635
},
{
"source": 28,
"target": 26,
"value": -0.72045139778605072
},
{
"source": 28,
"target": 27,
"value": 1.8607556593488048
},
{
"source": 28,
"target": 28,
"value": -1.3604078805766171
},
{
"source": 29,
"target": 0,
"value": 1.8880433964617662
},
{
"source": 29,
"target": 1,
"value": -0.84433982255081086
},
{
"source": 29,
"target": 2,
"value": -0.54589199409526989
},
{
"source": 29,
"target": 3,
"value": 3.5222143686727017
},
{
"source": 29,
"target": 4,
"value": 5.5750375644356183
},
{
"source": 29,
"target": 5,
"value": 0.0053381687011770798
},
{
"source": 29,
"target": 6,
"value": -0.68783600005051448
},
{
"source": 29,
"target": 7,
"value": 1.1865259468484
},
{
"source": 29,
"target": 8,
"value": -0.66783891323092515
},
{
"source": 29,
"target": 9,
"value": -0.59040753057532969
},
{
"source": 29,
"target": 10,
"value": -0.75413173412942125
},
{
"source": 29,
"target": 11,
"value": 1.3797742980016994
},
{
"source": 29,
"target": 12,
"value": -0.29796383386360409
},
{
"source": 29,
"target": 13,
"value": 3.4274713884970827
},
{
"source": 29,
"target": 14,
"value": -0.5529229703621944
},
{
"source": 29,
"target": 15,
"value": 2.8138039377085602
},
{
"source": 29,
"target": 16,
"value": 0.82084077194493621
},
{
"source": 29,
"target": 17,
"value": 2.561986214889362
},
{
"source": 29,
"target": 18,
"value": -0.54360425484813379
},
{
"source": 29,
"target": 19,
"value": -0.99911735570791049
},
{
"source": 29,
"target": 20,
"value": -0.37904396444913935
},
{
"source": 29,
"target": 21,
"value": -0.55888380958329631
},
{
"source": 29,
"target": 22,
"value": -0.1217619135287082
},
{
"source": 29,
"target": 23,
"value": -0.7745008660660786
},
{
"source": 29,
"target": 24,
"value": -0.50010338686916944
},
{
"source": 29,
"target": 25,
"value": 2.5800649017962134
},
{
"source": 29,
"target": 26,
"value": -0.65668973574088851
},
{
"source": 29,
"target": 27,
"value": -0.77484855913912054
},
{
"source": 29,
"target": 28,
"value": 1.7174816801016253
},
{
"source": 30,
"target": 0,
"value": -0.21640491917955929
},
{
"source": 30,
"target": 1,
"value": 0.093615086826348184
},
{
"source": 30,
"target": 2,
"value": -0.069198321796436799
},
{
"source": 30,
"target": 3,
"value": -0.15723665115341401
},
{
"source": 30,
"target": 4,
"value": -0.26607559728812397
},
{
"source": 30,
"target": 5,
"value": -0.47491374136585662
},
{
"source": 30,
"target": 6,
"value": -0.40998089336299659
},
{
"source": 30,
"target": 7,
"value": -0.25917309623776003
},
{
"source": 30,
"target": 8,
"value": 5.2379760798824995
},
{
"source": 30,
"target": 9,
"value": -0.023679060314694102
},
{
"source": 30,
"target": 10,
"value": -0.004338029866285501
},
{
"source": 30,
"target": 11,
"value": 0.07055313911585756
},
{
"source": 30,
"target": 12,
"value": -0.36766135468771233
},
{
"source": 30,
"target": 13,
"value": -0.18670530008409125
},
{
"source": 30,
"target": 14,
"value": 0.022236841031190689
},
{
"source": 30,
"target": 15,
"value": -0.44869923229616787
},
{
"source": 30,
"target": 16,
"value": -0.35040026499028892
},
{
"source": 30,
"target": 17,
"value": -0.17319415007783531
},
{
"source": 30,
"target": 18,
"value": -0.39352154826900576
},
{
"source": 30,
"target": 19,
"value": -0.27555262965177185
},
{
"source": 30,
"target": 20,
"value": -0.013517582331826513
},
{
"source": 30,
"target": 21,
"value": -0.40049539612419977
},
{
"source": 30,
"target": 22,
"value": -0.5646148140557431
},
{
"source": 30,
"target": 23,
"value": -0.31016429486962471
},
{
"source": 30,
"target": 24,
"value": -0.32718353099135161
},
{
"source": 30,
"target": 25,
"value": -0.71517592053376966
},
{
"source": 30,
"target": 26,
"value": 0.43914161628018528
},
{
"source": 30,
"target": 27,
"value": -0.10731686386188198
},
{
"source": 30,
"target": 28,
"value": 0.13160665576455349
},
{
"source": 31,
"target": 0,
"value": -0.43094198991411709
},
{
"source": 31,
"target": 1,
"value": -0.46888909930830919
},
{
"source": 31,
"target": 2,
"value": -0.26704431127574701
},
{
"source": 31,
"target": 3,
"value": -0.35475424548202278
},
{
"source": 31,
"target": 4,
"value": -0.41957441251304123
},
{
"source": 31,
"target": 5,
"value": -0.27925012560424278
},
{
"source": 31,
"target": 6,
"value": -0.40160227026328849
},
{
"source": 31,
"target": 7,
"value": -0.39916986083655914
},
{
"source": 31,
"target": 8,
"value": -0.29599964078051727
},
{
"source": 31,
"target": 9,
"value": -0.24524016082487823
},
{
"source": 31,
"target": 10,
"value": -0.33348671889842385
},
{
"source": 31,
"target": 11,
"value": -0.21901409650319972
},
{
"source": 31,
"target": 12,
"value": -0.27972252587037655
},
{
"source": 31,
"target": 13,
"value": -0.2668302326052937
},
{
"source": 31,
"target": 14,
"value": -0.44329528066003621
},
{
"source": 31,
"target": 15,
"value": -0.4223717071402992
},
{
"source": 31,
"target": 16,
"value": -0.27941615550643889
},
{
"source": 31,
"target": 17,
"value": -0.27922205751189433
},
{
"source": 31,
"target": 18,
"value": -0.42154250909007623
},
{
"source": 31,
"target": 19,
"value": -0.37661928942137596
},
{
"source": 31,
"target": 20,
"value": 3.6041555099053153
},
{
"source": 31,
"target": 21,
"value": -0.34170733984383461
},
{
"source": 31,
"target": 22,
"value": -0.30637769899371964
},
{
"source": 31,
"target": 23,
"value": -0.48121907926566776
},
{
"source": 31,
"target": 24,
"value": 0.082499535997544018
},
{
"source": 31,
"target": 25,
"value": -0.25397742496165004
},
{
"source": 31,
"target": 26,
"value": -0.38450356898898558
},
{
"source": 31,
"target": 27,
"value": -0.27482440589040269
},
{
"source": 31,
"target": 28,
"value": -0.31903402999092495
},
{
"source": 32,
"target": 0,
"value": -0.63595284705610922
},
{
"source": 32,
"target": 1,
"value": -0.50682459333884355
},
{
"source": 32,
"target": 2,
"value": -0.61122570221696115
},
{
"source": 32,
"target": 3,
"value": -0.72872806916823796
},
{
"source": 32,
"target": 4,
"value": -0.51888682997419477
},
{
"source": 32,
"target": 5,
"value": 0.089342818310470862
},
{
"source": 32,
"target": 6,
"value": 0.18905756872615601
},
{
"source": 32,
"target": 7,
"value": -0.43565553830069464
},
{
"source": 32,
"target": 8,
"value": -0.21734069771977796
},
{
"source": 32,
"target": 9,
"value": -0.36782661432533198
},
{
"source": 32,
"target": 10,
"value": -0.68544627125183799
},
{
"source": 32,
"target": 11,
"value": 0.18678091817457323
},
{
"source": 32,
"target": 12,
"value": -0.47135306673885297
},
{
"source": 32,
"target": 13,
"value": -0.41115928711439309
},
{
"source": 32,
"target": 14,
"value": -0.35814669143862876
},
{
"source": 32,
"target": 15,
"value": -0.323935296299935
},
{
"source": 32,
"target": 16,
"value": 2.2786284948158526
},
{
"source": 32,
"target": 17,
"value": -0.35773480064266111
},
{
"source": 32,
"target": 18,
"value": 1.1781394488403503
},
{
"source": 32,
"target": 19,
"value": 1.4980846744652283
},
{
"source": 32,
"target": 20,
"value": -0.75931756471863776
},
{
"source": 32,
"target": 21,
"value": -0.55293777359141927
},
{
"source": 32,
"target": 22,
"value": -0.15903515856139108
},
{
"source": 32,
"target": 23,
"value": 3.5996180441708256
},
{
"source": 32,
"target": 24,
"value": -0.39434612006284697
},
{
"source": 32,
"target": 25,
"value": -0.63978215958678997
},
{
"source": 32,
"target": 26,
"value": -0.36953287928534873
},
{
"source": 32,
"target": 27,
"value": 0.75576940746765031
},
{
"source": 32,
"target": 28,
"value": 0.14802111374739357
},
{
"source": 33,
"target": 0,
"value": 0.88273270597690467
},
{
"source": 33,
"target": 1,
"value": 1.3881330086401211
},
{
"source": 33,
"target": 2,
"value": 0.46845167359566897
},
{
"source": 33,
"target": 3,
"value": 0.36171503122902343
},
{
"source": 33,
"target": 4,
"value": 3.6181438819325864
},
{
"source": 33,
"target": 5,
"value": 0.41030557995297567
},
{
"source": 33,
"target": 6,
"value": 1.0849781282029094
},
{
"source": 33,
"target": 7,
"value": 1.5913870069001488
},
{
"source": 33,
"target": 8,
"value": -0.56862505979452094
},
{
"source": 33,
"target": 9,
"value": 0.13662626929156343
},
{
"source": 33,
"target": 10,
"value": -0.54438682572238717
},
{
"source": 33,
"target": 11,
"value": 1.0272015000739645
},
{
"source": 33,
"target": 12,
"value": 1.8844483487757921
},
{
"source": 33,
"target": 13,
"value": 1.9650696129864162
},
{
"source": 33,
"target": 14,
"value": -0.69189820073442188
},
{
"source": 33,
"target": 15,
"value": 0.041921238970886253
},
{
"source": 33,
"target": 16,
"value": -0.13591223557301149
},
{
"source": 33,
"target": 17,
"value": 0.78309498695512747
},
{
"source": 33,
"target": 18,
"value": 0.83190980772777656
},
{
"source": 33,
"target": 19,
"value": 0.17741266926896498
},
{
"source": 33,
"target": 20,
"value": 1.4421099756434612
},
{
"source": 33,
"target": 21,
"value": 0.28290738896132706
},
{
"source": 33,
"target": 22,
"value": 0.25823098175358833
},
{
"source": 33,
"target": 23,
"value": -1.0867349761306908
},
{
"source": 33,
"target": 24,
"value": 0.83121624965810781
},
{
"source": 33,
"target": 25,
"value": 0.19124753229607247
},
{
"source": 33,
"target": 26,
"value": -1.2854789023825373
},
{
"source": 33,
"target": 27,
"value": 0.64480210060367738
},
{
"source": 33,
"target": 28,
"value": 0.47777905735504289
},
{
"source": 34,
"target": 0,
"value": -0.032732558271648601
},
{
"source": 34,
"target": 1,
"value": -0.23691801897819109
},
{
"source": 34,
"target": 2,
"value": 0.073650329215618371
},
{
"source": 34,
"target": 3,
"value": 0.10699824395229077
},
{
"source": 34,
"target": 4,
"value": 0.49294799405006345
},
{
"source": 34,
"target": 5,
"value": -0.40753085651099363
},
{
"source": 34,
"target": 6,
"value": -0.40751429904720954
},
{
"source": 34,
"target": 7,
"value": -0.53869080587481832
},
{
"source": 34,
"target": 8,
"value": 3.5686222555558951
},
{
"source": 34,
"target": 9,
"value": -0.20989150737899759
},
{
"source": 34,
"target": 10,
"value": -0.16566652161231518
},
{
"source": 34,
"target": 11,
"value": -0.56410178207910011
},
{
"source": 34,
"target": 12,
"value": -0.66503489862950882
},
{
"source": 34,
"target": 13,
"value": 0.91919151494183593
},
{
"source": 34,
"target": 14,
"value": -0.44644917513494964
},
{
"source": 34,
"target": 15,
"value": -0.34824567475690854
},
{
"source": 34,
"target": 16,
"value": 1.9600019671269895
},
{
"source": 34,
"target": 17,
"value": -0.41692839988431663
},
{
"source": 34,
"target": 18,
"value": -0.12445262890232534
},
{
"source": 34,
"target": 19,
"value": -0.28134287698626392
},
{
"source": 34,
"target": 20,
"value": -0.62496583627257452
},
{
"source": 34,
"target": 21,
"value": -0.52295766725219972
},
{
"source": 34,
"target": 22,
"value": -0.87799344978952631
},
{
"source": 34,
"target": 23,
"value": -0.20604426240121998
},
{
"source": 34,
"target": 24,
"value": -0.91669415603232318
},
{
"source": 34,
"target": 25,
"value": -0.79820303181511865
},
{
"source": 34,
"target": 26,
"value": 0.23949816520662365
},
{
"source": 34,
"target": 27,
"value": -0.21755761311092356
},
{
"source": 34,
"target": 28,
"value": -0.52827852650674068
},
{
"source": 35,
"target": 0,
"value": 0.57979367629112366
},
{
"source": 35,
"target": 1,
"value": 0.91388985534244616
},
{
"source": 35,
"target": 2,
"value": -0.96825256179671693
},
{
"source": 35,
"target": 3,
"value": -1.6006601000023701
},
{
"source": 35,
"target": 4,
"value": -0.85075845820932749
},
{
"source": 35,
"target": 5,
"value": 0.61836068503812769
},
{
"source": 35,
"target": 6,
"value": 2.0258363310853844
},
{
"source": 35,
"target": 7,
"value": -0.60591416355569594
},
{
"source": 35,
"target": 8,
"value": -0.91932573593494693
},
{
"source": 35,
"target": 9,
"value": -0.31491355603781701
},
{
"source": 35,
"target": 10,
"value": 0.99209137934964686
},
{
"source": 35,
"target": 11,
"value": -0.13189123232955829
},
{
"source": 35,
"target": 12,
"value": 1.7617969349413753
},
{
"source": 35,
"target": 13,
"value": 2.1644070163926559
},
{
"source": 35,
"target": 14,
"value": 0.33102963115935796
},
{
"source": 35,
"target": 15,
"value": -0.25172384237241363
},
{
"source": 35,
"target": 16,
"value": -0.67458819193263486
},
{
"source": 35,
"target": 17,
"value": -0.11045269918254597
},
{
"source": 35,
"target": 18,
"value": -0.12126120262863935
},
{
"source": 35,
"target": 19,
"value": 1.2728689440247598
},
{
"source": 35,
"target": 20,
"value": 0.05798982072597636
},
{
"source": 35,
"target": 21,
"value": -0.39188577957591575
},
{
"source": 35,
"target": 22,
"value": 3.5053870145414607
},
{
"source": 35,
"target": 23,
"value": 2.5610657490328812
},
{
"source": 35,
"target": 24,
"value": 0.0078570461000824088
},
{
"source": 35,
"target": 25,
"value": 0.5622865694747351
},
{
"source": 35,
"target": 26,
"value": 0.61627737935847238
},
{
"source": 35,
"target": 27,
"value": 0.44990982523497142
},
{
"source": 35,
"target": 28,
"value": 0.20258024198030974
},
{
"source": 36,
"target": 0,
"value": -0.93818699442267728
},
{
"source": 36,
"target": 1,
"value": 0.26466069237913331
},
{
"source": 36,
"target": 2,
"value": 0.44227114035696247
},
{
"source": 36,
"target": 3,
"value": -0.99128529133744148
},
{
"source": 36,
"target": 4,
"value": 0.79774460926472157
},
{
"source": 36,
"target": 5,
"value": -0.27154020434718207
},
{
"source": 36,
"target": 6,
"value": -0.070652862715299844
},
{
"source": 36,
"target": 7,
"value": 1.0537100753381947
},
{
"source": 36,
"target": 8,
"value": 0.13925248136553925
},
{
"source": 36,
"target": 9,
"value": 0.089225815966012312
},
{
"source": 36,
"target": 10,
"value": 0.79043147424246185
},
{
"source": 36,
"target": 11,
"value": -0.76611420841971101
},
{
"source": 36,
"target": 12,
"value": -1.7300720827985332
},
{
"source": 36,
"target": 13,
"value": 0.052459230551901936
},
{
"source": 36,
"target": 14,
"value": 0.2901590799528227
},
{
"source": 36,
"target": 15,
"value": -0.34017690408122053
},
{
"source": 36,
"target": 16,
"value": 0.02339037988257273
},
{
"source": 36,
"target": 17,
"value": 0.29372954304846355
},
{
"source": 36,
"target": 18,
"value": 1.1691129532718838
},
{
"source": 36,
"target": 19,
"value": 0.44425728220759125
},
{
"source": 36,
"target": 20,
"value": -4.0802588098831167
},
{
"source": 36,
"target": 21,
"value": 0.45520402356351825
},
{
"source": 36,
"target": 22,
"value": 0.10210703652327417
},
{
"source": 36,
"target": 23,
"value": 0.062223471268436671
},
{
"source": 36,
"target": 24,
"value": -0.42692997283429651
},
{
"source": 36,
"target": 25,
"value": -0.34922360800200725
},
{
"source": 36,
"target": 26,
"value": 1.0605467659280787
},
{
"source": 36,
"target": 27,
"value": 0.16742010581940986
},
{
"source": 36,
"target": 28,
"value": -0.24055983565398106
},
{
"source": 37,
"target": 0,
"value": -0.15793316680896954
},
{
"source": 37,
"target": 1,
"value": 0.51363134778561104
},
{
"source": 37,
"target": 2,
"value": 0.072451614919145188
},
{
"source": 37,
"target": 3,
"value": -0.2779093571200198
},
{
"source": 37,
"target": 4,
"value": -0.36781104078357574
},
{
"source": 37,
"target": 5,
"value": 0.0031537023551814081
},
{
"source": 37,
"target": 6,
"value": -0.29758667718366671
},
{
"source": 37,
"target": 7,
"value": -0.45029330459939404
},
{
"source": 37,
"target": 8,
"value": -0.23977175806692927
},
{
"source": 37,
"target": 9,
"value": -0.67587397682407713
},
{
"source": 37,
"target": 10,
"value": -0.15301188390301618
},
{
"source": 37,
"target": 11,
"value": -0.46659915529445412
},
{
"source": 37,
"target": 12,
"value": -0.42498541196652306
},
{
"source": 37,
"target": 13,
"value": -0.34876645709355247
},
{
"source": 37,
"target": 14,
"value": -0.062544643283283963
},
{
"source": 37,
"target": 15,
"value": 0.80253877598169943
},
{
"source": 37,
"target": 16,
"value": -0.27184602411747838
},
{
"source": 37,
"target": 17,
"value": -0.15787223663965752
},
{
"source": 37,
"target": 18,
"value": -0.34334523433683506
},
{
"source": 37,
"target": 19,
"value": -0.33220282491294184
},
{
"source": 37,
"target": 20,
"value": 5.0400930058469546
},
{
"source": 37,
"target": 21,
"value": -0.24746302020851949
},
{
"source": 37,
"target": 22,
"value": -0.43263449168320545
},
{
"source": 37,
"target": 23,
"value": -0.1641589802630096
},
{
"source": 37,
"target": 24,
"value": 0.00019312105144206451
},
{
"source": 37,
"target": 25,
"value": -0.26255807907751227
},
{
"source": 37,
"target": 26,
"value": 0.0059299308389536756
},
{
"source": 37,
"target": 27,
"value": -0.063544522984810684
},
{
"source": 37,
"target": 28,
"value": -0.25915848809231951
},
{
"source": 38,
"target": 0,
"value": -0.24105989105115089
},
{
"source": 38,
"target": 1,
"value": 0.81552557678013782
},
{
"source": 38,
"target": 2,
"value": 0.19242246392482543
},
{
"source": 38,
"target": 3,
"value": -0.26747847298828153
},
{
"source": 38,
"target": 4,
"value": 0.62414399539355514
},
{
"source": 38,
"target": 5,
"value": 0.70984294326035358
},
{
"source": 38,
"target": 6,
"value": 0.1375337745491968
},
{
"source": 38,
"target": 7,
"value": -0.29375793325679805
},
{
"source": 38,
"target": 8,
"value": -0.60992542206252853
},
{
"source": 38,
"target": 9,
"value": 0.19860611062833625
},
{
"source": 38,
"target": 10,
"value": -0.5615650688977265
},
{
"source": 38,
"target": 11,
"value": 0.070294403309066347
},
{
"source": 38,
"target": 12,
"value": -0.81991400751565502
},
{
"source": 38,
"target": 13,
"value": -0.23163906999882333
},
{
"source": 38,
"target": 14,
"value": 1.0406015957281305
},
{
"source": 38,
"target": 15,
"value": 0.14230128725277777
},
{
"source": 38,
"target": 16,
"value": -0.3091277629745251
},
{
"source": 38,
"target": 17,
"value": 1.0592044469090454
},
{
"source": 38,
"target": 18,
"value": -0.26288122859554347
},
{
"source": 38,
"target": 19,
"value": -0.058661001282899125
},
{
"source": 38,
"target": 20,
"value": 11.614257469697533
},
{
"source": 38,
"target": 21,
"value": -0.23741573391056539
},
{
"source": 38,
"target": 22,
"value": 0.4200317431072989
},
{
"source": 38,
"target": 23,
"value": -0.21196477432529354
},
{
"source": 38,
"target": 24,
"value": -0.70008249265345002
},
{
"source": 38,
"target": 25,
"value": 0.70298237619910386
},
{
"source": 38,
"target": 26,
"value": 0.50509322302984627
},
{
"source": 38,
"target": 27,
"value": 0.056743537497408889
},
{
"source": 38,
"target": 28,
"value": -0.45003932529611446
},
{
"source": 39,
"target": 0,
"value": -0.4985639369434568
},
{
"source": 39,
"target": 1,
"value": -0.11913915934241706
},
{
"source": 39,
"target": 2,
"value": -0.1727725178823564
},
{
"source": 39,
"target": 3,
"value": -0.36268681262912739
},
{
"source": 39,
"target": 4,
"value": -0.38475814441097511
},
{
"source": 39,
"target": 5,
"value": 0.04366396348349931
},
{
"source": 39,
"target": 6,
"value": -0.074652921019355431
},
{
"source": 39,
"target": 7,
"value": -0.099301063496445255
},
{
"source": 39,
"target": 8,
"value": -0.2017264998761723
},
{
"source": 39,
"target": 9,
"value": -0.51089693220172572
},
{
"source": 39,
"target": 10,
"value": -0.55839948919142579
},
{
"source": 39,
"target": 11,
"value": -0.39702867153117777
},
{
"source": 39,
"target": 12,
"value": -0.29875959733780333
},
{
"source": 39,
"target": 13,
"value": -0.27126915457868744
},
{
"source": 39,
"target": 14,
"value": -0.16113113415268027
},
{
"source": 39,
"target": 15,
"value": -0.43387148696081834
},
{
"source": 39,
"target": 16,
"value": -0.40713512386836254
},
{
"source": 39,
"target": 17,
"value": -0.01309057095483469
},
{
"source": 39,
"target": 18,
"value": -0.18427557930631339
},
{
"source": 39,
"target": 19,
"value": -0.32295707681884245
},
{
"source": 39,
"target": 20,
"value": 8.77804157512195
},
{
"source": 39,
"target": 21,
"value": -0.42229703337907104
},
{
"source": 39,
"target": 22,
"value": -0.48610823641398554
},
{
"source": 39,
"target": 23,
"value": -0.27515556516839551
},
{
"source": 39,
"target": 24,
"value": 0.1513612645150513
},
{
"source": 39,
"target": 25,
"value": 0.29146391216859246
},
{
"source": 39,
"target": 26,
"value": 0.11476609063274466
},
{
"source": 39,
"target": 27,
"value": -0.33838670692126421
},
{
"source": 39,
"target": 28,
"value": 0.026572234707523366
},
{
"source": 40,
"target": 0,
"value": -0.55362082797203638
},
{
"source": 40,
"target": 1,
"value": 0.83149368716982042
},
{
"source": 40,
"target": 2,
"value": 0.28292863560001041
},
{
"source": 40,
"target": 3,
"value": 0.035833058118711097
},
{
"source": 40,
"target": 4,
"value": -0.55456506209114742
},
{
"source": 40,
"target": 5,
"value": -1.0118459887655582
},
{
"source": 40,
"target": 6,
"value": 0.39004208778357935
},
{
"source": 40,
"target": 7,
"value": 1.2139411456017979
},
{
"source": 40,
"target": 8,
"value": 0.19420909720096299
},
{
"source": 40,
"target": 9,
"value": 1.0826226597772
},
{
"source": 40,
"target": 10,
"value": 0.7117111776942695
},
{
"source": 40,
"target": 11,
"value": -0.46796480471499508
},
{
"source": 40,
"target": 12,
"value": -0.24461380102651686
},
{
"source": 40,
"target": 13,
"value": 0.5354949423664831
},
{
"source": 40,
"target": 14,
"value": -0.022874989667337316
},
{
"source": 40,
"target": 15,
"value": 0.47709581068113038
},
{
"source": 40,
"target": 16,
"value": 0.73621929883032289
},
{
"source": 40,
"target": 17,
"value": 0.42981882434200736
},
{
"source": 40,
"target": 18,
"value": 0.56233217432967697
},
{
"source": 40,
"target": 19,
"value": -0.039500504490510575
},
{
"source": 40,
"target": 20,
"value": -4.4080008222815543
},
{
"source": 40,
"target": 21,
"value": 0.34004197687378213
},
{
"source": 40,
"target": 22,
"value": -0.21330253134832258
},
{
"source": 40,
"target": 23,
"value": -1.8536691747510126
},
{
"source": 40,
"target": 24,
"value": 0.18067041194249117
},
{
"source": 40,
"target": 25,
"value": -0.37847589036704204
},
{
"source": 40,
"target": 26,
"value": 0.99435658689955331
},
{
"source": 40,
"target": 27,
"value": -0.22844874605155358
},
{
"source": 40,
"target": 28,
"value": -0.013718250154224853
},
{
"source": 41,
"target": 0,
"value": -0.49325182904169035
},
{
"source": 41,
"target": 1,
"value": 1.5695283848780797
},
{
"source": 41,
"target": 2,
"value": -0.11649776231548695
},
{
"source": 41,
"target": 3,
"value": 0.16408698658498563
},
{
"source": 41,
"target": 4,
"value": -0.0015652413104513807
},
{
"source": 41,
"target": 5,
"value": 0.40198720916534481
},
{
"source": 41,
"target": 6,
"value": -0.54561144241845294
},
{
"source": 41,
"target": 7,
"value": 0.85188327246055651
},
{
"source": 41,
"target": 8,
"value": -0.3637443682294571
},
{
"source": 41,
"target": 9,
"value": 0.19963936454095657
},
{
"source": 41,
"target": 10,
"value": -1.0118144612922504
},
{
"source": 41,
"target": 11,
"value": -0.76513857173256405
},
{
"source": 41,
"target": 12,
"value": -0.16994823859727246
},
{
"source": 41,
"target": 13,
"value": -0.52200076235655701
},
{
"source": 41,
"target": 14,
"value": 0.93566660054678885
},
{
"source": 41,
"target": 15,
"value": -0.11356832583874865
},
{
"source": 41,
"target": 16,
"value": 0.18800108546814573
},
{
"source": 41,
"target": 17,
"value": 0.095375266019330121
},
{
"source": 41,
"target": 18,
"value": 0.45029582006533447
},
{
"source": 41,
"target": 19,
"value": 0.28921112906858593
},
{
"source": 41,
"target": 20,
"value": 10.321214440939231
},
{
"source": 41,
"target": 21,
"value": -0.30210700196675067
},
{
"source": 41,
"target": 22,
"value": -0.33999823333663959
},
{
"source": 41,
"target": 23,
"value": -0.14186393698612917
},
{
"source": 41,
"target": 24,
"value": -0.75407823327168733
},
{
"source": 41,
"target": 25,
"value": -0.15953447119599681
},
{
"source": 41,
"target": 26,
"value": 0.86917453314384108
},
{
"source": 41,
"target": 27,
"value": -0.1569698597305412
},
{
"source": 41,
"target": 28,
"value": -0.46291717117283254
},
{
"source": 42,
"target": 0,
"value": -0.38281024166531319
},
{
"source": 42,
"target": 1,
"value": 0.22600528760923616
},
{
"source": 42,
"target": 2,
"value": -0.21876086924162078
},
{
"source": 42,
"target": 3,
"value": 0.036274035795098962
},
{
"source": 42,
"target": 4,
"value": -0.35630572129348181
},
{
"source": 42,
"target": 5,
"value": -0.31788640736411566
},
{
"source": 42,
"target": 6,
"value": -0.4488897335377357
},
{
"source": 42,
"target": 7,
"value": -0.36352228079977633
},
{
"source": 42,
"target": 8,
"value": -0.38932656628810819
},
{
"source": 42,
"target": 9,
"value": -0.13151952315218873
},
{
"source": 42,
"target": 10,
"value": 0.26032039708004684
},
{
"source": 42,
"target": 11,
"value": -0.45431340372792312
},
{
"source": 42,
"target": 12,
"value": -0.25408042875097248
},
{
"source": 42,
"target": 13,
"value": -0.64358023240596118
},
{
"source": 42,
"target": 14,
"value": -0.080476180333413749
},
{
"source": 42,
"target": 15,
"value": 0.39115271473456054
},
{
"source": 42,
"target": 16,
"value": -0.54318563106272877
},
{
"source": 42,
"target": 17,
"value": -0.10266408566506255
},
{
"source": 42,
"target": 18,
"value": -0.22050155595715687
},
{
"source": 42,
"target": 19,
"value": -0.040105569196558638
},
{
"source": 42,
"target": 20,
"value": 4.6820048714915048
},
{
"source": 42,
"target": 21,
"value": -0.042641895548359489
},
{
"source": 42,
"target": 22,
"value": -0.19117809515458148
},
{
"source": 42,
"target": 23,
"value": -0.21325619501606621
},
{
"source": 42,
"target": 24,
"value": -0.57183945850627738
},
{
"source": 42,
"target": 25,
"value": -0.22389112481481552
},
{
"source": 42,
"target": 26,
"value": -0.47240430495971514
},
{
"source": 42,
"target": 27,
"value": -0.33932367530137053
},
{
"source": 42,
"target": 28,
"value": -0.082234867945698786
},
{
"source": 43,
"target": 0,
"value": 1.3033598863698674
},
{
"source": 43,
"target": 1,
"value": 3.9963317000003848
},
{
"source": 43,
"target": 2,
"value": -0.54495369874692279
},
{
"source": 43,
"target": 3,
"value": -0.026372733541428602
},
{
"source": 43,
"target": 4,
"value": -0.067556562469782727
},
{
"source": 43,
"target": 5,
"value": 1.8166682109933501
},
{
"source": 43,
"target": 6,
"value": 1.2185384966262691
},
{
"source": 43,
"target": 7,
"value": -0.02901439267465972
},
{
"source": 43,
"target": 8,
"value": 0.089067984134487868
},
{
"source": 43,
"target": 9,
"value": -0.87056755054997481
},
{
"source": 43,
"target": 10,
"value": 1.314757246753097
},
{
"source": 43,
"target": 11,
"value": 0.54106290910217458
},
{
"source": 43,
"target": 12,
"value": 2.0988537845964008
},
{
"source": 43,
"target": 13,
"value": 0.16212683668662092
},
{
"source": 43,
"target": 14,
"value": -0.61294278672161751
},
{
"source": 43,
"target": 15,
"value": 0.41849376928662513
},
{
"source": 43,
"target": 16,
"value": -0.29821590198502962
},
{
"source": 43,
"target": 17,
"value": 0.1071965567957666
},
{
"source": 43,
"target": 18,
"value": 1.7166054944640807
},
{
"source": 43,
"target": 19,
"value": 2.0519082771381676
},
{
"source": 43,
"target": 20,
"value": -2.2200688354542586
},
{
"source": 43,
"target": 21,
"value": -0.55227645474357046
},
{
"source": 43,
"target": 22,
"value": -1.2480471868063814
},
{
"source": 43,
"target": 23,
"value": -0.17832045435606375
},
{
"source": 43,
"target": 24,
"value": -0.80445773503869189
},
{
"source": 43,
"target": 25,
"value": 2.1364328272540241
},
{
"source": 43,
"target": 26,
"value": -1.2423816074365652
},
{
"source": 43,
"target": 27,
"value": -0.66728365843076554
},
{
"source": 43,
"target": 28,
"value": -0.66985270930972962
},
{
"source": 44,
"target": 0,
"value": -0.78076739588418054
},
{
"source": 44,
"target": 1,
"value": 0.40110033883081464
},
{
"source": 44,
"target": 2,
"value": -0.87383158013853957
},
{
"source": 44,
"target": 3,
"value": 1.2720721331131117
},
{
"source": 44,
"target": 4,
"value": -1.0043478201358997
},
{
"source": 44,
"target": 5,
"value": -0.91746922500775818
},
{
"source": 44,
"target": 6,
"value": -0.45419799570054831
},
{
"source": 44,
"target": 7,
"value": -0.42526590048787605
},
{
"source": 44,
"target": 8,
"value": -0.25977245926634801
},
{
"source": 44,
"target": 9,
"value": -0.23583091840223119
},
{
"source": 44,
"target": 10,
"value": -0.99996437563554996
},
{
"source": 44,
"target": 11,
"value": -0.20080915865709448
},
{
"source": 44,
"target": 12,
"value": -0.79434660514955924
},
{
"source": 44,
"target": 13,
"value": -0.73478300224391468
},
{
"source": 44,
"target": 14,
"value": -0.73430833022192266
},
{
"source": 44,
"target": 15,
"value": 0.46151798005503664
},
{
"source": 44,
"target": 16,
"value": -0.52161194358528939
},
{
"source": 44,
"target": 17,
"value": -0.095330475366025069
},
{
"source": 44,
"target": 18,
"value": 0.4065024406299898
},
{
"source": 44,
"target": 19,
"value": -0.55165862069054028
},
{
"source": 44,
"target": 20,
"value": 1.8685919061687828
},
{
"source": 44,
"target": 21,
"value": -1.0386151793662934
},
{
"source": 44,
"target": 22,
"value": 0.59041278498379401
},
{
"source": 44,
"target": 23,
"value": -0.66493875836130911
},
{
"source": 44,
"target": 24,
"value": 3.5269232867396192
},
{
"source": 44,
"target": 25,
"value": -0.99795862332358698
},
{
"source": 44,
"target": 26,
"value": 0.98035120953751398
},
{
"source": 44,
"target": 27,
"value": -0.70847119561157268
},
{
"source": 44,
"target": 28,
"value": 0.19247363044270616
},
{
"source": 45,
"target": 0,
"value": -0.58332814851896653
},
{
"source": 45,
"target": 1,
"value": 0.42978240848445648
},
{
"source": 45,
"target": 2,
"value": -0.37696696568646476
},
{
"source": 45,
"target": 3,
"value": 0.33008083700944535
},
{
"source": 45,
"target": 4,
"value": -0.36537839926247517
},
{
"source": 45,
"target": 5,
"value": 0.83644973944287615
},
{
"source": 45,
"target": 6,
"value": -0.30790981986087618
},
{
"source": 45,
"target": 7,
"value": -0.1501341655136077
},
{
"source": 45,
"target": 8,
"value": -0.60117475081311378
},
{
"source": 45,
"target": 9,
"value": -0.50686496024301275
},
{
"source": 45,
"target": 10,
"value": 0.32608381409908649
},
{
"source": 45,
"target": 11,
"value": -0.37308544343813965
},
{
"source": 45,
"target": 12,
"value": -0.48700409640340903
},
{
"source": 45,
"target": 13,
"value": -0.16024222345153624
},
{
"source": 45,
"target": 14,
"value": 0.019592307334027108
},
{
"source": 45,
"target": 15,
"value": -0.16427599657254169
},
{
"source": 45,
"target": 16,
"value": -0.55672974606076442
},
{
"source": 45,
"target": 17,
"value": -0.42965801770396639
},
{
"source": 45,
"target": 18,
"value": 0.72242958589581907
},
{
"source": 45,
"target": 19,
"value": -0.39852708926597974
},
{
"source": 45,
"target": 20,
"value": -0.16800001791809416
},
{
"source": 45,
"target": 21,
"value": -0.26729208704589724
},
{
"source": 45,
"target": 22,
"value": -0.42030246407928346
},
{
"source": 45,
"target": 23,
"value": -0.14479488490962281
},
{
"source": 45,
"target": 24,
"value": -0.59193294784043426
},
{
"source": 45,
"target": 25,
"value": 8.9660460871152523
},
{
"source": 45,
"target": 26,
"value": 0.47695742888486053
},
{
"source": 45,
"target": 27,
"value": -0.33140370452443108
},
{
"source": 45,
"target": 28,
"value": -0.56457154100880103
},
{
"source": 46,
"target": 0,
"value": -0.43957756700506961
},
{
"source": 46,
"target": 1,
"value": 0.044555051152519128
},
{
"source": 46,
"target": 2,
"value": 0.057006877539753815
},
{
"source": 46,
"target": 3,
"value": 0.797583311443399
},
{
"source": 46,
"target": 4,
"value": -0.67388464354394684
},
{
"source": 46,
"target": 5,
"value": -0.55045011132993904
},
{
"source": 46,
"target": 6,
"value": -0.30214107869847084
},
{
"source": 46,
"target": 7,
"value": 1.3128215318657377
},
{
"source": 46,
"target": 8,
"value": -0.60398573991732474
},
{
"source": 46,
"target": 9,
"value": -0.71825183076836485
},
{
"source": 46,
"target": 10,
"value": -0.16421601697758609
},
{
"source": 46,
"target": 11,
"value": 0.18614834781990458
},
{
"source": 46,
"target": 12,
"value": -0.65110553402047422
},
{
"source": 46,
"target": 13,
"value": -0.55535444416792823
},
{
"source": 46,
"target": 14,
"value": -0.25327086125014109
},
{
"source": 46,
"target": 15,
"value": 0.024168019956094015
},
{
"source": 46,
"target": 16,
"value": -0.12156348637695213
},
{
"source": 46,
"target": 17,
"value": 0.2619695051754819
},
{
"source": 46,
"target": 18,
"value": -0.64318821257198178
},
{
"source": 46,
"target": 19,
"value": 0.49938757114149113
},
{
"source": 46,
"target": 20,
"value": 3.9675642228444734
},
{
"source": 46,
"target": 21,
"value": -0.70281062180674925
},
{
"source": 46,
"target": 22,
"value": -0.65447618984494971
},
{
"source": 46,
"target": 23,
"value": -0.82342959771236646
},
{
"source": 46,
"target": 24,
"value": -0.50244544853942275
},
{
"source": 46,
"target": 25,
"value": -0.30547525246712165
},
{
"source": 46,
"target": 26,
"value": -0.59700407590058391
},
{
"source": 46,
"target": 27,
"value": -0.13658193269165239
},
{
"source": 46,
"target": 28,
"value": -0.68892454989148588
},
{
"source": 47,
"target": 0,
"value": -0.29263359557530505
},
{
"source": 47,
"target": 1,
"value": -0.12032277245541689
},
{
"source": 47,
"target": 2,
"value": -0.16783308052856172
},
{
"source": 47,
"target": 3,
"value": -0.28945991847766611
},
{
"source": 47,
"target": 4,
"value": -0.48071171576619848
},
{
"source": 47,
"target": 5,
"value": -0.47823442554252071
},
{
"source": 47,
"target": 6,
"value": -0.34173261420499473
},
{
"source": 47,
"target": 7,
"value": -0.18751786576688484
},
{
"source": 47,
"target": 8,
"value": -0.14696518640759582
},
{
"source": 47,
"target": 9,
"value": -0.14113325833946158
},
{
"source": 47,
"target": 10,
"value": -0.51240106254686757
},
{
"source": 47,
"target": 11,
"value": -0.043947353257111438
},
{
"source": 47,
"target": 12,
"value": 0.29407359374184272
},
{
"source": 47,
"target": 13,
"value": -0.26064597556367408
},
{
"source": 47,
"target": 14,
"value": -0.018540464403895059
},
{
"source": 47,
"target": 15,
"value": -0.28650589028650969
},
{
"source": 47,
"target": 16,
"value": -0.12430640489570932
},
{
"source": 47,
"target": 17,
"value": -0.39046222331014596
},
{
"source": 47,
"target": 18,
"value": -0.068821343911077443
},
{
"source": 47,
"target": 19,
"value": -0.39324028277508627
},
{
"source": 47,
"target": 20,
"value": 7.0823068245093781
},
{
"source": 47,
"target": 21,
"value": -0.20382804507834343
},
{
"source": 47,
"target": 22,
"value": 0.092015319855412656
},
{
"source": 47,
"target": 23,
"value": 0.026395209043835275
},
{
"source": 47,
"target": 24,
"value": -0.40805035989568339
},
{
"source": 47,
"target": 25,
"value": -0.37607646794070781
},
{
"source": 47,
"target": 26,
"value": -0.43726366445782544
},
{
"source": 47,
"target": 27,
"value": -0.15110606749684694
},
{
"source": 47,
"target": 28,
"value": -0.28579951937134507
},
{
"source": 48,
"target": 0,
"value": -0.24383738485743198
},
{
"source": 48,
"target": 1,
"value": 0.27166708268347467
},
{
"source": 48,
"target": 2,
"value": 0.0050230473509062607
},
{
"source": 48,
"target": 3,
"value": -0.030429364256624021
},
{
"source": 48,
"target": 4,
"value": -0.18732733130411708
},
{
"source": 48,
"target": 5,
"value": 0.041927132855210138
},
{
"source": 48,
"target": 6,
"value": -0.51604896027515468
},
{
"source": 48,
"target": 7,
"value": 0.49846781139290136
},
{
"source": 48,
"target": 8,
"value": -0.47064528823191576
},
{
"source": 48,
"target": 9,
"value": -0.4159791235985561
},
{
"source": 48,
"target": 10,
"value": 0.05769943820812836
},
{
"source": 48,
"target": 11,
"value": 0.37063680405115118
},
{
"source": 48,
"target": 12,
"value": -0.170667759039002
},
{
"source": 48,
"target": 13,
"value": -0.0534528644283521
},
{
"source": 48,
"target": 14,
"value": -0.31010259133486312
},
{
"source": 48,
"target": 15,
"value": 0.19964540327435606
},
{
"source": 48,
"target": 16,
"value": -0.12450118094457631
},
{
"source": 48,
"target": 17,
"value": -0.0038280977758792497
},
{
"source": 48,
"target": 18,
"value": -0.24101295837952422
},
{
"source": 48,
"target": 19,
"value": -0.23833202520278116
},
{
"source": 48,
"target": 20,
"value": 15.562717427493785
},
{
"source": 48,
"target": 21,
"value": -0.29499992138737596
},
{
"source": 48,
"target": 22,
"value": -0.098493020108641888
},
{
"source": 48,
"target": 23,
"value": -0.044924579229184546
},
{
"source": 48,
"target": 24,
"value": 0.072077466984739075
},
{
"source": 48,
"target": 25,
"value": -0.4337555520577292
},
{
"source": 48,
"target": 26,
"value": -0.080173708660066401
},
{
"source": 48,
"target": 27,
"value": -0.16821641514412122
},
{
"source": 48,
"target": 28,
"value": -0.10446234143705566
},
{
"source": 49,
"target": 0,
"value": -0.18872959514050092
},
{
"source": 49,
"target": 1,
"value": -0.038924408259638152
},
{
"source": 49,
"target": 2,
"value": 0.22325827038858642
},
{
"source": 49,
"target": 3,
"value": -0.61003341562121693
},
{
"source": 49,
"target": 4,
"value": 0.17696883992434739
},
{
"source": 49,
"target": 5,
"value": 0.2344944164373205
},
{
"source": 49,
"target": 6,
"value": 0.15642208268399585
},
{
"source": 49,
"target": 7,
"value": -0.58636412128140158
},
{
"source": 49,
"target": 8,
"value": -0.38694390395643419
},
{
"source": 49,
"target": 9,
"value": -0.80925947633246953
},
{
"source": 49,
"target": 10,
"value": 4.9750579219604729
},
{
"source": 49,
"target": 11,
"value": -0.7628845457080633
},
{
"source": 49,
"target": 12,
"value": -0.42662132203435449
},
{
"source": 49,
"target": 13,
"value": -0.15418396792599112
},
{
"source": 49,
"target": 14,
"value": -0.23548393272565307
},
{
"source": 49,
"target": 15,
"value": 2.8395257652065791
},
{
"source": 49,
"target": 16,
"value": -0.47687938493305504
},
{
"source": 49,
"target": 17,
"value": -0.49661032814513606
},
{
"source": 49,
"target": 18,
"value": -0.20829666304559427
},
{
"source": 49,
"target": 19,
"value": -0.043562791948746994
},
{
"source": 49,
"target": 20,
"value": 2.099188784579324
},
{
"source": 49,
"target": 21,
View raw

(Sorry about that, but we can’t show files that are this big right now.)

View raw

(Sorry about that, but we can’t show files that are this big right now.)

View raw

(Sorry about that, but we can’t show files that are this big right now.)

View raw

(Sorry about that, but we can’t show files that are this big right now.)

View raw

(Sorry about that, but we can’t show files that are this big right now.)

View raw

(Sorry about that, but we can’t show files that are this big right now.)

View raw

(Sorry about that, but we can’t show files that are this big right now.)

View raw

(Sorry about that, but we can’t show files that are this big right now.)

View raw

(Sorry about that, but we can’t show files that are this big right now.)

View raw

(Sorry about that, but we can’t show files that are this big right now.)

View raw

(Sorry about that, but we can’t show files that are this big right now.)

View raw

(Sorry about that, but we can’t show files that are this big right now.)

View raw

(Sorry about that, but we can’t show files that are this big right now.)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment