Skip to content

Instantly share code, notes, and snippets.

@clhenrick
Last active November 23, 2016 22:57
Show Gist options
  • Save clhenrick/3101dd9410fdb67e9f37be63c9a72c38 to your computer and use it in GitHub Desktop.
Save clhenrick/3101dd9410fdb67e9f37be63c9a72c38 to your computer and use it in GitHub Desktop.
Day / Hour Heatmap
license: mit

Inspired by Trulia Trends - but with code and using SVG.

Example data shows concurrent user sessions over time, taken from a development environment.

MIT Licensed, see LICENSE.MD.

forked from tjdecke's block: Day / Hour Heatmap

day hour value
1 1 16
1 2 20
1 3 0
1 4 0
1 5 0
1 6 2
1 7 0
1 8 9
1 9 25
1 10 49
1 11 57
1 12 61
1 13 37
1 14 66
1 15 70
1 16 55
1 17 51
1 18 55
1 19 17
1 20 20
1 21 9
1 22 4
1 23 0
1 24 12
2 1 6
2 2 2
2 3 0
2 4 0
2 5 0
2 6 2
2 7 4
2 8 11
2 9 28
2 10 49
2 11 51
2 12 47
2 13 38
2 14 65
2 15 60
2 16 50
2 17 65
2 18 50
2 19 22
2 20 11
2 21 12
2 22 9
2 23 0
2 24 13
3 1 5
3 2 8
3 3 8
3 4 0
3 5 0
3 6 2
3 7 5
3 8 12
3 9 34
3 10 43
3 11 54
3 12 44
3 13 40
3 14 48
3 15 54
3 16 59
3 17 60
3 18 51
3 19 21
3 20 16
3 21 9
3 22 5
3 23 4
3 24 7
4 1 0
4 2 0
4 3 0
4 4 0
4 5 0
4 6 2
4 7 4
4 8 13
4 9 26
4 10 58
4 11 61
4 12 59
4 13 53
4 14 54
4 15 64
4 16 55
4 17 52
4 18 53
4 19 18
4 20 3
4 21 9
4 22 12
4 23 2
4 24 8
5 1 2
5 2 0
5 3 8
5 4 2
5 5 0
5 6 2
5 7 4
5 8 14
5 9 31
5 10 48
5 11 46
5 12 50
5 13 66
5 14 54
5 15 56
5 16 67
5 17 54
5 18 23
5 19 14
5 20 6
5 21 8
5 22 7
5 23 0
5 24 8
6 1 2
6 2 0
6 3 2
6 4 0
6 5 0
6 6 0
6 7 4
6 8 8
6 9 8
6 10 6
6 11 14
6 12 12
6 13 9
6 14 14
6 15 0
6 16 4
6 17 7
6 18 6
6 19 0
6 20 0
6 21 0
6 22 0
6 23 0
6 24 0
7 1 7
7 2 6
7 3 0
7 4 0
7 5 0
7 6 0
7 7 0
7 8 0
7 9 0
7 10 0
7 11 2
7 12 2
7 13 5
7 14 6
7 15 0
7 16 4
7 17 0
7 18 2
7 19 10
7 20 7
7 21 0
7 22 19
7 23 9
7 24 4
day hour value
1 1 88
1 2 20
1 3 44
1 4 0
1 5 33
1 6 2
1 7 0
1 8 9
1 9 25
1 10 1
1 11 57
1 12 61
1 13 22
1 14 25
1 15 7
1 16 55
1 17 51
1 18 4
1 19 17
1 20 20
1 21 4
1 22 4
1 23 6
1 24 12
2 1 6
2 2 22
2 3 0
2 4 0
2 5 33
2 6 5
2 7 4
2 8 8
2 9 28
2 10 99
2 11 51
2 12 66
2 13 38
2 14 39
2 15 60
2 16 22
2 17 65
2 18 50
2 19 22
2 20 11
2 21 12
2 22 9
2 23 33
2 24 13
3 1 5
3 2 8
3 3 44
3 4 0
3 5 12
3 6 2
3 7 5
3 8 12
3 9 34
3 10 43
3 11 54
3 12 44
3 13 40
3 14 48
3 15 54
3 16 59
3 17 60
3 18 51
3 19 21
3 20 16
3 21 9
3 22 5
3 23 24
3 24 7
4 1 22
4 2 33
4 3 102
4 4 33
4 5 0
4 6 2
4 7 4
4 8 13
4 9 26
4 10 58
4 11 61
4 12 59
4 13 53
4 14 54
4 15 64
4 16 55
4 17 52
4 18 53
4 19 18
4 20 3
4 21 9
4 22 12
4 23 2
4 24 8
5 1 2
5 2 0
5 3 8
5 4 2
5 5 0
5 6 2
5 7 4
5 8 14
5 9 31
5 10 48
5 11 46
5 12 50
5 13 66
5 14 54
5 15 56
5 16 67
5 17 54
5 18 23
5 19 14
5 20 6
5 21 8
5 22 7
5 23 0
5 24 84
6 1 11
6 2 22
6 3 33
6 4 44
6 5 4
6 6 0
6 7 4
6 8 8
6 9 8
6 10 6
6 11 14
6 12 12
6 13 9
6 14 14
6 15 0
6 16 4
6 17 7
6 18 6
6 19 42
6 20 5
6 21 77
6 22 32
6 23 41
6 24 0
7 1 7
7 2 6
7 3 11
7 4 22
7 5 33
7 6 44
7 7 66
7 8 5
7 9 33
7 10 0
7 11 2
7 12 2
7 13 44
7 14 6
7 15 0
7 16 4
7 17 33
7 18 2
7 19 10
7 20 7
7 21 0
7 22 19
7 23 9
7 24 4
<!DOCTYPE html>
<meta charset="utf-8">
<html>
<head>
<style>
rect.bordered {
stroke: #E6E6E6;
stroke-width:2px;
}
text.mono {
font-size: 9pt;
font-family: Consolas, courier;
fill: #aaa;
}
text.axis-workweek {
fill: #000;
}
text.axis-worktime {
fill: #000;
}
</style>
<script src="http://d3js.org/d3.v3.js"></script>
</head>
<body>
<div id="chart"></div>
<div id="dataset-picker">
</div>
<script type="text/javascript">
var margin = { top: 50, right: 0, bottom: 100, left: 30 },
width = 960 - margin.left - margin.right,
height = 430 - margin.top - margin.bottom,
gridSize = Math.floor(width / 24),
legendElementWidth = gridSize*2,
buckets = 9,
colors = ["#ffffd9","#edf8b1","#c7e9b4","#7fcdbb","#41b6c4","#1d91c0","#225ea8","#253494","#081d58"], // alternatively colorbrewer.YlGnBu[9]
days = ["Mo", "Tu", "We", "Th", "Fr", "Sa", "Su"],
times = ["1a", "2a", "3a", "4a", "5a", "6a", "7a", "8a", "9a", "10a", "11a", "12a", "1p", "2p", "3p", "4p", "5p", "6p", "7p", "8p", "9p", "10p", "11p", "12p"];
datasets = ["data.tsv", "data2.tsv"];
var svg = d3.select("#chart").append("svg")
.attr("width", width + margin.left + margin.right)
.attr("height", height + margin.top + margin.bottom)
.append("g")
.attr("transform", "translate(" + margin.left + "," + margin.top + ")");
var dayLabels = svg.selectAll(".dayLabel")
.data(days)
.enter().append("text")
.text(function (d) { return d; })
.attr("x", 0)
.attr("y", function (d, i) { return i * gridSize; })
.style("text-anchor", "end")
.attr("transform", "translate(-6," + gridSize / 1.5 + ")")
.attr("class", function (d, i) { return ((i >= 0 && i <= 4) ? "dayLabel mono axis axis-workweek" : "dayLabel mono axis"); });
var timeLabels = svg.selectAll(".timeLabel")
.data(times)
.enter().append("text")
.text(function(d) { return d; })
.attr("x", function(d, i) { return i * gridSize; })
.attr("y", 0)
.style("text-anchor", "middle")
.attr("transform", "translate(" + gridSize / 2 + ", -6)")
.attr("class", function(d, i) { return ((i >= 7 && i <= 16) ? "timeLabel mono axis axis-worktime" : "timeLabel mono axis"); });
var heatmapChart = function(tsvFile) {
d3.tsv(tsvFile,
function(d) {
return {
day: +d.day,
hour: +d.hour,
value: +d.value
};
},
function(error, data) {
console.log(data);
var colorScale = d3.scale.quantile()
.domain([0, buckets - 1, d3.max(data, function (d) { return d.value; })])
.range(colors);
var cards = svg.selectAll(".hour")
.data(data, function(d) {return d.day+':'+d.hour;});
cards.append("title");
cards.enter().append("rect")
.attr("x", function(d) { return (d.hour - 1) * gridSize; })
.attr("y", function(d) { return (d.day - 1) * gridSize; })
.attr("rx", 4)
.attr("ry", 4)
.attr("class", "hour bordered")
.attr("width", gridSize)
.attr("height", gridSize)
.style("fill", colors[0]);
cards.transition().duration(1000)
.style("fill", function(d) { return colorScale(d.value); });
cards.select("title").text(function(d) { return d.value; });
cards.exit().remove();
var legend = svg.selectAll(".legend")
.data([0].concat(colorScale.quantiles()), function(d) { return d; });
legend.enter().append("g")
.attr("class", "legend");
legend.append("rect")
.attr("x", function(d, i) { return legendElementWidth * i; })
.attr("y", height)
.attr("width", legendElementWidth)
.attr("height", gridSize / 2)
.style("fill", function(d, i) { return colors[i]; });
legend.append("text")
.attr("class", "mono")
.text(function(d) { return "≥ " + Math.round(d); })
.attr("x", function(d, i) { return legendElementWidth * i; })
.attr("y", height + gridSize);
legend.exit().remove();
});
};
heatmapChart(datasets[0]);
var datasetpicker = d3.select("#dataset-picker").selectAll(".dataset-button")
.data(datasets);
datasetpicker.enter()
.append("input")
.attr("value", function(d){ return "Dataset " + d })
.attr("type", "button")
.attr("class", "dataset-button")
.on("click", function(d) {
heatmapChart(d);
});
</script>
</body>
</html>

Copyright (c) 2016, Tom May

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

�PNG

IHDR��%*�\
�iCCPICC ProfileH ��wTS��Ͻ�@@J���z@��`#$��CH�� *"�2(��X b�� `�>Au,��ʻ�!�z��וּ���;��Ͼ9km�u,�0V C E���'�p�`�
�X;K�_�u|� ��MkY�u�� �n(YN�d�3>�X [(��Ft��b��9���Αq� ��8i��O�DG�">H<���@�DtZ6;�C�"l+�����O6���&�r���X!�<�͒�'��b%�c�X)r�9 �&��?K��Z5���9e�K�zM]d&g�E� OU�f9l��,�L�7�օb��Y拙ѳ̓�̲$-�1�i+B�����a�:;���L�\^t�,s�~��,Z)��ʎ��<߅�>��`Y��sc������}��py����$��>ܬ���f�E�r�d~sV牂�0}�?=��H)�W#�!��'�-`�(� �`\]��˒�]!\%���4r�V4��mcE���s��$�����{��k��������k����@��]3��8]��Q�t8��=0��Jj"w��k$3g���?a ăe� x ��J�փBP ��]�T��8��6p���u�n�@
F�K0>�I�p�B��d YB����P$%B)��@y�F�*�*���:���B��=h��B�aL�Ua���aG�K�8΅ �-p9\ �[���u�6,�_��(�"��Q�(k�
C%��Q"�ZT� U�jFu��Q7QR�+�'4ME���hwt:�Fg�עK��C�V�E�M�z � C�hc,1n&f&�S�)��cNb.ancF0�X�:�� ��cS���%ؽ�l'�;���p�8K�. �‰q��=�øs���#������� x~� ߈?��?�O��7B�CXE�J�#tnF�De�)уML%�'�������H$�ɕA��I夣�+�!�'�
ق�K^B�����;����(� ś�@S�P((�)�
6
L��:�J�V��׊EcE��2�\�2��7_)�L�|�XJk�*�N) *�+S��Ô3�K���*?W������pT
T�\P����T_*���ZG�DQŪ��2USU�U��������9�Ū�U��Q����Mԙ���[Տ��Q�<Ggcw��9�s�Lh�����ji�h����I���L�ܮ٦�H �e���Rk��%�WsU��e�-�{l�}mX�B;R{����q]�@��� :�t�u�uSuw��գ�y���v��{AS�1h�r�Eژ��~��D�F�W��� �`�A��#C�!�0�p�a�ᘑ�Q�Q�Q��}c�1ݘg�۸�x���$�d�I��sS S�i�i��C3���Y�Y��-s�9�<�|�y�l�d�����a [:[�-�Z�[a�\�V�V��dk�u�u������� 6m6���K��}^��o�N��u��T��6�uؽ���g�W��r�88�shwx�h��u��x׉��ɩ�髳��ȹ�y���%ѥ�e��J��Я�b\}\׹�v����&v;�����{�{���������{x�<j<��4�D���R/}/�W��oCo�w��3�9#�q�����G�s�g���w�o��/Яȯ�_�?ƿ��q�A@J@S�X�S���� LPH���A���l`��� �B�
�y��b�hAG(�#��Bㅂ�ma ��#�Q�ixf��؈��ʈ��v�y��QԨ�Q�Q�}��F?�1���t�*�.�m����+��.��h͢��Z����\BlB}��b�Ż�,qZR���Rӥ9K�.�Z����r����1�q���_Xa�Z�x3�*i�����~�����r=���g�ɥ��S<Rv���xe�W|_~�MjPju�DZX�������� |Fb�)�� Mpq��BKa�P�閹+sL"�ς��f��U�ƥGb&�A2��]��qe���9�9���U�6�z����j�j��<���yCkkj�Bk��v�3\W�n$?0��z�����m��P���Ƹ�:��?��T�P(*�侩�G��{7;l޳�[��Z�mqY�vɵ��~*�ijK�ޭ�[�m�nl���k��R������;Zw�v�|�k���e�eջ��%��� ����ٶ�K��v�OeK�v�檉������5W�TW����&���֤���@���u�u�?�n�ת/��zPpPz(������F�ƭMp��i���}G���7[7״��G%G_���˝c!Ǻ�ӏ7�0>Qu�z��j]�:��k��Ƿ��
>����q�W�_��?]yF��ֳijg����v�:�r~�ky׃ �.ܺq��Rȥ+�._�ft���q��U����ѯ�]w�����s�7��N�:���p�������?�������~7/�b޺~{���;1w�.����}~/�ޛ���'�?�<,z���������o�:K� � �<�z�`�=��?��<�<-{������ӣ�}/�y)|9���O�?�^��>��_=c��Fވ�L�-y����{��]���?d|��(�����'����q��M����R���kǷ�o�2���,k�@!3�� �ۃP���@T��w�=��a�o����3=�l�!@c>ш�yP�� �D��X�7��fFV���4A�6�5)��z��8s�NMM�MM}�G���t~��e�h>��5ғY�?��?��$1�i(�] pHYs  ��7iTXtXML:com.adobe.xmp<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="XMP Core 5.1.2">
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<rdf:Description rdf:about=""
xmlns:tiff="http://ns.adobe.com/tiff/1.0/">
<tiff:XResolution>72</tiff:XResolution>
<tiff:YResolution>72</tiff:YResolution>
<tiff:Compression>1</tiff:Compression>
<tiff:Orientation>1</tiff:Orientation>
<tiff:PhotometricInterpretation>2</tiff:PhotometricInterpretation>
</rdf:Description>
</rdf:RDF>
</x:xmpmeta>
��~!@IDATx�� �\Wy%|�����w�"��}�dy�Wla�-���` ����O��a�H`2���8b6&�$ �ْ%Y�b-֮ޤ��ں���u�Z�[�כ�^��^�����~�޷��i&�d� L Ӓ���2`0 ؀��20� ؀�F�mV�p�X��p�H���2`����42`nɶYYl��:`�Fl�M#�6+ˀ 8[,�Ȁ �i$�fe�A��8f �. #��'=}�'�� ���,�� ȋ��7�^7��uY$Nj�r,�~`��?�ǰ��7����W�!�� n�����@���Yˆ�����:�]:�:k$�k����VE��D��r���T�\�\Cr|��m�o��Q��1�e�p�s9�˘7�^��el��d9�H�������}R��v����A��j��i���Cww7zzz����W gJ�C�Y�87�ǹ3'�����La|UfIh�m�8�ЂT�k���3�%ܮ�NēD5<���x���ù�e^3�@*֏��DgG��a� GD�0EfG'�z:�0O�ө���b{�\��w8�q�7; U�t]]�yp�8ׯn� o���`*�f�}��7ÿs�D��w��d�?qϿ�N�iB"I�ho������J���Ct�'���A���3x��=��'��.\liC"�̬C'�贴H��?�>�{����o�F]������r�2O�]\�^<������������O��G˅�H���^.�����i�`�O��uTT���i7{y�����ƒ�=vm2�z:�q���M.��뜊
��:��~�-��W6�%{����ET.��[�����r��
����d���ߢ���x�P��:��q�������5�;y�����DsK�^o֎�� �Do3���_�?�e�gLȧ��A �u�!0�>�͗����_��?�o���b�9��K���log�4������/}I�\r�E�f��{�Vm��e QZAKS=Νk��Sg��������0ʱ'��ʅX�b)�;�Z��5%8q�8�/4�t};��"TpZ�I�����xb� ظ�6�N�ÒknC��z��O�yx�|�ՔM�vQ����ᯣ�ڏ�߱���I\� 8���ع�Y�:|k7lB�Щ���g�.�@tA5�ִ�v�MX\ ��O���0�~��=�ﻦ�=��}�9�i`��%�y� �Ѳ0| �-A���9߇v\�@<������� +��54�܋'�ۍ'�ލ�U�QU�#Ǜ��¥�nE�uWa����➻w��}7^�ŵ�����_�^���a˦�һ�C�Qː!1���|�r$:�����-N������O��+�cᚫPS>�͗�����X�w�ɳ�d�K������?Ǚ�^�Ѧ4�mYelvB�r����!�Oi���`�tv=�$�u�8Z��(R��Z[�~�fq�� Mt7�t� 6�]�c��QD"a�5�EO<���τ���?Ȋ[�{�mƯ��PS[���bԮX���Sx��c� �f�䐳�������m��$�j�B,�.îGk[O� �Y�-��4���uk�bIm�� wK"�ߌ������� b0�}j�OQ~��ti<�~��
�S(]X��֑_gK��|�5XX@0� �J�bIu%G;��\��� �H��n��ť���*��@��(=�ĝ�n%D55�Q[��c���e@�2~ltw��LQI9�oڈ�h��$Z;������x���u䐳���s;J������0?��oܾݭMXz�|�s�A���\��d����e}�=2#H��(]X�5k�bQ� �ͭ8���w�
$9�� SY /�h2}��!T,_�
���G���kH�_� y�N�Mk�q��ڈ]��xG�^}�v={?^l�a��*A�j��! -�^������ X��]'�����h�Ruu�^��u���R�N\h<�6� �x�%,�vn޺�=F^{�9����X�lz{y�k2�O �AK��W5�7�빈���8�)|�K_�滬�}��q�=��O�b�9�3�n8�?��M��&VW�~� ���=�E�W �7�9g�h��j8�{���ehF�N ����U%!t\hCa(:q��=�Mu�?�?�O�{��nT�?G�X���X/:: Q�h��"����7`j,����9z��eز~9����㨬�C�r'��1c3��E:�8s�C�-[P*�` ŋ(�<Od�0З._���
� ㆎk�4��?–���zf7[���[�0��d=zX�a6��3H� �X��6�gno9��~�ڣ������^�N�EbA ��rʋي0����X�Ż��/~�O��'�uW_�[nY�ݏ=�=M=x�;ފ��$�45������ �6 ��k �\�[9\|�珡��� 7`5GO����� -�Blڸ��>m�D�;���ݎ��Q�� �<�{���Mhl���o@�K��?�C]��{��Ċ������AUEn�~+���;*�ɝa��3���x����bU/��kV���O�O�Eox����q(/B&Qg�4�������R� ��� �E5E���܏�g[q�]��5��ę>��@�c��p8St����@oɭgBq ��7�iI��٩�'�C(R �}���G���SJ��dj��Y�Yz�D��&� /�@e'�n�L�;
�9�p�ҩ/*.tK5�\�Q��� _ ���� G�*�8�% #��o��+$�!������/,OO���G$<9ۇJȺ����$=���}���c�TUbvˮWC�Md!��8�|�u���g���=��;~Y��c� W\'���G�wl��d\��b~����$XV`��PCD`S�I�ܓ�&��M��q��.�8�Nbs
���P>� l,��#�I������?� XUlG�He�OG�#ಃ'{y$���I*����d�>���X^���5�p�����&��[v�2��8��}8/����ʵ�ң���@#�{��
7Uزn*��`q엃�9�ō;tt>ǩ#�ƙ��ړ+��u�}Ԁs랩s�*^N��"�%$�\G����,���]'��dO��+}����T��a��W ������%� >������C��G]e�xd�9*�gе��:�SG=v����S����lg�<s�ty‹�n����{�,�U�4~�W��s-|���������XZ[�ܸe<Gz�3x�Wy>�2ɀ|�-�un��7m�-�W��7���8� ��B�z<5<)���UT����^��T`�����#�&/�Nj��t��ۗ���ߊ7�s��)��ɣ�X�l����!/p��E�HI�����RS�W���?�
ҺT�s�|�����8n��z���w��;<M�( �G��'����9���+�?���A`�ïg|:"�J ]��c� O� �p�7�۞ڍ�PT���ܬc��<�q���J��{��ǻ���?;›3 gs�݋��]��}���o ޼a���]��ѽ.��{���ҋ�b��~��܍7��v���5v^�u��1|�;?��?�^��sx����u������+��{���*g
׾�g�F�Gμ��˸��?������O�)����d��7^�lW���C?�'3�]������F��P��u�g�wu.�CC��xW3 <9CF�p�JA'\^���t��$�^A�͠W�袚�j��3� ��T4��a�`�������A�x[BW[��q�抩�V\�����n�%�)p5n����N^��|�J^I��� �c{��K�a��"�/����8�����Jg�WI|ܱ�]1]M��r�*�/�m��tn?�R��10`;��a��U��?���f�ν�B=0�+�nv���+�LW�WH;�������97T�6�O�yzM����P!1��\��p����������(�ǨK����u��^�Z`[�՞� �`נ�<��������J��c�"7���GkQ�O��+��5 ��mLg���1���'���:��9�0:F:W�h�h�����v���:���\�ɏ@s ��������}������bV2��v���.򘦃�{�_�gL�����-ۖ�, ��p�H���r2P��#�X7ߜ�\�4�
c�c�;�co�i$��G�����f0��Qp�ـ�R=k�5+�7+�b��R�w�z֖kV2`nV��u�2`�J��-׬d�ܬt�5�Je�ܕ�Y[�Yɀ �Y�kԕʀ �+ճ�\��p��-֨+�pW�gm�f%6�f�[�QW*6�������sJ3�R��J6������i�{����Y�̴)g�H_�d���s�qf�qg"gO�ߒ3U���&סY/�d ƙ���( vqr��9F�|�.����{�E�=��΋�P�)i��pn .�~�wֿ���5�5�%��I��$�H7�c˄rs1(Aۛ)�P�I�I�#�['�����p Dѣ6�w�}�L95����w~��Q��� �)T��##�u~~�N�)O���$9^��tt�s͕�h^⢢4���,�M���Y�+è[���Ώy7�4��z�ݠ��q�}�+�C��dQ� sV1�7���K�$�� "�iΗ�x�E�h�� P��� �ܚ in
� D٢�P:��F�Q<6E����V +�J_!m�����B<���C���w�%�� ���ՠ�¥�)�����\���[3���U�Fd������q"���'��|�
�;��|��p_x�i~˯^ /���X��+F8���m��|���<s��c�0���X?��(Z·�p����x�뤢�ȝLk�n2]
�'�X�祥̴y��L� �_��o��Ź�]��� $"Ԓ�q��;կ��&R|=���| �� �0lҤ�AbM���T�0{��p��;�����"��Ua!_*g����E��n��[�h�ޯWQ� �jfoW�؉��P 9����P��U��uJ�7/���UF�y���hok1b��&�c'��׉0n�~ _�A��v���
mw�V���wU)�[��/Yi x���jll��h�i�T�B� �ƫ��G Sn��v����(�y{I:Z��[�b9�޲N'Y��I�$��f�!���KԼ�ANybԝOQ4'� [&�p�/U(pt�%�ޫ���(��Q]r .�s��˗ &Y<����vI���M��`��xCAY�F,�_�R䉛F�-O��:�B!���%�����?0�>8Vܔ��qp,�T^l@��k��q��s/e�)�ww�3|�~�d���b#G���XN�2�?i�$v]J� +�st@4��ڔ��:Ј׺�rdF!����M:^y%����r;aJ�W��� �QN��|N�lG����������w��?���5]���=C ���b<�����_������b�>�*����7� ��'N��}��?�!:�f����o|�ǞG߆�]����">�a W�H*��ū�����he �kO���i{ #�:龜��T_{�c� +��O����,�|�e�Z�6|���_��:��E6w �j�xc��g}*�2��"�y��� p��?�!f���p���M"E/���U�]|�I:Y�`k›�����S@]
`�<��Ʃz|�/ |��E��7�Dy!E:��'�Ws츻��N�`/B|�3����������Q�9����%|�?܊���l����t�x����/<��A�5ۖ�߷���X�0�!�G�[�+������Oކs{�� ���Jt��*\�O_���=����gN��{�_s[k�.D�G�.���r~x�w���~�.wʮ<ι��x���Jh����B&�ܔ�쮛�7��t�iD��sj�Ï�XzM��V�E ې���Ҽ�:�p�&���K�F��:�Ik%�g���.�1R���� O��:�nv�or��9l�<-a9؀HM�}�{��:.iZ̠H�z9*x�Y�{%��曆�̭ `�z�b���(ç�3gm 8l�e� '9ȟ$$�N��8e�V�����0�l� ��ΕL.��o�c6��'�@�]=����ygS<g�2v������c��w�P�y,\b��6�%����`�X�;���!.�.
�O� ��� �Q�r�5BC�����\G��u�����!f�0Ut�D��\'pS��ŵ �{l���*` �Nl�M'�6�yπ �y_,�ɀ ��d��5��7變%`:�7�lۼ�=6��}�L'6ওm�׼g�ܼ����d��t�m�� ؀��U�0� ؀�N�m^�+;�ܧ�}vsfv��Oû�����"��ܓ�Ӽ���L��1��8�u���΢�.4��TX�Ho���8�2*�͕J�3��'��l����1+��G�e0��J�p��W|�!C�h6���e~j�I'��L"&� ���9��a/9�̝5k��������"Hc23Ș���0$Wglr�̟a<刱�j��s3���К��s_g��0^Z�C��yȤVJ��������v ?)�;��h�q��F��!G%q����46/����F]˩��=�vbO� W��#~���SԠT<P���<Ť��C3-SŹ�*P�h��&ce��G�&�h+�����BP4��lp�N>YL��D��|7=\&mJ�-]ʝ��ꍬBb� �SբC�( �TW���$����)x+� QVX��p�\��{���y� �I*�>'����A(�-a���N!�j*E>�<����G�^V��)�-)���ۛ���S��>L)�ŷn����n]�{޽
��S3׫�͗7�vm����h������>�������^�}��$��+7��� ��"|�#+�g����a@f�w^؂��j�p�u�w>�6<��p�05k �^� �șN��O}�W�M&O6� N7�ɑɓu^����s�q�Z��`����~0Phr�r�L���$, >!0� IR���9���bDB����;� ��T�J(5����\<�L��� �E�<�����L��I��%�^\��L��X�Jona<� ���g���K-F^�O#�h4jd�<H�vd�XU�L/Gq���Z���3Y�R-c��L-�ʓr�wt����rTE����.
��3����H��ŵX\E�@���COg/; =�g��)
�TV���̅x'O��С��H�P��/tU٦]}�J�a:Kb���hm�H.mw���/�A�^\Z�[o^G!�B�o���/�&��~�݃�,z��\�6-æ u&��#�h�l��"����� �¢n�n%�K���!7�(M�J7�nپfM�m]��&�%�<�Ӭ��� �$z�;yD9oV����桊C���V��oA}�I��y��*��K\d�[U3�k�n�#���=���.��GS� X�>�Ԋo��:<��)����p8B^�A{�;�v��L㱿� w\����/��Oq�C>e���7.�ӏ���r���������xn
�ď��^��]�������� h�|�c;�נ������|�1PR��{U����$�����{=������/�뒛W^Tf�������T� ��M���x4�`���7*c�~d�R�1��Me�d[�0����T�e�Xm_��'��LT◽�x'{#�b³�jn�x����Lq���DXĎ����6���ԟ|r_Z.vQ�9�_>t7�6�(/��xQ�;u���:�h;���Zt�f.@��&�G��Fi��;���j.��r��W��<h��&�z��H��e ��c���p�3���Q�.��+���ٚ~�9�:����� �Y���F���u���O�k+�(�π���MhH�(͵���D������*:W� 
z �D٫�B���[��-�3�I�X�K8S!:���n^��,H�G��:���˃��7H}G���w�Po�����l�=��O2M�2���
? ��ٸ��t�2��fh*�.�󶌆��D�����$��A| �� n�K��.���G���r�n����f��x/O��}�V�.�f]��C�Z�C20�� )������ �i;3�e���������m��q���'�� 3�>�6��ZI�^�u|6NH��:�0|��̚e)�sm��bŮ� L6ঈX k�ŀ �\��u��)b��ka-������20E ؀�"b-�e 6�r�b�Y��pSD��� �b�\.V�:��1`n������\ ؀�Ŋ]g�"l�M��2��p�Xg]�����:�7[�r9�
8:�g���w}�a3K\���x; ���r���r�d�9Ӊ26�ۇl��J�J�̼�2�k�\����~`_����)Q� �n�fR ����)Ĩ�,!g�\���0�g����9H���ڎh˸������h�a����5��k�#BT맦�,���P™ڪ\�19V������#F�N+Ҩ,u&]ͽ d�m�=#�� v&��v���I���p©&��v�KXi9g{�q�sʋ�V�L����c;�/�{�j{�$�C��)E�bE��b/ y禴X��zC�J���ldRגFH�h�\����9��<4@1�(E��N�ylΝ@v�
D�� ��T��Y?e����I���2R���b�p�rʿS��8�D�4�Y�A�YW��OKs�n��`�Zr:nuյB(*����,�wlB��t��BB��^�� O��$��� "� β/D$J���c���j��$��J e�'��S9p�v�*�/e�%�vD$BŴt�|s�J�p�J�SJ�%�QU��,{�z�X
��R��T?��� ���d��$����X\�������Ԃ��X���� q�^���*�I��;���n���)=I�Eux�]�3���@={ⰑX�j����y�l�~%�A�������(dOᥭ���K�W��o��U%8F]�%~A��
봕1J)ܼ}-�}�Q���3�q��ED<ڮ*gT�����MX\S�3���ӟ�c��3R�<$�O,�¶kV� �ߤ��E���
���ɶ�)��v��B�Z���7Sc�O�$á�x1�����P�Dvd���Cp��Z�:5(�e�9ȗl�������ݏ��N.�:�u^_��F��� 9C#|�w��U^�������&Q�< 猣s0�U� ]����]��d���N��7�H�����+���E������&DI�׶V}$eS� +q��:�h���ε����N��y��ya)�融XR���_��OP��8s�/9���[C[������|3�[����{8��(J؛:2��1���d"��� ���cX�v��;��?����<�K{�9V���P����Dww _��O���Π���^��ؤ���(��wc���x�S��מFA�Cmϗw;D����$������GoSw$���D0W����/������`P�oA�M8ڱ�'}���E�~l[p�<c�c��F��%�Q�ˬm��չuO��y��[n��;����ꪊФm/�؋��6���wn��6�PX�CD�j�_�A�TjCg�/���{p�o�����&d��� O���~�S��M7�_:��*��� }gz��+hh|�R|���b��8����]Z^��W��G_ފ���o�G?�#�ݷϠvK{���;�إ%l0tc�+��x.4���@����8qw̦�D��)#� 3 ����hd���s%�:� 8_�R��b���N6{�+0�n-�yD [�\L�v����/�ņF�L�:\T���9�T��q�Tv�_�bN�o3�.+As�(�`<�3���V���U</'�\QS����,[Y��XzIⵂ6�_J�5���!,�.DI����b^�g��µR0�s���U�P[�w��Jm�F�}��O0)cZ
� ��*�������� |�9�pe����ge�S}�l�Q��B�-��s*���?�2a�c$uq12����S�ܫ������5zV�ȝ���2߽�#�vQ��@9U��E&}��$/�g�m��Lɗ/���,�p�&�����#绝��T���
a+ ����Oƹ�w,�)�ap#^|�F�&�af��i7L���q�}�}�iWp��(��i� ؀�N�&�l��_ے�l��'X�6�揯mIg6�f�� �p��׶���p�� ք�À ���k[�Y�� �Y�k��a����-�,`��,p�5a�0`n��ږt0`.'���z&x8dģ��F=t�5�Y�a�nJ�#P~�_RHZ�-F��ܡI��g��8f��0e&�
g�+�T �S��Lmq$��[�D~�n�M�DY�vΫt��0'?�&/+y)y������Tάo�z-�S���d�Z��q1�3fu��F����`
�I��e�TNޘ:P�V�8�gd���&t�w)7h�K�/S�K���tcՂ�(��Q�9�o���a�mh7X j��Խ �I����u�O⹲��r�i,al?^�GI� �� Q�I���!�f|����L U^��I���9�N��3{����Tq,��faУ�ė�����
N�#�N =N;��屐�����c�Ƚ'�������H�b�HQcЇ�� ��$�j~nQ5����4[��&S����z ���je5���5�r��_5R�16,�@Q������?�"-^̏*C��2^������P\R��kV�� ������Sٸ�G*�)c[��f����ݏ�������:��a�y���Fyy�.�W-��f�5�ȗ�8�|�z�S'��ƍ����
;��W���'q��Wa�j���@S��Œ�0bl�)v:d��"�?�めr�e3��D7�#�CRa���
X� v�B0}Z�)�����cr4��Տ��T"��v���Hu� �Bl���!ΐt��4�?,=��7X��� 8������8�y^#SvJO� ul{�S���Z������+&��x�o��AE���V*�uu����g���*z��PKW<�D���\��&`�軈w�U.(�J����ݲ(����� \f@d�6:�Ķ�)��P
��$�|�@�D�#����wǫ�� ����d��d��Q���p+�����Pu���SL+ �v9>��v�Fxk�Q�D��� 
M%s}�˶��f�FZ8�"N%j�.�5�\�w�� �tlW�}]��m�د�f�O���0����E�x� �C����?�hq]R��k��h"O�^�P��̳�d��O�R<7+ )7S!�Z4�����D�^r��ۥEC�p��2y��J|a�A�ͅv��3���*�����³{����)�ng#/ ��e��Zԋ߸ 7P�|���7^����o�x{��۟؂�|��8t��m{�h(�7���m���ޅ7޽�'�?x��a��K�w����ღ�_�����9~$��et$l�V��?����7���"��ǟ�:��|j$�5��w.ï��p:^�i&ز ���!`vP\~�d֤�t:p-:��" Re��[�����%�ї��`��ځ����ݏ7�M3-7[��Z�9�:�N^�x;n��|E*(���N�<݂���0�N��;j���gnh<U��o��7�4����c�z�"t�"�������Š'ގÇ������Ob��U���&���%��vO<|]��hi!�x7��N�vČ_��&�WU����v��ޗ�����e,+�m����?�4���]'�F��,�(�k9Ws�;���~kxAY�L���4��%�9\u���bq����)��,o{q$�Wë�bE:��t�M�N]��d��f�����:��eȟzI��󝐹���-3�!~W�w��<�"�CuEG�S�Nrs^S� '3�K�=[[g �۽��ʲ:#�7HjG�Xo�a{Խ"���~$dNY>�ɻ/r�/P~����q�ͷ�5.M���Tw}H�u��9e�: B3e����u�3P�ҌX|�&�q��IO=[v�MCGB��U�΃Z��]<-;8x3p��23�� ��[��@^��2�,M%��aۀ�Y0��� ؀���2�+6�|�ӂY�f����ح�_��+��2066����n� �ʀ 8_�`����76?v�e�Wl��J�� �̀ ����[-�2`�W:-�e`ll��͏�j�p��i�,c3��pWj�c�S𤽞#n�2��p�e0�ȇ9��6`��r��x�s��K� [2�%��p���%�;Gs�F��$�?Gi�C�;�K���w���g�]�Lx��q�P� r�T\y�2P4����&�jJ�2ч��3�����3s���WдS����J��?^�^8�C)��Ө�r&?�5��S�q��c��1Q�ɮU����4��f���Í��ls����^���� �lom�%�7� ��� �J���p
>��� �˖ �픦�� �Q���� �S�$;R<C;池I��%������I�PGn8��s
�f���ʐfM�+��;�5�ܝI�a�)5���)H���t �f�k��<2�XQ#<���
9տ҉�:f��ѯR��b���YW�cxe�U�V���h�OpΩ8!Z�6�c�~�y�6r)��%m P����4M�I����u��8� ���,�
��"�2š-Z²ҵ����P�J�ؤ|�p�U��-GE���a��ֵx�t#�X �A�d��C�>�n� � ����?ۅ��N
�zW��s����qǍ��Kƣ��}�%
��2�2yj{z�����EYi�߸_�����arS��΃��,)���½��ͨ�����_/ىHH��<�Ɣ���zRx�;���������_�>^��2�1jg�~�̲lOs�w |~�C�0�~擷Y�)�q�gۻ�x�n† K�K����&�ɔb�}U��R֦%s/��� �z�1J~e� G��L�� ����*Ȕ�g�Ϯ�C�saȗ4xh9O�\�e�awv�fm��C��Uf[:�N��Sc���
m ��d���l��혯��I����
�K�?�g�7��� ��=�pn]J�o[�W�.@K �v�B��F�Nj��c�\.-/��ك�s�z�����˻�5���#f��Y��UuTK���p���������S
i�O��W�&���v��T��{p��ѝ�T1�n�B�~y�L
�r�<��qdal�*�$e��ɋ���֯���bo��#�O2�ś� ��N�7�\�z��9_ji �KGS6 ɜ+�</ٻ
h��W�������"{�v,l�tzY���"�u�Q�r��!�#($�Ke<���=G�߇� Ϝk�ǎ�ŲH!�{���9�h�y��Ն�x��%x��A���J�_'I�C�m�RE5�6��ÇOa)�C��W��T�.�"�omY��<����jw�G��Q:}������X]�ƞ>��'��0��{V4[�!kC������o�}GN�OZQK|� �h���)��6)+Q��dwdR`q\P`H�O�й�W���N~���`��f�b�y�Gt�T'�� 1i�W(��V�E�I�$�A{�A�: id^ฑ���9�XQ*���T�Z�r>�S T�#�1go5�oO��uA�.�n7��~�l'N���8�A���x��b<B������r�O� �e�E$J}����K�[?Ļ�ׇi{<�4#�q��j��G�e�8�����ӥ���_Y��� N-�n3h�y�%ùNyxMҽ����VWy��ĴΙ�?~+/����m&�8������L� �W� ��5�g��va7�� ���5�8���nĺx�
���B�~珔�H�� -�#X���-�;�|���<�&;y��<� ٮ
̵��Os��ر�W;���^p�����6�.[�6�懟m)g 6�f�#��p��϶���p��֌��� ���g[�Y€ �Y�k��`����-�,a��,q�5c~0`n~�ٖr�0`n�8š1?�7?�lK9K�7Ka͘ �`�M����Å��s�� 8���<a���F���ʗ�b29��Ifg&fM�s\�5'Ι��cd��u�
�<����n���#y,�v�#�q�&0g|���<ҷ>�헏Y�5��䚜�Y嚜���9T^��Q3�R-�pqN7.�,��;S+�Ab�qֱ,Md�2Ge{���-')���"*�9A9zI���I3�����%a�d�ij/g�s]15G���N]J�o�hR� ��a��k��gx�I)���Ri󚢲]v�~�3��r�B�#�A�Er�������4p�i����P��&�F���ڈET ��𛕥�Ƕn5�y��8��}aI e�X^)��>jG��h�ҊR�!��� ���BF��[�lsi5"�B�Q�H�?�O�(V-(3�J�VW���|���������b�Q��|=%��~�PUn`���o�uaO�T(O����F�\U�L^.�KV[
1�3YIQKbC�x��X,%Z��[
��2R$��]>/���P9Dj ܹ�^��a��^�3v1�kW��
UR���Ԋ�U�wކ;��+:���*��>�O�����|�Qk+k��Ub0_n���n*��w�I=O)�4o��aj�� ı���Td���p)�l�)Ǫ
�[:���K=�ܬ��J��� ��~-��ǒ���V R��T������/�&5�k�1��9��*�uQ��IrD2+|�R�i�4���Ӆ��[F8թK~�Ά��K�ٱ��pҵ�]k�#[����.>`Kr��p���Fn��$`�v� �R=������]�[��ZN�����VxH��—�JR��CK�|�819t/�uq2�Z,�p�ݖ򣠫��O]J�!]K����?YJU,���A<^����t&Z��!ۙ�/�!�A�"�"Z*)A��iX��u�'*�����<�}�& ��$��(��{��C�F�B&��}���=�P�&Y�Лx���p-�`�(_#�H��o�.�^�؅�D�tmwJ��_�V�S� �cat^h:��;º�� ��k��'@��A\WY��\s���t}fdb6ԥt�%��`�S&O-��
k�Q0��� �4R���������k��j0�I���'ۉ�K%��o�7wr����Ӳ����Ρ��u �����`����p�X�N[��_ydDj��3��[)bۅ�d ��R3���CT J�_�?knOK���+ E� �!�!��0�G�`�s�z;��ӲLyR;���T�˘����w^�x�˓"yԝ�!��%���Q�>�� lP��lvN��I~��� �z3����\R(�=� 7����K��+� 3=�$�c?H����GN������@�I�_a��k���}��$nT��9ˀ��j�1m�ۀ�6�mF�g�jy� X����M�6ˀ�g�e`�7�d۬,6�l� L#6঑l��e�����id��4�m�� ؀�u�20� ؀�F�mV�p�X��p�H���2`n^�wͼ&aZ ?��s�pX�L�g����i*���Y�˯&7��4Ss���Q��a#Is�2o�뤙����!3��V��0�==���;���QdIڠ~&�g����'���:����S���`��&����<�!������Ρf�[�Q-�'��0��!9D���'�[��_k�q~ ����G�J�������h��ߒS�2�~k?���O�{�����I��
~KN�/�Ż8�RתRfL~�OL� .��e���2r�KiY�RU�(��xD�) '=q���ɬO�S�y=�K(�X���2�8��A��ObA�` �����u�)�Xh�D3�%_��G%�LbG�2,���d�F�N�󣏕 ң��� �����UY�G�M�~�Km�#�*�y�C�Se�k����A�� VT�?I"�T�R� �T�_���ة�6جĎ��?�K&/�ڛ�z�� M^-. ���#X�g )[��=&x�r�l�*��OUS�;l�z3#X4�ʗ%�����o_@�@ .��!��-~�?{�2��j���w���`�o�|��`7ok�-�<f`��1;�����3��206��b�n� ��@���I�ƓR?�K'��=`n20�+��h27���z�2:�slFL/���zb���[��Υ���H�3ྫlF(�|��d� �ӧ�����Sϥ�¹�_"��̭:�sp�-�� �8�£
Q�gϕ��-�m���Z����L��AV�>.��7s� ^����O49-�p��lNaVcIDATP�@��Mor����^.D��v�T[\��sx0�7D#|I�ܱ]$�Iz��iÚK�
��+"��y����Zr�E��['�"��᣺�l=���s!9������b*�\�]��M�1���7 r`1�� $�ŧ���E�\j��*�ű �6�f�z��|d��|��-�1`nƨ��Gl��G��2���9+c�M�k�\����7��cN|�p�z��s51��|77��hY]�f�Ε��jt;Hv�[��9響�@��r���Ų{N�8��ڬ�$麽��s-�����۬�J�5 ��$�b��Y����I{rOŃ(�� =�l���8�z��Ⱦ� �UK�� ��4�h��Dη�͑�w�H]Q�`���L�\j�D���c$Ss�o��:JU��ANA.�2~��@����9`r��v�@6v�20� ��|�).ߔ����`JKd�����M5��2�ŀ��E�]� L5�"��4�\�}�I��|��RN4��w�����߬8�[�e��(��D"���NͲ�؞��tzp�6'�G/t�A?�f-s.�]��c���ݮ�%����A]���4d�(v���@�\M6w�ik��� ��qτ�3��� �<�t�2l\Qm.��>~t�*s|�/�܇p4���Uؼ�n�'*��ߧ�DO�[�ՙ��z�Q��/�z�!t�wc��v`Yy7;e� ��6֟<� �\�y����F%�����8x���|'V�Fq�C8u�e� �|�&,�ԋ^�����]<g����5�潻~�^A�/�~ -�qD*��W���18����A���Z�\X6#~���uK�����󪹧��u��y�+CuOV�ی ��x�ɲL��%K0Pϼ�
z9)R�M{��Aξ��۰iu��(*�ݗE��3�\۫-F��$�|�%tP�`���8#��#-Ei1��;/����FAi�nو���7�qG5u�4��w�bw�6�}�� ��e��kp��nDwSZ.����X�m;�Y^��N��f� 3p@ii)��atҙ�)>E���j�
K�rQ �؍���eT�'���$�.ڞL ��X�B"\B��FV��( �/���2D��(++AwO7���F��:M^0Z�U�7aAY�� N5��]�p�O?�M-ݦ�]�;���P^^�޾���ԉI��D�`A�[�!XV��Eը����cGq���P��=�4c���C�W"Y�ox�M(��UJ$�i5��'.��o� ��� ���)L.���4�q�����Q�ox���(����>*A��S8��Y�ȱr:�����ן>�'�
qϛ�Bm%�1&�:lp�x����-\�
���v�P�ah��Zpm�X��c����`im��޵]O����W���\}�f���+�܂m�!1�@!G3U�g(_��0hb=li(�7Ѕ=;w�BG�����r����w�.�;|ˮن�B�d'�����8�#���4"���� �;�N��N�1���O����2>�h�5���}9c{*�X,ɗ&�qh��8]ѱ��h��!����}��և��^Eo���G��h+(��u+3�O�'L[ŗ0��L�|t�n?� |�Ώ��� ��B ���p����8t�� �q�c{z������X,��9��D��HeVJ�u���E T�� ��o�$]� @��݆���4p�FV�{�`$<c-jN�h{��'y�Q��06C�K��G8� P�K ��I%��K���e���)�a8��FV�*,D��o�I�*�J�J� {�A�7��1��[T����y��ӻ<�7�E���ʀj� �~�a&M���c��:��q�HR�a�h�G�?}��VV��>��ca"�_��ς@�N�N�g>�ƫv�e�
b`G�W��(�� 2�J<���IEND�B`�
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment