diff --git a/benchmark-slow/job-aps.sh b/benchmark-slow/job-aps.sh index 4bc9d94e73d431d87ab926b3d2a8da6b69a664d4..20f9c521c3bbbafeefe65ae88b696ee30773bd05 100644 --- a/benchmark-slow/job-aps.sh +++ b/benchmark-slow/job-aps.sh @@ -1,6 +1,6 @@ #!/bin/bash #SBATCH --job-name="swiftaps" -#SBATCH --ntasks=1 +#SBATCH --ntasks=2 #SBATCH --ntasks-per-node=1 #SBATCH --output=swiftaps.out #SBATCH --error=swiftaps.err diff --git a/benchmark-slow/job-arm.sh b/benchmark-slow/job-arm.sh index db2a892caf517c5bbef9c4f1ddf1d514411a87a1..b6cf4ed516d27acf4d983153ee950ec7f47861f3 100644 --- a/benchmark-slow/job-arm.sh +++ b/benchmark-slow/job-arm.sh @@ -1,6 +1,6 @@ #!/bin/bash #SBATCH --job-name="swiftarm" -#SBATCH --ntasks=1 +#SBATCH --ntasks=2 #SBATCH --ntasks-per-node=1 #SBATCH --output=swiftarm.out #SBATCH --error=swiftarm.err diff --git a/report/day1/benchmark-slow/aps_report_20210121_163112.html b/report/day1/benchmark-slow/aps_report_20210121_163112.html new file mode 100644 index 0000000000000000000000000000000000000000..816161183b949a756af93358d3fa577a2b4287dc --- /dev/null +++ b/report/day1/benchmark-slow/aps_report_20210121_163112.html @@ -0,0 +1 @@ +<!DOCTYPE html><html lang="en"><head><title>APS report</title><link rel="icon" href="favicon.ico" type="image/x-icon"><meta name="nexus-supported-models" content="mps_plugin.Result"><link rel="nexus-home" href="?nexus={nexus}"><link rel="nexus-app" href="?nexus={nexus}&path={properties.path}"><meta name="description" content="APS viewer application"><style type="text/css">body,html{height:100%}body{margin:0;font-family:'Segoe UI',Tahoma,Geneva,Verdana,sans-serif;font-size:15px;color:#000;background-color:#f7f7f7;overflow:hidden}@media (min-width:1320px){#content{width:1190px;font-size:16.5px}}@media (min-width:1540px){#content{width:1410px;font-size:18px}}@media (min-width:1760px){#content{width:1630px;font-size:19.5px}}.ablate{display:none}#leftMenuOpenedState,#topMenuOpenedState{background-color:#00aeef;padding:.5em;color:#fff}#leftMenuOpenedState>h4,#topMenuOpenedState>h4{font-weight:700;margin-bottom:.8em}#leftMenuOpenedState>div,#leftMenuOpenedState>span,#topMenuOpenedState>div,#topMenuOpenedState>span{opacity:.75;padding-bottom:.8em;font-style:italic}#leftMenuOpenedState>a,#leftMenuOpenedState>a:visited,#topMenuOpenedState>a,#topMenuOpenedState>a:visited{font-weight:400;color:#fff;opacity:.9}#leftMenuOpenedState>a:hover,#topMenuOpenedState>a:hover{opacity:1}#topMenuOpenedState>a{padding-top:.6em;padding-left:4em}#leftMenuClosedState,#topMenuClosedState{background-color:#0071c5}#leftMenuClosedState:hover,#topMenuClosedState:hover{cursor:pointer;background-color:#00aeef}#topMenuClosedState{font-size:22.5px;line-height:60px;color:#fff;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}#topMenuClosedState sup{display:none;font-size:.4em;font-weight:400;line-height:.8em}#topMenuClosedState span{padding-left:13px;padding-right:13px}#topMenuClosedState span.icon.menu:after{vertical-align:middle}#topMenuClosedState span.icon.intel{line-height:0;float:right;font-size:2em;padding-top:13px}@media (min-width:625px){#topMenuClosedState sup{display:inline}}#leftMenuClosedState div.icon{font-size:2.5em;width:1em;margin:15px auto}#leftMenuClosedState div.icon.intel{font-size:4em;position:absolute;margin:0;bottom:0;left:15px}#leftMenuClosedState,#leftMenuOpenedState{z-index:5;position:fixed}#topMenuClosedState,#topMenuOpenedState{z-index:5}#leftMenuClosedState,#leftMenuOpenedState,.feedback-panel.closed a.button{display:none}#topMenuOpenedState{display:block;position:fixed;left:0;right:0;top:-200px;bottom:0;width:100%;height:200px}#topMenuClosedState{display:block;position:absolute;left:0;right:0;top:0;height:60px}#contentWrap{position:fixed;overflow-y:auto;overflow-x:hidden;left:0;right:0;top:0;bottom:0;padding:20px;margin-top:60px}.menuOpened #topMenuOpenedState{top:0}.menuOpened #topMenuClosedState{top:-60px}.menuOpened #contentWrap{opacity:.35;margin-top:200px}@media (min-width:850px){#topMenuClosedState,#topMenuOpenedState{display:none}#leftMenuClosedState,#leftMenuOpenedState{display:block;left:-180px;top:0;bottom:0;width:180px}#leftMenuClosedState{left:0;width:90px}#contentWrap{left:0;top:0;padding-left:110px;margin-top:0}.menuOpened #leftMenuOpenedState{left:0}.menuOpened #leftMenuClosedState{left:-90px}.menuOpened #contentWrap{left:135px;margin-top:0}}.anim{-webkit-transition:.5s all cubic-bezier(.8,0,.2,1);-moz-transition:.5s all cubic-bezier(.8,0,.2,1);-o-transition:.5s all cubic-bezier(.8,0,.2,1);transition:.5s all cubic-bezier(.8,0,.2,1)}@media print{#leftMenuClosedState,#leftMenuOpenedState,#topMenuClosedState,#topMenuOpenedState{display:none}#contentWrap{position:relative}}#content{margin:0 auto;width:100%;max-height:0;overflow:hidden}#content:after{content:"Screen is too small";position:absolute;top:133.33333333px;left:0;width:100%;margin:auto;text-align:center;opacity:.5}@media (min-width:400px){#content{max-height:inherit}#content:after{content:""}}#bricks{clear:both}#bricks>article{background-color:#fff}.not-supported-browser{color:#000;background-color:#fff;padding:30px;height:100%}.feedback-panel{position:absolute;color:#fff;background-color:#0071c5;font-weight:400;padding:10px;width:200px;height:70px;transition:left ease-in-out .5s 2s,top ease-in-out .5s 2s}.feedback-panel:after{content:"";position:absolute;width:0;height:0}.feedback-panel.left{left:0;bottom:30px}.feedback-panel.left:after{left:220px;top:0;border:45px solid transparent;border-left-width:20px;border-left-color:#0071c5;border-right:0}.feedback-panel.top{right:30px;top:140px}.feedback-panel.top:after{left:100px;top:90px;border:60px solid transparent;border-top-width:20px;border-top-color:#0071c5;border-bottom-width:0}.feedback-panel.closed.left{left:-240px}.feedback-panel.closed.top{top:-110px}.feedback-panel .question{margin-bottom:.8em}.feedback-panel a.button{display:inline-block;color:#fff;padding:5px 10px;margin-bottom:5px;text-decoration:none;background-color:rgba(255,255,255,.2);border-radius:5px}.feedback-panel a.button:hover{background-color:rgba(255,255,255,.3)}.icon:after{display:inline-block;width:1em;height:1em;line-height:1em;vertical-align:bottom}.icon.menu:after{content:url(data:image/svg+xml,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%20fill%3D%27%23FFF%27%3E%3Crect%20x%3D%273%27%20y%3D%273%27%20width%3D%2714%27%20height%3D%273%27%2F%3E%3Crect%20x%3D%273%27%20y%3D%2713%27%20width%3D%2714%27%20height%3D%273%27%2F%3E%3Crect%20x%3D%273%27%20y%3D%278%27%20width%3D%2714%27%20height%3D%273%27%2F%3E%3C%2Fsvg%3E)}.icon.email:after{content:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3E%3Cpath fill='white' d='M10,0L2,6v9.5h16V6L10,0z M10,1.5L16,6l-6,3.2L4,6L10,1.5z M16.5,14.2h-13v-7l6.5,3.3L16.5,7V14.2z'/%3E%3C/svg%3E")}.icon.intel:after{content:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 293 293' fill='white'%3E%3Cpath d='M 291.28737,55.058565 C 277.50683,-12.11587 147.525,-16.369963 63.737895,34.808098 L 63.737895,40.460487 C 147.41497,-2.7316788 266.14859,-2.4562338 276.95315,59.422033 C 280.59385,79.920851 269.12707,101.24048 248.56679,113.50757 L 248.56679,129.56114 C 273.31695,120.47998 298.61629,91.08816 291.28737,55.058565 M 138.92617,172.67053 C 81.102616,178.02238 20.853265,169.59848 12.418485,124.23687 C 8.2296052,101.90025 18.426965,78.192925 31.877897,63.483967 L 31.877897,55.608451 C 7.6234054,76.957185 -5.5514356,103.96031 2.0555709,135.84419 C 11.756767,176.75954 63.462304,199.91949 142.39931,192.20804 C 173.65361,189.19069 214.55609,179.09205 242.94244,163.42581 L 242.94244,141.16845 C 217.14544,156.61695 174.47938,169.38024 138.92617,172.67053 z'/%3E%3Cpath d='M 238.31142,45.347552 L 223.15342,45.347552 L 223.15342,113.16 C 223.15342,121.1244 226.95767,128.05143 238.31142,129.14959'/%3E%3Cpath d='M 57.729915,70.130433 L 42.57092,70.130433 L 42.57092,114.42193 C 42.57092,122.38934 46.375174,129.31386 57.729915,130.41152'/%3E%3Cpath d='M 188.42548,81.588742 C 183.30029,81.588742 179.33248,84.253255 177.67794,87.85316 C 176.68611,90.022849 176.3545,91.672094 176.19095,94.338616 L 199.39759,94.338616 C 199.06648,87.82553 196.14302,81.588742 188.42548,81.588742 M 176.19095,104.61387 C 176.19095,112.33513 181.03904,118.01982 189.52834,118.01982 C 196.19954,118.01982 199.50663,116.15155 203.3654,112.33563 L 212.62645,121.26456 C 206.67299,127.14267 200.44444,130.71544 189.41981,130.71544 C 175.03357,130.71544 161.25152,122.82991 161.25152,99.85904 C 161.25152,80.21479 173.26798,69.115166 189.0887,69.115166 C 205.12948,69.115166 214.33351,82.110693 214.33351,99.173822 L 214.33351,104.61437 L 176.19095,104.61437'/%3E%3Cpath d='M 98.576374,82.329722 C 102.98533,82.329722 104.80493,84.500918 104.80493,88.045061 L 104.80493,129.78055 L 119.85388,129.78055 L 119.85388,87.990304 C 119.85388,79.499933 115.33339,70.129931 102.15955,70.129931 L 71.125329,70.129931 L 71.125329,129.78005 L 86.118769,129.78005 L 86.118769,82.329219'/%3E%3Cpath d='M 148.57135,129.69867 C 136.2803,129.69867 131.09859,121.12491 131.09859,112.66317 L 131.09859,53.837923 L 146.09203,53.837923 L 146.09203,70.130433 L 157.44627,70.130433 L 157.44627,82.329722 L 146.09203,82.329722 L 146.09203,111.75641 C 146.09203,115.21716 147.74557,117.11508 151.32725,117.11508 L 157.44627,117.11508 L 157.44627,129.69867 L 148.57135,129.69867'/%3E%3Crect x='42.570919' y='47.40823' width='15.158995' height='14.425744'/%3E%3Ctext x='244.26051' y='55.85825'%3ER%3C/text%3E%3C/svg%3E")}.icon.flag:after{content:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3E%3Cpolygon fill='%23BE3B26' points='4.5,0 11,3 10,6 13,11 7,9 7,7.5 4.5,7 4.5,15.5 3,15.5 3,0'/%3E%3C/svg%3E")}.icon.cross:after{content:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3E%3Cpolygon fill='%230071C5' points='1,17 3,19 10,12 17,19 19,17 12,10 19,3 17,1 10,8 3,1 1,3 8,10'/%3E%3C/svg%3E")}.icon.arrow-s-w:after{content:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3E%3Cpolygon fill='grey' points='19,3 17,1 5.5,12.5 1,8 1,19 12,19 7.5,14.5'/%3E%3C/svg%3E")}.tooltipped[data-tip-id]:not(.icon){cursor:help;border-bottom-width:1px;border-bottom-style:dashed}h3.tooltipped[data-tip-id],h4.tooltipped[data-tip-id]{display:table}.tip>div[data-id]{position:fixed;padding:.75em;display:none;max-width:35%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;background-color:rgba(255,255,255,.9);border:0 solid #000;box-shadow:rgba(0,0,0,.25) 0 5px 8px;z-index:10}.tip>div[data-id]:after{position:absolute;content:"";height:0;border:5px solid transparent}.tip>div[data-id].north{border-bottom-width:5px}.tip>div[data-id].north:after{bottom:-16px;border-top:6px solid #000}.tip>div[data-id].south{border-top-width:5px}.tip>div[data-id].south:after{top:-16px;border-bottom:6px solid #000}.tip>div[data-id].west:after{left:15px}.tip>div[data-id].east:after{right:1px}.tip>div[data-id].visible{display:block}.tip>div[data-id$=_ISSUE]{border-color:#bf3600}.tip>div[data-id$=_ISSUE].north:after{border-top-color:#bf3600}.tip>div[data-id$=_ISSUE].south:after{border-bottom-color:#bf3600}@media (min-width:650px){.tip>div{max-width:30%}}@media (min-width:850px){.tip>div{max-width:25%}}@media (min-width:1100px){.tip>div{max-width:20%}}body .icon.flag{color:inherit;transition:color .5s ease .5s}body .icon.flag:after{width:0;transition:width .5s ease .5s}body.withSuggestions .icon.flag{color:#bf3600}body.withSuggestions .icon.flag:after{width:1em}body article#suggestion{position:relative;padding:1.5em;margin-bottom:2.5em;margin-left:1.5em;border:2px solid gray;border-radius:4px;width:0%;max-height:0;opacity:.5;float:right;background-color:#fff;transition:max-height .75s ease 0s,width .5s ease .25s}body article#suggestion::after{content:"";position:absolute;width:0;height:0;left:10px;bottom:-10px;border-bottom:10px solid transparent;border-right:25px solid gray;transition:left .5s ease 0s,bottom .5s ease 0s,border-bottom-width .5s ease 0s,border-right-width .5s ease 0s,border-color .5s ease 0s}body article#suggestion section.aspect_map,body article#suggestion section[data-id=SUGGESTION_TEXT]{opacity:0;overflow:hidden;transition:opacity .5s ease 0s}body.withSuggestions article#suggestion{opacity:1;width:85%;max-height:700px;border-color:#0071c5;transition:max-height .5s ease .25s,width .5s ease 0s,border-color .5s ease 0s}body.withSuggestions article#suggestion::after{left:20px;bottom:-20px;border-bottom-width:20px;border-right-width:80px;border-right-color:#0071c5}body.withSuggestions article#suggestion section.aspect_map,body.withSuggestions article#suggestion section[data-id=SUGGESTION_TEXT]{opacity:1;transition:opacity .25s ease .5s}@media (min-width:625px){body.withSuggestions article#suggestion{width:50%}}a.button.suggestion{position:absolute;right:.9em;top:.75em}section[data-id=SUGGESTION_TEXT]{margin-bottom:1.5em}section[data-id=SUGGESTION_TEXT] span#first_line{font-size:150%;color:#0071c5}section.aspect_map{width:100%;display:table}section.aspect_map>section.aspect{display:table-row;height:1.6em}section.aspect_map>section.aspect>span{display:table-cell;vertical-align:middle;white-space:nowrap;padding-left:.5em}section.aspect_map>section.aspect>span:first-child{display:inline-block;padding-left:0}section.aspect_map>section.aspect>span:nth-child(2){text-align:right}section.aspect_map>section.aspect>span:not(.icon):nth-child(2){padding-right:1em}section.aspect_map>section.aspect>span:nth-child(3){padding-right:1em}section.aspect_map>section.aspect>span:last-child{position:relative;width:60%}section.aspect_map>section.aspect>span:last-child>span:not([data-tip-id]){position:absolute;left:0;right:100%;top:.5em;height:.6em;background-color:#bf3600}section.aspect_map>section.aspect:first-child{color:gray;text-align:center;font-size:.75em}article[data-id=INFO]{color:gray;margin-bottom:20px;padding-right:2em;font-size:80%}article[data-id=INFO] span[data-id]:last-child{font-style:italic;word-wrap:break-word;word-break:break-all;padding-left:.5em;color:#000}h1{font-size:2.5em;color:rgba(128,128,128,.5);margin:0 0 20px;display:none}h1 sup{display:block;font-size:.4em;font-weight:400;line-height:.8em}@media (min-width:850px){h1{display:block}}.aux-metric,.top-metric{display:inline-block;font-size:1em;font-weight:400;margin-bottom:1.5em}.aux-metric [data-id]:first-child,.top-metric [data-id]:first-child{display:block;padding-top:.75em;font-size:2.2em;font-weight:500;color:#00aeef}.top-metric{padding-right:10%}.aux-metric{padding-right:2em}.aux-metric:first-child{border-left:1px solid #00aeef}.aux-metric:last-child{border-right:1px solid #00aeef}div#content article[data-id=WALLCLOCK]>span[data-id]:first-child{font-size:3.4em;padding-top:0}div#bricks article{color:gray}div#bricks article h3{margin:0;font-size:1.5em;font-weight:400;color:#00aeef}div#bricks article h4{margin:.8em 0 0;padding:0;font-size:1em;font-weight:400;color:#000}div#bricks article .indent{margin-left:1.75em}div#bricks article table{margin-top:.8em;width:100%;border-collapse:collapse}div#bricks article table tr{border-bottom:1px solid rgba(128,128,128,.25)}div#bricks article table tr td,div#bricks article table tr th{text-align:right}div#bricks article table tr td:first-child,div#bricks article table tr th:first-child{text-align:left;white-space:normal}div#bricks article table tr td{padding:.2em;position:relative;overflow:hidden;white-space:nowrap}div#bricks article table tr th{font-weight:400;padding:.2em 0;border-bottom:2px solid rgba(128,128,128,.25)}div#bricks article table tr th:first-child{color:#000}div#bricks article table tr .progress{position:absolute;width:0%;height:100%;background:#00aeef;opacity:.15;left:0;top:0;-webkit-animation:filler 4s ease-in-out;-moz-animation:filler 4s ease-in-out;animation:filler 4s ease-in-out}div[data-id=MEMORY_INFO]>div,div[data-id=RSS_INFO]>div{margin-left:1.5em}div[data-id=MEMORY_INFO]>span,div[data-id=RSS_INFO]>span{margin-left:1em}</style><script>var json={"INFO":{"APPLICATION_NAME":"swift_mpi","NUM_RANKS":"1","RANKS_PER_NODE":"1","STAT_FILES":"/cosma/home/ds007/dc-fraw1/performance_analysis_workshop/swift-cs-performance-workshop-2021/benchmark-slow/swiftsim/examples/PMillennium/PMillennium-768/aps_result_20210121","CREATION_DATETIME":"2021-01-21 15:50:30"},"VECTORIZATION":null,"SP_FLOPS":null,"SP_PACKED":null,"SP_128_BIT":null,"SP_256_BIT":null,"SP_512_BIT":null,"SP_SCALAR":null,"DP_FLOPS":null,"DP_PACKED":null,"DP_128_BIT":null,"DP_256_BIT":null,"DP_512_BIT":null,"DP_SCALAR":null,"X87":null,"AVG_FREQUENCY":null,"NON_FP":null,"FP_ARITH_MEM_RD":null,"FP_ARITH_MEM_WR":null,"CACHE_BOUND":null,"DRAM_BOUND":null,"DRAM_BANDWIDTH":null,"PERS_MEM_BOUND":null,"PERS_MEM_BANDWIDTH":null,"MCDRAM_BANDWIDTH":null,"DRAM_HIT_RATIO":null,"DRAM_CACHE_HIT":null,"DRAM_CACHE_MISS":null,"NUMA_USE":null,"BANDWIDTH_AVG_OUT":null,"BANDWIDTH_AVG_IN":null,"PACKRATE_AVG_OUT":null,"PACKRATE_AVG_IN":null,"CPU_USAGE":null,"AVERAGE_CPU_USE":null,"CPU_OUT_OF":null,"PHYSICAL_CORE_USAGE":null,"PH_CORE_USE":null,"PH_CORE_OUT_OF":null,"BACK_END_BOUND":null,"L2_HIT_BOUND":null,"L2_MISS_BOUND":null,"SIMD_PER_CYCLE":null,"PACKED_SIMD":null,"SCALAR_SIMD":null,"CPI_RATE":null,"SPGFLOPS":null,"DPGFLOPS":null,"X87GFLOPS":null,"WALLCLOCK":{"WALLCLOCK_SEVERITY":"severityUnknown","WALLCLOCK_VAL":"1694.15s","WALLCLOCK_PERC":"0.00%","WALLCLOCK_DESCR":"Total application wall-time."},"MPI_TIME":{"MPI_TIME_SEVERITY":"severityMedium","MPI_TIME_VAL":"93.03s","MPI_TIME_PERC":"5.49%","MPI_TIME_DESCR":"Time spent inside the MPI library. Values more than 10% might need additional exploration on MPI communication efficiency. This might be caused by high wait times inside the library, active communications, non-optimal settings of the MPI library. See MPI Imbalance metric to see if the application has load balancing problem. Use <a href='https://software.intel.com/en-us/intel-trace-analyzer' target='_blank'>Intel® Trace Analyzer and Collector</a> to explore communication efficiency."},"MPI_IMBALANCE":{"MPI_IMBALANCE_SEVERITY":"severityUnknown","MPI_IMBALANCE_VAL":"N/A","MPI_IMBALANCE_PERC":"0.00%","MPI_IMBALANCE_DESCR":"Mean unproductive wait time per process spent in the MPI library calls when a process is waiting for data."},"NON_MPI_TIME":null,"OMP_REGIONS_TIME":null,"OMP_IMBALANCE_TIME":null,"OMP_SERIAL_TIME":null,"MEMORY":{"PEAK_MEM_RANK":"Rank: 0","PEAK_MEM_VAL":"100324.46 MB","MEAN_MEM_VAL":"100324.46 MB","MEM_DESCR":"Per-process memory usage affects the application scalability."},"RSS":{"PEAK_RSS_RANK":"Rank: 0","PEAK_RSS_VAL":"83212.16 MB","MEAN_RSS_VAL":"83212.16 MB","RSS_DESCR":"RSS usage affects the application scalability."},"MEMORY_PER_NODE":{"PEAK_MEM_NODE":"Node: b116.pri.cosma7.alces.network","PEAK_MEM_PER_NODE_VAL":"100324.46 MB","MEAN_MEM_PER_NODE_VAL":"100324.46 MB","MEM_PER_NODE_DESCR":"Per-node memory usage affects the application scalability."},"RSS_PER_NODE":{"PEAK_RSS_NODE":"Node: b116.pri.cosma7.alces.network","PEAK_RSS_PER_NODE_VAL":"83212.16 MB","MEAN_RSS_PER_NODE_VAL":"83212.16 MB","RSS_PER_NODE_DESCR":"Per-node RSS usage affects the application scalability."},"TOP_5":{"File_read_at":"5.49","File_open":"0.00","Init_thread":"0.00","Get_elements_x":"0.00","Reduce":"0.00"},"MEMORY_BOUND":null,"IO":{"READ_BYTES_SEVERITY":"severityUnknown","READ_BYTES_DESCR":"Amount of bytes read by the application. High volumes of I/O operations may lead to unproductive wait.","WRITTEN_BYTES_SEVERITY":"severityUnknown","WRITTEN_BYTES_DESCR":"Amount of bytes written by the application. High volumes of I/O operations may lead to unproductive wait.","IOWAIT_USEC_SEVERITY":"severityLow","IOWAIT_USEC_VAL":"0.00s","IOWAIT_USEC_PERC":"0.00%","IOWAIT_USEC_DESCR":"This is the time the application spends waiting for an I/O operation to complete.","READ_BYTES_AVG_VAL":" 0.0 KB","READ_BYTES_MAX_VAL":" 0.0 KB","READ_BYTES_MAX_RANK":"Rank: 0","WRITTEN_BYTES_AVG_VAL":" 0.0 KB","WRITTEN_BYTES_MAX_VAL":" 0.0 KB","WRITTEN_BYTES_MAX_RANK":"Rank: 0","IOWAIT_USEC_AVG_VAL":"0.00","IOWAIT_USEC_AVG_PERC":"0.00%","IOWAIT_USEC_MAX_VAL":"0.00","IOWAIT_USEC_MAX_PERC":"0.00%","IOWAIT_USEC_MAX_RANK":"Rank: 0"},"SUGGESTION":{"TEXT":"<span id='first_line'>Your application looks good.</span><br> Nothing suspicious has been detected.","STYLE":"good"}};</script><script>function drawProgress(){for(var e=document.querySelectorAll(".progress"),t=0;t<e.length;t++)e[t].style.width=e[t].dataset.progress+"%"}function drawThresholdBars(e){var t={BACK_END_BOUND:{threshold:20,lessIsBetter:!0,perc:!0},BANDWIDTH_AVG_OUT:{threshold:8.75,lessIsBetter:!0,perc:!1},BANDWIDTH_AVG_IN:{threshold:8.75,lessIsBetter:!0,perc:!1},CACHE_BOUND:{threshold:20,lessIsBetter:!0,perc:!0},CPI_RATE:{threshold:1,lessIsBetter:!0,perc:!1},CPU_USAGE:{threshold:90,lessIsBetter:!1,perc:!0},DP_128_BIT:{threshold:5,lessIsBetter:!0,perc:!0},DP_256_BIT:{threshold:5,lessIsBetter:!0,perc:!0},DP_SCALAR:{threshold:30,lessIsBetter:!0,perc:!0},DRAM_BOUND:{threshold:20,lessIsBetter:!0,perc:!0},FP_ARITH_MEM_RD:{threshold:.5,lessIsBetter:!1,perc:!1},FP_ARITH_MEM_WR:{threshold:.5,lessIsBetter:!1,perc:!1},IO:{threshold:10,lessIsBetter:!0,perc:!0},L2_HIT_BOUND:{threshold:10,lessIsBetter:!0,perc:!0},L2_MISS_BOUND:{threshold:15,lessIsBetter:!0,perc:!0},MEMORY_BOUND:{threshold:20,lessIsBetter:!0,perc:!0},MPI_IMBALANCE:{threshold:30,lessIsBetter:!0,perc:!1},MPI_TIME:{threshold:10,lessIsBetter:!0,perc:!0},NUMA_USE:{threshold:15,lessIsBetter:!0,perc:!0},OMP_IMBALANCE_TIME:{threshold:10,lessIsBetter:!0,perc:!0},OMP_SERIAL_TIME:{threshold:15,lessIsBetter:!0,perc:!0},PACKRATE_AVG_IN:{threshold:105,lessIsBetter:!0,perc:!1},PACKRATE_AVG_OUT:{threshold:105,lessIsBetter:!0,perc:!1},PERS_MEM_BANDWIDTH:{threshold:42,lessIsBetter:!0,perc:!1},PERS_MEM_BOUND:{threshold:20,lessIsBetter:!0,perc:!0},PHYSICAL_CORE_USAGE:{threshold:80,lessIsBetter:!1,perc:!0},SCALAR_FP:{threshold:15,lessIsBetter:!0,perc:!0},SCALAR_SIMD:{threshold:15,lessIsBetter:!0,perc:!0},SIMD_PER_CYCLE:{threshold:1,lessIsBetter:!1,perc:!1},SP_128_BIT:{threshold:5,lessIsBetter:!0,perc:!0},SP_256_BIT:{threshold:5,lessIsBetter:!0,perc:!0},SP_SCALAR:{threshold:30,lessIsBetter:!0,perc:!0},VECTORIZATION:{threshold:70,lessIsBetter:!1,perc:!0}};null!=e.BACK_END_BOUND&&(t.CPI_RATE.threshold=2);var s,r,o,n=["BACK_END_BOUND","CPU_USAGE","IO","MEMORY_BOUND","MPI_TIME","OMP_IMBALANCE_TIME","OMP_SERIAL_TIME","PHYSICAL_CORE_USAGE","SIMD_PER_CYCLE","VECTORIZATION"];for(var l in t)if(null!=e[l]){var i=-1<n.indexOf(l);if(o=t[l].perc?"_PERC":"_VAL",s=parseFloat(e[l][l+o]),"MPI_IMBALANCE"==l){var a=parseFloat(e.MPI_TIME.MPI_TIME_VAL),d=parseFloat(e.WALLCLOCK.WALLCLOCK_VAL);s=0<a?100*s/a:0,0<d&&100*a/d<=15&&(t[l].threshold=100),o="_PERC"}if(null!=(r=i?document.querySelector("[data-id="+l+"_BAR]"):document.querySelector("[data-id="+l+o+"]"))&&(t[l].lessIsBetter&&s>=t[l].threshold||!t[l].lessIsBetter&&s<=t[l].threshold)){if("SP_256_BIT"==l&&null==e.SP_512_BIT||"DP_256_BIT"==l&&null==e.DP_512_BIT)continue;if(i&&(r.style.right=95-95/90*Math.abs(s-t[l].threshold)+"%"),null!=(r=document.querySelectorAll("[data-id="+l+o+"]")))for(var u=0;u<r.length;u++)r[u].classList.add("icon"),r[u].classList.add("flag"),null!=e[l][l+"_ISSUE"]&&r[u].classList.add("tooltipped")}}}function makeInvisible(e){var t=document.querySelectorAll(e);if(null!=t)for(var s=0;s<t.length;s++)t[s].style.display="none"}function render(e){var t;if(null!=e.SUGGESTION&&(null!=(t=document.querySelector("[data-id=SUGGESTION_TEXT]"))&&(t.innerHTML=e.SUGGESTION.TEXT),null!=(t=document.getElementById("suggestion"))&&t.classList.add(e.SUGGESTION.STYLE)),null!=(t=document.querySelectorAll("[data-id=INFO] span")))for(var s=0;s<t.length;s++)null==e.INFO[t[s].dataset.id]&&makeInvisible("div[data-id="+t[s].dataset.id+"_STR]");for(var r in e){var o=e[r];if(null==o)makeInvisible("MEMORY"==r?"[data-id=MEMORY]":"[data-id^="+r+"]");else if("TOP_5"==r){var n=document.querySelector("[data-id=TOP_5]");for(var l in o){var i=document.createElement("tr");i.innerHTML="<td><span class='progress' data-progress='"+o[l]+"'></span>"+l+"</td><td>"+o[l]+"</td>",n.appendChild(i)}drawProgress()}else for(var a in o)if(null!=(t=document.querySelectorAll("[data-id="+a+"]")))for(s=0;s<t.length;s++)t[s].innerHTML=o[a]}drawThresholdBars(e);for(var d=["DRAM_BANDWIDTH","MCDRAM_BANDWIDTH"],u=0;u<d.length;u++)if(null!=e[d[u]])for(t=document.querySelectorAll("[data-id="+d[u]+"_VAL]"),s=0;s<t.length;s++)t[s].classList.remove("tooltipped"),t[s].dataset.tipId=d[u]+"_ISSUE";else if(makeInvisible("[data-id="+d[u]+"_EXTRA]"),"DRAM_BANDWIDTH"==d[u]||null!=e.INFO.HW_PLATFORM&&-1<e.INFO.HW_PLATFORM.indexOf("Knight"))for(t=document.querySelectorAll("[data-id="+d[u]+"_TITLE],[data-id="+d[u]+"_VAL]"),s=0;s<t.length;s++)t[s].style.display="";if(null==e.BANDWIDTH_AVG_OUT&&null==e.PACKRATE_AVG_OUT?makeInvisible("[data-id=FABRIC_USAGE]"):null==e.BANDWIDTH_AVG_OUT?makeInvisible("[data-id=BANDWIDTH_AVG_TITLE]"):null==e.PACKRATE_AVG_OUT&&makeInvisible("[data-id=PACKRATE_AVG_TITLE]"),null!=(t=document.querySelectorAll(".tip > div[data-id$=_ISSUE]")))for(s=0;s<t.length;s++)if(""==t[s].innerHTML||null==t[s].innerHTML){var c=document.querySelectorAll("[data-tip-id="+t[s].dataset.id+"].tooltipped");if(null!=c)for(var p=0;p<c.length;p++)c[p].classList.remove("tooltipped")}else{var h=document.querySelectorAll("[data-tip-id="+t[s].dataset.id+"]:not(.tooltipped)");if(null!=h)for(p=0;p<h.length;p++)h[p].classList.add("icon"),h[p].classList.add("flag"),h[p].classList.add("tooltipped")}if(null!=(t=document.querySelectorAll(".tip > div[data-id$=_DESCR]")))for(s=0;s<t.length;s++)if("MEM_DESCR"!=t[s].dataset.id&&(""==t[s].innerHTML||null==t[s].innerHTML)){var _=t[s].dataset.id.indexOf("_DESCR");makeInvisible("[data-id^="+t[s].dataset.id.substr(0,_)+"]")}null==e.MPI_TIME?makeInvisible("[data-id$=_INFO],[data-id=NUM_RANKS_STR],[data-id=RANK_STR],[data-id=MEMORY_DATA_BLOCK]>table,[data-id=FABRIC_USAGE]"):makeInvisible("[data-id=MEMORY_APP],[data-id=RSS_APP]"),null!=e.PCONTROL&&1==e.PCONTROL?makeInvisible("[data-id$=_DATA_BLOCK],section[data-id=IO]"):makeInvisible("[data-id$=_TEXT_BLOCK]"),null!=e.SP_FLOPS&&0==parseFloat(e.SP_FLOPS.SP_FLOPS_PERC)&&makeInvisible("[data-id=SP_FLOPS_BITS]"),null!=e.DP_FLOPS&&0==parseFloat(e.DP_FLOPS.DP_FLOPS_PERC)&&makeInvisible("[data-id=DP_FLOPS_BITS]"),initTooltips()}function isBrowserSupported(){var e,t,s={"Trident/":{version:11,offset:3},"Edge/":{version:12,offset:5},Firefox:{version:17,offset:8},Chrome:{version:40,offset:7},Safari:{version:8,offset:7}},r=(navigator.appVersion,navigator.userAgent),o=(navigator.appName,""+parseFloat(navigator.appVersion)),n=parseInt(navigator.appVersion,10);for(var l in s)if(-1!=(e=r.indexOf(l))&&("Trident/"==l&&(e=r.indexOf("rv:")),-1!=(t=(o=r.substring(e+s[l].offset)).indexOf(";"))&&(o=o.substring(0,t)),-1!=(t=o.indexOf(" "))&&(o=o.substring(0,t)),-1!=(t=o.indexOf(")"))&&(o=o.substring(0,t)),n=parseInt(""+o,10),isNaN(n)&&(o=""+parseFloat(navigator.appVersion),n=parseInt(navigator.appVersion,10)),n>=s[l].version))return!0;return!1}function renderForNotSupportedBrowsers(){var e=document.querySelectorAll("body > div:not(.not-supported-browser)");for(var t in e)e[t].parentNode&&e[t].parentNode.removeChild(e[t])}function renderForSupportedBrowsers(){var e=document.querySelector("body > div.not-supported-browser");e.parentNode&&e.parentNode.removeChild(e)}function masonryLayout(e){var t=e,a={columns:4,gap:15,padding:10,breakAt:{1100:3,850:2,625:1}};function s(){var e,n=function(){var e=document.body.clientWidth,t=a.columns;for(var s in a.breakAt)if(e<s){t=a.breakAt[s];break}return t}();if(1===n)t.style.height="auto",r(t.children,function(e,t){t.removeAttribute("style"),t.style.padding=a.padding+"px",t.style.marginBottom=a.gap+"px"});else{var l="calc("+100/(e=n)+"% - "+(2*a.padding+(e-1)*a.gap/e)+"px)",i=function(e,t){for(var s=[],r=0;r<e;r++)s.push(0);return s}(n);r(t.children,function(e,t){var s,r,o;t.style.position="absolute",t.style.width=l,t.style.left=0===(o=e%n)?"0":"calc("+100/n*o+"% + "+a.gap*o/n+"px)",t.style.top=i[e%n]+"px",t.style.padding=a.padding+"px",i[e%n]+=(s=t,r=parseInt(window.getComputedStyle(s,null).getPropertyValue("height"),10),isNaN(r)?0:r+a.gap+2*a.padding)}),t.style.height=Math.max.apply(null,i)+"px"}}function r(e,t){for(var s=0,r=0,o=e.length;s<o;s++)"none"!==window.getComputedStyle(e[s],null).getPropertyValue("display")&&(t(r,e[s]),r++)}window.addEventListener("resize",s),t.style.position="relative",s()}var sendAnalyticsVersion="APS%202019%20G",sendAnalyticsReportPage="%2F";function setupAnalytics(e){sendAnalyticsReportPage=e}function sendAnalytics(e){}function feedbackInit(){document.querySelectorAll(".feedback-panel").forEach(function(e){e.classList.remove("closed"),e.querySelector(".question").innerHTML="Like this report?"})}function feedback(e){var t=document.querySelectorAll(".feedback-panel");NodeList.prototype.forEach=Array.prototype.forEach,t.forEach(function(e){e.querySelector(".question").innerHTML="Thank you",e.classList.add("closed")}),sendAnalytics(e)}function menu(){var e,t=document.body,s=document.getElementById("topMenuClosedState"),r=document.getElementById("leftMenuClosedState");function o(){t.classList.add("menuOpened"),feedbackInit()}s.onmouseenter=r.onmouseenter=function(){e=setTimeout(o,800)},s.onmouseleave=r.onmouseleave=function(){clearTimeout(e)},s.onclick=r.onclick=o,document.getElementById("content").onmouseenter=function(){t.classList.remove("menuOpened")}}function suggestionShow(){document.body.classList.add("withSuggestions");var e=document.querySelector("a.button.suggestion");e.classList.remove("arrow-s-w"),e.classList.add("cross"),e.onclick=suggestionHide,initTooltips(),sendAnalytics("suggestionShow")}function suggestionHide(){document.body.classList.remove("withSuggestions");var e=document.querySelector("a.button.suggestion");e.classList.remove("cross"),e.classList.add("arrow-s-w"),e.onclick=suggestionShow,removeTooltipFromFlags(),sendAnalytics("suggestionHide")}function initTooltips(){for(var e=document.querySelectorAll(".tooltipped[data-tip-id]"),t=0;t<e.length;t++){var o,s,r,n=e[t];n.onmouseenter=function(){clearTimeout(o),void 0!==r&&i(r),r=this,s=setTimeout(l,200,this)},n.onmouseleave=function(){clearTimeout(s),o=setTimeout(i,800,this)}}function l(e){if(void 0!==e){var t=document.querySelector(".tip > div[data-id="+e.dataset.tipId+"]");if(null!=t){t.classList.add("visible");var s=e.getBoundingClientRect(),r=t.getBoundingClientRect();0<window.innerHeight-s.top-r.height?(t.classList.add("south"),t.style.top=s.bottom+8+"px"):(t.classList.add("north"),t.style.top=s.top-r.height-8+"px"),0<window.innerWidth-s.left-r.width?(t.classList.add("west"),t.style.left=s.left+"px"):(t.classList.add("east"),t.style.right=window.innerWidth-s.right+"px"),t.onmouseenter=function(){clearTimeout(o)},t.onmouseleave=function(){i(e)}}}}function i(e){if(void 0!==e){var t=document.querySelector(".tip > div[data-id="+e.dataset.tipId+"]");null!=t&&(t.removeAttribute("style"),t.classList.remove("visible","north","south","east","west"))}}}function removeTooltipFromFlags(){for(var e=document.querySelectorAll("[data-tip-id].icon.flag"),t=0;t<e.length;t++)e[t].onmouseenter=e[t].onmouseleave=null}function getDataFromNexus(){for(var e="",t="",s=document.location.search.slice(1).split("&"),r=0;r<s.length;r++){var o=s[r].split("=");"nexus"===o[0]&&o[1]&&(e="http://"+o[1]),"path"===o[0]&&(t=o[1])}var n=e+"/repository"+t+"/data/obj.json",l=new XMLHttpRequest;l.open("GET",n,!0),l.onload=function(e){4===l.readyState&&200==l.status&&(json=JSON.parse(l.responseText),setUpAndRender())},l.send(null)}function setUpAndRender(){isBrowserSupported()?(renderForSupportedBrowsers(),sendAnalytics("pageOpen"),menu(),render(json),masonryLayout(document.querySelector("#bricks"))):renderForNotSupportedBrowsers()}window.onload=function(){NodeList.prototype.forEach=Array.prototype.forEach,setUpAndRender()};</script></head><body class="withSuggestions"><div id="leftMenuOpenedState" class="anim"><h4>Additional Performance Analysis Tools:</h4><a href="https://software.intel.com/en-us/intel-trace-analyzer">Intel® Trace Analyzer and Collector</a><div>MPI Analyzer and Profiler</div><a href="https://software.intel.com/en-us/intel-vtune-amplifier-xe">Intel® VTune™ Amplifier</a><div>Performance Profiler</div><a href="https://software.intel.com/en-us/intel-advisor-xe">Intel® Advisor</a><div>Vectorization Optimization & Thread Prototyping</div><a href="http://www.intel.com/storage-snapshot">Storage Performance Snapshot</a><div>Visualize System Storage Bottlenecks</div><section class="feedback-panel left"><div class="question"></div><a class="button like" href="#" onclick="feedback('apsLike');">Yes</a> <a class="button dislike" href="#" onclick="feedback('apsDislike');">No</a> <a class="button icon email" href="mailto:parallel.studio.support@intel.com?Subject=MPI%20Performance%20Snapshot:%20feedback" target="_top"></a></section></div><div id="leftMenuClosedState" class="anim"><div class="icon menu"></div><div class="icon intel"></div></div><div id="topMenuOpenedState" class="anim"><h4>Additional Performance Analysis Tools:</h4><a href="https://software.intel.com/en-us/intel-trace-analyzer">Intel® Trace Analyzer and Collector</a> <span>- MPI Analyzer and Profiler</span><br><a href="https://software.intel.com/en-us/intel-vtune-amplifier-xe">Intel® VTune™ Amplifier</a> <span>- Performance Profiler</span><br><a href="https://software.intel.com/en-us/intel-advisor-xe">Intel® Advisor</a> <span>- Vectorization Optimization & Thread Prototyping</span><br><a href="http://www.intel.com/storage-snapshot">Storage Performance Snapshot</a> <span>- Visualize System Storage Bottlenecks</span><section class="feedback-panel top"><div class="question"></div><a class="button like" href="#" onclick="feedback('apsLike');">Yes</a> <a class="button dislike" href="#" onclick="feedback('apsDislike');">No</a> <a class="button icon email" href="mailto:parallel.studio.support@intel.com?Subject=MPI%20Performance%20Snapshot:%20feedback" target="_top"></a></section></div><div id="topMenuClosedState" class="anim"><span class="icon intel"></span> <span class="icon menu"></span> <sup>Intel® VTune™ Amplifier</sup> Application Performance Snapshot</div><div id="contentWrap" class="anim"><div id="content"><h1><sup>Intel® VTune™ Amplifier</sup>Application Performance Snapshot</h1><article id="suggestion"><a class="button suggestion icon cross" href="#" onclick="suggestionHide();"></a><section data-id="SUGGESTION_TEXT"></section><section class="aspect_map"><section class="aspect"><span></span> <span class="aspect_value"><span class="tooltipped" data-tip-id="current_run">Current run</span></span> <span class="aspect_target"><span class="tooltipped" data-tip-id="target">Target</span></span> <span><span class="tooltipped" data-tip-id="delta">Delta</span></span></section><section class="aspect" data-id="MPI_TIME"><span class="tooltipped" data-id="MPI_TIME_TITLE" data-tip-id="MPI_TIME_DESCR">MPI Time</span> <span class="aspect_value" data-id="MPI_TIME_PERC" data-tip-id="MPI_TIME_ISSUE"></span> <span class="aspect_target"><10%</span> <span class="aspect_bar"><span data-id="MPI_TIME_BAR"></span></span></section><section class="aspect" data-id="OMP_SERIAL_TIME"><span class="tooltipped" data-id="OMP_SERIAL_TIME_TITLE" data-tip-id="OMP_SERIAL_TIME_DESCR">Serial Time</span> <span class="aspect_value" data-id="OMP_SERIAL_TIME_PERC" data-tip-id="OMP_SERIAL_TIME_ISSUE"></span> <span class="aspect_target"><15%</span> <span class="aspect_bar"><span data-id="OMP_SERIAL_TIME_BAR"></span></span></section><section class="aspect" data-id="OMP_IMBALANCE_TIME"><span class="tooltipped" data-id="OMP_IMBALANCE_TIME_TITLE" data-tip-id="OMP_IMBALANCE_TIME_DESCR">OpenMP Imbalance</span> <span class="aspect_value" data-id="OMP_IMBALANCE_TIME_PERC" data-tip-id="OMP_IMBALANCE_TIME_ISSUE"></span> <span class="aspect_target"><10%</span> <span class="aspect_bar"><span data-id="OMP_IMBALANCE_TIME_BAR"></span></span></section><section class="aspect" data-id="CPU_USAGE"><span class="tooltipped" data-id="CPU_USAGE_TITLE" data-tip-id="CPU_USAGE_DESCR">CPU Utilization</span> <span class="aspect_value" data-id="CPU_USAGE_PERC" data-tip-id="CPU_USAGE_ISSUE"></span> <span class="aspect_target">>90%</span> <span class="aspect_bar"><span data-id="CPU_USAGE_BAR"></span></span></section><section class="aspect" data-id="PHYSICAL_CORE_USAGE"><span class="tooltipped" data-id="PHYSICAL_CORE_USAGE_TITLE" data-tip-id="PHYSICAL_CORE_USAGE_DESCR">Physical Core Utilization</span> <span class="aspect_value" data-id="PHYSICAL_CORE_USAGE_PERC" data-tip-id="PHYSICAL_CORE_USAGE_ISSUE"></span> <span class="aspect_target">>80%</span> <span class="aspect_bar"><span data-id="PHYSICAL_CORE_USAGE_BAR"></span></span></section><section class="aspect" data-id="MEMORY_BOUND"><span class="tooltipped" data-id="MEMORY_BOUND_TITLE" data-tip-id="MEMORY_BOUND_DESCR">Memory Stalls</span> <span class="aspect_value" data-id="MEMORY_BOUND_PERC" data-tip-id="MEMORY_BOUND_ISSUE"></span> <span class="aspect_target"><20%</span> <span class="aspect_bar"><span data-id="MEMORY_BOUND_BAR"></span></span></section><section class="aspect" data-id="BACK_END_BOUND"><span class="tooltipped" data-id="BACK_END_BOUND_TITLE" data-tip-id="BACK_END_BOUND_DESCR">Back-End Stalls</span> <span class="aspect_value" data-id="BACK_END_BOUND_PERC" data-tip-id="BACK_END_BOUND_ISSUE"></span> <span class="aspect_target"><20%</span> <span class="aspect_bar"><span data-id="BACK_END_BOUND_BAR"></span></span></section><section class="aspect" data-id="VECTORIZATION"><span class="tooltipped" data-id="VECTORIZATION_TITLE" data-tip-id="VECTORIZATION_DESCR">Vectorization</span> <span class="aspect_value" data-id="VECTORIZATION_PERC" data-tip-id="VECTORIZATION_ISSUE"></span> <span class="aspect_target">>70%</span> <span class="aspect_bar"><span data-id="VECTORIZATION_BAR"></span></span></section><section class="aspect" data-id="SIMD_PER_CYCLE"><span class="tooltipped" data-id="SIMD_PER_CYCLE_TITLE" data-tip-id="SIMD_PER_CYCLE_DESCR">SIMD Instr. per Cycle</span> <span class="aspect_value" data-id="SIMD_PER_CYCLE_VAL" data-tip-id="SIMD_PER_CYCLE_ISSUE"></span> <span class="aspect_target">>1</span> <span class="aspect_bar"><span data-id="SIMD_PER_CYCLE_BAR"></span></span></section><section class="aspect" data-id="IO"><span class="tooltipped" data-id="IO_TITLE" data-tip-id="IOWAIT_USEC_DESCR" class="tooltipped">I/O Bound</span> <span class="aspect_value" data-id="IOWAIT_USEC_PERC"></span> <span class="aspect_target"><10%</span> <span class="aspect_bar"><span data-id="IO_BAR"></span></span></section></section></article><article data-id="INFO"><div data-id="APPLICATION_NAME_STR">Application: <span data-id="APPLICATION_NAME"></span></div><div data-id="CREATION_DATETIME_STR">Report creation date: <span data-id="CREATION_DATETIME"></span></div><div data-id="RANK_STR">Rank: <span data-id="RANK"></span></div><div data-id="NUM_RANKS_STR">Number of ranks: <span data-id="NUM_RANKS"></span></div><div data-id="RANKS_PER_NODE_STR">Ranks per node: <span data-id="RANKS_PER_NODE"></span></div><div data-id="NUM_OMP_THREADS_STR">OpenMP threads<span data-id="POSTFIX"></span>: <span data-id="NUM_OMP_THREADS"></span></div><div data-id="HW_PLATFORM_STR">HW Platform: <span data-id="HW_PLATFORM"></span></div><div data-id="FREQUENCY_STR">Frequency: <span data-id="FREQUENCY"></span></div><div data-id="NUM_LOGIC_CORE_STR">Logical Core Count per node: <span data-id="NUM_LOGIC_CORE"></span></div><div data-id="COLLECTOR_TYPE_STR">Collector type: <span data-id="COLLECTOR_TYPE"></span></div></article><article data-id="WALLCLOCK" class="top-metric"><span data-id="WALLCLOCK_VAL"></span> <span class="tooltipped" data-tip-id="WALLCLOCK_DESCR">Elapsed Time</span></article><article data-id="CPI_RATE" class="top-metric"><span data-id="CPI_RATE_VAL" data-tip-id="CPI_RATE_ISSUE"></span> <span data-tip-id="CPI_RATE_DESCR" class="tooltipped">CPI</span><br><span data-id="CPI_INFO">(<span class="tooltipped" data-tip-id="CPI_RATE_MAX_NODE">MAX</span> <span data-id="CPI_RATE_MAX_VAL"></span>, <span class="tooltipped" data-tip-id="CPI_RATE_MIN_NODE">MIN</span> <span data-id="CPI_RATE_MIN_VAL"></span>)</span></article><article data-id="SPGFLOPS" class="aux-metric"><span data-id="SPGFLOPS_TOTAL_VAL"></span> <span data-tip-id="SPGFLOPS_DESCR" class="tooltipped">Single Precision</span></article><article data-id="DPGFLOPS" class="aux-metric"><span data-id="DPGFLOPS_TOTAL_VAL"></span> <span data-tip-id="DPGFLOPS_DESCR" class="tooltipped">Double Precision</span></article><article data-id="X87GFLOPS" class="aux-metric"><span data-id="X87GFLOPS_TOTAL_VAL"></span> <span data-tip-id="X87GFLOPS_DESCR" class="tooltipped">x87</span></article><article data-id="AVG_FREQUENCY" class="aux-metric"><span data-id="AVG_FREQUENCY_VAL"></span> <span data-tip-id="AVG_FREQUENCY_DESCR" class="tooltipped">Average CPU Frequency</span></article><div id="bricks"><article data-id="MPI_TIME"><h3 data-id="MPI_TIME_TITLE" data-tip-id="MPI_TIME_DESCR" class="tooltipped">MPI Time</h3><span data-id="MPI_TIME_VAL"></span><br><span data-id="MPI_TIME_PERC" data-tip-id="MPI_TIME_ISSUE"></span> of Elapsed Time<br><div class="indent"><h4 data-id="MPI_IMBALANCE_TITLE" data-tip-id="MPI_IMBALANCE_DESCR" class="tooltipped">MPI Imbalance</h4><span data-id="MPI_IMBALANCE_VAL"></span><br><span data-id="MPI_IMBALANCE_PERC" data-tip-id="MPI_IMBALANCE_ISSUE"></span> of Elapsed Time<br></div><table data-id="TOP_5"><tr><th>TOP 5 MPI Functions</th><th><span class="tooltipped" data-tip-id="MPI_PERC_DESCR">%</span></th></tr></table><div data-id="FABRIC_USAGE"><h4>Intel Omni-Path Fabric Usage</h4><table data-id="BANDWIDTH_AVG_TITLE"><tr><th>Interconnect Bandwidth</th><th>AVG, <span data-id="BANDWIDTH_AVG_IN_UNIT"></span></th></tr><tr><td><span data-tip-id="BANDWIDTH_AVG_OUT_DESCR" class="tooltipped">Outgoing:</span></td><td class="cell"><span data-id="BANDWIDTH_AVG_OUT_VAL" data-tip-id="BANDWIDTH_AVG_OUT_ISSUE"></span></td></tr><tr><td><span data-tip-id="BANDWIDTH_AVG_IN_DESCR" class="tooltipped">Incoming:</span></td><td class="cell"><span data-id="BANDWIDTH_AVG_IN_VAL" data-tip-id="BANDWIDTH_AVG_IN_ISSUE"></span></td></tr></table><table data-id="PACKRATE_AVG_TITLE"><tr><th>Interconnect Packet Rate</th><th>AVG, <span data-id="PACKRATE_AVG_OUT_UNIT"></span></th></tr><tr><td><span data-tip-id="PACKRATE_AVG_OUT_DESCR" class="tooltipped">Outgoing:</span></td><td class="cell"><span data-id="PACKRATE_AVG_OUT_VAL" data-tip-id="PACKRATE_AVG_OUT_ISSUE"></span></td></tr><tr><td><span data-tip-id="PACKRATE_AVG_IN_DESCR" class="tooltipped">Incoming:</span></td><td class="cell"><span data-id="PACKRATE_AVG_IN_VAL" data-tip-id="PACKRATE_AVG_IN_ISSUE"></span></td></tr></table></div></article><article data-id="OMP_SERIAL_TIME"><h3 data-id="OMP_SERIAL_TIME_TITLE" data-tip-id="OMP_SERIAL_TIME_DESCR" class="tooltipped">Serial Time</h3><span data-id="OMP_SERIAL_TIME_VAL"></span><br><span data-id="OMP_SERIAL_TIME_PERC" data-tip-id="OMP_SERIAL_TIME_ISSUE"></span> of Elapsed Time<br></article><article data-id="OMP_IMBALANCE_TIME"><h3 data-id="OMP_IMBALANCE_TIME_TITLE" data-tip-id="OMP_IMBALANCE_TIME_DESCR" class="tooltipped">OpenMP Imbalance</h3><span data-id="OMP_IMBALANCE_TIME_VAL"></span><br><span data-id="OMP_IMBALANCE_TIME_PERC" data-tip-id="OMP_IMBALANCE_TIME_ISSUE"></span> of Elapsed Time<br></article><article data-id="CPU_USAGE"><h3 data-id="CPU_USAGE_TITLE" data-tip-id="CPU_USAGE_DESCR" class="tooltipped">CPU Utilization</h3><span data-id="CPU_USAGE_PERC" data-tip-id="CPU_USAGE_ISSUE"></span><div class="indent"><h4 data-id="AVERAGE_CPU_USE_DESCR" class="tooltipped">Average CPU Utilization</h4><span data-id="AVERAGE_CPU_USE_VAL"></span> Out of <span data-id="CPU_OUT_OF_VAL"></span> logical CPUs</div></article><article data-id="PHYSICAL_CORE_USAGE"><h3 data-id="PHYSICAL_CORE_USAGE_TITLE" data-tip-id="PHYSICAL_CORE_USAGE_DESCR" class="tooltipped">Physical Core Utilization</h3><span data-id="PHYSICAL_CORE_USAGE_PERC" data-tip-id="PHYSICAL_CORE_USAGE_ISSUE"></span><div class="indent"><h4 data-id="PH_CORE_USE_DESCR" class="tooltipped">Average Physical Core Utilization</h4><span data-id="PH_CORE_USE_VAL"></span> out of <span data-id="PH_CORE_OUT_OF_VAL"></span> physical cores</div></article><article data-id="MEMORY_BOUND"><h3 data-id="MEMORY_BOUND_TITLE" data-tip-id="MEMORY_BOUND_DESCR" class="tooltipped">Memory Stalls</h3><span data-id="MEMORY_BOUND_PERC" data-tip-id="MEMORY_BOUND_ISSUE"></span> of pipeline slots<div class="indent"><h4 data-id="CACHE_BOUND_TITLE" data-tip-id="CACHE_BOUND_DESCR" class="tooltipped">Cache Stalls</h4><span data-id="CACHE_BOUND_PERC" data-tip-id="CACHE_BOUND_ISSUE"></span><span data-id="CACHE_BOUND_EXTRA"> of cycles</span><h4 data-id="DRAM_BOUND_TITLE" data-tip-id="DRAM_BOUND_DESCR" class="tooltipped">DRAM Stalls</h4><span data-id="DRAM_BOUND_PERC" data-tip-id="DRAM_BOUND_ISSUE"></span> of cycles<h4 data-id="DRAM_BANDWIDTH_TITLE" data-tip-id="DRAM_BANDWIDTH_DESCR" class="tooltipped">DRAM Bandwidth</h4><span data-id="DRAM_BANDWIDTH_EXTRA">AVG </span><span data-id="DRAM_BANDWIDTH_VAL" data-tip-id="DRAM_BANDWIDTH_VAL_DESCR" class="tooltipped">Not Available</span><span data-id="DRAM_BANDWIDTH_UNIT"></span><h4 data-id="PERS_MEM_BOUND_TITLE" data-tip-id="PERS_MEM_BOUND_DESCR" class="tooltipped">Persistent Memory Stalls</h4><span data-id="PERS_MEM_BOUND_PERC" data-tip-id="PERS_MEM_BOUND_ISSUE"></span><h4 data-id="PERS_MEM_BANDWIDTH_TITLE" data-tip-id="PERS_MEM_BANDWIDTH_DESCR" class="tooltipped">Persistent Memory Bandwidth</h4><span data-id="PERS_MEM_BANDWIDTH_EXTRA">AVG </span><span data-id="PERS_MEM_BANDWIDTH_VAL" data-tip-id="PERS_MEM_BANDWIDTH_ISSUE"></span><span data-id="PERS_MEM_BANDWIDTH_UNIT"></span><h4 data-id="DRAM_HIT_RATIO_TITLE">DRAM Cache Hit Ratio</h4><span data-id="DRAM_HIT_RATIO_PERC"></span><div class="indent"><h4 data-id="DRAM_CACHE_HIT_TITLE">DRAM Cache Hits</h4><span data-id="DRAM_CACHE_HIT_VAL"></span><h4 data-id="DRAM_CACHE_MISS_TITLE">DRAM Cache Misses</h4><span data-id="DRAM_CACHE_MISS_VAL"></span></div><h4 data-id="MCDRAM_BANDWIDTH_TITLE" data-tip-id="MCDRAM_BANDWIDTH_DESCR" class="tooltipped">MCDRAM Bandwidth</h4><span data-id="MCDRAM_BANDWIDTH_EXTRA">AVG </span><span data-id="MCDRAM_BANDWIDTH_VAL" data-tip-id="MCDRAM_BANDWIDTH_VAL_DESCR" class="tooltipped">Not Available</span><span data-id="MCDRAM_BANDWIDTH_UNIT"></span><h4 data-id="NUMA_USE_TITLE" data-tip-id="NUMA_USE_DESCR" class="tooltipped">NUMA</h4><span data-id="NUMA_USE_PERC" data-tip-id="NUMA_USE_ISSUE"></span><span data-id="NUMA_USE_EXTRA"> of remote accesses</span></div></article><article data-id="BACK_END_BOUND"><h3 data-id="BACK_END_BOUND_TITLE" data-tip-id="BACK_END_BOUND_DESCR" class="tooltipped">Back-End Stalls</h3><span data-id="BACK_END_BOUND_PERC" data-tip-id="BACK_END_BOUND_ISSUE"></span> of pipeline slots<div class="indent"><h4 data-tip-id="L2_HIT_BOUND_DESCR" class="tooltipped">L2 Hit Bound</h4><span data-id="L2_HIT_BOUND_PERC" data-tip-id="L2_HIT_BOUND_ISSUE"></span> of cycles<h4 data-tip-id="L2_MISS_BOUND_DESCR" class="tooltipped">L2 Miss Bound</h4><span data-id="L2_MISS_BOUND_PERC" data-tip-id="L2_MISS_BOUND_ISSUE"></span> of cycles<h4 data-id="DRAM_BANDWIDTH_TITLE" data-tip-id="DRAM_BANDWIDTH_DESCR" class="tooltipped">DRAM Bandwidth</h4><span data-id="DRAM_BANDWIDTH_EXTRA">AVG </span><span data-id="DRAM_BANDWIDTH_VAL" data-tip-id="DRAM_BANDWIDTH_VAL_DESCR" class="tooltipped">Not Available</span><span data-id="DRAM_BANDWIDTH_UNIT"></span><h4 data-id="MCDRAM_BANDWIDTH_TITLE" data-tip-id="MCDRAM_BANDWIDTH_DESCR" class="tooltipped">MCDRAM Bandwidth</h4><span data-id="MCDRAM_BANDWIDTH_EXTRA">AVG </span><span data-id="MCDRAM_BANDWIDTH_VAL" data-tip-id="MCDRAM_BANDWIDTH_VAL_DESCR" class="tooltipped">Not Available</span><span data-id="MCDRAM_BANDWIDTH_UNIT"></span></div></article><article data-id="VECTORIZATION"><h3 data-id="VECTORIZATION_TITLE" data-tip-id="VECTORIZATION_DESCR" class="tooltipped">Vectorization</h3><span data-id="VECTORIZATION_PERC" data-tip-id="VECTORIZATION_ISSUE"></span><span data-id="VECTORIZATION_TXT">of Packed FP Operations</span><div class="indent"><h4 data-id="VECTORIZATION_DATA">Instruction Mix:</h4><h4 data-id="SP_FLOPS" data-tip-id="SP_FLOPS_DESCR" class="tooltipped">SP FLOPs</h4><span data-id="SP_FLOPS_DATA"><span data-id="SP_FLOPS_PERC" data-tip-id="SP_FLOPS_ISSUE"></span><span> of uOps</span></span><br><span data-id="SP_PACKED"><span data-tip-id="SP_PACKED_DESCR" class="tooltipped">Packed</span>: <span data-id="SP_PACKED_PERC"></span><span> from SP FP</span></span><div data-id="SP_FLOPS_BITS" class="indent"><span data-id="SP_128_BIT"><span data-tip-id="SP_128_BIT_DESCR" class="tooltipped">128-bit</span>: <span data-id="SP_128_BIT_PERC" data-tip-id="SP_128_BIT_ISSUE"></span></span><br><span data-id="SP_256_BIT"><span data-tip-id="SP_256_BIT_DESCR" class="tooltipped">256-bit</span>: <span data-id="SP_256_BIT_PERC" data-tip-id="SP_256_BIT_ISSUE"></span></span><br><span data-id="SP_512_BIT"><span data-tip-id="SP_512_BIT_DESCR" class="tooltipped">512-bit</span>: <span data-id="SP_512_BIT_PERC"></span></span></div><span data-id="SP_SCALAR"><span data-tip-id="SP_SCALAR_DESCR" class="tooltipped">Scalar</span>: <span data-id="SP_SCALAR_PERC" data-tip-id="SP_SCALAR_ISSUE"></span><span> from SP FP</span></span><h4 data-id="DP_FLOPS" data-tip-id="DP_FLOPS_DESCR" class="tooltipped">DP FLOPs</h4><span data-id="DP_FLOPS_DATA"><span data-id="DP_FLOPS_PERC" data-tip-id="DP_FLOPS_ISSUE"></span><span> of uOps</span></span><br><span data-id="DP_PACKED"><span data-tip-id="DP_PACKED_DESCR" class="tooltipped">Packed</span>: <span data-id="DP_PACKED_PERC"></span><span> from DP FP</span></span><div data-id="DP_FLOPS_BITS" class="indent"><span data-id="DP_128_BIT"><span data-tip-id="DP_128_BIT_DESCR" class="tooltipped">128-bit</span>: <span data-id="DP_128_BIT_PERC" data-tip-id="DP_128_BIT_ISSUE"></span></span><br><span data-id="DP_256_BIT"><span data-tip-id="DP_256_BIT_DESCR" class="tooltipped">256-bit</span>: <span data-id="DP_256_BIT_PERC" data-tip-id="DP_256_BIT_ISSUE"></span></span><br><span data-id="DP_512_BIT"><span data-tip-id="DP_512_BIT_DESCR" class="tooltipped">512-bit</span>: <span data-id="DP_512_BIT_PERC"></span></span></div><span data-id="DP_SCALAR"><span data-tip-id="DP_SCALAR_DESCR" class="tooltipped">Scalar</span>: <span data-id="DP_SCALAR_PERC" data-tip-id="DP_SCALAR_ISSUE"></span><span> from DP FP</span></span><h4 data-id="X87" data-tip-id="X87_DESCR" class="tooltipped">x87 FLOPs</h4><span data-id="X87_DATA"><span data-id="X87_PERC" data-tip-id="X87_ISSUE"></span><span> of uOps</span></span><h4 data-id="NON_FP" data-tip-id="NON_FP_DESCR" class="tooltipped">Non-FP</h4><span data-id="NON_FP_DATA"><span data-id="NON_FP_PERC" data-tip-id="NON_FP_ISSUE"></span><span> of uOps</span></span><h4 data-id="FP_ARITH_MEM_RD" data-tip-id="FP_ARITH_MEM_RD_DESCR" class="tooltipped">FP Arith/Mem Rd Instr. Ratio</h4><span data-id="FP_ARITH_MEM_RD_VAL" data-tip-id="FP_ARITH_MEM_RD_ISSUE"></span><h4 data-id="FP_ARITH_MEM_WR" data-tip-id="FP_ARITH_MEM_WR_DESCR" class="tooltipped">FP Arith/Mem Wr Instr. Ratio</h4><span data-id="FP_ARITH_MEM_WR_VAL" data-tip-id="FP_ARITH_MEM_WR_ISSUE"></span></div></article><article data-id="SIMD_PER_CYCLE"><h3 data-id="SIMD_PER_CYCLE_TITLE" data-tip-id="SIMD_PER_CYCLE_DESCR" class="tooltipped">SIMD Instr. per Cycle</h3><span data-id="SIMD_PER_CYCLE_VAL" data-tip-id="SIMD_PER_CYCLE_ISSUE"></span><div class="indent"><h4>FP Instruction Mix</h4><div class="indent">% of <span data-tip-id="PACKED_SIMD_DESCR" class="tooltipped">Packed SIMD Instr.</span>: <span data-id="PACKED_SIMD_PERC"></span><br>% of <span data-tip-id="SCALAR_SIMD_DESCR" class="tooltipped">Scalar SIMD Instr.</span>: <span data-id="SCALAR_SIMD_PERC" data-tip-id="SCALAR_SIMD_ISSUE"></span></div></div></article><article data-id="IO"><h3 data-id="IO_TITLE" data-tip-id="IOWAIT_USEC_DESCR" class="tooltipped">I/O Bound</h3><div data-id="IO_TEXT_BLOCK">These metrics are not available for Pcontrol.</div><div data-id="IO_DATA_BLOCK"><span data-id="IOWAIT_USEC_PERC"></span><br>(AVG <span data-id="IOWAIT_USEC_AVG_VAL"></span>, <a class="tooltipped" data-tip-id="IOWAIT_USEC_MAX_RANK">PEAK</a> <span data-id="IOWAIT_USEC_MAX_VAL"></span>)<div class="indent"><h4 data-tip-id="READ_BYTES_DESCR" class="tooltipped">Read</h4>AVG <span data-id="READ_BYTES_AVG_VAL"></span>, <a class="tooltipped" data-tip-id="READ_BYTES_MAX_RANK">MAX</a> <span data-id="READ_BYTES_MAX_VAL"></span><h4 data-tip-id="WRITTEN_BYTES_DESCR" class="tooltipped">Write</h4>AVG <span data-id="WRITTEN_BYTES_AVG_VAL"></span>, <a class="tooltipped" data-tip-id="WRITTEN_BYTES_MAX_RANK">MAX</a> <span data-id="WRITTEN_BYTES_MAX_VAL"></span></div></div></article><article data-id="MEMORY"><h3 data-tip-id="MEM_DESCR" class="tooltipped">Memory Footprint</h3><div data-id="MEMORY_TEXT_BLOCK">These metrics are not available for Pcontrol.</div><div data-id="MEMORY_DATA_BLOCK"><div data-id="RSS_APP">Resident total: <span data-id="RSS_VAL"></span></div><table><tr><th>Resident</th><th>PEAK</th><th>AVG</th></tr><tr><td>Per node:</td><td><span data-id="PEAK_RSS_PER_NODE_VAL" class="tooltipped" data-tip-id="PEAK_RSS_NODE"></span></td><td><span data-id="MEAN_RSS_PER_NODE_VAL"></span></td></tr><tr><td>Per rank:</td><td class="cell"><span data-id="PEAK_RSS_VAL" class="tooltipped" data-tip-id="PEAK_RSS_RANK"></span></td><td class="cell"><span data-id="MEAN_RSS_VAL"></span></td></tr></table><div data-id="MEMORY_APP">Virtual total: <span data-id="MEM_VAL"></span></div><table><tr><th>Virtual</th><th>PEAK</th><th>AVG</th></tr><tr><td>Per node:</td><td><span data-id="PEAK_MEM_PER_NODE_VAL" class="tooltipped" data-tip-id="PEAK_MEM_NODE"></span></td><td><span data-id="MEAN_MEM_PER_NODE_VAL"></span></td></tr><tr><td>Per rank:</td><td class="cell"><span data-id="PEAK_MEM_VAL" class="tooltipped" data-tip-id="PEAK_MEM_RANK"></span></td><td class="cell"><span data-id="MEAN_MEM_VAL"></span></td></tr></table></div></article></div></div></div><div class="tip"><div data-id="current_run">Metric <b>value</b> collected during the application profiling run.</div><div data-id="target">Metric threshold used to indicate possible performance issues. Threshold values are fixed and may not accurately reflect the nature of your application.</div><div data-id="delta">Visual representation of the current run value compared to the target threshold. The Delta is set to zero if the current run value is within the target threshold.</div><div data-id="WALLCLOCK_DESCR"></div><div data-id="SPGFLOPS_DESCR"></div><div data-id="DPGFLOPS_DESCR"></div><div data-id="X87GFLOPS_DESCR"></div><div data-id="AVG_FREQUENCY_DESCR"></div><div data-id="CPI_RATE_MIN_NODE"></div><div data-id="CPI_RATE_MAX_NODE"></div><div data-id="CPI_RATE_DESCR"></div><div data-id="CPI_RATE_ISSUE"></div><div data-id="MEM_DESCR"></div><div data-id="RSS_DESCR"></div><div data-id="MEMORY_BOUND_MIN_NODE"></div><div data-id="MEMORY_BOUND_MAX_NODE"></div><div data-id="READ_BYTES_MAX_RANK"></div><div data-id="WRITTEN_BYTES_MAX_RANK"></div><div data-id="IOWAIT_USEC_MAX_RANK"></div><div data-id="IOWAIT_USEC_DESCR"></div><div data-id="PEAK_MEM_RANK"></div><div data-id="PEAK_MEM_NODE"></div><div data-id="PEAK_RSS_RANK"></div><div data-id="PEAK_RSS_NODE"></div><div data-id="READ_BYTES_DESCR"></div><div data-id="WRITTEN_BYTES_DESCR"></div><div data-id="MPI_TIME_DESCR"></div><div data-id="MPI_TIME_ISSUE"></div><div data-id="MPI_IMBALANCE_DESCR"></div><div data-id="MPI_IMBALANCE_ISSUE"></div><div data-id="OMP_IMBALANCE_TIME_ISSUE"></div><div data-id="OMP_IMBALANCE_TIME_DESCR"></div><div data-id="OMP_SERIAL_TIME_ISSUE"></div><div data-id="OMP_SERIAL_TIME_DESCR"></div><div data-id="MEMORY_BOUND_DESCR"></div><div data-id="MEMORY_BOUND_ISSUE"></div><div data-id="VECTORIZATION_DESCR"></div><div data-id="VECTORIZATION_ISSUE"></div><div data-id="FLOPS_PER_CYCLE_DESCR"></div><div data-id="FLOPS_PER_CYCLE_ISSUE"></div><div data-id="X87_DESCR"></div><div data-id="X87_ISSUE"></div><div data-id="NON_FP_DESCR"></div><div data-id="NON_FP_ISSUE"></div><div data-id="DP_FLOPS_DESCR"></div><div data-id="DP_PACKED_DESCR"></div><div data-id="DP_128_BIT_DESCR"></div><div data-id="DP_128_BIT_ISSUE"></div><div data-id="DP_256_BIT_DESCR"></div><div data-id="DP_256_BIT_ISSUE"></div><div data-id="DP_512_BIT_DESCR"></div><div data-id="DP_SCALAR_DESCR"></div><div data-id="DP_SCALAR_ISSUE"></div><div data-id="SP_FLOPS_DESCR"></div><div data-id="SP_PACKED_DESCR"></div><div data-id="SP_128_BIT_DESCR"></div><div data-id="SP_128_BIT_ISSUE"></div><div data-id="SP_256_BIT_DESCR"></div><div data-id="SP_256_BIT_ISSUE"></div><div data-id="SP_512_BIT_DESCR"></div><div data-id="SP_SCALAR_DESCR"></div><div data-id="SP_SCALAR_ISSUE"></div><div data-id="FP_ARITH_MEM_RD_DESCR"></div><div data-id="FP_ARITH_MEM_RD_ISSUE"></div><div data-id="FP_ARITH_MEM_WR_DESCR"></div><div data-id="FP_ARITH_MEM_WR_ISSUE"></div><div data-id="CACHE_BOUND_DESCR"></div><div data-id="CACHE_BOUND_ISSUE"></div><div data-id="DRAM_BOUND_DESCR"></div><div data-id="DRAM_BOUND_ISSUE"></div><div data-id="PERS_MEM_BOUND_DESCR"></div><div data-id="PERS_MEM_BOUND_ISSUE"></div><div data-id="NUMA_USE_DESCR"></div><div data-id="NUMA_USE_ISSUE"></div><div data-id="CPU_USAGE_DESCR"></div><div data-id="CPU_USAGE_ISSUE"></div><div data-id="PHYSICAL_CORE_USAGE_DESCR"></div><div data-id="PHYSICAL_CORE_USAGE_ISSUE"></div><div data-id="AVERAGE_CPU_USE_DESCR"></div><div data-id="BACK_END_BOUND_DESCR"></div><div data-id="BACK_END_BOUND_ISSUE"></div><div data-id="L2_HIT_BOUND_DESCR"></div><div data-id="L2_MISS_BOUND_DESCR"></div><div data-id="L2_HIT_BOUND_ISSUE"></div><div data-id="L2_MISS_BOUND_ISSUE"></div><div data-id="SIMD_PER_CYCLE_DESCR"></div><div data-id="SIMD_PER_CYCLE_ISSUE"></div><div data-id="PACKED_SIMD_DESCR"></div><div data-id="SCALAR_SIMD_DESCR"></div><div data-id="SCALAR_SIMD_ISSUE"></div><div data-id="FLOPS_PER_CYCLE_ISSUE"></div><div data-id="DRAM_BANDWIDTH_DESCR">Average amount of data transferred through DRAM memory controller per second.</div><div data-id="MCDRAM_BANDWIDTH_DESCR">Average amount of data transferred through MCDRAM memory controller per second.</div><div data-id="DRAM_BANDWIDTH_VAL_DESCR">Data for this metric is not collected since it requires system-wide performance monitoring. Make sure the sampling driver is properly installed on your system: <a href="https://software.intel.com/en-us/vtune-amplifier-help-sep-driver">https://software.intel.com/en-us/vtune-amplifier-help-sep-driver</a>. Otherwise, enable a driverless Perf-based sampling collection by setting the /proc/sys/kernel/perf_even_paranoid value to 0 or less.</div><div data-id="MCDRAM_BANDWIDTH_VAL_DESCR">Data for this metric is not collected since it requires system-wide performance monitoring. Make sure the sampling driver is properly installed on your system: <a href="https://software.intel.com/en-us/vtune-amplifier-help-sep-driver">https://software.intel.com/en-us/vtune-amplifier-help-sep-driver</a>. Otherwise, enable a driverless Perf-based sampling collection by setting the /proc/sys/kernel/perf_even_paranoid value to 0 or less.</div><div data-id="PERS_MEM_BANDWIDTH_DESCR"></div><div data-id="MCDRAM_BANDWIDTH_ISSUE"></div><div data-id="DRAM_BANDWIDTH_ISSUE"></div><div data-id="PERS_MEM_BANDWIDTH_ISSUE"></div><div data-id="BANDWIDTH_AVG_OUT_DESCR"></div><div data-id="BANDWIDTH_AVG_IN_DESCR"></div><div data-id="BANDWIDTH_AVG_OUT_ISSUE"></div><div data-id="BANDWIDTH_AVG_IN_ISSUE"></div><div data-id="PACKRATE_AVG_OUT_DESCR"></div><div data-id="PACKRATE_AVG_IN_DESCR"></div><div data-id="PACKRATE_AVG_OUT_ISSUE"></div><div data-id="PACKRATE_AVG_IN_ISSUE"></div><div data-id="MPI_PERC_DESCR">Percentage from Elapsed Time</div></div><div class="not-supported-browser">Intel<sup>®</sup> MPI Performance Snapshot report cannot be opened with the current browser. Use any of these supported browsers:<ul><li>Mozilla Firefox* version 17 or later</li><li>Safari* version 8 or later</li><li>Microsoft Internet Explorer* version 11 or later</li><li>Microsoft Edge* version 12 or later</li><li>Google Chrome* version 40 or later</li></ul></div></body></html> \ No newline at end of file diff --git a/report/day1/benchmark-slow/swift_mpi_1p_1n_2021-01-21_15-56.html b/report/day1/benchmark-slow/swift_mpi_1p_1n_2021-01-21_15-56.html new file mode 100644 index 0000000000000000000000000000000000000000..2ecaff11fd595d505e6fe1d671bb3564ddccef88 --- /dev/null +++ b/report/day1/benchmark-slow/swift_mpi_1p_1n_2021-01-21_15-56.html @@ -0,0 +1,6035 @@ +<!DOCTYPE HTML> +<html> +<head> + +<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> + +<title>Performance Report</title> +<style type="text/css" >*, *:before, *:after { + -moz-box-sizing: border-box; + box-sizing: border-box; +} +abbr { + text-decoration: none !important; +} +body { + font-family: "Lucida Grande", "Lucida Sans Unicode", "Bitstream Vera Sans",sans-serif; + font-size: 1em; + color: #2c1a0a; + margin-bottom: 0; +} +div#content { + width: 960px; + margin-left: auto; + margin-right: auto; +} +.header { + padding-top: 16px; +} +.header_left { + float:left; + width: 582px; +} +a img { + outline: none; + border: none; +} +.logo { + float: left; +} +#time_radar { + float: right; +} + +.clear { + clear: both; +} +table { + border-spacing: 0; +} +td { + padding-left: 0; + padding-right: 16px; + padding-top: 1px; + padding-bottom: 1px; +} +#error { + border: 1px solid; + margin: 16px 0px; + padding: 16px 16px 16px 16px; + color: #C80000; + background-color: #FFC0C0; + overflow: hidden; +} +#error p { + margin: 8px; +} +.application_details { + margin-top: 8px; + margin-left: 16px; + margin-right: 16px; +} +.application_details .details_key { width: 116px; color: #bdc4d5;} +.application_details table { + table-layout: fixed; + width: 100%; + color: #37537b; +} +.application_details #CommandLine { + word-wrap: break-word; +} +.application_details #ExePath { + word-wrap: break-word; +} +.summary { +} +hr { + margin-top: 32px; + margin-bottom: 32px; + visibility: hidden; +} +.summary .heading { + font-family: inherit; + font-size: 1.8em; + padding-bottom: 8px; +} +.summary_class { + font-weight: bold; +} +.overview_general_advice p { + margin-top: 8px; + margin-bottom: 8px; +} + +.subsections .explanation { + font-size: 0.9em; + color: #404040; + margin-top: 8px; + margin-bottom: 8px; +} + +.table_spacer { height: 8px; } + +h2 { font-size: 1.5em; margin: 0; font-weight: normal; } +.subsections h2 { padding-bottom: 8px; } + +.bar { padding-left: 0; padding-right: 0; } +.bar > div { height: 100%; min-width: 1px; } +.summary_table .bar { width: 200px; height: 2em; } +.subsection .bar { width: 50px; height: 1em; } + +.bar_graph { width: 216px; } +.summary_table { padding-top: 16px; padding-bottom: 8px; } +.summary_table td p { margin: 0px; margin-bottom: 4px; } +.summary_table td { padding-bottom: 8px; } +.summary_table .details { font-size: 0.9em; } +.right_cell { text-align: right; white-space: nowrap; } + +.metric_chart_table { padding-top: 8px; } +.metric_chart_table td { font-size: 0.9em; padding-bottom: 8px; } + +.subsections .error { + font-size: 0.9em; + color: #404040; + margin-top: 8px; + margin-bottom: 8px; +} + +#subsections { + margin-left: -14px; + margin-right: -14px; +} + +.subsections > .subsection { + float: left; + width: 494px; + padding-left: 14px; + padding-right: 14px; + margin-bottom: 32px; +} + +.bar { + position: relative; + overflow: hidden; +} + +.bar > .barBox { + position: absolute; + height: 1em; + z-index: 100; + margin-left: -1px; + width: 2px; + background-color: #000000; +} + +a.toggle { + color: inherit; + text-decoration: inherit; +} + +a.toggle:hover { + text-decoration: underline; +} + +.tip { + transition:all 0.3s ease; +} + +.metricDetail { + padding-top: 0; + padding-bottom: 0 !important; +} + +.metricDetail > div { + max-height: 0; + overflow: hidden; + transition: max-height 1s, margin 1s; + border-radius: 4px; +} + +.metricDetail.show > div { + margin-bottom: 8px; + max-height: 100px; +} + +.inlinedDescription { + margin-left: 1em; +} + +table.tip { + margin-left: auto; + margin-right: auto; +} + +table.tip td, table.tip th { + padding: 4px !important; + margin: 0; + font-size: 80%; +} +</style> +<script type="text/javascript">if(!window.LTE_IE_8) { +/* + The following JavaScript is from d3.min.js and is subject to the + following licence. + + Copyright (c) 2010-2015, Michael Bostock + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * The name Michael Bostock may not be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL MICHAEL BOSTOCK BE LIABLE FOR ANY DIRECT, + INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY + OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + --------------------------------------------------------------------- +*/ +d3=function(){function n(n){return null!=n&&!isNaN(n)}function t(n){return n.length}function e(n){for(var t=1;n*t%1;)t*=10;return t}function r(n,t){try{for(var e in t)Object.defineProperty(n.prototype,e,{value:t[e],enumerable:!1})}catch(r){n.prototype=t}}function u(){}function i(){}function o(n,t,e){return function(){var r=e.apply(t,arguments);return r===t?n:r}}function a(n,t){if(t in n)return t;t=t.charAt(0).toUpperCase()+t.substring(1);for(var e=0,r=la.length;r>e;++e){var u=la[e]+t;if(u in n)return u}}function c(){}function s(){}function l(n){function t(){for(var t,r=e,u=-1,i=r.length;++u<i;)(t=r[u].on)&&t.apply(this,arguments);return n}var e=[],r=new u;return t.on=function(t,u){var i,o=r.get(t);return arguments.length<2?o&&o.on:(o&&(o.on=null,e=e.slice(0,i=e.indexOf(o)).concat(e.slice(i+1)),r.remove(t)),u&&e.push(r.set(t,{on:u})),n)},t}function f(){$o.event.preventDefault()}function h(){for(var n,t=$o.event;n=t.sourceEvent;)t=n;return t}function g(n){for(var t=new s,e=0,r=arguments.length;++e<r;)t[arguments[e]]=l(t);return t.of=function(e,r){return function(u){try{var i=u.sourceEvent=$o.event;u.target=n,$o.event=u,t[u.type].apply(e,r)}finally{$o.event=i}}},t}function p(n){return ha(n,ma),n}function v(n){return"function"==typeof n?n:function(){return ga(n,this)}}function d(n){return"function"==typeof n?n:function(){return pa(n,this)}}function m(n,t){function e(){this.removeAttribute(n)}function r(){this.removeAttributeNS(n.space,n.local)}function u(){this.setAttribute(n,t)}function i(){this.setAttributeNS(n.space,n.local,t)}function o(){var e=t.apply(this,arguments);null==e?this.removeAttribute(n):this.setAttribute(n,e)}function a(){var e=t.apply(this,arguments);null==e?this.removeAttributeNS(n.space,n.local):this.setAttributeNS(n.space,n.local,e)}return n=$o.ns.qualify(n),null==t?n.local?r:e:"function"==typeof t?n.local?a:o:n.local?i:u}function y(n){return n.trim().replace(/\s+/g," ")}function x(n){return new RegExp("(?:^|\\s+)"+$o.requote(n)+"(?:\\s+|$)","g")}function M(n,t){function e(){for(var e=-1;++e<u;)n[e](this,t)}function r(){for(var e=-1,r=t.apply(this,arguments);++e<u;)n[e](this,r)}n=n.trim().split(/\s+/).map(_);var u=n.length;return"function"==typeof t?r:e}function _(n){var t=x(n);return function(e,r){if(u=e.classList)return r?u.add(n):u.remove(n);var u=e.getAttribute("class")||"";r?(t.lastIndex=0,t.test(u)||e.setAttribute("class",y(u+" "+n))):e.setAttribute("class",y(u.replace(t," ")))}}function b(n,t,e){function r(){this.style.removeProperty(n)}function u(){this.style.setProperty(n,t,e)}function i(){var r=t.apply(this,arguments);null==r?this.style.removeProperty(n):this.style.setProperty(n,r,e)}return null==t?r:"function"==typeof t?i:u}function w(n,t){function e(){delete this[n]}function r(){this[n]=t}function u(){var e=t.apply(this,arguments);null==e?delete this[n]:this[n]=e}return null==t?e:"function"==typeof t?u:r}function S(n){return"function"==typeof n?n:(n=$o.ns.qualify(n)).local?function(){return this.ownerDocument.createElementNS(n.space,n.local)}:function(){return this.ownerDocument.createElementNS(this.namespaceURI,n)}}function k(n){return{__data__:n}}function E(n){return function(){return da(this,n)}}function A(n){return arguments.length||(n=$o.ascending),function(t,e){return t&&e?n(t.__data__,e.__data__):!t-!e}}function C(n,t){for(var e=0,r=n.length;r>e;e++)for(var u,i=n[e],o=0,a=i.length;a>o;o++)(u=i[o])&&t(u,o,e);return n}function N(n){return ha(n,xa),n}function L(n){var t,e;return function(r,u,i){var o,a=n[i].update,c=a.length;for(i!=e&&(e=i,t=0),u>=t&&(t=u+1);!(o=a[t])&&++t<c;);return o}}function T(){var n=this.__transition__;n&&++n.active}function q(n,t,e){function r(){var t=this[o];t&&(this.removeEventListener(n,t,t.$),delete this[o])}function u(){var u=s(t,Wo(arguments));r.call(this),this.addEventListener(n,this[o]=u,u.$=e),u._=t}function i(){var t,e=new RegExp("^__on([^.]+)"+$o.requote(n)+"$");for(var r in this)if(t=r.match(e)){var u=this[r];this.removeEventListener(t[1],u,u.$),delete this[r]}}var o="__on"+n,a=n.indexOf("."),s=z;a>0&&(n=n.substring(0,a));var l=_a.get(n);return l&&(n=l,s=R),a?t?u:r:t?c:i}function z(n,t){return function(e){var r=$o.event;$o.event=e,t[0]=this.__data__;try{n.apply(this,t)}finally{$o.event=r}}}function R(n,t){var e=z(n,t);return function(n){var t=this,r=n.relatedTarget;r&&(r===t||8&r.compareDocumentPosition(t))||e.call(t,n)}}function D(){var n=".dragsuppress-"+ ++wa,t="click"+n,e=$o.select(Ko).on("touchmove"+n,f).on("dragstart"+n,f).on("selectstart"+n,f);if(ba){var r=Go.style,u=r[ba];r[ba]="none"}return function(i){function o(){e.on(t,null)}e.on(n,null),ba&&(r[ba]=u),i&&(e.on(t,function(){f(),o()},!0),setTimeout(o,0))}}function P(n,t){t.changedTouches&&(t=t.changedTouches[0]);var e=n.ownerSVGElement||n;if(e.createSVGPoint){var r=e.createSVGPoint();if(0>Sa&&(Ko.scrollX||Ko.scrollY)){e=$o.select("body").append("svg").style({position:"absolute",top:0,left:0,margin:0,padding:0,border:"none"},"important");var u=e[0][0].getScreenCTM();Sa=!(u.f||u.e),e.remove()}return Sa?(r.x=t.pageX,r.y=t.pageY):(r.x=t.clientX,r.y=t.clientY),r=r.matrixTransform(n.getScreenCTM().inverse()),[r.x,r.y]}var i=n.getBoundingClientRect();return[t.clientX-i.left-n.clientLeft,t.clientY-i.top-n.clientTop]}function U(n){return n>0?1:0>n?-1:0}function j(n){return n>1?0:-1>n?ka:Math.acos(n)}function H(n){return n>1?Aa:-1>n?-Aa:Math.asin(n)}function F(n){return((n=Math.exp(n))-1/n)/2}function O(n){return((n=Math.exp(n))+1/n)/2}function Y(n){return((n=Math.exp(2*n))-1)/(n+1)}function I(n){return(n=Math.sin(n/2))*n}function Z(){}function V(n,t,e){return new X(n,t,e)}function X(n,t,e){this.h=n,this.s=t,this.l=e}function $(n,t,e){function r(n){return n>360?n-=360:0>n&&(n+=360),60>n?i+(o-i)*n/60:180>n?o:240>n?i+(o-i)*(240-n)/60:i}function u(n){return Math.round(255*r(n))}var i,o;return n=isNaN(n)?0:(n%=360)<0?n+360:n,t=isNaN(t)?0:0>t?0:t>1?1:t,e=0>e?0:e>1?1:e,o=.5>=e?e*(1+t):e+t-e*t,i=2*e-o,ot(u(n+120),u(n),u(n-120))}function B(n,t,e){return new W(n,t,e)}function W(n,t,e){this.h=n,this.c=t,this.l=e}function J(n,t,e){return isNaN(n)&&(n=0),isNaN(t)&&(t=0),G(e,Math.cos(n*=La)*t,Math.sin(n)*t)}function G(n,t,e){return new K(n,t,e)}function K(n,t,e){this.l=n,this.a=t,this.b=e}function Q(n,t,e){var r=(n+16)/116,u=r+t/500,i=r-e/200;return u=tt(u)*Oa,r=tt(r)*Ya,i=tt(i)*Ia,ot(rt(3.2404542*u-1.5371385*r-.4985314*i),rt(-.969266*u+1.8760108*r+.041556*i),rt(.0556434*u-.2040259*r+1.0572252*i))}function nt(n,t,e){return n>0?B(Math.atan2(e,t)*Ta,Math.sqrt(t*t+e*e),n):B(0/0,0/0,n)}function tt(n){return n>.206893034?n*n*n:(n-4/29)/7.787037}function et(n){return n>.008856?Math.pow(n,1/3):7.787037*n+4/29}function rt(n){return Math.round(255*(.00304>=n?12.92*n:1.055*Math.pow(n,1/2.4)-.055))}function ut(n){return ot(n>>16,255&n>>8,255&n)}function it(n){return ut(n)+""}function ot(n,t,e){return new at(n,t,e)}function at(n,t,e){this.r=n,this.g=t,this.b=e}function ct(n){return 16>n?"0"+Math.max(0,n).toString(16):Math.min(255,n).toString(16)}function st(n,t,e){var r,u,i,o=0,a=0,c=0;if(r=/([a-z]+)\((.*)\)/i.exec(n))switch(u=r[2].split(","),r[1]){case"hsl":return e(parseFloat(u[0]),parseFloat(u[1])/100,parseFloat(u[2])/100);case"rgb":return t(gt(u[0]),gt(u[1]),gt(u[2]))}return(i=Xa.get(n))?t(i.r,i.g,i.b):(null!=n&&"#"===n.charAt(0)&&(4===n.length?(o=n.charAt(1),o+=o,a=n.charAt(2),a+=a,c=n.charAt(3),c+=c):7===n.length&&(o=n.substring(1,3),a=n.substring(3,5),c=n.substring(5,7)),o=parseInt(o,16),a=parseInt(a,16),c=parseInt(c,16)),t(o,a,c))}function lt(n,t,e){var r,u,i=Math.min(n/=255,t/=255,e/=255),o=Math.max(n,t,e),a=o-i,c=(o+i)/2;return a?(u=.5>c?a/(o+i):a/(2-o-i),r=n==o?(t-e)/a+(e>t?6:0):t==o?(e-n)/a+2:(n-t)/a+4,r*=60):(r=0/0,u=c>0&&1>c?0:r),V(r,u,c)}function ft(n,t,e){n=ht(n),t=ht(t),e=ht(e);var r=et((.4124564*n+.3575761*t+.1804375*e)/Oa),u=et((.2126729*n+.7151522*t+.072175*e)/Ya),i=et((.0193339*n+.119192*t+.9503041*e)/Ia);return G(116*u-16,500*(r-u),200*(u-i))}function ht(n){return(n/=255)<=.04045?n/12.92:Math.pow((n+.055)/1.055,2.4)}function gt(n){var t=parseFloat(n);return"%"===n.charAt(n.length-1)?Math.round(2.55*t):t}function pt(n){return"function"==typeof n?n:function(){return n}}function vt(n){return n}function dt(n){return function(t,e,r){return 2===arguments.length&&"function"==typeof e&&(r=e,e=null),mt(t,e,n,r)}}function mt(n,t,e,r){function u(){var n,t=c.status;if(!t&&c.responseText||t>=200&&300>t||304===t){try{n=e.call(i,c)}catch(r){return o.error.call(i,r),void 0}o.load.call(i,n)}else o.error.call(i,c)}var i={},o=$o.dispatch("beforesend","progress","load","error"),a={},c=new XMLHttpRequest,s=null;return!Ko.XDomainRequest||"withCredentials"in c||!/^(http(s)?:)?\/\//.test(n)||(c=new XDomainRequest),"onload"in c?c.onload=c.onerror=u:c.onreadystatechange=function(){c.readyState>3&&u()},c.onprogress=function(n){var t=$o.event;$o.event=n;try{o.progress.call(i,c)}finally{$o.event=t}},i.header=function(n,t){return n=(n+"").toLowerCase(),arguments.length<2?a[n]:(null==t?delete a[n]:a[n]=t+"",i)},i.mimeType=function(n){return arguments.length?(t=null==n?null:n+"",i):t},i.responseType=function(n){return arguments.length?(s=n,i):s},i.response=function(n){return e=n,i},["get","post"].forEach(function(n){i[n]=function(){return i.send.apply(i,[n].concat(Wo(arguments)))}}),i.send=function(e,r,u){if(2===arguments.length&&"function"==typeof r&&(u=r,r=null),c.open(e,n,!0),null==t||"accept"in a||(a.accept=t+",*/*"),c.setRequestHeader)for(var l in a)c.setRequestHeader(l,a[l]);return null!=t&&c.overrideMimeType&&c.overrideMimeType(t),null!=s&&(c.responseType=s),null!=u&&i.on("error",u).on("load",function(n){u(null,n)}),o.beforesend.call(i,c),c.send(null==r?null:r),i},i.abort=function(){return c.abort(),i},$o.rebind(i,o,"on"),null==r?i:i.get(yt(r))}function yt(n){return 1===n.length?function(t,e){n(null==t?e:null)}:n}function xt(){var n=Mt(),t=_t()-n;t>24?(isFinite(t)&&(clearTimeout(Ja),Ja=setTimeout(xt,t)),Wa=0):(Wa=1,Ka(xt))}function Mt(){var n=Date.now();for(Ga=$a;Ga;)n>=Ga.t&&(Ga.f=Ga.c(n-Ga.t)),Ga=Ga.n;return n}function _t(){for(var n,t=$a,e=1/0;t;)t.f?t=n?n.n=t.n:$a=t.n:(t.t<e&&(e=t.t),t=(n=t).n);return Ba=n,e}function bt(n,t){var e=Math.pow(10,3*aa(8-t));return{scale:t>8?function(n){return n/e}:function(n){return n*e},symbol:n}}function wt(n,t){return t-(n?Math.ceil(Math.log(n)/Math.LN10):1)}function St(n){return n+""}function kt(){}function Et(n,t,e){var r=e.s=n+t,u=r-n,i=r-u;e.t=n-i+(t-u)}function At(n,t){n&&lc.hasOwnProperty(n.type)&&lc[n.type](n,t)}function Ct(n,t,e){var r,u=-1,i=n.length-e;for(t.lineStart();++u<i;)r=n[u],t.point(r[0],r[1],r[2]);t.lineEnd()}function Nt(n,t){var e=-1,r=n.length;for(t.polygonStart();++e<r;)Ct(n[e],t,1);t.polygonEnd()}function Lt(){function n(n,t){n*=La,t=t*La/2+ka/4;var e=n-r,o=Math.cos(t),a=Math.sin(t),c=i*a,s=u*o+c*Math.cos(e),l=c*Math.sin(e);hc.add(Math.atan2(l,s)),r=n,u=o,i=a}var t,e,r,u,i;gc.point=function(o,a){gc.point=n,r=(t=o)*La,u=Math.cos(a=(e=a)*La/2+ka/4),i=Math.sin(a)},gc.lineEnd=function(){n(t,e)}}function Tt(n){var t=n[0],e=n[1],r=Math.cos(e);return[r*Math.cos(t),r*Math.sin(t),Math.sin(e)]}function qt(n,t){return n[0]*t[0]+n[1]*t[1]+n[2]*t[2]}function zt(n,t){return[n[1]*t[2]-n[2]*t[1],n[2]*t[0]-n[0]*t[2],n[0]*t[1]-n[1]*t[0]]}function Rt(n,t){n[0]+=t[0],n[1]+=t[1],n[2]+=t[2]}function Dt(n,t){return[n[0]*t,n[1]*t,n[2]*t]}function Pt(n){var t=Math.sqrt(n[0]*n[0]+n[1]*n[1]+n[2]*n[2]);n[0]/=t,n[1]/=t,n[2]/=t}function Ut(n){return[Math.atan2(n[1],n[0]),H(n[2])]}function jt(n,t){return aa(n[0]-t[0])<Ca&&aa(n[1]-t[1])<Ca}function Ht(n,t){n*=La;var e=Math.cos(t*=La);Ft(e*Math.cos(n),e*Math.sin(n),Math.sin(t))}function Ft(n,t,e){++pc,dc+=(n-dc)/pc,mc+=(t-mc)/pc,yc+=(e-yc)/pc}function Ot(){function n(n,u){n*=La;var i=Math.cos(u*=La),o=i*Math.cos(n),a=i*Math.sin(n),c=Math.sin(u),s=Math.atan2(Math.sqrt((s=e*c-r*a)*s+(s=r*o-t*c)*s+(s=t*a-e*o)*s),t*o+e*a+r*c);vc+=s,xc+=s*(t+(t=o)),Mc+=s*(e+(e=a)),_c+=s*(r+(r=c)),Ft(t,e,r)}var t,e,r;kc.point=function(u,i){u*=La;var o=Math.cos(i*=La);t=o*Math.cos(u),e=o*Math.sin(u),r=Math.sin(i),kc.point=n,Ft(t,e,r)}}function Yt(){kc.point=Ht}function It(){function n(n,t){n*=La;var e=Math.cos(t*=La),o=e*Math.cos(n),a=e*Math.sin(n),c=Math.sin(t),s=u*c-i*a,l=i*o-r*c,f=r*a-u*o,h=Math.sqrt(s*s+l*l+f*f),g=r*o+u*a+i*c,p=h&&-j(g)/h,v=Math.atan2(h,g);bc+=p*s,wc+=p*l,Sc+=p*f,vc+=v,xc+=v*(r+(r=o)),Mc+=v*(u+(u=a)),_c+=v*(i+(i=c)),Ft(r,u,i)}var t,e,r,u,i;kc.point=function(o,a){t=o,e=a,kc.point=n,o*=La;var c=Math.cos(a*=La);r=c*Math.cos(o),u=c*Math.sin(o),i=Math.sin(a),Ft(r,u,i)},kc.lineEnd=function(){n(t,e),kc.lineEnd=Yt,kc.point=Ht}}function Zt(){return!0}function Vt(n,t,e,r,u){var i=[],o=[];if(n.forEach(function(n){if(!((t=n.length-1)<=0)){var t,e=n[0],r=n[t];if(jt(e,r)){u.lineStart();for(var a=0;t>a;++a)u.point((e=n[a])[0],e[1]);return u.lineEnd(),void 0}var c=new $t(e,n,null,!0),s=new $t(e,null,c,!1);c.o=s,i.push(c),o.push(s),c=new $t(r,n,null,!1),s=new $t(r,null,c,!0),c.o=s,i.push(c),o.push(s)}}),o.sort(t),Xt(i),Xt(o),i.length){for(var a=0,c=e,s=o.length;s>a;++a)o[a].e=c=!c;for(var l,f,h=i[0];;){for(var g=h,p=!0;g.v;)if((g=g.n)===h)return;l=g.z,u.lineStart();do{if(g.v=g.o.v=!0,g.e){if(p)for(var a=0,s=l.length;s>a;++a)u.point((f=l[a])[0],f[1]);else r(g.x,g.n.x,1,u);g=g.n}else{if(p){l=g.p.z;for(var a=l.length-1;a>=0;--a)u.point((f=l[a])[0],f[1])}else r(g.x,g.p.x,-1,u);g=g.p}g=g.o,l=g.z,p=!p}while(!g.v);u.lineEnd()}}}function Xt(n){if(t=n.length){for(var t,e,r=0,u=n[0];++r<t;)u.n=e=n[r],e.p=u,u=e;u.n=e=n[0],e.p=u}}function $t(n,t,e,r){this.x=n,this.z=t,this.o=e,this.e=r,this.v=!1,this.n=this.p=null}function Bt(n,t,e,r){return function(u,i){function o(t,e){var r=u(t,e);n(t=r[0],e=r[1])&&i.point(t,e)}function a(n,t){var e=u(n,t);d.point(e[0],e[1])}function c(){y.point=a,d.lineStart()}function s(){y.point=o,d.lineEnd()}function l(n,t){v.push([n,t]);var e=u(n,t);M.point(e[0],e[1])}function f(){M.lineStart(),v=[]}function h(){l(v[0][0],v[0][1]),M.lineEnd();var n,t=M.clean(),e=x.buffer(),r=e.length;if(v.pop(),p.push(v),v=null,r){if(1&t){n=e[0];var u,r=n.length-1,o=-1;for(i.lineStart();++o<r;)i.point((u=n[o])[0],u[1]);return i.lineEnd(),void 0}r>1&&2&t&&e.push(e.pop().concat(e.shift())),g.push(e.filter(Wt))}}var g,p,v,d=t(i),m=u.invert(r[0],r[1]),y={point:o,lineStart:c,lineEnd:s,polygonStart:function(){y.point=l,y.lineStart=f,y.lineEnd=h,g=[],p=[],i.polygonStart()},polygonEnd:function(){y.point=o,y.lineStart=c,y.lineEnd=s,g=$o.merge(g);var n=Kt(m,p);g.length?Vt(g,Gt,n,e,i):n&&(i.lineStart(),e(null,null,1,i),i.lineEnd()),i.polygonEnd(),g=p=null},sphere:function(){i.polygonStart(),i.lineStart(),e(null,null,1,i),i.lineEnd(),i.polygonEnd()}},x=Jt(),M=t(x);return y}}function Wt(n){return n.length>1}function Jt(){var n,t=[];return{lineStart:function(){t.push(n=[])},point:function(t,e){n.push([t,e])},lineEnd:c,buffer:function(){var e=t;return t=[],n=null,e},rejoin:function(){t.length>1&&t.push(t.pop().concat(t.shift()))}}}function Gt(n,t){return((n=n.x)[0]<0?n[1]-Aa-Ca:Aa-n[1])-((t=t.x)[0]<0?t[1]-Aa-Ca:Aa-t[1])}function Kt(n,t){var e=n[0],r=n[1],u=[Math.sin(e),-Math.cos(e),0],i=0,o=0;hc.reset();for(var a=0,c=t.length;c>a;++a){var s=t[a],l=s.length;if(l)for(var f=s[0],h=f[0],g=f[1]/2+ka/4,p=Math.sin(g),v=Math.cos(g),d=1;;){d===l&&(d=0),n=s[d];var m=n[0],y=n[1]/2+ka/4,x=Math.sin(y),M=Math.cos(y),_=m-h,b=aa(_)>ka,w=p*x;if(hc.add(Math.atan2(w*Math.sin(_),v*M+w*Math.cos(_))),i+=b?_+(_>=0?Ea:-Ea):_,b^h>=e^m>=e){var S=zt(Tt(f),Tt(n));Pt(S);var k=zt(u,S);Pt(k);var E=(b^_>=0?-1:1)*H(k[2]);(r>E||r===E&&(S[0]||S[1]))&&(o+=b^_>=0?1:-1)}if(!d++)break;h=m,p=x,v=M,f=n}}return(-Ca>i||Ca>i&&0>hc)^1&o}function Qt(n){var t,e=0/0,r=0/0,u=0/0;return{lineStart:function(){n.lineStart(),t=1},point:function(i,o){var a=i>0?ka:-ka,c=aa(i-e);aa(c-ka)<Ca?(n.point(e,r=(r+o)/2>0?Aa:-Aa),n.point(u,r),n.lineEnd(),n.lineStart(),n.point(a,r),n.point(i,r),t=0):u!==a&&c>=ka&&(aa(e-u)<Ca&&(e-=u*Ca),aa(i-a)<Ca&&(i-=a*Ca),r=ne(e,r,i,o),n.point(u,r),n.lineEnd(),n.lineStart(),n.point(a,r),t=0),n.point(e=i,r=o),u=a},lineEnd:function(){n.lineEnd(),e=r=0/0},clean:function(){return 2-t}}}function ne(n,t,e,r){var u,i,o=Math.sin(n-e);return aa(o)>Ca?Math.atan((Math.sin(t)*(i=Math.cos(r))*Math.sin(e)-Math.sin(r)*(u=Math.cos(t))*Math.sin(n))/(u*i*o)):(t+r)/2}function te(n,t,e,r){var u;if(null==n)u=e*Aa,r.point(-ka,u),r.point(0,u),r.point(ka,u),r.point(ka,0),r.point(ka,-u),r.point(0,-u),r.point(-ka,-u),r.point(-ka,0),r.point(-ka,u);else if(aa(n[0]-t[0])>Ca){var i=n[0]<t[0]?ka:-ka;u=e*i/2,r.point(-i,u),r.point(0,u),r.point(i,u)}else r.point(t[0],t[1])}function ee(n){function t(n,t){return Math.cos(n)*Math.cos(t)>i}function e(n){var e,i,c,s,l;return{lineStart:function(){s=c=!1,l=1},point:function(f,h){var g,p=[f,h],v=t(f,h),d=o?v?0:u(f,h):v?u(f+(0>f?ka:-ka),h):0;if(!e&&(s=c=v)&&n.lineStart(),v!==c&&(g=r(e,p),(jt(e,g)||jt(p,g))&&(p[0]+=Ca,p[1]+=Ca,v=t(p[0],p[1]))),v!==c)l=0,v?(n.lineStart(),g=r(p,e),n.point(g[0],g[1])):(g=r(e,p),n.point(g[0],g[1]),n.lineEnd()),e=g;else if(a&&e&&o^v){var m;d&i||!(m=r(p,e,!0))||(l=0,o?(n.lineStart(),n.point(m[0][0],m[0][1]),n.point(m[1][0],m[1][1]),n.lineEnd()):(n.point(m[1][0],m[1][1]),n.lineEnd(),n.lineStart(),n.point(m[0][0],m[0][1])))}!v||e&&jt(e,p)||n.point(p[0],p[1]),e=p,c=v,i=d},lineEnd:function(){c&&n.lineEnd(),e=null},clean:function(){return l|(s&&c)<<1}}}function r(n,t,e){var r=Tt(n),u=Tt(t),o=[1,0,0],a=zt(r,u),c=qt(a,a),s=a[0],l=c-s*s;if(!l)return!e&&n;var f=i*c/l,h=-i*s/l,g=zt(o,a),p=Dt(o,f),v=Dt(a,h);Rt(p,v);var d=g,m=qt(p,d),y=qt(d,d),x=m*m-y*(qt(p,p)-1);if(!(0>x)){var M=Math.sqrt(x),_=Dt(d,(-m-M)/y);if(Rt(_,p),_=Ut(_),!e)return _;var b,w=n[0],S=t[0],k=n[1],E=t[1];w>S&&(b=w,w=S,S=b);var A=S-w,C=aa(A-ka)<Ca,N=C||Ca>A;if(!C&&k>E&&(b=k,k=E,E=b),N?C?k+E>0^_[1]<(aa(_[0]-w)<Ca?k:E):k<=_[1]&&_[1]<=E:A>ka^(w<=_[0]&&_[0]<=S)){var L=Dt(d,(-m+M)/y);return Rt(L,p),[_,Ut(L)]}}}function u(t,e){var r=o?n:ka-n,u=0;return-r>t?u|=1:t>r&&(u|=2),-r>e?u|=4:e>r&&(u|=8),u}var i=Math.cos(n),o=i>0,a=aa(i)>Ca,c=Le(n,6*La);return Bt(t,e,c,o?[0,-n]:[-ka,n-ka])}function re(n,t,e,r){return function(u){var i,o=u.a,a=u.b,c=o.x,s=o.y,l=a.x,f=a.y,h=0,g=1,p=l-c,v=f-s;if(i=n-c,p||!(i>0)){if(i/=p,0>p){if(h>i)return;g>i&&(g=i)}else if(p>0){if(i>g)return;i>h&&(h=i)}if(i=e-c,p||!(0>i)){if(i/=p,0>p){if(i>g)return;i>h&&(h=i)}else if(p>0){if(h>i)return;g>i&&(g=i)}if(i=t-s,v||!(i>0)){if(i/=v,0>v){if(h>i)return;g>i&&(g=i)}else if(v>0){if(i>g)return;i>h&&(h=i)}if(i=r-s,v||!(0>i)){if(i/=v,0>v){if(i>g)return;i>h&&(h=i)}else if(v>0){if(h>i)return;g>i&&(g=i)}return h>0&&(u.a={x:c+h*p,y:s+h*v}),1>g&&(u.b={x:c+g*p,y:s+g*v}),u}}}}}}function ue(n,t,e,r){function u(r,u){return aa(r[0]-n)<Ca?u>0?0:3:aa(r[0]-e)<Ca?u>0?2:1:aa(r[1]-t)<Ca?u>0?1:0:u>0?3:2}function i(n,t){return o(n.x,t.x)}function o(n,t){var e=u(n,1),r=u(t,1);return e!==r?e-r:0===e?t[1]-n[1]:1===e?n[0]-t[0]:2===e?n[1]-t[1]:t[0]-n[0]}return function(a){function c(n){for(var t=0,e=m.length,r=n[1],u=0;e>u;++u)for(var i,o=1,a=m[u],c=a.length,l=a[0];c>o;++o)i=a[o],l[1]<=r?i[1]>r&&s(l,i,n)>0&&++t:i[1]<=r&&s(l,i,n)<0&&--t,l=i;return 0!==t}function s(n,t,e){return(t[0]-n[0])*(e[1]-n[1])-(e[0]-n[0])*(t[1]-n[1])}function l(i,a,c,s){var l=0,f=0;if(null==i||(l=u(i,c))!==(f=u(a,c))||o(i,a)<0^c>0){do s.point(0===l||3===l?n:e,l>1?r:t);while((l=(l+c+4)%4)!==f)}else s.point(a[0],a[1])}function f(u,i){return u>=n&&e>=u&&i>=t&&r>=i}function h(n,t){f(n,t)&&a.point(n,t)}function g(){L.point=v,m&&m.push(y=[]),k=!0,S=!1,b=w=0/0}function p(){d&&(v(x,M),_&&S&&C.rejoin(),d.push(C.buffer())),L.point=h,S&&a.lineEnd()}function v(n,t){n=Math.max(-Ac,Math.min(Ac,n)),t=Math.max(-Ac,Math.min(Ac,t));var e=f(n,t);if(m&&y.push([n,t]),k)x=n,M=t,_=e,k=!1,e&&(a.lineStart(),a.point(n,t));else if(e&&S)a.point(n,t);else{var r={a:{x:b,y:w},b:{x:n,y:t}};N(r)?(S||(a.lineStart(),a.point(r.a.x,r.a.y)),a.point(r.b.x,r.b.y),e||a.lineEnd(),E=!1):e&&(a.lineStart(),a.point(n,t),E=!1)}b=n,w=t,S=e}var d,m,y,x,M,_,b,w,S,k,E,A=a,C=Jt(),N=re(n,t,e,r),L={point:h,lineStart:g,lineEnd:p,polygonStart:function(){a=C,d=[],m=[],E=!0},polygonEnd:function(){a=A,d=$o.merge(d);var t=c([n,r]),e=E&&t,u=d.length;(e||u)&&(a.polygonStart(),e&&(a.lineStart(),l(null,null,1,a),a.lineEnd()),u&&Vt(d,i,t,l,a),a.polygonEnd()),d=m=y=null}};return L}}function ie(n,t){function e(e,r){return e=n(e,r),t(e[0],e[1])}return n.invert&&t.invert&&(e.invert=function(e,r){return e=t.invert(e,r),e&&n.invert(e[0],e[1])}),e}function oe(n){var t=0,e=ka/3,r=be(n),u=r(t,e);return u.parallels=function(n){return arguments.length?r(t=n[0]*ka/180,e=n[1]*ka/180):[180*(t/ka),180*(e/ka)]},u}function ae(n,t){function e(n,t){var e=Math.sqrt(i-2*u*Math.sin(t))/u;return[e*Math.sin(n*=u),o-e*Math.cos(n)]}var r=Math.sin(n),u=(r+Math.sin(t))/2,i=1+r*(2*u-r),o=Math.sqrt(i)/u;return e.invert=function(n,t){var e=o-t;return[Math.atan2(n,e)/u,H((i-(n*n+e*e)*u*u)/(2*u))]},e}function ce(){function n(n,t){Nc+=u*n-r*t,r=n,u=t}var t,e,r,u;Rc.point=function(i,o){Rc.point=n,t=r=i,e=u=o},Rc.lineEnd=function(){n(t,e)}}function se(n,t){Lc>n&&(Lc=n),n>qc&&(qc=n),Tc>t&&(Tc=t),t>zc&&(zc=t)}function le(){function n(n,t){o.push("M",n,",",t,i)}function t(n,t){o.push("M",n,",",t),a.point=e}function e(n,t){o.push("L",n,",",t)}function r(){a.point=n}function u(){o.push("Z")}var i=fe(4.5),o=[],a={point:n,lineStart:function(){a.point=t},lineEnd:r,polygonStart:function(){a.lineEnd=u},polygonEnd:function(){a.lineEnd=r,a.point=n},pointRadius:function(n){return i=fe(n),a},result:function(){if(o.length){var n=o.join("");return o=[],n}}};return a}function fe(n){return"m0,"+n+"a"+n+","+n+" 0 1,1 0,"+-2*n+"a"+n+","+n+" 0 1,1 0,"+2*n+"z"}function he(n,t){dc+=n,mc+=t,++yc}function ge(){function n(n,r){var u=n-t,i=r-e,o=Math.sqrt(u*u+i*i);xc+=o*(t+n)/2,Mc+=o*(e+r)/2,_c+=o,he(t=n,e=r)}var t,e;Pc.point=function(r,u){Pc.point=n,he(t=r,e=u)}}function pe(){Pc.point=he}function ve(){function n(n,t){var e=n-r,i=t-u,o=Math.sqrt(e*e+i*i);xc+=o*(r+n)/2,Mc+=o*(u+t)/2,_c+=o,o=u*n-r*t,bc+=o*(r+n),wc+=o*(u+t),Sc+=3*o,he(r=n,u=t)}var t,e,r,u;Pc.point=function(i,o){Pc.point=n,he(t=r=i,e=u=o)},Pc.lineEnd=function(){n(t,e)}}function de(n){function t(t,e){n.moveTo(t,e),n.arc(t,e,o,0,Ea)}function e(t,e){n.moveTo(t,e),a.point=r}function r(t,e){n.lineTo(t,e)}function u(){a.point=t}function i(){n.closePath()}var o=4.5,a={point:t,lineStart:function(){a.point=e},lineEnd:u,polygonStart:function(){a.lineEnd=i},polygonEnd:function(){a.lineEnd=u,a.point=t},pointRadius:function(n){return o=n,a},result:c};return a}function me(n){function t(n){return(a?r:e)(n)}function e(t){return Me(t,function(e,r){e=n(e,r),t.point(e[0],e[1])})}function r(t){function e(e,r){e=n(e,r),t.point(e[0],e[1])}function r(){x=0/0,S.point=i,t.lineStart()}function i(e,r){var i=Tt([e,r]),o=n(e,r);u(x,M,y,_,b,w,x=o[0],M=o[1],y=e,_=i[0],b=i[1],w=i[2],a,t),t.point(x,M)}function o(){S.point=e,t.lineEnd()}function c(){r(),S.point=s,S.lineEnd=l}function s(n,t){i(f=n,h=t),g=x,p=M,v=_,d=b,m=w,S.point=i}function l(){u(x,M,y,_,b,w,g,p,f,v,d,m,a,t),S.lineEnd=o,o()}var f,h,g,p,v,d,m,y,x,M,_,b,w,S={point:e,lineStart:r,lineEnd:o,polygonStart:function(){t.polygonStart(),S.lineStart=c},polygonEnd:function(){t.polygonEnd(),S.lineStart=r}};return S}function u(t,e,r,a,c,s,l,f,h,g,p,v,d,m){var y=l-t,x=f-e,M=y*y+x*x;if(M>4*i&&d--){var _=a+g,b=c+p,w=s+v,S=Math.sqrt(_*_+b*b+w*w),k=Math.asin(w/=S),E=aa(aa(w)-1)<Ca?(r+h)/2:Math.atan2(b,_),A=n(E,k),C=A[0],N=A[1],L=C-t,T=N-e,q=x*L-y*T;(q*q/M>i||aa((y*L+x*T)/M-.5)>.3||o>a*g+c*p+s*v)&&(u(t,e,r,a,c,s,C,N,E,_/=S,b/=S,w,d,m),m.point(C,N),u(C,N,E,_,b,w,l,f,h,g,p,v,d,m))}}var i=.5,o=Math.cos(30*La),a=16;return t.precision=function(n){return arguments.length?(a=(i=n*n)>0&&16,t):Math.sqrt(i)},t}function ye(n){var t=me(function(t,e){return n([t*Ta,e*Ta])});return function(n){return we(t(n))}}function xe(n){this.stream=n}function Me(n,t){return{point:t,sphere:function(){n.sphere()},lineStart:function(){n.lineStart()},lineEnd:function(){n.lineEnd()},polygonStart:function(){n.polygonStart()},polygonEnd:function(){n.polygonEnd()}}}function _e(n){return be(function(){return n})()}function be(n){function t(n){return n=a(n[0]*La,n[1]*La),[n[0]*h+c,s-n[1]*h]}function e(n){return n=a.invert((n[0]-c)/h,(s-n[1])/h),n&&[n[0]*Ta,n[1]*Ta]}function r(){a=ie(o=Ee(m,y,x),i);var n=i(v,d);return c=g-n[0]*h,s=p+n[1]*h,u()}function u(){return l&&(l.valid=!1,l=null),t}var i,o,a,c,s,l,f=me(function(n,t){return n=i(n,t),[n[0]*h+c,s-n[1]*h]}),h=150,g=480,p=250,v=0,d=0,m=0,y=0,x=0,M=Ec,_=vt,b=null,w=null;return t.stream=function(n){return l&&(l.valid=!1),l=we(M(o,f(_(n)))),l.valid=!0,l},t.clipAngle=function(n){return arguments.length?(M=null==n?(b=n,Ec):ee((b=+n)*La),u()):b},t.clipExtent=function(n){return arguments.length?(w=n,_=n?ue(n[0][0],n[0][1],n[1][0],n[1][1]):vt,u()):w},t.scale=function(n){return arguments.length?(h=+n,r()):h},t.translate=function(n){return arguments.length?(g=+n[0],p=+n[1],r()):[g,p]},t.center=function(n){return arguments.length?(v=n[0]%360*La,d=n[1]%360*La,r()):[v*Ta,d*Ta]},t.rotate=function(n){return arguments.length?(m=n[0]%360*La,y=n[1]%360*La,x=n.length>2?n[2]%360*La:0,r()):[m*Ta,y*Ta,x*Ta]},$o.rebind(t,f,"precision"),function(){return i=n.apply(this,arguments),t.invert=i.invert&&e,r()}}function we(n){return Me(n,function(t,e){n.point(t*La,e*La)})}function Se(n,t){return[n,t]}function ke(n,t){return[n>ka?n-Ea:-ka>n?n+Ea:n,t]}function Ee(n,t,e){return n?t||e?ie(Ce(n),Ne(t,e)):Ce(n):t||e?Ne(t,e):ke}function Ae(n){return function(t,e){return t+=n,[t>ka?t-Ea:-ka>t?t+Ea:t,e]}}function Ce(n){var t=Ae(n);return t.invert=Ae(-n),t}function Ne(n,t){function e(n,t){var e=Math.cos(t),a=Math.cos(n)*e,c=Math.sin(n)*e,s=Math.sin(t),l=s*r+a*u;return[Math.atan2(c*i-l*o,a*r-s*u),H(l*i+c*o)]}var r=Math.cos(n),u=Math.sin(n),i=Math.cos(t),o=Math.sin(t);return e.invert=function(n,t){var e=Math.cos(t),a=Math.cos(n)*e,c=Math.sin(n)*e,s=Math.sin(t),l=s*i-c*o;return[Math.atan2(c*i+s*o,a*r+l*u),H(l*r-a*u)]},e}function Le(n,t){var e=Math.cos(n),r=Math.sin(n);return function(u,i,o,a){var c=o*t;null!=u?(u=Te(e,u),i=Te(e,i),(o>0?i>u:u>i)&&(u+=o*Ea)):(u=n+o*Ea,i=n-.5*c);for(var s,l=u;o>0?l>i:i>l;l-=c)a.point((s=Ut([e,-r*Math.cos(l),-r*Math.sin(l)]))[0],s[1])}}function Te(n,t){var e=Tt(t);e[0]-=n,Pt(e);var r=j(-e[1]);return((-e[2]<0?-r:r)+2*Math.PI-Ca)%(2*Math.PI)}function qe(n,t,e){var r=$o.range(n,t-Ca,e).concat(t);return function(n){return r.map(function(t){return[n,t]})}}function ze(n,t,e){var r=$o.range(n,t-Ca,e).concat(t);return function(n){return r.map(function(t){return[t,n]})}}function Re(n){return n.source}function De(n){return n.target}function Pe(n,t,e,r){var u=Math.cos(t),i=Math.sin(t),o=Math.cos(r),a=Math.sin(r),c=u*Math.cos(n),s=u*Math.sin(n),l=o*Math.cos(e),f=o*Math.sin(e),h=2*Math.asin(Math.sqrt(I(r-t)+u*o*I(e-n))),g=1/Math.sin(h),p=h?function(n){var t=Math.sin(n*=h)*g,e=Math.sin(h-n)*g,r=e*c+t*l,u=e*s+t*f,o=e*i+t*a;return[Math.atan2(u,r)*Ta,Math.atan2(o,Math.sqrt(r*r+u*u))*Ta]}:function(){return[n*Ta,t*Ta]};return p.distance=h,p}function Ue(){function n(n,u){var i=Math.sin(u*=La),o=Math.cos(u),a=aa((n*=La)-t),c=Math.cos(a);Uc+=Math.atan2(Math.sqrt((a=o*Math.sin(a))*a+(a=r*i-e*o*c)*a),e*i+r*o*c),t=n,e=i,r=o}var t,e,r;jc.point=function(u,i){t=u*La,e=Math.sin(i*=La),r=Math.cos(i),jc.point=n},jc.lineEnd=function(){jc.point=jc.lineEnd=c}}function je(n,t){function e(t,e){var r=Math.cos(t),u=Math.cos(e),i=n(r*u);return[i*u*Math.sin(t),i*Math.sin(e)]}return e.invert=function(n,e){var r=Math.sqrt(n*n+e*e),u=t(r),i=Math.sin(u),o=Math.cos(u);return[Math.atan2(n*i,r*o),Math.asin(r&&e*i/r)]},e}function He(n,t){function e(n,t){var e=aa(aa(t)-Aa)<Ca?0:o/Math.pow(u(t),i);return[e*Math.sin(i*n),o-e*Math.cos(i*n)]}var r=Math.cos(n),u=function(n){return Math.tan(ka/4+n/2)},i=n===t?Math.sin(n):Math.log(r/Math.cos(t))/Math.log(u(t)/u(n)),o=r*Math.pow(u(n),i)/i;return i?(e.invert=function(n,t){var e=o-t,r=U(i)*Math.sqrt(n*n+e*e);return[Math.atan2(n,e)/i,2*Math.atan(Math.pow(o/r,1/i))-Aa]},e):Oe}function Fe(n,t){function e(n,t){var e=i-t;return[e*Math.sin(u*n),i-e*Math.cos(u*n)]}var r=Math.cos(n),u=n===t?Math.sin(n):(r-Math.cos(t))/(t-n),i=r/u+n;return aa(u)<Ca?Se:(e.invert=function(n,t){var e=i-t;return[Math.atan2(n,e)/u,i-U(u)*Math.sqrt(n*n+e*e)]},e)}function Oe(n,t){return[n,Math.log(Math.tan(ka/4+t/2))]}function Ye(n){var t,e=_e(n),r=e.scale,u=e.translate,i=e.clipExtent;return e.scale=function(){var n=r.apply(e,arguments);return n===e?t?e.clipExtent(null):e:n},e.translate=function(){var n=u.apply(e,arguments);return n===e?t?e.clipExtent(null):e:n},e.clipExtent=function(n){var o=i.apply(e,arguments);if(o===e){if(t=null==n){var a=ka*r(),c=u();i([[c[0]-a,c[1]-a],[c[0]+a,c[1]+a]])}}else t&&(o=null);return o},e.clipExtent(null)}function Ie(n,t){var e=Math.cos(t)*Math.sin(n);return[Math.log((1+e)/(1-e))/2,Math.atan2(Math.tan(t),Math.cos(n))]}function Ze(n){return n[0]}function Ve(n){return n[1]}function Xe(n,t,e,r){var u,i,o,a,c,s,l;return u=r[n],i=u[0],o=u[1],u=r[t],a=u[0],c=u[1],u=r[e],s=u[0],l=u[1],(l-o)*(a-i)-(c-o)*(s-i)>0}function $e(n,t,e){return(e[0]-t[0])*(n[1]-t[1])<(e[1]-t[1])*(n[0]-t[0])}function Be(n,t,e,r){var u=n[0],i=e[0],o=t[0]-u,a=r[0]-i,c=n[1],s=e[1],l=t[1]-c,f=r[1]-s,h=(a*(c-s)-f*(u-i))/(f*o-a*l);return[u+h*o,c+h*l]}function We(n){var t=n[0],e=n[n.length-1];return!(t[0]-e[0]||t[1]-e[1])}function Je(){mr(this),this.edge=this.site=this.circle=null}function Ge(n){var t=Jc.pop()||new Je;return t.site=n,t}function Ke(n){cr(n),$c.remove(n),Jc.push(n),mr(n)}function Qe(n){var t=n.circle,e=t.x,r=t.cy,u={x:e,y:r},i=n.P,o=n.N,a=[n];Ke(n);for(var c=i;c.circle&&aa(e-c.circle.x)<Ca&&aa(r-c.circle.cy)<Ca;)i=c.P,a.unshift(c),Ke(c),c=i;a.unshift(c),cr(c);for(var s=o;s.circle&&aa(e-s.circle.x)<Ca&&aa(r-s.circle.cy)<Ca;)o=s.N,a.push(s),Ke(s),s=o;a.push(s),cr(s);var l,f=a.length;for(l=1;f>l;++l)s=a[l],c=a[l-1],pr(s.edge,c.site,s.site,u);c=a[0],s=a[f-1],s.edge=hr(c.site,s.site,null,u),ar(c),ar(s)}function nr(n){for(var t,e,r,u,i=n.x,o=n.y,a=$c._;a;)if(r=tr(a,o)-i,r>Ca)a=a.L;else{if(u=i-er(a,o),!(u>Ca)){r>-Ca?(t=a.P,e=a):u>-Ca?(t=a,e=a.N):t=e=a;break}if(!a.R){t=a;break}a=a.R}var c=Ge(n);if($c.insert(t,c),t||e){if(t===e)return cr(t),e=Ge(t.site),$c.insert(c,e),c.edge=e.edge=hr(t.site,c.site),ar(t),ar(e),void 0;if(!e)return c.edge=hr(t.site,c.site),void 0;cr(t),cr(e);var s=t.site,l=s.x,f=s.y,h=n.x-l,g=n.y-f,p=e.site,v=p.x-l,d=p.y-f,m=2*(h*d-g*v),y=h*h+g*g,x=v*v+d*d,M={x:(d*y-g*x)/m+l,y:(h*x-v*y)/m+f};pr(e.edge,s,p,M),c.edge=hr(s,n,null,M),e.edge=hr(n,p,null,M),ar(t),ar(e)}}function tr(n,t){var e=n.site,r=e.x,u=e.y,i=u-t;if(!i)return r;var o=n.P;if(!o)return-1/0;e=o.site;var a=e.x,c=e.y,s=c-t;if(!s)return a;var l=a-r,f=1/i-1/s,h=l/s;return f?(-h+Math.sqrt(h*h-2*f*(l*l/(-2*s)-c+s/2+u-i/2)))/f+r:(r+a)/2}function er(n,t){var e=n.N;if(e)return tr(e,t);var r=n.site;return r.y===t?r.x:1/0}function rr(n){this.site=n,this.edges=[]}function ur(n){for(var t,e,r,u,i,o,a,c,s,l,f=n[0][0],h=n[1][0],g=n[0][1],p=n[1][1],v=Xc,d=v.length;d--;)if(i=v[d],i&&i.prepare())for(a=i.edges,c=a.length,o=0;c>o;)l=a[o].end(),r=l.x,u=l.y,s=a[++o%c].start(),t=s.x,e=s.y,(aa(r-t)>Ca||aa(u-e)>Ca)&&(a.splice(o,0,new vr(gr(i.site,l,aa(r-f)<Ca&&p-u>Ca?{x:f,y:aa(t-f)<Ca?e:p}:aa(u-p)<Ca&&h-r>Ca?{x:aa(e-p)<Ca?t:h,y:p}:aa(r-h)<Ca&&u-g>Ca?{x:h,y:aa(t-h)<Ca?e:g}:aa(u-g)<Ca&&r-f>Ca?{x:aa(e-g)<Ca?t:f,y:g}:null),i.site,null)),++c)}function ir(n,t){return t.angle-n.angle}function or(){mr(this),this.x=this.y=this.arc=this.site=this.cy=null}function ar(n){var t=n.P,e=n.N;if(t&&e){var r=t.site,u=n.site,i=e.site;if(r!==i){var o=u.x,a=u.y,c=r.x-o,s=r.y-a,l=i.x-o,f=i.y-a,h=2*(c*f-s*l);if(!(h>=-Na)){var g=c*c+s*s,p=l*l+f*f,v=(f*g-s*p)/h,d=(c*p-l*g)/h,f=d+a,m=Gc.pop()||new or;m.arc=n,m.site=u,m.x=v+o,m.y=f+Math.sqrt(v*v+d*d),m.cy=f,n.circle=m;for(var y=null,x=Wc._;x;)if(m.y<x.y||m.y===x.y&&m.x<=x.x){if(!x.L){y=x.P;break}x=x.L}else{if(!x.R){y=x;break}x=x.R}Wc.insert(y,m),y||(Bc=m)}}}}function cr(n){var t=n.circle;t&&(t.P||(Bc=t.N),Wc.remove(t),Gc.push(t),mr(t),n.circle=null)}function sr(n){for(var t,e=Vc,r=re(n[0][0],n[0][1],n[1][0],n[1][1]),u=e.length;u--;)t=e[u],(!lr(t,n)||!r(t)||aa(t.a.x-t.b.x)<Ca&&aa(t.a.y-t.b.y)<Ca)&&(t.a=t.b=null,e.splice(u,1))}function lr(n,t){var e=n.b;if(e)return!0;var r,u,i=n.a,o=t[0][0],a=t[1][0],c=t[0][1],s=t[1][1],l=n.l,f=n.r,h=l.x,g=l.y,p=f.x,v=f.y,d=(h+p)/2,m=(g+v)/2; +if(v===g){if(o>d||d>=a)return;if(h>p){if(i){if(i.y>=s)return}else i={x:d,y:c};e={x:d,y:s}}else{if(i){if(i.y<c)return}else i={x:d,y:s};e={x:d,y:c}}}else if(r=(h-p)/(v-g),u=m-r*d,-1>r||r>1)if(h>p){if(i){if(i.y>=s)return}else i={x:(c-u)/r,y:c};e={x:(s-u)/r,y:s}}else{if(i){if(i.y<c)return}else i={x:(s-u)/r,y:s};e={x:(c-u)/r,y:c}}else if(v>g){if(i){if(i.x>=a)return}else i={x:o,y:r*o+u};e={x:a,y:r*a+u}}else{if(i){if(i.x<o)return}else i={x:a,y:r*a+u};e={x:o,y:r*o+u}}return n.a=i,n.b=e,!0}function fr(n,t){this.l=n,this.r=t,this.a=this.b=null}function hr(n,t,e,r){var u=new fr(n,t);return Vc.push(u),e&&pr(u,n,t,e),r&&pr(u,t,n,r),Xc[n.i].edges.push(new vr(u,n,t)),Xc[t.i].edges.push(new vr(u,t,n)),u}function gr(n,t,e){var r=new fr(n,null);return r.a=t,r.b=e,Vc.push(r),r}function pr(n,t,e,r){n.a||n.b?n.l===e?n.b=r:n.a=r:(n.a=r,n.l=t,n.r=e)}function vr(n,t,e){var r=n.a,u=n.b;this.edge=n,this.site=t,this.angle=e?Math.atan2(e.y-t.y,e.x-t.x):n.l===t?Math.atan2(u.x-r.x,r.y-u.y):Math.atan2(r.x-u.x,u.y-r.y)}function dr(){this._=null}function mr(n){n.U=n.C=n.L=n.R=n.P=n.N=null}function yr(n,t){var e=t,r=t.R,u=e.U;u?u.L===e?u.L=r:u.R=r:n._=r,r.U=u,e.U=r,e.R=r.L,e.R&&(e.R.U=e),r.L=e}function xr(n,t){var e=t,r=t.L,u=e.U;u?u.L===e?u.L=r:u.R=r:n._=r,r.U=u,e.U=r,e.L=r.R,e.L&&(e.L.U=e),r.R=e}function Mr(n){for(;n.L;)n=n.L;return n}function _r(n,t){var e,r,u,i=n.sort(br).pop();for(Vc=[],Xc=new Array(n.length),$c=new dr,Wc=new dr;;)if(u=Bc,i&&(!u||i.y<u.y||i.y===u.y&&i.x<u.x))(i.x!==e||i.y!==r)&&(Xc[i.i]=new rr(i),nr(i),e=i.x,r=i.y),i=n.pop();else{if(!u)break;Qe(u.arc)}t&&(sr(t),ur(t));var o={cells:Xc,edges:Vc};return $c=Wc=Vc=Xc=null,o}function br(n,t){return t.y-n.y||t.x-n.x}function wr(n,t,e){return(n.x-e.x)*(t.y-n.y)-(n.x-t.x)*(e.y-n.y)}function Sr(n){return n.x}function kr(n){return n.y}function Er(){return{leaf:!0,nodes:[],point:null,x:null,y:null}}function Ar(n,t,e,r,u,i){if(!n(t,e,r,u,i)){var o=.5*(e+u),a=.5*(r+i),c=t.nodes;c[0]&&Ar(n,c[0],e,r,o,a),c[1]&&Ar(n,c[1],o,r,u,a),c[2]&&Ar(n,c[2],e,a,o,i),c[3]&&Ar(n,c[3],o,a,u,i)}}function Cr(n,t){n=$o.rgb(n),t=$o.rgb(t);var e=n.r,r=n.g,u=n.b,i=t.r-e,o=t.g-r,a=t.b-u;return function(n){return"#"+ct(Math.round(e+i*n))+ct(Math.round(r+o*n))+ct(Math.round(u+a*n))}}function Nr(n,t){var e,r={},u={};for(e in n)e in t?r[e]=qr(n[e],t[e]):u[e]=n[e];for(e in t)e in n||(u[e]=t[e]);return function(n){for(e in r)u[e]=r[e](n);return u}}function Lr(n,t){return t-=n=+n,function(e){return n+t*e}}function Tr(n,t){var e,r,u,i,o,a=0,c=0,s=[],l=[];for(n+="",t+="",Qc.lastIndex=0,r=0;e=Qc.exec(t);++r)e.index&&s.push(t.substring(a,c=e.index)),l.push({i:s.length,x:e[0]}),s.push(null),a=Qc.lastIndex;for(a<t.length&&s.push(t.substring(a)),r=0,i=l.length;(e=Qc.exec(n))&&i>r;++r)if(o=l[r],o.x==e[0]){if(o.i)if(null==s[o.i+1])for(s[o.i-1]+=o.x,s.splice(o.i,1),u=r+1;i>u;++u)l[u].i--;else for(s[o.i-1]+=o.x+s[o.i+1],s.splice(o.i,2),u=r+1;i>u;++u)l[u].i-=2;else if(null==s[o.i+1])s[o.i]=o.x;else for(s[o.i]=o.x+s[o.i+1],s.splice(o.i+1,1),u=r+1;i>u;++u)l[u].i--;l.splice(r,1),i--,r--}else o.x=Lr(parseFloat(e[0]),parseFloat(o.x));for(;i>r;)o=l.pop(),null==s[o.i+1]?s[o.i]=o.x:(s[o.i]=o.x+s[o.i+1],s.splice(o.i+1,1)),i--;return 1===s.length?null==s[0]?(o=l[0].x,function(n){return o(n)+""}):function(){return t}:function(n){for(r=0;i>r;++r)s[(o=l[r]).i]=o.x(n);return s.join("")}}function qr(n,t){for(var e,r=$o.interpolators.length;--r>=0&&!(e=$o.interpolators[r](n,t)););return e}function zr(n,t){var e,r=[],u=[],i=n.length,o=t.length,a=Math.min(n.length,t.length);for(e=0;a>e;++e)r.push(qr(n[e],t[e]));for(;i>e;++e)u[e]=n[e];for(;o>e;++e)u[e]=t[e];return function(n){for(e=0;a>e;++e)u[e]=r[e](n);return u}}function Rr(n){return function(t){return 0>=t?0:t>=1?1:n(t)}}function Dr(n){return function(t){return 1-n(1-t)}}function Pr(n){return function(t){return.5*(.5>t?n(2*t):2-n(2-2*t))}}function Ur(n){return n*n}function jr(n){return n*n*n}function Hr(n){if(0>=n)return 0;if(n>=1)return 1;var t=n*n,e=t*n;return 4*(.5>n?e:3*(n-t)+e-.75)}function Fr(n){return function(t){return Math.pow(t,n)}}function Or(n){return 1-Math.cos(n*Aa)}function Yr(n){return Math.pow(2,10*(n-1))}function Ir(n){return 1-Math.sqrt(1-n*n)}function Zr(n,t){var e;return arguments.length<2&&(t=.45),arguments.length?e=t/Ea*Math.asin(1/n):(n=1,e=t/4),function(r){return 1+n*Math.pow(2,-10*r)*Math.sin((r-e)*Ea/t)}}function Vr(n){return n||(n=1.70158),function(t){return t*t*((n+1)*t-n)}}function Xr(n){return 1/2.75>n?7.5625*n*n:2/2.75>n?7.5625*(n-=1.5/2.75)*n+.75:2.5/2.75>n?7.5625*(n-=2.25/2.75)*n+.9375:7.5625*(n-=2.625/2.75)*n+.984375}function $r(n,t){n=$o.hcl(n),t=$o.hcl(t);var e=n.h,r=n.c,u=n.l,i=t.h-e,o=t.c-r,a=t.l-u;return isNaN(o)&&(o=0,r=isNaN(r)?t.c:r),isNaN(i)?(i=0,e=isNaN(e)?t.h:e):i>180?i-=360:-180>i&&(i+=360),function(n){return J(e+i*n,r+o*n,u+a*n)+""}}function Br(n,t){n=$o.hsl(n),t=$o.hsl(t);var e=n.h,r=n.s,u=n.l,i=t.h-e,o=t.s-r,a=t.l-u;return isNaN(o)&&(o=0,r=isNaN(r)?t.s:r),isNaN(i)?(i=0,e=isNaN(e)?t.h:e):i>180?i-=360:-180>i&&(i+=360),function(n){return $(e+i*n,r+o*n,u+a*n)+""}}function Wr(n,t){n=$o.lab(n),t=$o.lab(t);var e=n.l,r=n.a,u=n.b,i=t.l-e,o=t.a-r,a=t.b-u;return function(n){return Q(e+i*n,r+o*n,u+a*n)+""}}function Jr(n,t){return t-=n,function(e){return Math.round(n+t*e)}}function Gr(n){var t=[n.a,n.b],e=[n.c,n.d],r=Qr(t),u=Kr(t,e),i=Qr(nu(e,t,-u))||0;t[0]*e[1]<e[0]*t[1]&&(t[0]*=-1,t[1]*=-1,r*=-1,u*=-1),this.rotate=(r?Math.atan2(t[1],t[0]):Math.atan2(-e[0],e[1]))*Ta,this.translate=[n.e,n.f],this.scale=[r,i],this.skew=i?Math.atan2(u,i)*Ta:0}function Kr(n,t){return n[0]*t[0]+n[1]*t[1]}function Qr(n){var t=Math.sqrt(Kr(n,n));return t&&(n[0]/=t,n[1]/=t),t}function nu(n,t,e){return n[0]+=e*t[0],n[1]+=e*t[1],n}function tu(n,t){var e,r=[],u=[],i=$o.transform(n),o=$o.transform(t),a=i.translate,c=o.translate,s=i.rotate,l=o.rotate,f=i.skew,h=o.skew,g=i.scale,p=o.scale;return a[0]!=c[0]||a[1]!=c[1]?(r.push("translate(",null,",",null,")"),u.push({i:1,x:Lr(a[0],c[0])},{i:3,x:Lr(a[1],c[1])})):c[0]||c[1]?r.push("translate("+c+")"):r.push(""),s!=l?(s-l>180?l+=360:l-s>180&&(s+=360),u.push({i:r.push(r.pop()+"rotate(",null,")")-2,x:Lr(s,l)})):l&&r.push(r.pop()+"rotate("+l+")"),f!=h?u.push({i:r.push(r.pop()+"skewX(",null,")")-2,x:Lr(f,h)}):h&&r.push(r.pop()+"skewX("+h+")"),g[0]!=p[0]||g[1]!=p[1]?(e=r.push(r.pop()+"scale(",null,",",null,")"),u.push({i:e-4,x:Lr(g[0],p[0])},{i:e-2,x:Lr(g[1],p[1])})):(1!=p[0]||1!=p[1])&&r.push(r.pop()+"scale("+p+")"),e=u.length,function(n){for(var t,i=-1;++i<e;)r[(t=u[i]).i]=t.x(n);return r.join("")}}function eu(n,t){return t=t-(n=+n)?1/(t-n):0,function(e){return(e-n)*t}}function ru(n,t){return t=t-(n=+n)?1/(t-n):0,function(e){return Math.max(0,Math.min(1,(e-n)*t))}}function uu(n){for(var t=n.source,e=n.target,r=ou(t,e),u=[t];t!==r;)t=t.parent,u.push(t);for(var i=u.length;e!==r;)u.splice(i,0,e),e=e.parent;return u}function iu(n){for(var t=[],e=n.parent;null!=e;)t.push(n),n=e,e=e.parent;return t.push(n),t}function ou(n,t){if(n===t)return n;for(var e=iu(n),r=iu(t),u=e.pop(),i=r.pop(),o=null;u===i;)o=u,u=e.pop(),i=r.pop();return o}function au(n){n.fixed|=2}function cu(n){n.fixed&=-7}function su(n){n.fixed|=4,n.px=n.x,n.py=n.y}function lu(n){n.fixed&=-5}function fu(n,t,e){var r=0,u=0;if(n.charge=0,!n.leaf)for(var i,o=n.nodes,a=o.length,c=-1;++c<a;)i=o[c],null!=i&&(fu(i,t,e),n.charge+=i.charge,r+=i.charge*i.cx,u+=i.charge*i.cy);if(n.point){n.leaf||(n.point.x+=Math.random()-.5,n.point.y+=Math.random()-.5);var s=t*e[n.point.index];n.charge+=n.pointCharge=s,r+=s*n.point.x,u+=s*n.point.y}n.cx=r/n.charge,n.cy=u/n.charge}function hu(n,t){return $o.rebind(n,t,"sort","children","value"),n.nodes=n,n.links=du,n}function gu(n){return n.children}function pu(n){return n.value}function vu(n,t){return t.value-n.value}function du(n){return $o.merge(n.map(function(n){return(n.children||[]).map(function(t){return{source:n,target:t}})}))}function mu(n){return n.x}function yu(n){return n.y}function xu(n,t,e){n.y0=t,n.y=e}function Mu(n){return $o.range(n.length)}function _u(n){for(var t=-1,e=n[0].length,r=[];++t<e;)r[t]=0;return r}function bu(n){for(var t,e=1,r=0,u=n[0][1],i=n.length;i>e;++e)(t=n[e][1])>u&&(r=e,u=t);return r}function wu(n){return n.reduce(Su,0)}function Su(n,t){return n+t[1]}function ku(n,t){return Eu(n,Math.ceil(Math.log(t.length)/Math.LN2+1))}function Eu(n,t){for(var e=-1,r=+n[0],u=(n[1]-r)/t,i=[];++e<=t;)i[e]=u*e+r;return i}function Au(n){return[$o.min(n),$o.max(n)]}function Cu(n,t){return n.parent==t.parent?1:2}function Nu(n){var t=n.children;return t&&t.length?t[0]:n._tree.thread}function Lu(n){var t,e=n.children;return e&&(t=e.length)?e[t-1]:n._tree.thread}function Tu(n,t){var e=n.children;if(e&&(u=e.length))for(var r,u,i=-1;++i<u;)t(r=Tu(e[i],t),n)>0&&(n=r);return n}function qu(n,t){return n.x-t.x}function zu(n,t){return t.x-n.x}function Ru(n,t){return n.depth-t.depth}function Du(n,t){function e(n,r){var u=n.children;if(u&&(o=u.length))for(var i,o,a=null,c=-1;++c<o;)i=u[c],e(i,a),a=i;t(n,r)}e(n,null)}function Pu(n){for(var t,e=0,r=0,u=n.children,i=u.length;--i>=0;)t=u[i]._tree,t.prelim+=e,t.mod+=e,e+=t.shift+(r+=t.change)}function Uu(n,t,e){n=n._tree,t=t._tree;var r=e/(t.number-n.number);n.change+=r,t.change-=r,t.shift+=e,t.prelim+=e,t.mod+=e}function ju(n,t,e){return n._tree.ancestor.parent==t.parent?n._tree.ancestor:e}function Hu(n,t){return n.value-t.value}function Fu(n,t){var e=n._pack_next;n._pack_next=t,t._pack_prev=n,t._pack_next=e,e._pack_prev=t}function Ou(n,t){n._pack_next=t,t._pack_prev=n}function Yu(n,t){var e=t.x-n.x,r=t.y-n.y,u=n.r+t.r;return.999*u*u>e*e+r*r}function Iu(n){function t(n){l=Math.min(n.x-n.r,l),f=Math.max(n.x+n.r,f),h=Math.min(n.y-n.r,h),g=Math.max(n.y+n.r,g)}if((e=n.children)&&(s=e.length)){var e,r,u,i,o,a,c,s,l=1/0,f=-1/0,h=1/0,g=-1/0;if(e.forEach(Zu),r=e[0],r.x=-r.r,r.y=0,t(r),s>1&&(u=e[1],u.x=u.r,u.y=0,t(u),s>2))for(i=e[2],$u(r,u,i),t(i),Fu(r,i),r._pack_prev=i,Fu(i,u),u=r._pack_next,o=3;s>o;o++){$u(r,u,i=e[o]);var p=0,v=1,d=1;for(a=u._pack_next;a!==u;a=a._pack_next,v++)if(Yu(a,i)){p=1;break}if(1==p)for(c=r._pack_prev;c!==a._pack_prev&&!Yu(c,i);c=c._pack_prev,d++);p?(d>v||v==d&&u.r<r.r?Ou(r,u=a):Ou(r=c,u),o--):(Fu(r,i),u=i,t(i))}var m=(l+f)/2,y=(h+g)/2,x=0;for(o=0;s>o;o++)i=e[o],i.x-=m,i.y-=y,x=Math.max(x,i.r+Math.sqrt(i.x*i.x+i.y*i.y));n.r=x,e.forEach(Vu)}}function Zu(n){n._pack_next=n._pack_prev=n}function Vu(n){delete n._pack_next,delete n._pack_prev}function Xu(n,t,e,r){var u=n.children;if(n.x=t+=r*n.x,n.y=e+=r*n.y,n.r*=r,u)for(var i=-1,o=u.length;++i<o;)Xu(u[i],t,e,r)}function $u(n,t,e){var r=n.r+e.r,u=t.x-n.x,i=t.y-n.y;if(r&&(u||i)){var o=t.r+e.r,a=u*u+i*i;o*=o,r*=r;var c=.5+(r-o)/(2*a),s=Math.sqrt(Math.max(0,2*o*(r+a)-(r-=a)*r-o*o))/(2*a);e.x=n.x+c*u+s*i,e.y=n.y+c*i-s*u}else e.x=n.x+r,e.y=n.y}function Bu(n){return 1+$o.max(n,function(n){return n.y})}function Wu(n){return n.reduce(function(n,t){return n+t.x},0)/n.length}function Ju(n){var t=n.children;return t&&t.length?Ju(t[0]):n}function Gu(n){var t,e=n.children;return e&&(t=e.length)?Gu(e[t-1]):n}function Ku(n){return{x:n.x,y:n.y,dx:n.dx,dy:n.dy}}function Qu(n,t){var e=n.x+t[3],r=n.y+t[0],u=n.dx-t[1]-t[3],i=n.dy-t[0]-t[2];return 0>u&&(e+=u/2,u=0),0>i&&(r+=i/2,i=0),{x:e,y:r,dx:u,dy:i}}function ni(n){var t=n[0],e=n[n.length-1];return e>t?[t,e]:[e,t]}function ti(n){return n.rangeExtent?n.rangeExtent():ni(n.range())}function ei(n,t,e,r){var u=e(n[0],n[1]),i=r(t[0],t[1]);return function(n){return i(u(n))}}function ri(n,t){var e,r=0,u=n.length-1,i=n[r],o=n[u];return i>o&&(e=r,r=u,u=e,e=i,i=o,o=e),n[r]=t.floor(i),n[u]=t.ceil(o),n}function ui(n){return n?{floor:function(t){return Math.floor(t/n)*n},ceil:function(t){return Math.ceil(t/n)*n}}:ss}function ii(n,t,e,r){var u=[],i=[],o=0,a=Math.min(n.length,t.length)-1;for(n[a]<n[0]&&(n=n.slice().reverse(),t=t.slice().reverse());++o<=a;)u.push(e(n[o-1],n[o])),i.push(r(t[o-1],t[o]));return function(t){var e=$o.bisect(n,t,1,a)-1;return i[e](u[e](t))}}function oi(n,t,e,r){function u(){var u=Math.min(n.length,t.length)>2?ii:ei,c=r?ru:eu;return o=u(n,t,c,e),a=u(t,n,c,qr),i}function i(n){return o(n)}var o,a;return i.invert=function(n){return a(n)},i.domain=function(t){return arguments.length?(n=t.map(Number),u()):n},i.range=function(n){return arguments.length?(t=n,u()):t},i.rangeRound=function(n){return i.range(n).interpolate(Jr)},i.clamp=function(n){return arguments.length?(r=n,u()):r},i.interpolate=function(n){return arguments.length?(e=n,u()):e},i.ticks=function(t){return li(n,t)},i.tickFormat=function(t,e){return fi(n,t,e)},i.nice=function(t){return ci(n,t),u()},i.copy=function(){return oi(n,t,e,r)},u()}function ai(n,t){return $o.rebind(n,t,"range","rangeRound","interpolate","clamp")}function ci(n,t){return ri(n,ui(si(n,t)[2]))}function si(n,t){null==t&&(t=10);var e=ni(n),r=e[1]-e[0],u=Math.pow(10,Math.floor(Math.log(r/t)/Math.LN10)),i=t/r*u;return.15>=i?u*=10:.35>=i?u*=5:.75>=i&&(u*=2),e[0]=Math.ceil(e[0]/u)*u,e[1]=Math.floor(e[1]/u)*u+.5*u,e[2]=u,e}function li(n,t){return $o.range.apply($o,si(n,t))}function fi(n,t,e){var r=si(n,t);return $o.format(e?e.replace(uc,function(n,t,e,u,i,o,a,c,s,l){return[t,e,u,i,o,a,c,s||"."+gi(l,r),l].join("")}):",."+hi(r[2])+"f")}function hi(n){return-Math.floor(Math.log(n)/Math.LN10+.01)}function gi(n,t){var e=hi(t[2]);return n in ls?Math.abs(e-hi(Math.max(Math.abs(t[0]),Math.abs(t[1]))))+ +("e"!==n):e-2*("%"===n)}function pi(n,t,e,r){function u(n){return(e?Math.log(0>n?0:n):-Math.log(n>0?0:-n))/Math.log(t)}function i(n){return e?Math.pow(t,n):-Math.pow(t,-n)}function o(t){return n(u(t))}return o.invert=function(t){return i(n.invert(t))},o.domain=function(t){return arguments.length?(e=t[0]>=0,n.domain((r=t.map(Number)).map(u)),o):r},o.base=function(e){return arguments.length?(t=+e,n.domain(r.map(u)),o):t},o.nice=function(){var t=ri(r.map(u),e?Math:hs);return n.domain(t),r=t.map(i),o},o.ticks=function(){var n=ni(r),o=[],a=n[0],c=n[1],s=Math.floor(u(a)),l=Math.ceil(u(c)),f=t%1?2:t;if(isFinite(l-s)){if(e){for(;l>s;s++)for(var h=1;f>h;h++)o.push(i(s)*h);o.push(i(s))}else for(o.push(i(s));s++<l;)for(var h=f-1;h>0;h--)o.push(i(s)*h);for(s=0;o[s]<a;s++);for(l=o.length;o[l-1]>c;l--);o=o.slice(s,l)}return o},o.tickFormat=function(n,t){if(!arguments.length)return fs;arguments.length<2?t=fs:"function"!=typeof t&&(t=$o.format(t));var r,a=Math.max(.1,n/o.ticks().length),c=e?(r=1e-12,Math.ceil):(r=-1e-12,Math.floor);return function(n){return n/i(c(u(n)+r))<=a?t(n):""}},o.copy=function(){return pi(n.copy(),t,e,r)},ai(o,n)}function vi(n,t,e){function r(t){return n(u(t))}var u=di(t),i=di(1/t);return r.invert=function(t){return i(n.invert(t))},r.domain=function(t){return arguments.length?(n.domain((e=t.map(Number)).map(u)),r):e},r.ticks=function(n){return li(e,n)},r.tickFormat=function(n,t){return fi(e,n,t)},r.nice=function(n){return r.domain(ci(e,n))},r.exponent=function(o){return arguments.length?(u=di(t=o),i=di(1/t),n.domain(e.map(u)),r):t},r.copy=function(){return vi(n.copy(),t,e)},ai(r,n)}function di(n){return function(t){return 0>t?-Math.pow(-t,n):Math.pow(t,n)}}function mi(n,t){function e(e){return o[((i.get(e)||"range"===t.t&&i.set(e,n.push(e)))-1)%o.length]}function r(t,e){return $o.range(n.length).map(function(n){return t+e*n})}var i,o,a;return e.domain=function(r){if(!arguments.length)return n;n=[],i=new u;for(var o,a=-1,c=r.length;++a<c;)i.has(o=r[a])||i.set(o,n.push(o));return e[t.t].apply(e,t.a)},e.range=function(n){return arguments.length?(o=n,a=0,t={t:"range",a:arguments},e):o},e.rangePoints=function(u,i){arguments.length<2&&(i=0);var c=u[0],s=u[1],l=(s-c)/(Math.max(1,n.length-1)+i);return o=r(n.length<2?(c+s)/2:c+l*i/2,l),a=0,t={t:"rangePoints",a:arguments},e},e.rangeBands=function(u,i,c){arguments.length<2&&(i=0),arguments.length<3&&(c=i);var s=u[1]<u[0],l=u[s-0],f=u[1-s],h=(f-l)/(n.length-i+2*c);return o=r(l+h*c,h),s&&o.reverse(),a=h*(1-i),t={t:"rangeBands",a:arguments},e},e.rangeRoundBands=function(u,i,c){arguments.length<2&&(i=0),arguments.length<3&&(c=i);var s=u[1]<u[0],l=u[s-0],f=u[1-s],h=Math.floor((f-l)/(n.length-i+2*c)),g=f-l-(n.length-i)*h;return o=r(l+Math.round(g/2),h),s&&o.reverse(),a=Math.round(h*(1-i)),t={t:"rangeRoundBands",a:arguments},e},e.rangeBand=function(){return a},e.rangeExtent=function(){return ni(t.a[0])},e.copy=function(){return mi(n,t)},e.domain(n)}function yi(n,t){function e(){var e=0,i=t.length;for(u=[];++e<i;)u[e-1]=$o.quantile(n,e/i);return r}function r(n){return isNaN(n=+n)?void 0:t[$o.bisect(u,n)]}var u;return r.domain=function(t){return arguments.length?(n=t.filter(function(n){return!isNaN(n)}).sort($o.ascending),e()):n},r.range=function(n){return arguments.length?(t=n,e()):t},r.quantiles=function(){return u},r.invertExtent=function(e){return e=t.indexOf(e),0>e?[0/0,0/0]:[e>0?u[e-1]:n[0],e<u.length?u[e]:n[n.length-1]]},r.copy=function(){return yi(n,t)},e()}function xi(n,t,e){function r(t){return e[Math.max(0,Math.min(o,Math.floor(i*(t-n))))]}function u(){return i=e.length/(t-n),o=e.length-1,r}var i,o;return r.domain=function(e){return arguments.length?(n=+e[0],t=+e[e.length-1],u()):[n,t]},r.range=function(n){return arguments.length?(e=n,u()):e},r.invertExtent=function(t){return t=e.indexOf(t),t=0>t?0/0:t/i+n,[t,t+1/i]},r.copy=function(){return xi(n,t,e)},u()}function Mi(n,t){function e(e){return e>=e?t[$o.bisect(n,e)]:void 0}return e.domain=function(t){return arguments.length?(n=t,e):n},e.range=function(n){return arguments.length?(t=n,e):t},e.invertExtent=function(e){return e=t.indexOf(e),[n[e-1],n[e]]},e.copy=function(){return Mi(n,t)},e}function _i(n){function t(n){return+n}return t.invert=t,t.domain=t.range=function(e){return arguments.length?(n=e.map(t),t):n},t.ticks=function(t){return li(n,t)},t.tickFormat=function(t,e){return fi(n,t,e)},t.copy=function(){return _i(n)},t}function bi(n){return n.innerRadius}function wi(n){return n.outerRadius}function Si(n){return n.startAngle}function ki(n){return n.endAngle}function Ei(n){function t(t){function o(){s.push("M",i(n(l),a))}for(var c,s=[],l=[],f=-1,h=t.length,g=pt(e),p=pt(r);++f<h;)u.call(this,c=t[f],f)?l.push([+g.call(this,c,f),+p.call(this,c,f)]):l.length&&(o(),l=[]);return l.length&&o(),s.length?s.join(""):null}var e=Ze,r=Ve,u=Zt,i=Ai,o=i.key,a=.7;return t.x=function(n){return arguments.length?(e=n,t):e},t.y=function(n){return arguments.length?(r=n,t):r},t.defined=function(n){return arguments.length?(u=n,t):u},t.interpolate=function(n){return arguments.length?(o="function"==typeof n?i=n:(i=xs.get(n)||Ai).key,t):o},t.tension=function(n){return arguments.length?(a=n,t):a},t}function Ai(n){return n.join("L")}function Ci(n){return Ai(n)+"Z"}function Ni(n){for(var t=0,e=n.length,r=n[0],u=[r[0],",",r[1]];++t<e;)u.push("H",(r[0]+(r=n[t])[0])/2,"V",r[1]);return e>1&&u.push("H",r[0]),u.join("")}function Li(n){for(var t=0,e=n.length,r=n[0],u=[r[0],",",r[1]];++t<e;)u.push("V",(r=n[t])[1],"H",r[0]);return u.join("")}function Ti(n){for(var t=0,e=n.length,r=n[0],u=[r[0],",",r[1]];++t<e;)u.push("H",(r=n[t])[0],"V",r[1]);return u.join("")}function qi(n,t){return n.length<4?Ai(n):n[1]+Di(n.slice(1,n.length-1),Pi(n,t))}function zi(n,t){return n.length<3?Ai(n):n[0]+Di((n.push(n[0]),n),Pi([n[n.length-2]].concat(n,[n[1]]),t))}function Ri(n,t){return n.length<3?Ai(n):n[0]+Di(n,Pi(n,t))}function Di(n,t){if(t.length<1||n.length!=t.length&&n.length!=t.length+2)return Ai(n);var e=n.length!=t.length,r="",u=n[0],i=n[1],o=t[0],a=o,c=1;if(e&&(r+="Q"+(i[0]-2*o[0]/3)+","+(i[1]-2*o[1]/3)+","+i[0]+","+i[1],u=n[1],c=2),t.length>1){a=t[1],i=n[c],c++,r+="C"+(u[0]+o[0])+","+(u[1]+o[1])+","+(i[0]-a[0])+","+(i[1]-a[1])+","+i[0]+","+i[1];for(var s=2;s<t.length;s++,c++)i=n[c],a=t[s],r+="S"+(i[0]-a[0])+","+(i[1]-a[1])+","+i[0]+","+i[1]}if(e){var l=n[c];r+="Q"+(i[0]+2*a[0]/3)+","+(i[1]+2*a[1]/3)+","+l[0]+","+l[1]}return r}function Pi(n,t){for(var e,r=[],u=(1-t)/2,i=n[0],o=n[1],a=1,c=n.length;++a<c;)e=i,i=o,o=n[a],r.push([u*(o[0]-e[0]),u*(o[1]-e[1])]);return r}function Ui(n){if(n.length<3)return Ai(n);var t=1,e=n.length,r=n[0],u=r[0],i=r[1],o=[u,u,u,(r=n[1])[0]],a=[i,i,i,r[1]],c=[u,",",i,"L",Oi(bs,o),",",Oi(bs,a)];for(n.push(n[e-1]);++t<=e;)r=n[t],o.shift(),o.push(r[0]),a.shift(),a.push(r[1]),Yi(c,o,a);return n.pop(),c.push("L",r),c.join("")}function ji(n){if(n.length<4)return Ai(n);for(var t,e=[],r=-1,u=n.length,i=[0],o=[0];++r<3;)t=n[r],i.push(t[0]),o.push(t[1]);for(e.push(Oi(bs,i)+","+Oi(bs,o)),--r;++r<u;)t=n[r],i.shift(),i.push(t[0]),o.shift(),o.push(t[1]),Yi(e,i,o);return e.join("")}function Hi(n){for(var t,e,r=-1,u=n.length,i=u+4,o=[],a=[];++r<4;)e=n[r%u],o.push(e[0]),a.push(e[1]);for(t=[Oi(bs,o),",",Oi(bs,a)],--r;++r<i;)e=n[r%u],o.shift(),o.push(e[0]),a.shift(),a.push(e[1]),Yi(t,o,a);return t.join("")}function Fi(n,t){var e=n.length-1;if(e)for(var r,u,i=n[0][0],o=n[0][1],a=n[e][0]-i,c=n[e][1]-o,s=-1;++s<=e;)r=n[s],u=s/e,r[0]=t*r[0]+(1-t)*(i+u*a),r[1]=t*r[1]+(1-t)*(o+u*c);return Ui(n)}function Oi(n,t){return n[0]*t[0]+n[1]*t[1]+n[2]*t[2]+n[3]*t[3]}function Yi(n,t,e){n.push("C",Oi(Ms,t),",",Oi(Ms,e),",",Oi(_s,t),",",Oi(_s,e),",",Oi(bs,t),",",Oi(bs,e))}function Ii(n,t){return(t[1]-n[1])/(t[0]-n[0])}function Zi(n){for(var t=0,e=n.length-1,r=[],u=n[0],i=n[1],o=r[0]=Ii(u,i);++t<e;)r[t]=(o+(o=Ii(u=i,i=n[t+1])))/2;return r[t]=o,r}function Vi(n){for(var t,e,r,u,i=[],o=Zi(n),a=-1,c=n.length-1;++a<c;)t=Ii(n[a],n[a+1]),aa(t)<Ca?o[a]=o[a+1]=0:(e=o[a]/t,r=o[a+1]/t,u=e*e+r*r,u>9&&(u=3*t/Math.sqrt(u),o[a]=u*e,o[a+1]=u*r));for(a=-1;++a<=c;)u=(n[Math.min(c,a+1)][0]-n[Math.max(0,a-1)][0])/(6*(1+o[a]*o[a])),i.push([u||0,o[a]*u||0]);return i}function Xi(n){return n.length<3?Ai(n):n[0]+Di(n,Vi(n))}function $i(n){for(var t,e,r,u=-1,i=n.length;++u<i;)t=n[u],e=t[0],r=t[1]+ms,t[0]=e*Math.cos(r),t[1]=e*Math.sin(r);return n}function Bi(n){function t(t){function c(){v.push("M",a(n(m),f),l,s(n(d.reverse()),f),"Z")}for(var h,g,p,v=[],d=[],m=[],y=-1,x=t.length,M=pt(e),_=pt(u),b=e===r?function(){return g}:pt(r),w=u===i?function(){return p}:pt(i);++y<x;)o.call(this,h=t[y],y)?(d.push([g=+M.call(this,h,y),p=+_.call(this,h,y)]),m.push([+b.call(this,h,y),+w.call(this,h,y)])):d.length&&(c(),d=[],m=[]);return d.length&&c(),v.length?v.join(""):null}var e=Ze,r=Ze,u=0,i=Ve,o=Zt,a=Ai,c=a.key,s=a,l="L",f=.7;return t.x=function(n){return arguments.length?(e=r=n,t):r},t.x0=function(n){return arguments.length?(e=n,t):e},t.x1=function(n){return arguments.length?(r=n,t):r},t.y=function(n){return arguments.length?(u=i=n,t):i},t.y0=function(n){return arguments.length?(u=n,t):u},t.y1=function(n){return arguments.length?(i=n,t):i},t.defined=function(n){return arguments.length?(o=n,t):o},t.interpolate=function(n){return arguments.length?(c="function"==typeof n?a=n:(a=xs.get(n)||Ai).key,s=a.reverse||a,l=a.closed?"M":"L",t):c},t.tension=function(n){return arguments.length?(f=n,t):f},t}function Wi(n){return n.radius}function Ji(n){return[n.x,n.y]}function Gi(n){return function(){var t=n.apply(this,arguments),e=t[0],r=t[1]+ms;return[e*Math.cos(r),e*Math.sin(r)]}}function Ki(){return 64}function Qi(){return"circle"}function no(n){var t=Math.sqrt(n/ka);return"M0,"+t+"A"+t+","+t+" 0 1,1 0,"+-t+"A"+t+","+t+" 0 1,1 0,"+t+"Z"}function to(n,t){return ha(n,Cs),n.id=t,n}function eo(n,t,e,r){var u=n.id;return C(n,"function"==typeof e?function(n,i,o){n.__transition__[u].tween.set(t,r(e.call(n,n.__data__,i,o)))}:(e=r(e),function(n){n.__transition__[u].tween.set(t,e)}))}function ro(n){return null==n&&(n=""),function(){this.textContent=n}}function uo(n,t,e,r){var i=n.__transition__||(n.__transition__={active:0,count:0}),o=i[e];if(!o){var a=r.time;o=i[e]={tween:new u,time:a,ease:r.ease,delay:r.delay,duration:r.duration},++i.count,$o.timer(function(r){function u(r){return i.active>e?s():(i.active=e,o.event&&o.event.start.call(n,l,t),o.tween.forEach(function(e,r){(r=r.call(n,l,t))&&v.push(r)}),$o.timer(function(){return p.c=c(r||1)?Zt:c,1},0,a),void 0)}function c(r){if(i.active!==e)return s();for(var u=r/g,a=f(u),c=v.length;c>0;)v[--c].call(n,a);return u>=1?(o.event&&o.event.end.call(n,l,t),s()):void 0}function s(){return--i.count?delete i[e]:delete n.__transition__,1}var l=n.__data__,f=o.ease,h=o.delay,g=o.duration,p=Ga,v=[];return p.t=h+a,r>=h?u(r-h):(p.c=u,void 0)},0,a)}}function io(n,t){n.attr("transform",function(n){return"translate("+t(n)+",0)"})}function oo(n,t){n.attr("transform",function(n){return"translate(0,"+t(n)+")"})}function ao(){this._=new Date(arguments.length>1?Date.UTC.apply(this,arguments):arguments[0])}function co(n,t,e){function r(t){var e=n(t),r=i(e,1);return r-t>t-e?e:r}function u(e){return t(e=n(new Ds(e-1)),1),e}function i(n,e){return t(n=new Ds(+n),e),n}function o(n,r,i){var o=u(n),a=[];if(i>1)for(;r>o;)e(o)%i||a.push(new Date(+o)),t(o,1);else for(;r>o;)a.push(new Date(+o)),t(o,1);return a}function a(n,t,e){try{Ds=ao;var r=new ao;return r._=n,o(r,t,e)}finally{Ds=Date}}n.floor=n,n.round=r,n.ceil=u,n.offset=i,n.range=o;var c=n.utc=so(n);return c.floor=c,c.round=so(r),c.ceil=so(u),c.offset=so(i),c.range=a,n}function so(n){return function(t,e){try{Ds=ao;var r=new ao;return r._=t,n(r,e)._}finally{Ds=Date}}}function lo(n){function t(t){for(var r,u,i,o=[],a=-1,c=0;++a<e;)37===n.charCodeAt(a)&&(o.push(n.substring(c,a)),null!=(u=nl[r=n.charAt(++a)])&&(r=n.charAt(++a)),(i=tl[r])&&(r=i(t,null==u?"e"===r?" ":"0":u)),o.push(r),c=a+1);return o.push(n.substring(c,a)),o.join("")}var e=n.length;return t.parse=function(t){var e={y:1900,m:0,d:1,H:0,M:0,S:0,L:0,Z:null},r=fo(e,n,t,0);if(r!=t.length)return null;"p"in e&&(e.H=e.H%12+12*e.p);var u=null!=e.Z&&Ds!==ao,i=new(u?ao:Ds);return"j"in e?i.setFullYear(e.y,0,e.j):"w"in e&&("W"in e||"U"in e)?(i.setFullYear(e.y,0,1),i.setFullYear(e.y,0,"W"in e?(e.w+6)%7+7*e.W-(i.getDay()+5)%7:e.w+7*e.U-(i.getDay()+6)%7)):i.setFullYear(e.y,e.m,e.d),i.setHours(e.H+Math.floor(e.Z/100),e.M+e.Z%100,e.S,e.L),u?i._:i},t.toString=function(){return n},t}function fo(n,t,e,r){for(var u,i,o,a=0,c=t.length,s=e.length;c>a;){if(r>=s)return-1;if(u=t.charCodeAt(a++),37===u){if(o=t.charAt(a++),i=el[o in nl?t.charAt(a++):o],!i||(r=i(n,e,r))<0)return-1}else if(u!=e.charCodeAt(r++))return-1}return r}function ho(n){return new RegExp("^(?:"+n.map($o.requote).join("|")+")","i")}function go(n){for(var t=new u,e=-1,r=n.length;++e<r;)t.set(n[e].toLowerCase(),e);return t}function po(n,t,e){var r=0>n?"-":"",u=(r?-n:n)+"",i=u.length;return r+(e>i?new Array(e-i+1).join(t)+u:u)}function vo(n,t,e){$s.lastIndex=0;var r=$s.exec(t.substring(e));return r?(n.w=Bs.get(r[0].toLowerCase()),e+r[0].length):-1}function mo(n,t,e){Vs.lastIndex=0;var r=Vs.exec(t.substring(e));return r?(n.w=Xs.get(r[0].toLowerCase()),e+r[0].length):-1}function yo(n,t,e){rl.lastIndex=0;var r=rl.exec(t.substring(e,e+1));return r?(n.w=+r[0],e+r[0].length):-1}function xo(n,t,e){rl.lastIndex=0;var r=rl.exec(t.substring(e));return r?(n.U=+r[0],e+r[0].length):-1}function Mo(n,t,e){rl.lastIndex=0;var r=rl.exec(t.substring(e));return r?(n.W=+r[0],e+r[0].length):-1}function _o(n,t,e){Gs.lastIndex=0;var r=Gs.exec(t.substring(e));return r?(n.m=Ks.get(r[0].toLowerCase()),e+r[0].length):-1}function bo(n,t,e){Ws.lastIndex=0;var r=Ws.exec(t.substring(e));return r?(n.m=Js.get(r[0].toLowerCase()),e+r[0].length):-1}function wo(n,t,e){return fo(n,tl.c.toString(),t,e)}function So(n,t,e){return fo(n,tl.x.toString(),t,e)}function ko(n,t,e){return fo(n,tl.X.toString(),t,e)}function Eo(n,t,e){rl.lastIndex=0;var r=rl.exec(t.substring(e,e+4));return r?(n.y=+r[0],e+r[0].length):-1}function Ao(n,t,e){rl.lastIndex=0;var r=rl.exec(t.substring(e,e+2));return r?(n.y=No(+r[0]),e+r[0].length):-1}function Co(n,t,e){return/^[+-]\d{4}$/.test(t=t.substring(e,e+5))?(n.Z=+t,e+5):-1}function No(n){return n+(n>68?1900:2e3)}function Lo(n,t,e){rl.lastIndex=0;var r=rl.exec(t.substring(e,e+2));return r?(n.m=r[0]-1,e+r[0].length):-1}function To(n,t,e){rl.lastIndex=0;var r=rl.exec(t.substring(e,e+2));return r?(n.d=+r[0],e+r[0].length):-1}function qo(n,t,e){rl.lastIndex=0;var r=rl.exec(t.substring(e,e+3));return r?(n.j=+r[0],e+r[0].length):-1}function zo(n,t,e){rl.lastIndex=0;var r=rl.exec(t.substring(e,e+2));return r?(n.H=+r[0],e+r[0].length):-1}function Ro(n,t,e){rl.lastIndex=0;var r=rl.exec(t.substring(e,e+2));return r?(n.M=+r[0],e+r[0].length):-1}function Do(n,t,e){rl.lastIndex=0;var r=rl.exec(t.substring(e,e+2));return r?(n.S=+r[0],e+r[0].length):-1}function Po(n,t,e){rl.lastIndex=0;var r=rl.exec(t.substring(e,e+3));return r?(n.L=+r[0],e+r[0].length):-1}function Uo(n,t,e){var r=ul.get(t.substring(e,e+=2).toLowerCase());return null==r?-1:(n.p=r,e)}function jo(n){var t=n.getTimezoneOffset(),e=t>0?"-":"+",r=~~(aa(t)/60),u=aa(t)%60;return e+po(r,"0",2)+po(u,"0",2)}function Ho(n,t,e){Qs.lastIndex=0;var r=Qs.exec(t.substring(e,e+1));return r?e+r[0].length:-1}function Fo(n){function t(n){try{Ds=ao;var t=new Ds;return t._=n,e(t)}finally{Ds=Date}}var e=lo(n);return t.parse=function(n){try{Ds=ao;var t=e.parse(n);return t&&t._}finally{Ds=Date}},t.toString=e.toString,t}function Oo(n){return n.toISOString()}function Yo(n,t,e){function r(t){return n(t)}function u(n,e){var r=n[1]-n[0],u=r/e,i=$o.bisect(ol,u);return i==ol.length?[t.year,si(n.map(function(n){return n/31536e6}),e)[2]]:i?t[u/ol[i-1]<ol[i]/u?i-1:i]:[ll,si(n,e)[2]]}return r.invert=function(t){return Io(n.invert(t))},r.domain=function(t){return arguments.length?(n.domain(t),r):n.domain().map(Io)},r.nice=function(n,t){function e(e){return!isNaN(e)&&!n.range(e,Io(+e+1),t).length}var i=r.domain(),o=ni(i),a=null==n?u(o,10):"number"==typeof n&&u(o,n);return a&&(n=a[0],t=a[1]),r.domain(ri(i,t>1?{floor:function(t){for(;e(t=n.floor(t));)t=Io(t-1);return t},ceil:function(t){for(;e(t=n.ceil(t));)t=Io(+t+1);return t}}:n))},r.ticks=function(n,t){var e=ni(r.domain()),i=null==n?u(e,10):"number"==typeof n?u(e,n):!n.range&&[{range:n},t];return i&&(n=i[0],t=i[1]),n.range(e[0],Io(+e[1]+1),1>t?1:t)},r.tickFormat=function(){return e},r.copy=function(){return Yo(n.copy(),t,e)},ai(r,n)}function Io(n){return new Date(n)}function Zo(n){return function(t){for(var e=n.length-1,r=n[e];!r[1](t);)r=n[--e];return r[0](t)}}function Vo(n){return JSON.parse(n.responseText)}function Xo(n){var t=Jo.createRange();return t.selectNode(Jo.body),t.createContextualFragment(n.responseText)}var $o={version:"3.3.9"};Date.now||(Date.now=function(){return+new Date});var Bo=[].slice,Wo=function(n){return Bo.call(n)},Jo=document,Go=Jo.documentElement,Ko=window;try{Wo(Go.childNodes)[0].nodeType}catch(Qo){Wo=function(n){for(var t=n.length,e=new Array(t);t--;)e[t]=n[t];return e}}try{Jo.createElement("div").style.setProperty("opacity",0,"")}catch(na){var ta=Ko.Element.prototype,ea=ta.setAttribute,ra=ta.setAttributeNS,ua=Ko.CSSStyleDeclaration.prototype,ia=ua.setProperty;ta.setAttribute=function(n,t){ea.call(this,n,t+"")},ta.setAttributeNS=function(n,t,e){ra.call(this,n,t,e+"")},ua.setProperty=function(n,t,e){ia.call(this,n,t+"",e)}}$o.ascending=function(n,t){return t>n?-1:n>t?1:n>=t?0:0/0},$o.descending=function(n,t){return n>t?-1:t>n?1:t>=n?0:0/0},$o.min=function(n,t){var e,r,u=-1,i=n.length;if(1===arguments.length){for(;++u<i&&!(null!=(e=n[u])&&e>=e);)e=void 0;for(;++u<i;)null!=(r=n[u])&&e>r&&(e=r)}else{for(;++u<i&&!(null!=(e=t.call(n,n[u],u))&&e>=e);)e=void 0;for(;++u<i;)null!=(r=t.call(n,n[u],u))&&e>r&&(e=r)}return e},$o.max=function(n,t){var e,r,u=-1,i=n.length;if(1===arguments.length){for(;++u<i&&!(null!=(e=n[u])&&e>=e);)e=void 0;for(;++u<i;)null!=(r=n[u])&&r>e&&(e=r)}else{for(;++u<i&&!(null!=(e=t.call(n,n[u],u))&&e>=e);)e=void 0;for(;++u<i;)null!=(r=t.call(n,n[u],u))&&r>e&&(e=r)}return e},$o.extent=function(n,t){var e,r,u,i=-1,o=n.length;if(1===arguments.length){for(;++i<o&&!(null!=(e=u=n[i])&&e>=e);)e=u=void 0;for(;++i<o;)null!=(r=n[i])&&(e>r&&(e=r),r>u&&(u=r))}else{for(;++i<o&&!(null!=(e=u=t.call(n,n[i],i))&&e>=e);)e=void 0;for(;++i<o;)null!=(r=t.call(n,n[i],i))&&(e>r&&(e=r),r>u&&(u=r))}return[e,u]},$o.sum=function(n,t){var e,r=0,u=n.length,i=-1;if(1===arguments.length)for(;++i<u;)isNaN(e=+n[i])||(r+=e);else for(;++i<u;)isNaN(e=+t.call(n,n[i],i))||(r+=e);return r},$o.mean=function(t,e){var r,u=t.length,i=0,o=-1,a=0;if(1===arguments.length)for(;++o<u;)n(r=t[o])&&(i+=(r-i)/++a);else for(;++o<u;)n(r=e.call(t,t[o],o))&&(i+=(r-i)/++a);return a?i:void 0},$o.quantile=function(n,t){var e=(n.length-1)*t+1,r=Math.floor(e),u=+n[r-1],i=e-r; +return i?u+i*(n[r]-u):u},$o.median=function(t,e){return arguments.length>1&&(t=t.map(e)),t=t.filter(n),t.length?$o.quantile(t.sort($o.ascending),.5):void 0},$o.bisector=function(n){return{left:function(t,e,r,u){for(arguments.length<3&&(r=0),arguments.length<4&&(u=t.length);u>r;){var i=r+u>>>1;n.call(t,t[i],i)<e?r=i+1:u=i}return r},right:function(t,e,r,u){for(arguments.length<3&&(r=0),arguments.length<4&&(u=t.length);u>r;){var i=r+u>>>1;e<n.call(t,t[i],i)?u=i:r=i+1}return r}}};var oa=$o.bisector(function(n){return n});$o.bisectLeft=oa.left,$o.bisect=$o.bisectRight=oa.right,$o.shuffle=function(n){for(var t,e,r=n.length;r;)e=0|Math.random()*r--,t=n[r],n[r]=n[e],n[e]=t;return n},$o.permute=function(n,t){for(var e=t.length,r=new Array(e);e--;)r[e]=n[t[e]];return r},$o.pairs=function(n){for(var t,e=0,r=n.length-1,u=n[0],i=new Array(0>r?0:r);r>e;)i[e]=[t=u,u=n[++e]];return i},$o.zip=function(){if(!(u=arguments.length))return[];for(var n=-1,e=$o.min(arguments,t),r=new Array(e);++n<e;)for(var u,i=-1,o=r[n]=new Array(u);++i<u;)o[i]=arguments[i][n];return r},$o.transpose=function(n){return $o.zip.apply($o,n)},$o.keys=function(n){var t=[];for(var e in n)t.push(e);return t},$o.values=function(n){var t=[];for(var e in n)t.push(n[e]);return t},$o.entries=function(n){var t=[];for(var e in n)t.push({key:e,value:n[e]});return t},$o.merge=function(n){for(var t,e,r,u=n.length,i=-1,o=0;++i<u;)o+=n[i].length;for(e=new Array(o);--u>=0;)for(r=n[u],t=r.length;--t>=0;)e[--o]=r[t];return e};var aa=Math.abs;$o.range=function(n,t,r){if(arguments.length<3&&(r=1,arguments.length<2&&(t=n,n=0)),1/0===(t-n)/r)throw new Error("infinite range");var u,i=[],o=e(aa(r)),a=-1;if(n*=o,t*=o,r*=o,0>r)for(;(u=n+r*++a)>t;)i.push(u/o);else for(;(u=n+r*++a)<t;)i.push(u/o);return i},$o.map=function(n){var t=new u;if(n instanceof u)n.forEach(function(n,e){t.set(n,e)});else for(var e in n)t.set(e,n[e]);return t},r(u,{has:function(n){return ca+n in this},get:function(n){return this[ca+n]},set:function(n,t){return this[ca+n]=t},remove:function(n){return n=ca+n,n in this&&delete this[n]},keys:function(){var n=[];return this.forEach(function(t){n.push(t)}),n},values:function(){var n=[];return this.forEach(function(t,e){n.push(e)}),n},entries:function(){var n=[];return this.forEach(function(t,e){n.push({key:t,value:e})}),n},forEach:function(n){for(var t in this)t.charCodeAt(0)===sa&&n.call(this,t.substring(1),this[t])}});var ca="\x00",sa=ca.charCodeAt(0);$o.nest=function(){function n(t,a,c){if(c>=o.length)return r?r.call(i,a):e?a.sort(e):a;for(var s,l,f,h,g=-1,p=a.length,v=o[c++],d=new u;++g<p;)(h=d.get(s=v(l=a[g])))?h.push(l):d.set(s,[l]);return t?(l=t(),f=function(e,r){l.set(e,n(t,r,c))}):(l={},f=function(e,r){l[e]=n(t,r,c)}),d.forEach(f),l}function t(n,e){if(e>=o.length)return n;var r=[],u=a[e++];return n.forEach(function(n,u){r.push({key:n,values:t(u,e)})}),u?r.sort(function(n,t){return u(n.key,t.key)}):r}var e,r,i={},o=[],a=[];return i.map=function(t,e){return n(e,t,0)},i.entries=function(e){return t(n($o.map,e,0),0)},i.key=function(n){return o.push(n),i},i.sortKeys=function(n){return a[o.length-1]=n,i},i.sortValues=function(n){return e=n,i},i.rollup=function(n){return r=n,i},i},$o.set=function(n){var t=new i;if(n)for(var e=0,r=n.length;r>e;++e)t.add(n[e]);return t},r(i,{has:function(n){return ca+n in this},add:function(n){return this[ca+n]=!0,n},remove:function(n){return n=ca+n,n in this&&delete this[n]},values:function(){var n=[];return this.forEach(function(t){n.push(t)}),n},forEach:function(n){for(var t in this)t.charCodeAt(0)===sa&&n.call(this,t.substring(1))}}),$o.behavior={},$o.rebind=function(n,t){for(var e,r=1,u=arguments.length;++r<u;)n[e=arguments[r]]=o(n,t,t[e]);return n};var la=["webkit","ms","moz","Moz","o","O"];$o.dispatch=function(){for(var n=new s,t=-1,e=arguments.length;++t<e;)n[arguments[t]]=l(n);return n},s.prototype.on=function(n,t){var e=n.indexOf("."),r="";if(e>=0&&(r=n.substring(e+1),n=n.substring(0,e)),n)return arguments.length<2?this[n].on(r):this[n].on(r,t);if(2===arguments.length){if(null==t)for(n in this)this.hasOwnProperty(n)&&this[n].on(r,null);return this}},$o.event=null,$o.requote=function(n){return n.replace(fa,"\\$&")};var fa=/[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g,ha={}.__proto__?function(n,t){n.__proto__=t}:function(n,t){for(var e in t)n[e]=t[e]},ga=function(n,t){return t.querySelector(n)},pa=function(n,t){return t.querySelectorAll(n)},va=Go[a(Go,"matchesSelector")],da=function(n,t){return va.call(n,t)};"function"==typeof Sizzle&&(ga=function(n,t){return Sizzle(n,t)[0]||null},pa=function(n,t){return Sizzle.uniqueSort(Sizzle(n,t))},da=Sizzle.matchesSelector),$o.selection=function(){return Ma};var ma=$o.selection.prototype=[];ma.select=function(n){var t,e,r,u,i=[];n=v(n);for(var o=-1,a=this.length;++o<a;){i.push(t=[]),t.parentNode=(r=this[o]).parentNode;for(var c=-1,s=r.length;++c<s;)(u=r[c])?(t.push(e=n.call(u,u.__data__,c,o)),e&&"__data__"in u&&(e.__data__=u.__data__)):t.push(null)}return p(i)},ma.selectAll=function(n){var t,e,r=[];n=d(n);for(var u=-1,i=this.length;++u<i;)for(var o=this[u],a=-1,c=o.length;++a<c;)(e=o[a])&&(r.push(t=Wo(n.call(e,e.__data__,a,u))),t.parentNode=e);return p(r)};var ya={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/"};$o.ns={prefix:ya,qualify:function(n){var t=n.indexOf(":"),e=n;return t>=0&&(e=n.substring(0,t),n=n.substring(t+1)),ya.hasOwnProperty(e)?{space:ya[e],local:n}:n}},ma.attr=function(n,t){if(arguments.length<2){if("string"==typeof n){var e=this.node();return n=$o.ns.qualify(n),n.local?e.getAttributeNS(n.space,n.local):e.getAttribute(n)}for(t in n)this.each(m(t,n[t]));return this}return this.each(m(n,t))},ma.classed=function(n,t){if(arguments.length<2){if("string"==typeof n){var e=this.node(),r=(n=n.trim().split(/^|\s+/g)).length,u=-1;if(t=e.classList){for(;++u<r;)if(!t.contains(n[u]))return!1}else for(t=e.getAttribute("class");++u<r;)if(!x(n[u]).test(t))return!1;return!0}for(t in n)this.each(M(t,n[t]));return this}return this.each(M(n,t))},ma.style=function(n,t,e){var r=arguments.length;if(3>r){if("string"!=typeof n){2>r&&(t="");for(e in n)this.each(b(e,n[e],t));return this}if(2>r)return Ko.getComputedStyle(this.node(),null).getPropertyValue(n);e=""}return this.each(b(n,t,e))},ma.property=function(n,t){if(arguments.length<2){if("string"==typeof n)return this.node()[n];for(t in n)this.each(w(t,n[t]));return this}return this.each(w(n,t))},ma.text=function(n){return arguments.length?this.each("function"==typeof n?function(){var t=n.apply(this,arguments);this.textContent=null==t?"":t}:null==n?function(){this.textContent=""}:function(){this.textContent=n}):this.node().textContent},ma.html=function(n){return arguments.length?this.each("function"==typeof n?function(){var t=n.apply(this,arguments);this.innerHTML=null==t?"":t}:null==n?function(){this.innerHTML=""}:function(){this.innerHTML=n}):this.node().innerHTML},ma.append=function(n){return n=S(n),this.select(function(){return this.appendChild(n.apply(this,arguments))})},ma.insert=function(n,t){return n=S(n),t=v(t),this.select(function(){return this.insertBefore(n.apply(this,arguments),t.apply(this,arguments)||null)})},ma.remove=function(){return this.each(function(){var n=this.parentNode;n&&n.removeChild(this)})},ma.data=function(n,t){function e(n,e){var r,i,o,a=n.length,f=e.length,h=Math.min(a,f),g=new Array(f),p=new Array(f),v=new Array(a);if(t){var d,m=new u,y=new u,x=[];for(r=-1;++r<a;)d=t.call(i=n[r],i.__data__,r),m.has(d)?v[r]=i:m.set(d,i),x.push(d);for(r=-1;++r<f;)d=t.call(e,o=e[r],r),(i=m.get(d))?(g[r]=i,i.__data__=o):y.has(d)||(p[r]=k(o)),y.set(d,o),m.remove(d);for(r=-1;++r<a;)m.has(x[r])&&(v[r]=n[r])}else{for(r=-1;++r<h;)i=n[r],o=e[r],i?(i.__data__=o,g[r]=i):p[r]=k(o);for(;f>r;++r)p[r]=k(e[r]);for(;a>r;++r)v[r]=n[r]}p.update=g,p.parentNode=g.parentNode=v.parentNode=n.parentNode,c.push(p),s.push(g),l.push(v)}var r,i,o=-1,a=this.length;if(!arguments.length){for(n=new Array(a=(r=this[0]).length);++o<a;)(i=r[o])&&(n[o]=i.__data__);return n}var c=N([]),s=p([]),l=p([]);if("function"==typeof n)for(;++o<a;)e(r=this[o],n.call(r,r.parentNode.__data__,o));else for(;++o<a;)e(r=this[o],n);return s.enter=function(){return c},s.exit=function(){return l},s},ma.datum=function(n){return arguments.length?this.property("__data__",n):this.property("__data__")},ma.filter=function(n){var t,e,r,u=[];"function"!=typeof n&&(n=E(n));for(var i=0,o=this.length;o>i;i++){u.push(t=[]),t.parentNode=(e=this[i]).parentNode;for(var a=0,c=e.length;c>a;a++)(r=e[a])&&n.call(r,r.__data__,a)&&t.push(r)}return p(u)},ma.order=function(){for(var n=-1,t=this.length;++n<t;)for(var e,r=this[n],u=r.length-1,i=r[u];--u>=0;)(e=r[u])&&(i&&i!==e.nextSibling&&i.parentNode.insertBefore(e,i),i=e);return this},ma.sort=function(n){n=A.apply(this,arguments);for(var t=-1,e=this.length;++t<e;)this[t].sort(n);return this.order()},ma.each=function(n){return C(this,function(t,e,r){n.call(t,t.__data__,e,r)})},ma.call=function(n){var t=Wo(arguments);return n.apply(t[0]=this,t),this},ma.empty=function(){return!this.node()},ma.node=function(){for(var n=0,t=this.length;t>n;n++)for(var e=this[n],r=0,u=e.length;u>r;r++){var i=e[r];if(i)return i}return null},ma.size=function(){var n=0;return this.each(function(){++n}),n};var xa=[];$o.selection.enter=N,$o.selection.enter.prototype=xa,xa.append=ma.append,xa.empty=ma.empty,xa.node=ma.node,xa.call=ma.call,xa.size=ma.size,xa.select=function(n){for(var t,e,r,u,i,o=[],a=-1,c=this.length;++a<c;){r=(u=this[a]).update,o.push(t=[]),t.parentNode=u.parentNode;for(var s=-1,l=u.length;++s<l;)(i=u[s])?(t.push(r[s]=e=n.call(u.parentNode,i.__data__,s,a)),e.__data__=i.__data__):t.push(null)}return p(o)},xa.insert=function(n,t){return arguments.length<2&&(t=L(this)),ma.insert.call(this,n,t)},ma.transition=function(){for(var n,t,e=Ss||++Ns,r=[],u=ks||{time:Date.now(),ease:Hr,delay:0,duration:250},i=-1,o=this.length;++i<o;){r.push(n=[]);for(var a=this[i],c=-1,s=a.length;++c<s;)(t=a[c])&&uo(t,c,e,u),n.push(t)}return to(r,e)},ma.interrupt=function(){return this.each(T)},$o.select=function(n){var t=["string"==typeof n?ga(n,Jo):n];return t.parentNode=Go,p([t])},$o.selectAll=function(n){var t=Wo("string"==typeof n?pa(n,Jo):n);return t.parentNode=Go,p([t])};var Ma=$o.select(Go);ma.on=function(n,t,e){var r=arguments.length;if(3>r){if("string"!=typeof n){2>r&&(t=!1);for(e in n)this.each(q(e,n[e],t));return this}if(2>r)return(r=this.node()["__on"+n])&&r._;e=!1}return this.each(q(n,t,e))};var _a=$o.map({mouseenter:"mouseover",mouseleave:"mouseout"});_a.forEach(function(n){"on"+n in Jo&&_a.remove(n)});var ba="onselectstart"in Jo?null:a(Go.style,"userSelect"),wa=0;$o.mouse=function(n){return P(n,h())};var Sa=/WebKit/.test(Ko.navigator.userAgent)?-1:0;$o.touches=function(n,t){return arguments.length<2&&(t=h().touches),t?Wo(t).map(function(t){var e=P(n,t);return e.identifier=t.identifier,e}):[]},$o.behavior.drag=function(){function n(){this.on("mousedown.drag",o).on("touchstart.drag",a)}function t(){return $o.event.changedTouches[0].identifier}function e(n,t){return $o.touches(n).filter(function(n){return n.identifier===t})[0]}function r(n,t,e,r){return function(){function o(){var n=t(l,g),e=n[0]-v[0],r=n[1]-v[1];d|=e|r,v=n,f({type:"drag",x:n[0]+c[0],y:n[1]+c[1],dx:e,dy:r})}function a(){m.on(e+"."+p,null).on(r+"."+p,null),y(d&&$o.event.target===h),f({type:"dragend"})}var c,s=this,l=s.parentNode,f=u.of(s,arguments),h=$o.event.target,g=n(),p=null==g?"drag":"drag-"+g,v=t(l,g),d=0,m=$o.select(Ko).on(e+"."+p,o).on(r+"."+p,a),y=D();i?(c=i.apply(s,arguments),c=[c.x-v[0],c.y-v[1]]):c=[0,0],f({type:"dragstart"})}}var u=g(n,"drag","dragstart","dragend"),i=null,o=r(c,$o.mouse,"mousemove","mouseup"),a=r(t,e,"touchmove","touchend");return n.origin=function(t){return arguments.length?(i=t,n):i},$o.rebind(n,u,"on")};var ka=Math.PI,Ea=2*ka,Aa=ka/2,Ca=1e-6,Na=Ca*Ca,La=ka/180,Ta=180/ka,qa=Math.SQRT2,za=2,Ra=4;$o.interpolateZoom=function(n,t){function e(n){var t=n*y;if(m){var e=O(v),o=i/(za*h)*(e*Y(qa*t+v)-F(v));return[r+o*s,u+o*l,i*e/O(qa*t+v)]}return[r+n*s,u+n*l,i*Math.exp(qa*t)]}var r=n[0],u=n[1],i=n[2],o=t[0],a=t[1],c=t[2],s=o-r,l=a-u,f=s*s+l*l,h=Math.sqrt(f),g=(c*c-i*i+Ra*f)/(2*i*za*h),p=(c*c-i*i-Ra*f)/(2*c*za*h),v=Math.log(Math.sqrt(g*g+1)-g),d=Math.log(Math.sqrt(p*p+1)-p),m=d-v,y=(m||Math.log(c/i))/qa;return e.duration=1e3*y,e},$o.behavior.zoom=function(){function n(n){n.on(A,s).on(Ua+".zoom",h).on(C,p).on("dblclick.zoom",v).on(L,l)}function t(n){return[(n[0]-S.x)/S.k,(n[1]-S.y)/S.k]}function e(n){return[n[0]*S.k+S.x,n[1]*S.k+S.y]}function r(n){S.k=Math.max(E[0],Math.min(E[1],n))}function u(n,t){t=e(t),S.x+=n[0]-t[0],S.y+=n[1]-t[1]}function i(){_&&_.domain(M.range().map(function(n){return(n-S.x)/S.k}).map(M.invert)),w&&w.domain(b.range().map(function(n){return(n-S.y)/S.k}).map(b.invert))}function o(n){n({type:"zoomstart"})}function a(n){i(),n({type:"zoom",scale:S.k,translate:[S.x,S.y]})}function c(n){n({type:"zoomend"})}function s(){function n(){l=1,u($o.mouse(r),h),a(i)}function e(){f.on(C,Ko===r?p:null).on(N,null),g(l&&$o.event.target===s),c(i)}var r=this,i=q.of(r,arguments),s=$o.event.target,l=0,f=$o.select(Ko).on(C,n).on(N,e),h=t($o.mouse(r)),g=D();T.call(r),o(i)}function l(){function n(){var n=$o.touches(p);return g=S.k,n.forEach(function(n){n.identifier in d&&(d[n.identifier]=t(n))}),n}function e(){for(var t=$o.event.changedTouches,e=0,i=t.length;i>e;++e)d[t[e].identifier]=null;var o=n(),c=Date.now();if(1===o.length){if(500>c-x){var s=o[0],l=d[s.identifier];r(2*S.k),u(s,l),f(),a(v)}x=c}else if(o.length>1){var s=o[0],h=o[1],g=s[0]-h[0],p=s[1]-h[1];m=g*g+p*p}}function i(){for(var n,t,e,i,o=$o.touches(p),c=0,s=o.length;s>c;++c,i=null)if(e=o[c],i=d[e.identifier]){if(t)break;n=e,t=i}if(i){var l=(l=e[0]-n[0])*l+(l=e[1]-n[1])*l,f=m&&Math.sqrt(l/m);n=[(n[0]+e[0])/2,(n[1]+e[1])/2],t=[(t[0]+i[0])/2,(t[1]+i[1])/2],r(f*g)}x=null,u(n,t),a(v)}function h(){if($o.event.touches.length){for(var t=$o.event.changedTouches,e=0,r=t.length;r>e;++e)delete d[t[e].identifier];for(var u in d)return void n()}b.on(M,null).on(_,null),w.on(A,s).on(L,l),k(),c(v)}var g,p=this,v=q.of(p,arguments),d={},m=0,y=$o.event.changedTouches[0].identifier,M="touchmove.zoom-"+y,_="touchend.zoom-"+y,b=$o.select(Ko).on(M,i).on(_,h),w=$o.select(p).on(A,null).on(L,e),k=D();T.call(p),e(),o(v)}function h(){var n=q.of(this,arguments);y?clearTimeout(y):(T.call(this),o(n)),y=setTimeout(function(){y=null,c(n)},50),f();var e=m||$o.mouse(this);d||(d=t(e)),r(Math.pow(2,.002*Da())*S.k),u(e,d),a(n)}function p(){d=null}function v(){var n=q.of(this,arguments),e=$o.mouse(this),i=t(e),s=Math.log(S.k)/Math.LN2;o(n),r(Math.pow(2,$o.event.shiftKey?Math.ceil(s)-1:Math.floor(s)+1)),u(e,i),a(n),c(n)}var d,m,y,x,M,_,b,w,S={x:0,y:0,k:1},k=[960,500],E=Pa,A="mousedown.zoom",C="mousemove.zoom",N="mouseup.zoom",L="touchstart.zoom",q=g(n,"zoomstart","zoom","zoomend");return n.event=function(n){n.each(function(){var n=q.of(this,arguments),t=S;Ss?$o.select(this).transition().each("start.zoom",function(){S=this.__chart__||{x:0,y:0,k:1},o(n)}).tween("zoom:zoom",function(){var e=k[0],r=k[1],u=e/2,i=r/2,o=$o.interpolateZoom([(u-S.x)/S.k,(i-S.y)/S.k,e/S.k],[(u-t.x)/t.k,(i-t.y)/t.k,e/t.k]);return function(t){var r=o(t),c=e/r[2];this.__chart__=S={x:u-r[0]*c,y:i-r[1]*c,k:c},a(n)}}).each("end.zoom",function(){c(n)}):(this.__chart__=S,o(n),a(n),c(n))})},n.translate=function(t){return arguments.length?(S={x:+t[0],y:+t[1],k:S.k},i(),n):[S.x,S.y]},n.scale=function(t){return arguments.length?(S={x:S.x,y:S.y,k:+t},i(),n):S.k},n.scaleExtent=function(t){return arguments.length?(E=null==t?Pa:[+t[0],+t[1]],n):E},n.center=function(t){return arguments.length?(m=t&&[+t[0],+t[1]],n):m},n.size=function(t){return arguments.length?(k=t&&[+t[0],+t[1]],n):k},n.x=function(t){return arguments.length?(_=t,M=t.copy(),S={x:0,y:0,k:1},n):_},n.y=function(t){return arguments.length?(w=t,b=t.copy(),S={x:0,y:0,k:1},n):w},$o.rebind(n,q,"on")};var Da,Pa=[0,1/0],Ua="onwheel"in Jo?(Da=function(){return-$o.event.deltaY*($o.event.deltaMode?120:1)},"wheel"):"onmousewheel"in Jo?(Da=function(){return $o.event.wheelDelta},"mousewheel"):(Da=function(){return-$o.event.detail},"MozMousePixelScroll");Z.prototype.toString=function(){return this.rgb()+""},$o.hsl=function(n,t,e){return 1===arguments.length?n instanceof X?V(n.h,n.s,n.l):st(""+n,lt,V):V(+n,+t,+e)};var ja=X.prototype=new Z;ja.brighter=function(n){return n=Math.pow(.7,arguments.length?n:1),V(this.h,this.s,this.l/n)},ja.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),V(this.h,this.s,n*this.l)},ja.rgb=function(){return $(this.h,this.s,this.l)},$o.hcl=function(n,t,e){return 1===arguments.length?n instanceof W?B(n.h,n.c,n.l):n instanceof K?nt(n.l,n.a,n.b):nt((n=ft((n=$o.rgb(n)).r,n.g,n.b)).l,n.a,n.b):B(+n,+t,+e)};var Ha=W.prototype=new Z;Ha.brighter=function(n){return B(this.h,this.c,Math.min(100,this.l+Fa*(arguments.length?n:1)))},Ha.darker=function(n){return B(this.h,this.c,Math.max(0,this.l-Fa*(arguments.length?n:1)))},Ha.rgb=function(){return J(this.h,this.c,this.l).rgb()},$o.lab=function(n,t,e){return 1===arguments.length?n instanceof K?G(n.l,n.a,n.b):n instanceof W?J(n.l,n.c,n.h):ft((n=$o.rgb(n)).r,n.g,n.b):G(+n,+t,+e)};var Fa=18,Oa=.95047,Ya=1,Ia=1.08883,Za=K.prototype=new Z;Za.brighter=function(n){return G(Math.min(100,this.l+Fa*(arguments.length?n:1)),this.a,this.b)},Za.darker=function(n){return G(Math.max(0,this.l-Fa*(arguments.length?n:1)),this.a,this.b)},Za.rgb=function(){return Q(this.l,this.a,this.b)},$o.rgb=function(n,t,e){return 1===arguments.length?n instanceof at?ot(n.r,n.g,n.b):st(""+n,ot,$):ot(~~n,~~t,~~e)};var Va=at.prototype=new Z;Va.brighter=function(n){n=Math.pow(.7,arguments.length?n:1);var t=this.r,e=this.g,r=this.b,u=30;return t||e||r?(t&&u>t&&(t=u),e&&u>e&&(e=u),r&&u>r&&(r=u),ot(Math.min(255,~~(t/n)),Math.min(255,~~(e/n)),Math.min(255,~~(r/n)))):ot(u,u,u)},Va.darker=function(n){return n=Math.pow(.7,arguments.length?n:1),ot(~~(n*this.r),~~(n*this.g),~~(n*this.b))},Va.hsl=function(){return lt(this.r,this.g,this.b)},Va.toString=function(){return"#"+ct(this.r)+ct(this.g)+ct(this.b)};var Xa=$o.map({aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074});Xa.forEach(function(n,t){Xa.set(n,ut(t))}),$o.functor=pt,$o.xhr=dt(vt),$o.dsv=function(n,t){function e(n,e,i){arguments.length<3&&(i=e,e=null);var o=$o.xhr(n,t,i);return o.row=function(n){return arguments.length?o.response(null==(e=n)?r:u(n)):e},o.row(e)}function r(n){return e.parse(n.responseText)}function u(n){return function(t){return e.parse(t.responseText,n)}}function o(t){return t.map(a).join(n)}function a(n){return c.test(n)?'"'+n.replace(/\"/g,'""')+'"':n}var c=new RegExp('["'+n+"\n]"),s=n.charCodeAt(0);return e.parse=function(n,t){var r;return e.parseRows(n,function(n,e){if(r)return r(n,e-1);var u=new Function("d","return {"+n.map(function(n,t){return JSON.stringify(n)+": d["+t+"]"}).join(",")+"}");r=t?function(n,e){return t(u(n),e)}:u})},e.parseRows=function(n,t){function e(){if(l>=c)return o;if(u)return u=!1,i;var t=l;if(34===n.charCodeAt(t)){for(var e=t;e++<c;)if(34===n.charCodeAt(e)){if(34!==n.charCodeAt(e+1))break;++e}l=e+2;var r=n.charCodeAt(e+1);return 13===r?(u=!0,10===n.charCodeAt(e+2)&&++l):10===r&&(u=!0),n.substring(t+1,e).replace(/""/g,'"')}for(;c>l;){var r=n.charCodeAt(l++),a=1;if(10===r)u=!0;else if(13===r)u=!0,10===n.charCodeAt(l)&&(++l,++a);else if(r!==s)continue;return n.substring(t,l-a)}return n.substring(t)}for(var r,u,i={},o={},a=[],c=n.length,l=0,f=0;(r=e())!==o;){for(var h=[];r!==i&&r!==o;)h.push(r),r=e();(!t||(h=t(h,f++)))&&a.push(h)}return a},e.format=function(t){if(Array.isArray(t[0]))return e.formatRows(t);var r=new i,u=[];return t.forEach(function(n){for(var t in n)r.has(t)||u.push(r.add(t))}),[u.map(a).join(n)].concat(t.map(function(t){return u.map(function(n){return a(t[n])}).join(n)})).join("\n")},e.formatRows=function(n){return n.map(o).join("\n")},e},$o.csv=$o.dsv(",","text/csv"),$o.tsv=$o.dsv(" ","text/tab-separated-values");var $a,Ba,Wa,Ja,Ga,Ka=Ko[a(Ko,"requestAnimationFrame")]||function(n){setTimeout(n,17)};$o.timer=function(n,t,e){var r=arguments.length;2>r&&(t=0),3>r&&(e=Date.now());var u=e+t,i={c:n,t:u,f:!1,n:null};Ba?Ba.n=i:$a=i,Ba=i,Wa||(Ja=clearTimeout(Ja),Wa=1,Ka(xt))},$o.timer.flush=function(){Mt(),_t()};var Qa=".",nc=",",tc=[3,3],ec="$",rc=["y","z","a","f","p","n","\xb5","m","","k","M","G","T","P","E","Z","Y"].map(bt);$o.formatPrefix=function(n,t){var e=0;return n&&(0>n&&(n*=-1),t&&(n=$o.round(n,wt(n,t))),e=1+Math.floor(1e-12+Math.log(n)/Math.LN10),e=Math.max(-24,Math.min(24,3*Math.floor((0>=e?e+1:e-1)/3)))),rc[8+e/3]},$o.round=function(n,t){return t?Math.round(n*(t=Math.pow(10,t)))/t:Math.round(n)},$o.format=function(n){var t=uc.exec(n),e=t[1]||" ",r=t[2]||">",u=t[3]||"",i=t[4]||"",o=t[5],a=+t[6],c=t[7],s=t[8],l=t[9],f=1,h="",g=!1;switch(s&&(s=+s.substring(1)),(o||"0"===e&&"="===r)&&(o=e="0",r="=",c&&(a-=Math.floor((a-1)/4))),l){case"n":c=!0,l="g";break;case"%":f=100,h="%",l="f";break;case"p":f=100,h="%",l="r";break;case"b":case"o":case"x":case"X":"#"===i&&(i="0"+l.toLowerCase());case"c":case"d":g=!0,s=0;break;case"s":f=-1,l="r"}"#"===i?i="":"$"===i&&(i=ec),"r"!=l||s||(l="g"),null!=s&&("g"==l?s=Math.max(1,Math.min(21,s)):("e"==l||"f"==l)&&(s=Math.max(0,Math.min(20,s)))),l=ic.get(l)||St;var p=o&&c;return function(n){if(g&&n%1)return"";var t=0>n||0===n&&0>1/n?(n=-n,"-"):u;if(0>f){var v=$o.formatPrefix(n,s);n=v.scale(n),h=v.symbol}else n*=f;n=l(n,s);var d=n.lastIndexOf("."),m=0>d?n:n.substring(0,d),y=0>d?"":Qa+n.substring(d+1);!o&&c&&(m=oc(m));var x=i.length+m.length+y.length+(p?0:t.length),M=a>x?new Array(x=a-x+1).join(e):"";return p&&(m=oc(M+m)),t+=i,n=m+y,("<"===r?t+n+M:">"===r?M+t+n:"^"===r?M.substring(0,x>>=1)+t+n+M.substring(x):t+(p?n:M+n))+h}};var uc=/(?:([^{])?([<>=^]))?([+\- ])?([$#])?(0)?(\d+)?(,)?(\.-?\d+)?([a-z%])?/i,ic=$o.map({b:function(n){return n.toString(2)},c:function(n){return String.fromCharCode(n)},o:function(n){return n.toString(8)},x:function(n){return n.toString(16)},X:function(n){return n.toString(16).toUpperCase()},g:function(n,t){return n.toPrecision(t)},e:function(n,t){return n.toExponential(t)},f:function(n,t){return n.toFixed(t)},r:function(n,t){return(n=$o.round(n,wt(n,t))).toFixed(Math.max(0,Math.min(20,wt(n*(1+1e-15),t))))}}),oc=vt;if(tc){var ac=tc.length;oc=function(n){for(var t=n.length,e=[],r=0,u=tc[0];t>0&&u>0;)e.push(n.substring(t-=u,t+u)),u=tc[r=(r+1)%ac];return e.reverse().join(nc)}}$o.geo={},kt.prototype={s:0,t:0,add:function(n){Et(n,this.t,cc),Et(cc.s,this.s,this),this.s?this.t+=cc.t:this.s=cc.t},reset:function(){this.s=this.t=0},valueOf:function(){return this.s}};var cc=new kt;$o.geo.stream=function(n,t){n&&sc.hasOwnProperty(n.type)?sc[n.type](n,t):At(n,t)};var sc={Feature:function(n,t){At(n.geometry,t)},FeatureCollection:function(n,t){for(var e=n.features,r=-1,u=e.length;++r<u;)At(e[r].geometry,t)}},lc={Sphere:function(n,t){t.sphere()},Point:function(n,t){n=n.coordinates,t.point(n[0],n[1],n[2])},MultiPoint:function(n,t){for(var e=n.coordinates,r=-1,u=e.length;++r<u;)n=e[r],t.point(n[0],n[1],n[2])},LineString:function(n,t){Ct(n.coordinates,t,0)},MultiLineString:function(n,t){for(var e=n.coordinates,r=-1,u=e.length;++r<u;)Ct(e[r],t,0)},Polygon:function(n,t){Nt(n.coordinates,t)},MultiPolygon:function(n,t){for(var e=n.coordinates,r=-1,u=e.length;++r<u;)Nt(e[r],t)},GeometryCollection:function(n,t){for(var e=n.geometries,r=-1,u=e.length;++r<u;)At(e[r],t)}};$o.geo.area=function(n){return fc=0,$o.geo.stream(n,gc),fc};var fc,hc=new kt,gc={sphere:function(){fc+=4*ka},point:c,lineStart:c,lineEnd:c,polygonStart:function(){hc.reset(),gc.lineStart=Lt},polygonEnd:function(){var n=2*hc;fc+=0>n?4*ka+n:n,gc.lineStart=gc.lineEnd=gc.point=c}};$o.geo.bounds=function(){function n(n,t){x.push(M=[l=n,h=n]),f>t&&(f=t),t>g&&(g=t)}function t(t,e){var r=Tt([t*La,e*La]);if(m){var u=zt(m,r),i=[u[1],-u[0],0],o=zt(i,u);Pt(o),o=Ut(o);var c=t-p,s=c>0?1:-1,v=o[0]*Ta*s,d=aa(c)>180;if(d^(v>s*p&&s*t>v)){var y=o[1]*Ta;y>g&&(g=y)}else if(v=(v+360)%360-180,d^(v>s*p&&s*t>v)){var y=-o[1]*Ta;f>y&&(f=y)}else f>e&&(f=e),e>g&&(g=e);d?p>t?a(l,t)>a(l,h)&&(h=t):a(t,h)>a(l,h)&&(l=t):h>=l?(l>t&&(l=t),t>h&&(h=t)):t>p?a(l,t)>a(l,h)&&(h=t):a(t,h)>a(l,h)&&(l=t)}else n(t,e);m=r,p=t}function e(){_.point=t}function r(){M[0]=l,M[1]=h,_.point=n,m=null}function u(n,e){if(m){var r=n-p;y+=aa(r)>180?r+(r>0?360:-360):r}else v=n,d=e;gc.point(n,e),t(n,e)}function i(){gc.lineStart()}function o(){u(v,d),gc.lineEnd(),aa(y)>Ca&&(l=-(h=180)),M[0]=l,M[1]=h,m=null}function a(n,t){return(t-=n)<0?t+360:t}function c(n,t){return n[0]-t[0]}function s(n,t){return t[0]<=t[1]?t[0]<=n&&n<=t[1]:n<t[0]||t[1]<n}var l,f,h,g,p,v,d,m,y,x,M,_={point:n,lineStart:e,lineEnd:r,polygonStart:function(){_.point=u,_.lineStart=i,_.lineEnd=o,y=0,gc.polygonStart()},polygonEnd:function(){gc.polygonEnd(),_.point=n,_.lineStart=e,_.lineEnd=r,0>hc?(l=-(h=180),f=-(g=90)):y>Ca?g=90:-Ca>y&&(f=-90),M[0]=l,M[1]=h}};return function(n){g=h=-(l=f=1/0),x=[],$o.geo.stream(n,_);var t=x.length;if(t){x.sort(c);for(var e,r=1,u=x[0],i=[u];t>r;++r)e=x[r],s(e[0],u)||s(e[1],u)?(a(u[0],e[1])>a(u[0],u[1])&&(u[1]=e[1]),a(e[0],u[1])>a(u[0],u[1])&&(u[0]=e[0])):i.push(u=e);for(var o,e,p=-1/0,t=i.length-1,r=0,u=i[t];t>=r;u=e,++r)e=i[r],(o=a(u[1],e[0]))>p&&(p=o,l=e[0],h=u[1])}return x=M=null,1/0===l||1/0===f?[[0/0,0/0],[0/0,0/0]]:[[l,f],[h,g]]}}(),$o.geo.centroid=function(n){pc=vc=dc=mc=yc=xc=Mc=_c=bc=wc=Sc=0,$o.geo.stream(n,kc);var t=bc,e=wc,r=Sc,u=t*t+e*e+r*r;return Na>u&&(t=xc,e=Mc,r=_c,Ca>vc&&(t=dc,e=mc,r=yc),u=t*t+e*e+r*r,Na>u)?[0/0,0/0]:[Math.atan2(e,t)*Ta,H(r/Math.sqrt(u))*Ta]};var pc,vc,dc,mc,yc,xc,Mc,_c,bc,wc,Sc,kc={sphere:c,point:Ht,lineStart:Ot,lineEnd:Yt,polygonStart:function(){kc.lineStart=It},polygonEnd:function(){kc.lineStart=Ot}},Ec=Bt(Zt,Qt,te,[-ka,-ka/2]),Ac=1e9;$o.geo.clipExtent=function(){var n,t,e,r,u,i,o={stream:function(n){return u&&(u.valid=!1),u=i(n),u.valid=!0,u},extent:function(a){return arguments.length?(i=ue(n=+a[0][0],t=+a[0][1],e=+a[1][0],r=+a[1][1]),u&&(u.valid=!1,u=null),o):[[n,t],[e,r]]}};return o.extent([[0,0],[960,500]])},($o.geo.conicEqualArea=function(){return oe(ae)}).raw=ae,$o.geo.albers=function(){return $o.geo.conicEqualArea().rotate([96,0]).center([-.6,38.7]).parallels([29.5,45.5]).scale(1070)},$o.geo.albersUsa=function(){function n(n){var i=n[0],o=n[1];return t=null,e(i,o),t||(r(i,o),t)||u(i,o),t}var t,e,r,u,i=$o.geo.albers(),o=$o.geo.conicEqualArea().rotate([154,0]).center([-2,58.5]).parallels([55,65]),a=$o.geo.conicEqualArea().rotate([157,0]).center([-3,19.9]).parallels([8,18]),c={point:function(n,e){t=[n,e]}};return n.invert=function(n){var t=i.scale(),e=i.translate(),r=(n[0]-e[0])/t,u=(n[1]-e[1])/t;return(u>=.12&&.234>u&&r>=-.425&&-.214>r?o:u>=.166&&.234>u&&r>=-.214&&-.115>r?a:i).invert(n)},n.stream=function(n){var t=i.stream(n),e=o.stream(n),r=a.stream(n);return{point:function(n,u){t.point(n,u),e.point(n,u),r.point(n,u)},sphere:function(){t.sphere(),e.sphere(),r.sphere()},lineStart:function(){t.lineStart(),e.lineStart(),r.lineStart()},lineEnd:function(){t.lineEnd(),e.lineEnd(),r.lineEnd()},polygonStart:function(){t.polygonStart(),e.polygonStart(),r.polygonStart()},polygonEnd:function(){t.polygonEnd(),e.polygonEnd(),r.polygonEnd()}}},n.precision=function(t){return arguments.length?(i.precision(t),o.precision(t),a.precision(t),n):i.precision()},n.scale=function(t){return arguments.length?(i.scale(t),o.scale(.35*t),a.scale(t),n.translate(i.translate())):i.scale()},n.translate=function(t){if(!arguments.length)return i.translate();var s=i.scale(),l=+t[0],f=+t[1];return e=i.translate(t).clipExtent([[l-.455*s,f-.238*s],[l+.455*s,f+.238*s]]).stream(c).point,r=o.translate([l-.307*s,f+.201*s]).clipExtent([[l-.425*s+Ca,f+.12*s+Ca],[l-.214*s-Ca,f+.234*s-Ca]]).stream(c).point,u=a.translate([l-.205*s,f+.212*s]).clipExtent([[l-.214*s+Ca,f+.166*s+Ca],[l-.115*s-Ca,f+.234*s-Ca]]).stream(c).point,n},n.scale(1070)};var Cc,Nc,Lc,Tc,qc,zc,Rc={point:c,lineStart:c,lineEnd:c,polygonStart:function(){Nc=0,Rc.lineStart=ce},polygonEnd:function(){Rc.lineStart=Rc.lineEnd=Rc.point=c,Cc+=aa(Nc/2)}},Dc={point:se,lineStart:c,lineEnd:c,polygonStart:c,polygonEnd:c},Pc={point:he,lineStart:ge,lineEnd:pe,polygonStart:function(){Pc.lineStart=ve},polygonEnd:function(){Pc.point=he,Pc.lineStart=ge,Pc.lineEnd=pe}};$o.geo.path=function(){function n(n){return n&&("function"==typeof a&&i.pointRadius(+a.apply(this,arguments)),o&&o.valid||(o=u(i)),$o.geo.stream(n,o)),i.result()}function t(){return o=null,n}var e,r,u,i,o,a=4.5;return n.area=function(n){return Cc=0,$o.geo.stream(n,u(Rc)),Cc},n.centroid=function(n){return dc=mc=yc=xc=Mc=_c=bc=wc=Sc=0,$o.geo.stream(n,u(Pc)),Sc?[bc/Sc,wc/Sc]:_c?[xc/_c,Mc/_c]:yc?[dc/yc,mc/yc]:[0/0,0/0]},n.bounds=function(n){return qc=zc=-(Lc=Tc=1/0),$o.geo.stream(n,u(Dc)),[[Lc,Tc],[qc,zc]]},n.projection=function(n){return arguments.length?(u=(e=n)?n.stream||ye(n):vt,t()):e},n.context=function(n){return arguments.length?(i=null==(r=n)?new le:new de(n),"function"!=typeof a&&i.pointRadius(a),t()):r},n.pointRadius=function(t){return arguments.length?(a="function"==typeof t?t:(i.pointRadius(+t),+t),n):a},n.projection($o.geo.albersUsa()).context(null)},$o.geo.transform=function(n){return{stream:function(t){var e=new xe(t);for(var r in n)e[r]=n[r];return e}}},xe.prototype={point:function(n,t){this.stream.point(n,t)},sphere:function(){this.stream.sphere()},lineStart:function(){this.stream.lineStart() +},lineEnd:function(){this.stream.lineEnd()},polygonStart:function(){this.stream.polygonStart()},polygonEnd:function(){this.stream.polygonEnd()}},$o.geo.projection=_e,$o.geo.projectionMutator=be,($o.geo.equirectangular=function(){return _e(Se)}).raw=Se.invert=Se,$o.geo.rotation=function(n){function t(t){return t=n(t[0]*La,t[1]*La),t[0]*=Ta,t[1]*=Ta,t}return n=Ee(n[0]%360*La,n[1]*La,n.length>2?n[2]*La:0),t.invert=function(t){return t=n.invert(t[0]*La,t[1]*La),t[0]*=Ta,t[1]*=Ta,t},t},ke.invert=Se,$o.geo.circle=function(){function n(){var n="function"==typeof r?r.apply(this,arguments):r,t=Ee(-n[0]*La,-n[1]*La,0).invert,u=[];return e(null,null,1,{point:function(n,e){u.push(n=t(n,e)),n[0]*=Ta,n[1]*=Ta}}),{type:"Polygon",coordinates:[u]}}var t,e,r=[0,0],u=6;return n.origin=function(t){return arguments.length?(r=t,n):r},n.angle=function(r){return arguments.length?(e=Le((t=+r)*La,u*La),n):t},n.precision=function(r){return arguments.length?(e=Le(t*La,(u=+r)*La),n):u},n.angle(90)},$o.geo.distance=function(n,t){var e,r=(t[0]-n[0])*La,u=n[1]*La,i=t[1]*La,o=Math.sin(r),a=Math.cos(r),c=Math.sin(u),s=Math.cos(u),l=Math.sin(i),f=Math.cos(i);return Math.atan2(Math.sqrt((e=f*o)*e+(e=s*l-c*f*a)*e),c*l+s*f*a)},$o.geo.graticule=function(){function n(){return{type:"MultiLineString",coordinates:t()}}function t(){return $o.range(Math.ceil(i/d)*d,u,d).map(h).concat($o.range(Math.ceil(s/m)*m,c,m).map(g)).concat($o.range(Math.ceil(r/p)*p,e,p).filter(function(n){return aa(n%d)>Ca}).map(l)).concat($o.range(Math.ceil(a/v)*v,o,v).filter(function(n){return aa(n%m)>Ca}).map(f))}var e,r,u,i,o,a,c,s,l,f,h,g,p=10,v=p,d=90,m=360,y=2.5;return n.lines=function(){return t().map(function(n){return{type:"LineString",coordinates:n}})},n.outline=function(){return{type:"Polygon",coordinates:[h(i).concat(g(c).slice(1),h(u).reverse().slice(1),g(s).reverse().slice(1))]}},n.extent=function(t){return arguments.length?n.majorExtent(t).minorExtent(t):n.minorExtent()},n.majorExtent=function(t){return arguments.length?(i=+t[0][0],u=+t[1][0],s=+t[0][1],c=+t[1][1],i>u&&(t=i,i=u,u=t),s>c&&(t=s,s=c,c=t),n.precision(y)):[[i,s],[u,c]]},n.minorExtent=function(t){return arguments.length?(r=+t[0][0],e=+t[1][0],a=+t[0][1],o=+t[1][1],r>e&&(t=r,r=e,e=t),a>o&&(t=a,a=o,o=t),n.precision(y)):[[r,a],[e,o]]},n.step=function(t){return arguments.length?n.majorStep(t).minorStep(t):n.minorStep()},n.majorStep=function(t){return arguments.length?(d=+t[0],m=+t[1],n):[d,m]},n.minorStep=function(t){return arguments.length?(p=+t[0],v=+t[1],n):[p,v]},n.precision=function(t){return arguments.length?(y=+t,l=qe(a,o,90),f=ze(r,e,y),h=qe(s,c,90),g=ze(i,u,y),n):y},n.majorExtent([[-180,-90+Ca],[180,90-Ca]]).minorExtent([[-180,-80-Ca],[180,80+Ca]])},$o.geo.greatArc=function(){function n(){return{type:"LineString",coordinates:[t||r.apply(this,arguments),e||u.apply(this,arguments)]}}var t,e,r=Re,u=De;return n.distance=function(){return $o.geo.distance(t||r.apply(this,arguments),e||u.apply(this,arguments))},n.source=function(e){return arguments.length?(r=e,t="function"==typeof e?null:e,n):r},n.target=function(t){return arguments.length?(u=t,e="function"==typeof t?null:t,n):u},n.precision=function(){return arguments.length?n:0},n},$o.geo.interpolate=function(n,t){return Pe(n[0]*La,n[1]*La,t[0]*La,t[1]*La)},$o.geo.length=function(n){return Uc=0,$o.geo.stream(n,jc),Uc};var Uc,jc={sphere:c,point:c,lineStart:Ue,lineEnd:c,polygonStart:c,polygonEnd:c},Hc=je(function(n){return Math.sqrt(2/(1+n))},function(n){return 2*Math.asin(n/2)});($o.geo.azimuthalEqualArea=function(){return _e(Hc)}).raw=Hc;var Fc=je(function(n){var t=Math.acos(n);return t&&t/Math.sin(t)},vt);($o.geo.azimuthalEquidistant=function(){return _e(Fc)}).raw=Fc,($o.geo.conicConformal=function(){return oe(He)}).raw=He,($o.geo.conicEquidistant=function(){return oe(Fe)}).raw=Fe;var Oc=je(function(n){return 1/n},Math.atan);($o.geo.gnomonic=function(){return _e(Oc)}).raw=Oc,Oe.invert=function(n,t){return[n,2*Math.atan(Math.exp(t))-Aa]},($o.geo.mercator=function(){return Ye(Oe)}).raw=Oe;var Yc=je(function(){return 1},Math.asin);($o.geo.orthographic=function(){return _e(Yc)}).raw=Yc;var Ic=je(function(n){return 1/(1+n)},function(n){return 2*Math.atan(n)});($o.geo.stereographic=function(){return _e(Ic)}).raw=Ic,Ie.invert=function(n,t){return[Math.atan2(F(n),Math.cos(t)),H(Math.sin(t)/O(n))]},($o.geo.transverseMercator=function(){return Ye(Ie)}).raw=Ie,$o.geom={},$o.geom.hull=function(n){function t(n){if(n.length<3)return[];var t,u,i,o,a,c,s,l,f,h,g,p,v=pt(e),d=pt(r),m=n.length,y=m-1,x=[],M=[],_=0;if(v===Ze&&r===Ve)t=n;else for(i=0,t=[];m>i;++i)t.push([+v.call(this,u=n[i],i),+d.call(this,u,i)]);for(i=1;m>i;++i)(t[i][1]<t[_][1]||t[i][1]==t[_][1]&&t[i][0]<t[_][0])&&(_=i);for(i=0;m>i;++i)i!==_&&(c=t[i][1]-t[_][1],a=t[i][0]-t[_][0],x.push({angle:Math.atan2(c,a),index:i}));for(x.sort(function(n,t){return n.angle-t.angle}),g=x[0].angle,h=x[0].index,f=0,i=1;y>i;++i){if(o=x[i].index,g==x[i].angle){if(a=t[h][0]-t[_][0],c=t[h][1]-t[_][1],s=t[o][0]-t[_][0],l=t[o][1]-t[_][1],a*a+c*c>=s*s+l*l){x[i].index=-1;continue}x[f].index=-1}g=x[i].angle,f=i,h=o}for(M.push(_),i=0,o=0;2>i;++o)x[o].index>-1&&(M.push(x[o].index),i++);for(p=M.length;y>o;++o)if(!(x[o].index<0)){for(;!Xe(M[p-2],M[p-1],x[o].index,t);)--p;M[p++]=x[o].index}var b=[];for(i=p-1;i>=0;--i)b.push(n[M[i]]);return b}var e=Ze,r=Ve;return arguments.length?t(n):(t.x=function(n){return arguments.length?(e=n,t):e},t.y=function(n){return arguments.length?(r=n,t):r},t)},$o.geom.polygon=function(n){return ha(n,Zc),n};var Zc=$o.geom.polygon.prototype=[];Zc.area=function(){for(var n,t=-1,e=this.length,r=this[e-1],u=0;++t<e;)n=r,r=this[t],u+=n[1]*r[0]-n[0]*r[1];return.5*u},Zc.centroid=function(n){var t,e,r=-1,u=this.length,i=0,o=0,a=this[u-1];for(arguments.length||(n=-1/(6*this.area()));++r<u;)t=a,a=this[r],e=t[0]*a[1]-a[0]*t[1],i+=(t[0]+a[0])*e,o+=(t[1]+a[1])*e;return[i*n,o*n]},Zc.clip=function(n){for(var t,e,r,u,i,o,a=We(n),c=-1,s=this.length-We(this),l=this[s-1];++c<s;){for(t=n.slice(),n.length=0,u=this[c],i=t[(r=t.length-a)-1],e=-1;++e<r;)o=t[e],$e(o,l,u)?($e(i,l,u)||n.push(Be(i,o,l,u)),n.push(o)):$e(i,l,u)&&n.push(Be(i,o,l,u)),i=o;a&&n.push(n[0]),l=u}return n};var Vc,Xc,$c,Bc,Wc,Jc=[],Gc=[];rr.prototype.prepare=function(){for(var n,t=this.edges,e=t.length;e--;)n=t[e].edge,n.b&&n.a||t.splice(e,1);return t.sort(ir),t.length},vr.prototype={start:function(){return this.edge.l===this.site?this.edge.a:this.edge.b},end:function(){return this.edge.l===this.site?this.edge.b:this.edge.a}},dr.prototype={insert:function(n,t){var e,r,u;if(n){if(t.P=n,t.N=n.N,n.N&&(n.N.P=t),n.N=t,n.R){for(n=n.R;n.L;)n=n.L;n.L=t}else n.R=t;e=n}else this._?(n=Mr(this._),t.P=null,t.N=n,n.P=n.L=t,e=n):(t.P=t.N=null,this._=t,e=null);for(t.L=t.R=null,t.U=e,t.C=!0,n=t;e&&e.C;)r=e.U,e===r.L?(u=r.R,u&&u.C?(e.C=u.C=!1,r.C=!0,n=r):(n===e.R&&(yr(this,e),n=e,e=n.U),e.C=!1,r.C=!0,xr(this,r))):(u=r.L,u&&u.C?(e.C=u.C=!1,r.C=!0,n=r):(n===e.L&&(xr(this,e),n=e,e=n.U),e.C=!1,r.C=!0,yr(this,r))),e=n.U;this._.C=!1},remove:function(n){n.N&&(n.N.P=n.P),n.P&&(n.P.N=n.N),n.N=n.P=null;var t,e,r,u=n.U,i=n.L,o=n.R;if(e=i?o?Mr(o):i:o,u?u.L===n?u.L=e:u.R=e:this._=e,i&&o?(r=e.C,e.C=n.C,e.L=i,i.U=e,e!==o?(u=e.U,e.U=n.U,n=e.R,u.L=n,e.R=o,o.U=e):(e.U=u,u=e,n=e.R)):(r=n.C,n=e),n&&(n.U=u),!r){if(n&&n.C)return n.C=!1,void 0;do{if(n===this._)break;if(n===u.L){if(t=u.R,t.C&&(t.C=!1,u.C=!0,yr(this,u),t=u.R),t.L&&t.L.C||t.R&&t.R.C){t.R&&t.R.C||(t.L.C=!1,t.C=!0,xr(this,t),t=u.R),t.C=u.C,u.C=t.R.C=!1,yr(this,u),n=this._;break}}else if(t=u.L,t.C&&(t.C=!1,u.C=!0,xr(this,u),t=u.L),t.L&&t.L.C||t.R&&t.R.C){t.L&&t.L.C||(t.R.C=!1,t.C=!0,yr(this,t),t=u.L),t.C=u.C,u.C=t.L.C=!1,xr(this,u),n=this._;break}t.C=!0,n=u,u=u.U}while(!n.C);n&&(n.C=!1)}}},$o.geom.voronoi=function(n){function t(n){var t=new Array(n.length),r=a[0][0],u=a[0][1],i=a[1][0],o=a[1][1];return _r(e(n),a).cells.forEach(function(e,a){var c=e.edges,s=e.site,l=t[a]=c.length?c.map(function(n){var t=n.start();return[t.x,t.y]}):s.x>=r&&s.x<=i&&s.y>=u&&s.y<=o?[[r,o],[i,o],[i,u],[r,u]]:[];l.point=n[a]}),t}function e(n){return n.map(function(n,t){return{x:Math.round(i(n,t)/Ca)*Ca,y:Math.round(o(n,t)/Ca)*Ca,i:t}})}var r=Ze,u=Ve,i=r,o=u,a=Kc;return n?t(n):(t.links=function(n){return _r(e(n)).edges.filter(function(n){return n.l&&n.r}).map(function(t){return{source:n[t.l.i],target:n[t.r.i]}})},t.triangles=function(n){var t=[];return _r(e(n)).cells.forEach(function(e,r){for(var u,i,o=e.site,a=e.edges.sort(ir),c=-1,s=a.length,l=a[s-1].edge,f=l.l===o?l.r:l.l;++c<s;)u=l,i=f,l=a[c].edge,f=l.l===o?l.r:l.l,r<i.i&&r<f.i&&wr(o,i,f)<0&&t.push([n[r],n[i.i],n[f.i]])}),t},t.x=function(n){return arguments.length?(i=pt(r=n),t):r},t.y=function(n){return arguments.length?(o=pt(u=n),t):u},t.clipExtent=function(n){return arguments.length?(a=null==n?Kc:n,t):a===Kc?null:a},t.size=function(n){return arguments.length?t.clipExtent(n&&[[0,0],n]):a===Kc?null:a&&a[1]},t)};var Kc=[[-1e6,-1e6],[1e6,1e6]];$o.geom.delaunay=function(n){return $o.geom.voronoi().triangles(n)},$o.geom.quadtree=function(n,t,e,r,u){function i(n){function i(n,t,e,r,u,i,o,a){if(!isNaN(e)&&!isNaN(r))if(n.leaf){var c=n.x,l=n.y;if(null!=c)if(aa(c-e)+aa(l-r)<.01)s(n,t,e,r,u,i,o,a);else{var f=n.point;n.x=n.y=n.point=null,s(n,f,c,l,u,i,o,a),s(n,t,e,r,u,i,o,a)}else n.x=e,n.y=r,n.point=t}else s(n,t,e,r,u,i,o,a)}function s(n,t,e,r,u,o,a,c){var s=.5*(u+a),l=.5*(o+c),f=e>=s,h=r>=l,g=(h<<1)+f;n.leaf=!1,n=n.nodes[g]||(n.nodes[g]=Er()),f?u=s:a=s,h?o=l:c=l,i(n,t,e,r,u,o,a,c)}var l,f,h,g,p,v,d,m,y,x=pt(a),M=pt(c);if(null!=t)v=t,d=e,m=r,y=u;else if(m=y=-(v=d=1/0),f=[],h=[],p=n.length,o)for(g=0;p>g;++g)l=n[g],l.x<v&&(v=l.x),l.y<d&&(d=l.y),l.x>m&&(m=l.x),l.y>y&&(y=l.y),f.push(l.x),h.push(l.y);else for(g=0;p>g;++g){var _=+x(l=n[g],g),b=+M(l,g);v>_&&(v=_),d>b&&(d=b),_>m&&(m=_),b>y&&(y=b),f.push(_),h.push(b)}var w=m-v,S=y-d;w>S?y=d+w:m=v+S;var k=Er();if(k.add=function(n){i(k,n,+x(n,++g),+M(n,g),v,d,m,y)},k.visit=function(n){Ar(n,k,v,d,m,y)},g=-1,null==t){for(;++g<p;)i(k,n[g],f[g],h[g],v,d,m,y);--g}else n.forEach(k.add);return f=h=n=l=null,k}var o,a=Ze,c=Ve;return(o=arguments.length)?(a=Sr,c=kr,3===o&&(u=e,r=t,e=t=0),i(n)):(i.x=function(n){return arguments.length?(a=n,i):a},i.y=function(n){return arguments.length?(c=n,i):c},i.extent=function(n){return arguments.length?(null==n?t=e=r=u=null:(t=+n[0][0],e=+n[0][1],r=+n[1][0],u=+n[1][1]),i):null==t?null:[[t,e],[r,u]]},i.size=function(n){return arguments.length?(null==n?t=e=r=u=null:(t=e=0,r=+n[0],u=+n[1]),i):null==t?null:[r-t,u-e]},i)},$o.interpolateRgb=Cr,$o.interpolateObject=Nr,$o.interpolateNumber=Lr,$o.interpolateString=Tr;var Qc=/[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g;$o.interpolate=qr,$o.interpolators=[function(n,t){var e=typeof t;return("string"===e?Xa.has(t)||/^(#|rgb\(|hsl\()/.test(t)?Cr:Tr:t instanceof Z?Cr:"object"===e?Array.isArray(t)?zr:Nr:Lr)(n,t)}],$o.interpolateArray=zr;var ns=function(){return vt},ts=$o.map({linear:ns,poly:Fr,quad:function(){return Ur},cubic:function(){return jr},sin:function(){return Or},exp:function(){return Yr},circle:function(){return Ir},elastic:Zr,back:Vr,bounce:function(){return Xr}}),es=$o.map({"in":vt,out:Dr,"in-out":Pr,"out-in":function(n){return Pr(Dr(n))}});$o.ease=function(n){var t=n.indexOf("-"),e=t>=0?n.substring(0,t):n,r=t>=0?n.substring(t+1):"in";return e=ts.get(e)||ns,r=es.get(r)||vt,Rr(r(e.apply(null,Bo.call(arguments,1))))},$o.interpolateHcl=$r,$o.interpolateHsl=Br,$o.interpolateLab=Wr,$o.interpolateRound=Jr,$o.transform=function(n){var t=Jo.createElementNS($o.ns.prefix.svg,"g");return($o.transform=function(n){if(null!=n){t.setAttribute("transform",n);var e=t.transform.baseVal.consolidate()}return new Gr(e?e.matrix:rs)})(n)},Gr.prototype.toString=function(){return"translate("+this.translate+")rotate("+this.rotate+")skewX("+this.skew+")scale("+this.scale+")"};var rs={a:1,b:0,c:0,d:1,e:0,f:0};$o.interpolateTransform=tu,$o.layout={},$o.layout.bundle=function(){return function(n){for(var t=[],e=-1,r=n.length;++e<r;)t.push(uu(n[e]));return t}},$o.layout.chord=function(){function n(){var n,s,f,h,g,p={},v=[],d=$o.range(i),m=[];for(e=[],r=[],n=0,h=-1;++h<i;){for(s=0,g=-1;++g<i;)s+=u[h][g];v.push(s),m.push($o.range(i)),n+=s}for(o&&d.sort(function(n,t){return o(v[n],v[t])}),a&&m.forEach(function(n,t){n.sort(function(n,e){return a(u[t][n],u[t][e])})}),n=(Ea-l*i)/n,s=0,h=-1;++h<i;){for(f=s,g=-1;++g<i;){var y=d[h],x=m[y][g],M=u[y][x],_=s,b=s+=M*n;p[y+"-"+x]={index:y,subindex:x,startAngle:_,endAngle:b,value:M}}r[y]={index:y,startAngle:f,endAngle:s,value:(s-f)/n},s+=l}for(h=-1;++h<i;)for(g=h-1;++g<i;){var w=p[h+"-"+g],S=p[g+"-"+h];(w.value||S.value)&&e.push(w.value<S.value?{source:S,target:w}:{source:w,target:S})}c&&t()}function t(){e.sort(function(n,t){return c((n.source.value+n.target.value)/2,(t.source.value+t.target.value)/2)})}var e,r,u,i,o,a,c,s={},l=0;return s.matrix=function(n){return arguments.length?(i=(u=n)&&u.length,e=r=null,s):u},s.padding=function(n){return arguments.length?(l=n,e=r=null,s):l},s.sortGroups=function(n){return arguments.length?(o=n,e=r=null,s):o},s.sortSubgroups=function(n){return arguments.length?(a=n,e=null,s):a},s.sortChords=function(n){return arguments.length?(c=n,e&&t(),s):c},s.chords=function(){return e||n(),e},s.groups=function(){return r||n(),r},s},$o.layout.force=function(){function n(n){return function(t,e,r,u){if(t.point!==n){var i=t.cx-n.x,o=t.cy-n.y,a=1/Math.sqrt(i*i+o*o);if(v>(u-e)*a){var c=t.charge*a*a;return n.px-=i*c,n.py-=o*c,!0}if(t.point&&isFinite(a)){var c=t.pointCharge*a*a;n.px-=i*c,n.py-=o*c}}return!t.charge}}function t(n){n.px=$o.event.x,n.py=$o.event.y,a.resume()}var e,r,u,i,o,a={},c=$o.dispatch("start","tick","end"),s=[1,1],l=.9,f=us,h=is,g=-30,p=.1,v=.8,d=[],m=[];return a.tick=function(){if((r*=.99)<.005)return c.end({type:"end",alpha:r=0}),!0;var t,e,a,f,h,v,y,x,M,_=d.length,b=m.length;for(e=0;b>e;++e)a=m[e],f=a.source,h=a.target,x=h.x-f.x,M=h.y-f.y,(v=x*x+M*M)&&(v=r*i[e]*((v=Math.sqrt(v))-u[e])/v,x*=v,M*=v,h.x-=x*(y=f.weight/(h.weight+f.weight)),h.y-=M*y,f.x+=x*(y=1-y),f.y+=M*y);if((y=r*p)&&(x=s[0]/2,M=s[1]/2,e=-1,y))for(;++e<_;)a=d[e],a.x+=(x-a.x)*y,a.y+=(M-a.y)*y;if(g)for(fu(t=$o.geom.quadtree(d),r,o),e=-1;++e<_;)(a=d[e]).fixed||t.visit(n(a));for(e=-1;++e<_;)a=d[e],a.fixed?(a.x=a.px,a.y=a.py):(a.x-=(a.px-(a.px=a.x))*l,a.y-=(a.py-(a.py=a.y))*l);c.tick({type:"tick",alpha:r})},a.nodes=function(n){return arguments.length?(d=n,a):d},a.links=function(n){return arguments.length?(m=n,a):m},a.size=function(n){return arguments.length?(s=n,a):s},a.linkDistance=function(n){return arguments.length?(f="function"==typeof n?n:+n,a):f},a.distance=a.linkDistance,a.linkStrength=function(n){return arguments.length?(h="function"==typeof n?n:+n,a):h},a.friction=function(n){return arguments.length?(l=+n,a):l},a.charge=function(n){return arguments.length?(g="function"==typeof n?n:+n,a):g},a.gravity=function(n){return arguments.length?(p=+n,a):p},a.theta=function(n){return arguments.length?(v=+n,a):v},a.alpha=function(n){return arguments.length?(n=+n,r?r=n>0?n:0:n>0&&(c.start({type:"start",alpha:r=n}),$o.timer(a.tick)),a):r},a.start=function(){function n(n,r){if(!e){for(e=new Array(c),a=0;c>a;++a)e[a]=[];for(a=0;s>a;++a){var u=m[a];e[u.source.index].push(u.target),e[u.target.index].push(u.source)}}for(var i,o=e[t],a=-1,s=o.length;++a<s;)if(!isNaN(i=o[a][n]))return i;return Math.random()*r}var t,e,r,c=d.length,l=m.length,p=s[0],v=s[1];for(t=0;c>t;++t)(r=d[t]).index=t,r.weight=0;for(t=0;l>t;++t)r=m[t],"number"==typeof r.source&&(r.source=d[r.source]),"number"==typeof r.target&&(r.target=d[r.target]),++r.source.weight,++r.target.weight;for(t=0;c>t;++t)r=d[t],isNaN(r.x)&&(r.x=n("x",p)),isNaN(r.y)&&(r.y=n("y",v)),isNaN(r.px)&&(r.px=r.x),isNaN(r.py)&&(r.py=r.y);if(u=[],"function"==typeof f)for(t=0;l>t;++t)u[t]=+f.call(this,m[t],t);else for(t=0;l>t;++t)u[t]=f;if(i=[],"function"==typeof h)for(t=0;l>t;++t)i[t]=+h.call(this,m[t],t);else for(t=0;l>t;++t)i[t]=h;if(o=[],"function"==typeof g)for(t=0;c>t;++t)o[t]=+g.call(this,d[t],t);else for(t=0;c>t;++t)o[t]=g;return a.resume()},a.resume=function(){return a.alpha(.1)},a.stop=function(){return a.alpha(0)},a.drag=function(){return e||(e=$o.behavior.drag().origin(vt).on("dragstart.force",au).on("drag.force",t).on("dragend.force",cu)),arguments.length?(this.on("mouseover.force",su).on("mouseout.force",lu).call(e),void 0):e},$o.rebind(a,c,"on")};var us=20,is=1;$o.layout.hierarchy=function(){function n(t,o,a){var c=u.call(e,t,o);if(t.depth=o,a.push(t),c&&(s=c.length)){for(var s,l,f=-1,h=t.children=new Array(s),g=0,p=o+1;++f<s;)l=h[f]=n(c[f],p,a),l.parent=t,g+=l.value;r&&h.sort(r),i&&(t.value=g)}else delete t.children,i&&(t.value=+i.call(e,t,o)||0);return t}function t(n,r){var u=n.children,o=0;if(u&&(a=u.length))for(var a,c=-1,s=r+1;++c<a;)o+=t(u[c],s);else i&&(o=+i.call(e,n,r)||0);return i&&(n.value=o),o}function e(t){var e=[];return n(t,0,e),e}var r=vu,u=gu,i=pu;return e.sort=function(n){return arguments.length?(r=n,e):r},e.children=function(n){return arguments.length?(u=n,e):u},e.value=function(n){return arguments.length?(i=n,e):i},e.revalue=function(n){return t(n,0),n},e},$o.layout.partition=function(){function n(t,e,r,u){var i=t.children;if(t.x=e,t.y=t.depth*u,t.dx=r,t.dy=u,i&&(o=i.length)){var o,a,c,s=-1;for(r=t.value?r/t.value:0;++s<o;)n(a=i[s],e,c=a.value*r,u),e+=c}}function t(n){var e=n.children,r=0;if(e&&(u=e.length))for(var u,i=-1;++i<u;)r=Math.max(r,t(e[i]));return 1+r}function e(e,i){var o=r.call(this,e,i);return n(o[0],0,u[0],u[1]/t(o[0])),o}var r=$o.layout.hierarchy(),u=[1,1];return e.size=function(n){return arguments.length?(u=n,e):u},hu(e,r)},$o.layout.pie=function(){function n(i){var o=i.map(function(e,r){return+t.call(n,e,r)}),a=+("function"==typeof r?r.apply(this,arguments):r),c=(("function"==typeof u?u.apply(this,arguments):u)-a)/$o.sum(o),s=$o.range(i.length);null!=e&&s.sort(e===os?function(n,t){return o[t]-o[n]}:function(n,t){return e(i[n],i[t])});var l=[];return s.forEach(function(n){var t;l[n]={data:i[n],value:t=o[n],startAngle:a,endAngle:a+=t*c}}),l}var t=Number,e=os,r=0,u=Ea;return n.value=function(e){return arguments.length?(t=e,n):t},n.sort=function(t){return arguments.length?(e=t,n):e},n.startAngle=function(t){return arguments.length?(r=t,n):r},n.endAngle=function(t){return arguments.length?(u=t,n):u},n};var os={};$o.layout.stack=function(){function n(a,c){var s=a.map(function(e,r){return t.call(n,e,r)}),l=s.map(function(t){return t.map(function(t,e){return[i.call(n,t,e),o.call(n,t,e)]})}),f=e.call(n,l,c);s=$o.permute(s,f),l=$o.permute(l,f);var h,g,p,v=r.call(n,l,c),d=s.length,m=s[0].length;for(g=0;m>g;++g)for(u.call(n,s[0][g],p=v[g],l[0][g][1]),h=1;d>h;++h)u.call(n,s[h][g],p+=l[h-1][g][1],l[h][g][1]);return a}var t=vt,e=Mu,r=_u,u=xu,i=mu,o=yu;return n.values=function(e){return arguments.length?(t=e,n):t},n.order=function(t){return arguments.length?(e="function"==typeof t?t:as.get(t)||Mu,n):e},n.offset=function(t){return arguments.length?(r="function"==typeof t?t:cs.get(t)||_u,n):r},n.x=function(t){return arguments.length?(i=t,n):i},n.y=function(t){return arguments.length?(o=t,n):o},n.out=function(t){return arguments.length?(u=t,n):u},n};var as=$o.map({"inside-out":function(n){var t,e,r=n.length,u=n.map(bu),i=n.map(wu),o=$o.range(r).sort(function(n,t){return u[n]-u[t]}),a=0,c=0,s=[],l=[];for(t=0;r>t;++t)e=o[t],c>a?(a+=i[e],s.push(e)):(c+=i[e],l.push(e));return l.reverse().concat(s)},reverse:function(n){return $o.range(n.length).reverse()},"default":Mu}),cs=$o.map({silhouette:function(n){var t,e,r,u=n.length,i=n[0].length,o=[],a=0,c=[];for(e=0;i>e;++e){for(t=0,r=0;u>t;t++)r+=n[t][e][1];r>a&&(a=r),o.push(r)}for(e=0;i>e;++e)c[e]=(a-o[e])/2;return c},wiggle:function(n){var t,e,r,u,i,o,a,c,s,l=n.length,f=n[0],h=f.length,g=[];for(g[0]=c=s=0,e=1;h>e;++e){for(t=0,u=0;l>t;++t)u+=n[t][e][1];for(t=0,i=0,a=f[e][0]-f[e-1][0];l>t;++t){for(r=0,o=(n[t][e][1]-n[t][e-1][1])/(2*a);t>r;++r)o+=(n[r][e][1]-n[r][e-1][1])/a;i+=o*n[t][e][1]}g[e]=c-=u?i/u*a:0,s>c&&(s=c)}for(e=0;h>e;++e)g[e]-=s;return g},expand:function(n){var t,e,r,u=n.length,i=n[0].length,o=1/u,a=[];for(e=0;i>e;++e){for(t=0,r=0;u>t;t++)r+=n[t][e][1];if(r)for(t=0;u>t;t++)n[t][e][1]/=r;else for(t=0;u>t;t++)n[t][e][1]=o}for(e=0;i>e;++e)a[e]=0;return a},zero:_u});$o.layout.histogram=function(){function n(n,i){for(var o,a,c=[],s=n.map(e,this),l=r.call(this,s,i),f=u.call(this,l,s,i),i=-1,h=s.length,g=f.length-1,p=t?1:1/h;++i<g;)o=c[i]=[],o.dx=f[i+1]-(o.x=f[i]),o.y=0;if(g>0)for(i=-1;++i<h;)a=s[i],a>=l[0]&&a<=l[1]&&(o=c[$o.bisect(f,a,1,g)-1],o.y+=p,o.push(n[i]));return c}var t=!0,e=Number,r=Au,u=ku;return n.value=function(t){return arguments.length?(e=t,n):e},n.range=function(t){return arguments.length?(r=pt(t),n):r},n.bins=function(t){return arguments.length?(u="number"==typeof t?function(n){return Eu(n,t)}:pt(t),n):u},n.frequency=function(e){return arguments.length?(t=!!e,n):t},n},$o.layout.tree=function(){function n(n,i){function o(n,t){var r=n.children,u=n._tree;if(r&&(i=r.length)){for(var i,a,s,l=r[0],f=l,h=-1;++h<i;)s=r[h],o(s,a),f=c(s,a,f),a=s;Pu(n);var g=.5*(l._tree.prelim+s._tree.prelim);t?(u.prelim=t._tree.prelim+e(n,t),u.mod=u.prelim-g):u.prelim=g}else t&&(u.prelim=t._tree.prelim+e(n,t))}function a(n,t){n.x=n._tree.prelim+t;var e=n.children;if(e&&(r=e.length)){var r,u=-1;for(t+=n._tree.mod;++u<r;)a(e[u],t)}}function c(n,t,r){if(t){for(var u,i=n,o=n,a=t,c=n.parent.children[0],s=i._tree.mod,l=o._tree.mod,f=a._tree.mod,h=c._tree.mod;a=Lu(a),i=Nu(i),a&&i;)c=Nu(c),o=Lu(o),o._tree.ancestor=n,u=a._tree.prelim+f-i._tree.prelim-s+e(a,i),u>0&&(Uu(ju(a,n,r),n,u),s+=u,l+=u),f+=a._tree.mod,s+=i._tree.mod,h+=c._tree.mod,l+=o._tree.mod;a&&!Lu(o)&&(o._tree.thread=a,o._tree.mod+=f-l),i&&!Nu(c)&&(c._tree.thread=i,c._tree.mod+=s-h,r=n)}return r}var s=t.call(this,n,i),l=s[0];Du(l,function(n,t){n._tree={ancestor:n,prelim:0,mod:0,change:0,shift:0,number:t?t._tree.number+1:0}}),o(l),a(l,-l._tree.prelim);var f=Tu(l,zu),h=Tu(l,qu),g=Tu(l,Ru),p=f.x-e(f,h)/2,v=h.x+e(h,f)/2,d=g.depth||1;return Du(l,u?function(n){n.x*=r[0],n.y=n.depth*r[1],delete n._tree}:function(n){n.x=(n.x-p)/(v-p)*r[0],n.y=n.depth/d*r[1],delete n._tree}),s}var t=$o.layout.hierarchy().sort(null).value(null),e=Cu,r=[1,1],u=!1;return n.separation=function(t){return arguments.length?(e=t,n):e},n.size=function(t){return arguments.length?(u=null==(r=t),n):u?null:r},n.nodeSize=function(t){return arguments.length?(u=null!=(r=t),n):u?r:null},hu(n,t)},$o.layout.pack=function(){function n(n,i){var o=e.call(this,n,i),a=o[0],c=u[0],s=u[1],l=null==t?Math.sqrt:"function"==typeof t?t:function(){return t};if(a.x=a.y=0,Du(a,function(n){n.r=+l(n.value)}),Du(a,Iu),r){var f=r*(t?1:Math.max(2*a.r/c,2*a.r/s))/2;Du(a,function(n){n.r+=f}),Du(a,Iu),Du(a,function(n){n.r-=f})}return Xu(a,c/2,s/2,t?1:1/Math.max(2*a.r/c,2*a.r/s)),o}var t,e=$o.layout.hierarchy().sort(Hu),r=0,u=[1,1];return n.size=function(t){return arguments.length?(u=t,n):u},n.radius=function(e){return arguments.length?(t=null==e||"function"==typeof e?e:+e,n):t},n.padding=function(t){return arguments.length?(r=+t,n):r},hu(n,e)},$o.layout.cluster=function(){function n(n,i){var o,a=t.call(this,n,i),c=a[0],s=0;Du(c,function(n){var t=n.children;t&&t.length?(n.x=Wu(t),n.y=Bu(t)):(n.x=o?s+=e(n,o):0,n.y=0,o=n)});var l=Ju(c),f=Gu(c),h=l.x-e(l,f)/2,g=f.x+e(f,l)/2;return Du(c,u?function(n){n.x=(n.x-c.x)*r[0],n.y=(c.y-n.y)*r[1]}:function(n){n.x=(n.x-h)/(g-h)*r[0],n.y=(1-(c.y?n.y/c.y:1))*r[1]}),a}var t=$o.layout.hierarchy().sort(null).value(null),e=Cu,r=[1,1],u=!1;return n.separation=function(t){return arguments.length?(e=t,n):e},n.size=function(t){return arguments.length?(u=null==(r=t),n):u?null:r},n.nodeSize=function(t){return arguments.length?(u=null!=(r=t),n):u?r:null},hu(n,t)},$o.layout.treemap=function(){function n(n,t){for(var e,r,u=-1,i=n.length;++u<i;)r=(e=n[u]).value*(0>t?0:t),e.area=isNaN(r)||0>=r?0:r}function t(e){var i=e.children;if(i&&i.length){var o,a,c,s=f(e),l=[],h=i.slice(),p=1/0,v="slice"===g?s.dx:"dice"===g?s.dy:"slice-dice"===g?1&e.depth?s.dy:s.dx:Math.min(s.dx,s.dy);for(n(h,s.dx*s.dy/e.value),l.area=0;(c=h.length)>0;)l.push(o=h[c-1]),l.area+=o.area,"squarify"!==g||(a=r(l,v))<=p?(h.pop(),p=a):(l.area-=l.pop().area,u(l,v,s,!1),v=Math.min(s.dx,s.dy),l.length=l.area=0,p=1/0);l.length&&(u(l,v,s,!0),l.length=l.area=0),i.forEach(t)}}function e(t){var r=t.children;if(r&&r.length){var i,o=f(t),a=r.slice(),c=[];for(n(a,o.dx*o.dy/t.value),c.area=0;i=a.pop();)c.push(i),c.area+=i.area,null!=i.z&&(u(c,i.z?o.dx:o.dy,o,!a.length),c.length=c.area=0);r.forEach(e)}}function r(n,t){for(var e,r=n.area,u=0,i=1/0,o=-1,a=n.length;++o<a;)(e=n[o].area)&&(i>e&&(i=e),e>u&&(u=e));return r*=r,t*=t,r?Math.max(t*u*p/r,r/(t*i*p)):1/0}function u(n,t,e,r){var u,i=-1,o=n.length,a=e.x,s=e.y,l=t?c(n.area/t):0;if(t==e.dx){for((r||l>e.dy)&&(l=e.dy);++i<o;)u=n[i],u.x=a,u.y=s,u.dy=l,a+=u.dx=Math.min(e.x+e.dx-a,l?c(u.area/l):0);u.z=!0,u.dx+=e.x+e.dx-a,e.y+=l,e.dy-=l}else{for((r||l>e.dx)&&(l=e.dx);++i<o;)u=n[i],u.x=a,u.y=s,u.dx=l,s+=u.dy=Math.min(e.y+e.dy-s,l?c(u.area/l):0);u.z=!1,u.dy+=e.y+e.dy-s,e.x+=l,e.dx-=l}}function i(r){var u=o||a(r),i=u[0];return i.x=0,i.y=0,i.dx=s[0],i.dy=s[1],o&&a.revalue(i),n([i],i.dx*i.dy/i.value),(o?e:t)(i),h&&(o=u),u}var o,a=$o.layout.hierarchy(),c=Math.round,s=[1,1],l=null,f=Ku,h=!1,g="squarify",p=.5*(1+Math.sqrt(5));return i.size=function(n){return arguments.length?(s=n,i):s},i.padding=function(n){function t(t){var e=n.call(i,t,t.depth);return null==e?Ku(t):Qu(t,"number"==typeof e?[e,e,e,e]:e)}function e(t){return Qu(t,n)}if(!arguments.length)return l;var r;return f=null==(l=n)?Ku:"function"==(r=typeof n)?t:"number"===r?(n=[n,n,n,n],e):e,i},i.round=function(n){return arguments.length?(c=n?Math.round:Number,i):c!=Number},i.sticky=function(n){return arguments.length?(h=n,o=null,i):h},i.ratio=function(n){return arguments.length?(p=n,i):p},i.mode=function(n){return arguments.length?(g=n+"",i):g},hu(i,a)},$o.random={normal:function(n,t){var e=arguments.length;return 2>e&&(t=1),1>e&&(n=0),function(){var e,r,u;do e=2*Math.random()-1,r=2*Math.random()-1,u=e*e+r*r;while(!u||u>1);return n+t*e*Math.sqrt(-2*Math.log(u)/u)}},logNormal:function(){var n=$o.random.normal.apply($o,arguments);return function(){return Math.exp(n())}},irwinHall:function(n){return function(){for(var t=0,e=0;n>e;e++)t+=Math.random();return t/n}}},$o.scale={};var ss={floor:vt,ceil:vt};$o.scale.linear=function(){return oi([0,1],[0,1],qr,!1)};var ls={s:1,g:1,p:1,r:1,e:1};$o.scale.log=function(){return pi($o.scale.linear().domain([0,1]),10,!0,[1,10])};var fs=$o.format(".0e"),hs={floor:function(n){return-Math.ceil(-n)},ceil:function(n){return-Math.floor(-n)}};$o.scale.pow=function(){return vi($o.scale.linear(),1,[0,1])},$o.scale.sqrt=function(){return $o.scale.pow().exponent(.5)},$o.scale.ordinal=function(){return mi([],{t:"range",a:[[]]})},$o.scale.category10=function(){return $o.scale.ordinal().range(gs)},$o.scale.category20=function(){return $o.scale.ordinal().range(ps)},$o.scale.category20b=function(){return $o.scale.ordinal().range(vs)},$o.scale.category20c=function(){return $o.scale.ordinal().range(ds)};var gs=[2062260,16744206,2924588,14034728,9725885,9197131,14907330,8355711,12369186,1556175].map(it),ps=[2062260,11454440,16744206,16759672,2924588,10018698,14034728,16750742,9725885,12955861,9197131,12885140,14907330,16234194,8355711,13092807,12369186,14408589,1556175,10410725].map(it),vs=[3750777,5395619,7040719,10264286,6519097,9216594,11915115,13556636,9202993,12426809,15186514,15190932,8666169,11356490,14049643,15177372,8077683,10834324,13528509,14589654].map(it),ds=[3244733,7057110,10406625,13032431,15095053,16616764,16625259,16634018,3253076,7652470,10607003,13101504,7695281,10394312,12369372,14342891,6513507,9868950,12434877,14277081].map(it);$o.scale.quantile=function(){return yi([],[])},$o.scale.quantize=function(){return xi(0,1,[0,1])},$o.scale.threshold=function(){return Mi([.5],[0,1])},$o.scale.identity=function(){return _i([0,1])},$o.svg={},$o.svg.arc=function(){function n(){var n=t.apply(this,arguments),i=e.apply(this,arguments),o=r.apply(this,arguments)+ms,a=u.apply(this,arguments)+ms,c=(o>a&&(c=o,o=a,a=c),a-o),s=ka>c?"0":"1",l=Math.cos(o),f=Math.sin(o),h=Math.cos(a),g=Math.sin(a);return c>=ys?n?"M0,"+i+"A"+i+","+i+" 0 1,1 0,"+-i+"A"+i+","+i+" 0 1,1 0,"+i+"M0,"+n+"A"+n+","+n+" 0 1,0 0,"+-n+"A"+n+","+n+" 0 1,0 0,"+n+"Z":"M0,"+i+"A"+i+","+i+" 0 1,1 0,"+-i+"A"+i+","+i+" 0 1,1 0,"+i+"Z":n?"M"+i*l+","+i*f+"A"+i+","+i+" 0 "+s+",1 "+i*h+","+i*g+"L"+n*h+","+n*g+"A"+n+","+n+" 0 "+s+",0 "+n*l+","+n*f+"Z":"M"+i*l+","+i*f+"A"+i+","+i+" 0 "+s+",1 "+i*h+","+i*g+"L0,0"+"Z"}var t=bi,e=wi,r=Si,u=ki;return n.innerRadius=function(e){return arguments.length?(t=pt(e),n):t},n.outerRadius=function(t){return arguments.length?(e=pt(t),n):e},n.startAngle=function(t){return arguments.length?(r=pt(t),n):r},n.endAngle=function(t){return arguments.length?(u=pt(t),n):u},n.centroid=function(){var n=(t.apply(this,arguments)+e.apply(this,arguments))/2,i=(r.apply(this,arguments)+u.apply(this,arguments))/2+ms;return[Math.cos(i)*n,Math.sin(i)*n]},n};var ms=-Aa,ys=Ea-Ca;$o.svg.line=function(){return Ei(vt)};var xs=$o.map({linear:Ai,"linear-closed":Ci,step:Ni,"step-before":Li,"step-after":Ti,basis:Ui,"basis-open":ji,"basis-closed":Hi,bundle:Fi,cardinal:Ri,"cardinal-open":qi,"cardinal-closed":zi,monotone:Xi});xs.forEach(function(n,t){t.key=n,t.closed=/-closed$/.test(n)});var Ms=[0,2/3,1/3,0],_s=[0,1/3,2/3,0],bs=[0,1/6,2/3,1/6];$o.svg.line.radial=function(){var n=Ei($i);return n.radius=n.x,delete n.x,n.angle=n.y,delete n.y,n},Li.reverse=Ti,Ti.reverse=Li,$o.svg.area=function(){return Bi(vt)},$o.svg.area.radial=function(){var n=Bi($i);return n.radius=n.x,delete n.x,n.innerRadius=n.x0,delete n.x0,n.outerRadius=n.x1,delete n.x1,n.angle=n.y,delete n.y,n.startAngle=n.y0,delete n.y0,n.endAngle=n.y1,delete n.y1,n},$o.svg.chord=function(){function n(n,a){var c=t(this,i,n,a),s=t(this,o,n,a);return"M"+c.p0+r(c.r,c.p1,c.a1-c.a0)+(e(c,s)?u(c.r,c.p1,c.r,c.p0):u(c.r,c.p1,s.r,s.p0)+r(s.r,s.p1,s.a1-s.a0)+u(s.r,s.p1,c.r,c.p0))+"Z"}function t(n,t,e,r){var u=t.call(n,e,r),i=a.call(n,u,r),o=c.call(n,u,r)+ms,l=s.call(n,u,r)+ms;return{r:i,a0:o,a1:l,p0:[i*Math.cos(o),i*Math.sin(o)],p1:[i*Math.cos(l),i*Math.sin(l)]}}function e(n,t){return n.a0==t.a0&&n.a1==t.a1}function r(n,t,e){return"A"+n+","+n+" 0 "+ +(e>ka)+",1 "+t}function u(n,t,e,r){return"Q 0,0 "+r}var i=Re,o=De,a=Wi,c=Si,s=ki;return n.radius=function(t){return arguments.length?(a=pt(t),n):a},n.source=function(t){return arguments.length?(i=pt(t),n):i},n.target=function(t){return arguments.length?(o=pt(t),n):o},n.startAngle=function(t){return arguments.length?(c=pt(t),n):c},n.endAngle=function(t){return arguments.length?(s=pt(t),n):s},n},$o.svg.diagonal=function(){function n(n,u){var i=t.call(this,n,u),o=e.call(this,n,u),a=(i.y+o.y)/2,c=[i,{x:i.x,y:a},{x:o.x,y:a},o];return c=c.map(r),"M"+c[0]+"C"+c[1]+" "+c[2]+" "+c[3]}var t=Re,e=De,r=Ji;return n.source=function(e){return arguments.length?(t=pt(e),n):t},n.target=function(t){return arguments.length?(e=pt(t),n):e},n.projection=function(t){return arguments.length?(r=t,n):r},n},$o.svg.diagonal.radial=function(){var n=$o.svg.diagonal(),t=Ji,e=n.projection;return n.projection=function(n){return arguments.length?e(Gi(t=n)):t},n},$o.svg.symbol=function(){function n(n,r){return(ws.get(t.call(this,n,r))||no)(e.call(this,n,r))}var t=Qi,e=Ki;return n.type=function(e){return arguments.length?(t=pt(e),n):t},n.size=function(t){return arguments.length?(e=pt(t),n):e},n};var ws=$o.map({circle:no,cross:function(n){var t=Math.sqrt(n/5)/2;return"M"+-3*t+","+-t+"H"+-t+"V"+-3*t+"H"+t+"V"+-t+"H"+3*t+"V"+t+"H"+t+"V"+3*t+"H"+-t+"V"+t+"H"+-3*t+"Z"},diamond:function(n){var t=Math.sqrt(n/(2*As)),e=t*As;return"M0,"+-t+"L"+e+",0"+" 0,"+t+" "+-e+",0"+"Z"},square:function(n){var t=Math.sqrt(n)/2;return"M"+-t+","+-t+"L"+t+","+-t+" "+t+","+t+" "+-t+","+t+"Z"},"triangle-down":function(n){var t=Math.sqrt(n/Es),e=t*Es/2;return"M0,"+e+"L"+t+","+-e+" "+-t+","+-e+"Z"},"triangle-up":function(n){var t=Math.sqrt(n/Es),e=t*Es/2;return"M0,"+-e+"L"+t+","+e+" "+-t+","+e+"Z"}});$o.svg.symbolTypes=ws.keys();var Ss,ks,Es=Math.sqrt(3),As=Math.tan(30*La),Cs=[],Ns=0; +Cs.call=ma.call,Cs.empty=ma.empty,Cs.node=ma.node,Cs.size=ma.size,$o.transition=function(n){return arguments.length?Ss?n.transition():n:Ma.transition()},$o.transition.prototype=Cs,Cs.select=function(n){var t,e,r,u=this.id,i=[];n=v(n);for(var o=-1,a=this.length;++o<a;){i.push(t=[]);for(var c=this[o],s=-1,l=c.length;++s<l;)(r=c[s])&&(e=n.call(r,r.__data__,s,o))?("__data__"in r&&(e.__data__=r.__data__),uo(e,s,u,r.__transition__[u]),t.push(e)):t.push(null)}return to(i,u)},Cs.selectAll=function(n){var t,e,r,u,i,o=this.id,a=[];n=d(n);for(var c=-1,s=this.length;++c<s;)for(var l=this[c],f=-1,h=l.length;++f<h;)if(r=l[f]){i=r.__transition__[o],e=n.call(r,r.__data__,f,c),a.push(t=[]);for(var g=-1,p=e.length;++g<p;)(u=e[g])&&uo(u,g,o,i),t.push(u)}return to(a,o)},Cs.filter=function(n){var t,e,r,u=[];"function"!=typeof n&&(n=E(n));for(var i=0,o=this.length;o>i;i++){u.push(t=[]);for(var e=this[i],a=0,c=e.length;c>a;a++)(r=e[a])&&n.call(r,r.__data__,a)&&t.push(r)}return to(u,this.id)},Cs.tween=function(n,t){var e=this.id;return arguments.length<2?this.node().__transition__[e].tween.get(n):C(this,null==t?function(t){t.__transition__[e].tween.remove(n)}:function(r){r.__transition__[e].tween.set(n,t)})},Cs.attr=function(n,t){function e(){this.removeAttribute(a)}function r(){this.removeAttributeNS(a.space,a.local)}function u(n){return null==n?e:(n+="",function(){var t,e=this.getAttribute(a);return e!==n&&(t=o(e,n),function(n){this.setAttribute(a,t(n))})})}function i(n){return null==n?r:(n+="",function(){var t,e=this.getAttributeNS(a.space,a.local);return e!==n&&(t=o(e,n),function(n){this.setAttributeNS(a.space,a.local,t(n))})})}if(arguments.length<2){for(t in n)this.attr(t,n[t]);return this}var o="transform"==n?tu:qr,a=$o.ns.qualify(n);return eo(this,"attr."+n,t,a.local?i:u)},Cs.attrTween=function(n,t){function e(n,e){var r=t.call(this,n,e,this.getAttribute(u));return r&&function(n){this.setAttribute(u,r(n))}}function r(n,e){var r=t.call(this,n,e,this.getAttributeNS(u.space,u.local));return r&&function(n){this.setAttributeNS(u.space,u.local,r(n))}}var u=$o.ns.qualify(n);return this.tween("attr."+n,u.local?r:e)},Cs.style=function(n,t,e){function r(){this.style.removeProperty(n)}function u(t){return null==t?r:(t+="",function(){var r,u=Ko.getComputedStyle(this,null).getPropertyValue(n);return u!==t&&(r=qr(u,t),function(t){this.style.setProperty(n,r(t),e)})})}var i=arguments.length;if(3>i){if("string"!=typeof n){2>i&&(t="");for(e in n)this.style(e,n[e],t);return this}e=""}return eo(this,"style."+n,t,u)},Cs.styleTween=function(n,t,e){function r(r,u){var i=t.call(this,r,u,Ko.getComputedStyle(this,null).getPropertyValue(n));return i&&function(t){this.style.setProperty(n,i(t),e)}}return arguments.length<3&&(e=""),this.tween("style."+n,r)},Cs.text=function(n){return eo(this,"text",n,ro)},Cs.remove=function(){return this.each("end.transition",function(){var n;this.__transition__.count<2&&(n=this.parentNode)&&n.removeChild(this)})},Cs.ease=function(n){var t=this.id;return arguments.length<1?this.node().__transition__[t].ease:("function"!=typeof n&&(n=$o.ease.apply($o,arguments)),C(this,function(e){e.__transition__[t].ease=n}))},Cs.delay=function(n){var t=this.id;return C(this,"function"==typeof n?function(e,r,u){e.__transition__[t].delay=+n.call(e,e.__data__,r,u)}:(n=+n,function(e){e.__transition__[t].delay=n}))},Cs.duration=function(n){var t=this.id;return C(this,"function"==typeof n?function(e,r,u){e.__transition__[t].duration=Math.max(1,n.call(e,e.__data__,r,u))}:(n=Math.max(1,n),function(e){e.__transition__[t].duration=n}))},Cs.each=function(n,t){var e=this.id;if(arguments.length<2){var r=ks,u=Ss;Ss=e,C(this,function(t,r,u){ks=t.__transition__[e],n.call(t,t.__data__,r,u)}),ks=r,Ss=u}else C(this,function(r){var u=r.__transition__[e];(u.event||(u.event=$o.dispatch("start","end"))).on(n,t)});return this},Cs.transition=function(){for(var n,t,e,r,u=this.id,i=++Ns,o=[],a=0,c=this.length;c>a;a++){o.push(n=[]);for(var t=this[a],s=0,l=t.length;l>s;s++)(e=t[s])&&(r=Object.create(e.__transition__[u]),r.delay+=r.duration,uo(e,s,i,r)),n.push(e)}return to(o,i)},$o.svg.axis=function(){function n(n){n.each(function(){var n,s=$o.select(this),l=this.__chart__||e,f=this.__chart__=e.copy(),h=null==c?f.ticks?f.ticks.apply(f,a):f.domain():c,g=null==t?f.tickFormat?f.tickFormat.apply(f,a):vt:t,p=s.selectAll(".tick").data(h,f),v=p.enter().insert("g",".domain").attr("class","tick").style("opacity",Ca),d=$o.transition(p.exit()).style("opacity",Ca).remove(),m=$o.transition(p).style("opacity",1),y=ti(f),x=s.selectAll(".domain").data([0]),M=(x.enter().append("path").attr("class","domain"),$o.transition(x));v.append("line"),v.append("text");var _=v.select("line"),b=m.select("line"),w=p.select("text").text(g),S=v.select("text"),k=m.select("text");switch(r){case"bottom":n=io,_.attr("y2",u),S.attr("y",Math.max(u,0)+o),b.attr("x2",0).attr("y2",u),k.attr("x",0).attr("y",Math.max(u,0)+o),w.attr("dy",".71em").style("text-anchor","middle"),M.attr("d","M"+y[0]+","+i+"V0H"+y[1]+"V"+i);break;case"top":n=io,_.attr("y2",-u),S.attr("y",-(Math.max(u,0)+o)),b.attr("x2",0).attr("y2",-u),k.attr("x",0).attr("y",-(Math.max(u,0)+o)),w.attr("dy","0em").style("text-anchor","middle"),M.attr("d","M"+y[0]+","+-i+"V0H"+y[1]+"V"+-i);break;case"left":n=oo,_.attr("x2",-u),S.attr("x",-(Math.max(u,0)+o)),b.attr("x2",-u).attr("y2",0),k.attr("x",-(Math.max(u,0)+o)).attr("y",0),w.attr("dy",".32em").style("text-anchor","end"),M.attr("d","M"+-i+","+y[0]+"H0V"+y[1]+"H"+-i);break;case"right":n=oo,_.attr("x2",u),S.attr("x",Math.max(u,0)+o),b.attr("x2",u).attr("y2",0),k.attr("x",Math.max(u,0)+o).attr("y",0),w.attr("dy",".32em").style("text-anchor","start"),M.attr("d","M"+i+","+y[0]+"H0V"+y[1]+"H"+i)}if(f.rangeBand){var E=f.rangeBand()/2,A=function(n){return f(n)+E};v.call(n,A),m.call(n,A)}else v.call(n,l),m.call(n,f),d.call(n,f)})}var t,e=$o.scale.linear(),r=Ls,u=6,i=6,o=3,a=[10],c=null;return n.scale=function(t){return arguments.length?(e=t,n):e},n.orient=function(t){return arguments.length?(r=t in Ts?t+"":Ls,n):r},n.ticks=function(){return arguments.length?(a=arguments,n):a},n.tickValues=function(t){return arguments.length?(c=t,n):c},n.tickFormat=function(e){return arguments.length?(t=e,n):t},n.tickSize=function(t){var e=arguments.length;return e?(u=+t,i=+arguments[e-1],n):u},n.innerTickSize=function(t){return arguments.length?(u=+t,n):u},n.outerTickSize=function(t){return arguments.length?(i=+t,n):i},n.tickPadding=function(t){return arguments.length?(o=+t,n):o},n.tickSubdivide=function(){return arguments.length&&n},n};var Ls="bottom",Ts={top:1,right:1,bottom:1,left:1};$o.svg.brush=function(){function n(i){i.each(function(){var i=$o.select(this).style("pointer-events","all").style("-webkit-tap-highlight-color","rgba(0,0,0,0)").on("mousedown.brush",u).on("touchstart.brush",u),o=i.selectAll(".background").data([0]);o.enter().append("rect").attr("class","background").style("visibility","hidden").style("cursor","crosshair"),i.selectAll(".extent").data([0]).enter().append("rect").attr("class","extent").style("cursor","move");var a=i.selectAll(".resize").data(d,vt);a.exit().remove(),a.enter().append("g").attr("class",function(n){return"resize "+n}).style("cursor",function(n){return qs[n]}).append("rect").attr("x",function(n){return/[ew]$/.test(n)?-3:null}).attr("y",function(n){return/^[ns]/.test(n)?-3:null}).attr("width",6).attr("height",6).style("visibility","hidden"),a.style("display",n.empty()?"none":null);var l,f=$o.transition(i),h=$o.transition(o);c&&(l=ti(c),h.attr("x",l[0]).attr("width",l[1]-l[0]),e(f)),s&&(l=ti(s),h.attr("y",l[0]).attr("height",l[1]-l[0]),r(f)),t(f)})}function t(n){n.selectAll(".resize").attr("transform",function(n){return"translate("+l[+/e$/.test(n)]+","+h[+/^s/.test(n)]+")"})}function e(n){n.select(".extent").attr("x",l[0]),n.selectAll(".extent,.n>rect,.s>rect").attr("width",l[1]-l[0])}function r(n){n.select(".extent").attr("y",h[0]),n.selectAll(".extent,.e>rect,.w>rect").attr("height",h[1]-h[0])}function u(){function u(){32==$o.event.keyCode&&(C||(x=null,L[0]-=l[1],L[1]-=h[1],C=2),f())}function g(){32==$o.event.keyCode&&2==C&&(L[0]+=l[1],L[1]+=h[1],C=0,f())}function d(){var n=$o.mouse(_),u=!1;M&&(n[0]+=M[0],n[1]+=M[1]),C||($o.event.altKey?(x||(x=[(l[0]+l[1])/2,(h[0]+h[1])/2]),L[0]=l[+(n[0]<x[0])],L[1]=h[+(n[1]<x[1])]):x=null),E&&m(n,c,0)&&(e(S),u=!0),A&&m(n,s,1)&&(r(S),u=!0),u&&(t(S),w({type:"brush",mode:C?"move":"resize"}))}function m(n,t,e){var r,u,a=ti(t),c=a[0],s=a[1],f=L[e],g=e?h:l,d=g[1]-g[0];return C&&(c-=f,s-=d+f),r=(e?v:p)?Math.max(c,Math.min(s,n[e])):n[e],C?u=(r+=f)+d:(x&&(f=Math.max(c,Math.min(s,2*x[e]-r))),r>f?(u=r,r=f):u=f),g[0]!=r||g[1]!=u?(e?o=null:i=null,g[0]=r,g[1]=u,!0):void 0}function y(){d(),S.style("pointer-events","all").selectAll(".resize").style("display",n.empty()?"none":null),$o.select("body").style("cursor",null),T.on("mousemove.brush",null).on("mouseup.brush",null).on("touchmove.brush",null).on("touchend.brush",null).on("keydown.brush",null).on("keyup.brush",null),N(),w({type:"brushend"})}var x,M,_=this,b=$o.select($o.event.target),w=a.of(_,arguments),S=$o.select(_),k=b.datum(),E=!/^(n|s)$/.test(k)&&c,A=!/^(e|w)$/.test(k)&&s,C=b.classed("extent"),N=D(),L=$o.mouse(_),T=$o.select(Ko).on("keydown.brush",u).on("keyup.brush",g);if($o.event.changedTouches?T.on("touchmove.brush",d).on("touchend.brush",y):T.on("mousemove.brush",d).on("mouseup.brush",y),S.interrupt().selectAll("*").interrupt(),C)L[0]=l[0]-L[0],L[1]=h[0]-L[1];else if(k){var q=+/w$/.test(k),z=+/^n/.test(k);M=[l[1-q]-L[0],h[1-z]-L[1]],L[0]=l[q],L[1]=h[z]}else $o.event.altKey&&(x=L.slice());S.style("pointer-events","none").selectAll(".resize").style("display",null),$o.select("body").style("cursor",b.style("cursor")),w({type:"brushstart"}),d()}var i,o,a=g(n,"brushstart","brush","brushend"),c=null,s=null,l=[0,0],h=[0,0],p=!0,v=!0,d=zs[0];return n.event=function(n){n.each(function(){var n=a.of(this,arguments),t={x:l,y:h,i:i,j:o},e=this.__chart__||t;this.__chart__=t,Ss?$o.select(this).transition().each("start.brush",function(){i=e.i,o=e.j,l=e.x,h=e.y,n({type:"brushstart"})}).tween("brush:brush",function(){var e=zr(l,t.x),r=zr(h,t.y);return i=o=null,function(u){l=t.x=e(u),h=t.y=r(u),n({type:"brush",mode:"resize"})}}).each("end.brush",function(){i=t.i,o=t.j,n({type:"brush",mode:"resize"}),n({type:"brushend"})}):(n({type:"brushstart"}),n({type:"brush",mode:"resize"}),n({type:"brushend"}))})},n.x=function(t){return arguments.length?(c=t,d=zs[!c<<1|!s],n):c},n.y=function(t){return arguments.length?(s=t,d=zs[!c<<1|!s],n):s},n.clamp=function(t){return arguments.length?(c&&s?(p=!!t[0],v=!!t[1]):c?p=!!t:s&&(v=!!t),n):c&&s?[p,v]:c?p:s?v:null},n.extent=function(t){var e,r,u,a,f;return arguments.length?(c&&(e=t[0],r=t[1],s&&(e=e[0],r=r[0]),i=[e,r],c.invert&&(e=c(e),r=c(r)),e>r&&(f=e,e=r,r=f),(e!=l[0]||r!=l[1])&&(l=[e,r])),s&&(u=t[0],a=t[1],c&&(u=u[1],a=a[1]),o=[u,a],s.invert&&(u=s(u),a=s(a)),u>a&&(f=u,u=a,a=f),(u!=h[0]||a!=h[1])&&(h=[u,a])),n):(c&&(i?(e=i[0],r=i[1]):(e=l[0],r=l[1],c.invert&&(e=c.invert(e),r=c.invert(r)),e>r&&(f=e,e=r,r=f))),s&&(o?(u=o[0],a=o[1]):(u=h[0],a=h[1],s.invert&&(u=s.invert(u),a=s.invert(a)),u>a&&(f=u,u=a,a=f))),c&&s?[[e,u],[r,a]]:c?[e,r]:s&&[u,a])},n.clear=function(){return n.empty()||(l=[0,0],h=[0,0],i=o=null),n},n.empty=function(){return!!c&&l[0]==l[1]||!!s&&h[0]==h[1]},$o.rebind(n,a,"on")};var qs={n:"ns-resize",e:"ew-resize",s:"ns-resize",w:"ew-resize",nw:"nwse-resize",ne:"nesw-resize",se:"nwse-resize",sw:"nesw-resize"},zs=[["n","e","s","w","nw","ne","se","sw"],["e","w"],["n","s"],[]],Rs=$o.time={},Ds=Date,Ps=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];ao.prototype={getDate:function(){return this._.getUTCDate()},getDay:function(){return this._.getUTCDay()},getFullYear:function(){return this._.getUTCFullYear()},getHours:function(){return this._.getUTCHours()},getMilliseconds:function(){return this._.getUTCMilliseconds()},getMinutes:function(){return this._.getUTCMinutes()},getMonth:function(){return this._.getUTCMonth()},getSeconds:function(){return this._.getUTCSeconds()},getTime:function(){return this._.getTime()},getTimezoneOffset:function(){return 0},valueOf:function(){return this._.valueOf()},setDate:function(){Us.setUTCDate.apply(this._,arguments)},setDay:function(){Us.setUTCDay.apply(this._,arguments)},setFullYear:function(){Us.setUTCFullYear.apply(this._,arguments)},setHours:function(){Us.setUTCHours.apply(this._,arguments)},setMilliseconds:function(){Us.setUTCMilliseconds.apply(this._,arguments)},setMinutes:function(){Us.setUTCMinutes.apply(this._,arguments)},setMonth:function(){Us.setUTCMonth.apply(this._,arguments)},setSeconds:function(){Us.setUTCSeconds.apply(this._,arguments)},setTime:function(){Us.setTime.apply(this._,arguments)}};var Us=Date.prototype,js="%a %b %e %X %Y",Hs="%m/%d/%Y",Fs="%H:%M:%S",Os=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],Ys=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],Is=["January","February","March","April","May","June","July","August","September","October","November","December"],Zs=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];Rs.year=co(function(n){return n=Rs.day(n),n.setMonth(0,1),n},function(n,t){n.setFullYear(n.getFullYear()+t)},function(n){return n.getFullYear()}),Rs.years=Rs.year.range,Rs.years.utc=Rs.year.utc.range,Rs.day=co(function(n){var t=new Ds(2e3,0);return t.setFullYear(n.getFullYear(),n.getMonth(),n.getDate()),t},function(n,t){n.setDate(n.getDate()+t)},function(n){return n.getDate()-1}),Rs.days=Rs.day.range,Rs.days.utc=Rs.day.utc.range,Rs.dayOfYear=function(n){var t=Rs.year(n);return Math.floor((n-t-6e4*(n.getTimezoneOffset()-t.getTimezoneOffset()))/864e5)},Ps.forEach(function(n,t){n=n.toLowerCase(),t=7-t;var e=Rs[n]=co(function(n){return(n=Rs.day(n)).setDate(n.getDate()-(n.getDay()+t)%7),n},function(n,t){n.setDate(n.getDate()+7*Math.floor(t))},function(n){var e=Rs.year(n).getDay();return Math.floor((Rs.dayOfYear(n)+(e+t)%7)/7)-(e!==t)});Rs[n+"s"]=e.range,Rs[n+"s"].utc=e.utc.range,Rs[n+"OfYear"]=function(n){var e=Rs.year(n).getDay();return Math.floor((Rs.dayOfYear(n)+(e+t)%7)/7)}}),Rs.week=Rs.sunday,Rs.weeks=Rs.sunday.range,Rs.weeks.utc=Rs.sunday.utc.range,Rs.weekOfYear=Rs.sundayOfYear,Rs.format=lo;var Vs=ho(Os),Xs=go(Os),$s=ho(Ys),Bs=go(Ys),Ws=ho(Is),Js=go(Is),Gs=ho(Zs),Ks=go(Zs),Qs=/^%/,nl={"-":"",_:" ",0:"0"},tl={a:function(n){return Ys[n.getDay()]},A:function(n){return Os[n.getDay()]},b:function(n){return Zs[n.getMonth()]},B:function(n){return Is[n.getMonth()]},c:lo(js),d:function(n,t){return po(n.getDate(),t,2)},e:function(n,t){return po(n.getDate(),t,2)},H:function(n,t){return po(n.getHours(),t,2)},I:function(n,t){return po(n.getHours()%12||12,t,2)},j:function(n,t){return po(1+Rs.dayOfYear(n),t,3)},L:function(n,t){return po(n.getMilliseconds(),t,3)},m:function(n,t){return po(n.getMonth()+1,t,2)},M:function(n,t){return po(n.getMinutes(),t,2)},p:function(n){return n.getHours()>=12?"PM":"AM"},S:function(n,t){return po(n.getSeconds(),t,2)},U:function(n,t){return po(Rs.sundayOfYear(n),t,2)},w:function(n){return n.getDay()},W:function(n,t){return po(Rs.mondayOfYear(n),t,2)},x:lo(Hs),X:lo(Fs),y:function(n,t){return po(n.getFullYear()%100,t,2)},Y:function(n,t){return po(n.getFullYear()%1e4,t,4)},Z:jo,"%":function(){return"%"}},el={a:vo,A:mo,b:_o,B:bo,c:wo,d:To,e:To,H:zo,I:zo,j:qo,L:Po,m:Lo,M:Ro,p:Uo,S:Do,U:xo,w:yo,W:Mo,x:So,X:ko,y:Ao,Y:Eo,Z:Co,"%":Ho},rl=/^\s*\d+/,ul=$o.map({am:0,pm:1});lo.utc=Fo;var il=Fo("%Y-%m-%dT%H:%M:%S.%LZ");lo.iso=Date.prototype.toISOString&&+new Date("2000-01-01T00:00:00.000Z")?Oo:il,Oo.parse=function(n){var t=new Date(n);return isNaN(t)?null:t},Oo.toString=il.toString,Rs.second=co(function(n){return new Ds(1e3*Math.floor(n/1e3))},function(n,t){n.setTime(n.getTime()+1e3*Math.floor(t))},function(n){return n.getSeconds()}),Rs.seconds=Rs.second.range,Rs.seconds.utc=Rs.second.utc.range,Rs.minute=co(function(n){return new Ds(6e4*Math.floor(n/6e4))},function(n,t){n.setTime(n.getTime()+6e4*Math.floor(t))},function(n){return n.getMinutes()}),Rs.minutes=Rs.minute.range,Rs.minutes.utc=Rs.minute.utc.range,Rs.hour=co(function(n){var t=n.getTimezoneOffset()/60;return new Ds(36e5*(Math.floor(n/36e5-t)+t))},function(n,t){n.setTime(n.getTime()+36e5*Math.floor(t))},function(n){return n.getHours()}),Rs.hours=Rs.hour.range,Rs.hours.utc=Rs.hour.utc.range,Rs.month=co(function(n){return n=Rs.day(n),n.setDate(1),n},function(n,t){n.setMonth(n.getMonth()+t)},function(n){return n.getMonth()}),Rs.months=Rs.month.range,Rs.months.utc=Rs.month.utc.range;var ol=[1e3,5e3,15e3,3e4,6e4,3e5,9e5,18e5,36e5,108e5,216e5,432e5,864e5,1728e5,6048e5,2592e6,7776e6,31536e6],al=[[Rs.second,1],[Rs.second,5],[Rs.second,15],[Rs.second,30],[Rs.minute,1],[Rs.minute,5],[Rs.minute,15],[Rs.minute,30],[Rs.hour,1],[Rs.hour,3],[Rs.hour,6],[Rs.hour,12],[Rs.day,1],[Rs.day,2],[Rs.week,1],[Rs.month,1],[Rs.month,3],[Rs.year,1]],cl=[[lo("%Y"),Zt],[lo("%B"),function(n){return n.getMonth()}],[lo("%b %d"),function(n){return 1!=n.getDate()}],[lo("%a %d"),function(n){return n.getDay()&&1!=n.getDate()}],[lo("%I %p"),function(n){return n.getHours()}],[lo("%I:%M"),function(n){return n.getMinutes()}],[lo(":%S"),function(n){return n.getSeconds()}],[lo(".%L"),function(n){return n.getMilliseconds()}]],sl=Zo(cl);al.year=Rs.year,Rs.scale=function(){return Yo($o.scale.linear(),al,sl)};var ll={range:function(n,t,e){return $o.range(+n,+t,e).map(Io)}},fl=al.map(function(n){return[n[0].utc,n[1]]}),hl=[[Fo("%Y"),Zt],[Fo("%B"),function(n){return n.getUTCMonth()}],[Fo("%b %d"),function(n){return 1!=n.getUTCDate()}],[Fo("%a %d"),function(n){return n.getUTCDay()&&1!=n.getUTCDate()}],[Fo("%I %p"),function(n){return n.getUTCHours()}],[Fo("%I:%M"),function(n){return n.getUTCMinutes()}],[Fo(":%S"),function(n){return n.getUTCSeconds()}],[Fo(".%L"),function(n){return n.getUTCMilliseconds()}]],gl=Zo(hl);return fl.year=Rs.year.utc,Rs.scale.utc=function(){return Yo($o.scale.linear(),fl,gl)},$o.text=dt(function(n){return n.responseText}),$o.json=function(n,t){return mt(n,"application/json",Vo,t)},$o.html=function(n,t){return mt(n,"text/html",Xo,t)},$o.xml=dt(function(n){return n.responseXML}),$o}(); +/* + --------------------------------------------------------------------- + End of d3.min.js +*/ +} +</script> +<script type="text/javascript">var RadarChart = { + draw: function(id, d, options){ + var cfg = { + radius: 5, + w: 600, + h: 600, + factor: .95, + factorLegend: 1, + levels: 3, + maxValue: 0, + radians: 2 * Math.PI, + opacityArea: 0.5, + color: d3.scale.category10(), + fontSize: 10 + }; + if('undefined' !== typeof options){ + for(var i in options){ + if('undefined' !== typeof options[i]){ + cfg[i] = options[i]; + } + } + } + cfg.maxValue = Math.max(cfg.maxValue, d3.max(d, function(i){return d3.max(i.map(function(o){return o.value;}))})); + var allAxis = (d[0].map(function(i, j){return i.axis})); + var total = allAxis.length; + var radius = cfg.factor*Math.min(cfg.w/2, cfg.h/2); + d3.select(id).select("svg").remove(); + var g = d3.select(id).append("svg").attr("width", cfg.w).attr("height", cfg.h).append("g"); + + var tooltip; + function getPosition(i, range, factor, func){ + factor = typeof factor !== 'undefined' ? factor : 1; + return range * (1 - factor * func(i * cfg.radians / total)); + } + function getHorizontalPosition(i, range, factor){ + return getPosition(i, range, factor, Math.sin); + } + function getVerticalPosition(i, range, factor){ + return getPosition(i, range, factor, Math.cos); + } + + for(var j=0; j<cfg.levels; j++){ + var levelFactor = radius*((j+1)/cfg.levels); + g.selectAll(".levels").data(allAxis).enter().append("svg:line") + .attr("x1", function(d, i){return getHorizontalPosition(i, levelFactor);}) + .attr("y1", function(d, i){return getVerticalPosition(i, levelFactor);}) + .attr("x2", function(d, i){return getHorizontalPosition(i+1, levelFactor);}) + .attr("y2", function(d, i){return getVerticalPosition(i+1, levelFactor);}) + .attr("class", "line").style("stroke", "grey").style("stroke-width", "0.5px").attr("transform", "translate(" + (cfg.w/2-levelFactor) + ", " + (cfg.h/2-levelFactor) + ")"); + + } + + series = 0; + + var axis = g.selectAll(".axis").data(allAxis).enter().append("g").attr("class", "axis"); + + axis.append("line") + .attr("x1", cfg.w/2) + .attr("y1", cfg.h/2) + .attr("x2", function(j, i){return getHorizontalPosition(i, cfg.w/2, cfg.factor);}) + .attr("y2", function(j, i){return getVerticalPosition(i, cfg.h/2, cfg.factor);}) + .attr("class", "line").style("stroke", "grey").style("stroke-width", "1px"); + + axis.append("text").attr("class", function(d,i){ return "legend_axis" + i; }) + .text(function(d){return d}) + .style("font-size", cfg.fontSize + "px") + .style("text-anchor", function(d, i){ + var p = getHorizontalPosition(i, 0.5); + return (p < 0.4) ? "start" : ((p > 0.6) ? "end" : "middle"); + }) + .attr("transform", function(d, i){ + var p = getVerticalPosition(i, cfg.h / 2); + return p < cfg.fontSize ? "translate(0, " + (cfg.fontSize - p) + ")" : ""; + }) + .attr("x", function(d, i){return getHorizontalPosition(i, cfg.w / 2, cfg.factorLegend);}) + .attr("y", function(d, i){return getVerticalPosition(i, cfg.h / 2, cfg.factorLegend);}); + + d.forEach(function(y, x){ + dataValues = []; + g.selectAll(".nodes") + .data(y, function(j, i){ + dataValues.push([ + getHorizontalPosition(i, cfg.w/2, (parseFloat(Math.max(j.value, 0))/cfg.maxValue)*cfg.factor), + getVerticalPosition(i, cfg.h/2, (parseFloat(Math.max(j.value, 0))/cfg.maxValue)*cfg.factor) + ]); + }); + dataValues.push(dataValues[0]); + g.selectAll(".area") + .data([dataValues]) + .enter() + .append("polygon") + .attr("class", "radar-chart-serie"+series) + .style("stroke-width", "2px") + .style("stroke", cfg.color(series)) + .attr("points",function(d) { + var str=""; + for(var pti=0;pti<d.length;pti++){ + str=str+d[pti][0]+","+d[pti][1]+" "; + } + return str; + }) + .style("fill", function(j, i){return cfg.color(series)}) + .style("fill-opacity", cfg.opacityArea) + .on('mouseover', function (d){ + z = "polygon."+d3.select(this).attr("class"); + g.selectAll("polygon").transition(200).style("fill-opacity", 0.1); + g.selectAll(z).transition(200).style("fill-opacity", .7); + }) + .on('mouseout', function(){ + g.selectAll("polygon").transition(200).style("fill-opacity", cfg.opacityArea); + }); + series++; + }); + series=0; + + + d.forEach(function(y, x){ + g.selectAll(".nodes") + .data(y).enter() + .append("svg:circle").attr("class", "radar-chart-serie"+series) + .attr('r', cfg.radius) + .attr("alt", function(j){return Math.max(j.value, 0)}) + .attr("cx", function(j, i){ + dataValues.push([ + getHorizontalPosition(i, cfg.w/2, (parseFloat(Math.max(j.value, 0))/cfg.maxValue)*cfg.factor), + getVerticalPosition(i, cfg.h/2, (parseFloat(Math.max(j.value, 0))/cfg.maxValue)*cfg.factor) + ]); + return getHorizontalPosition(i, cfg.w/2, (Math.max(j.value, 0)/cfg.maxValue)*cfg.factor); + }) + .attr("cy", function(j, i){ + return getVerticalPosition(i, cfg.h/2, (Math.max(j.value, 0)/cfg.maxValue)*cfg.factor); + }) + .attr("data-id", function(j){return j.axis}) + .style("fill", cfg.color(series)).style("fill-opacity", .9) + .on('mouseover', function (d){ + newX = parseFloat(d3.select(this).attr('cx')) - 10; + newY = parseFloat(d3.select(this).attr('cy')) - 5; + tooltip.attr('x', newX).attr('y', newY).text(d.value).transition(200).style('opacity', 1); + z = "polygon."+d3.select(this).attr("class"); + g.selectAll("polygon").transition(200).style("fill-opacity", 0.1); + g.selectAll(z).transition(200).style("fill-opacity", .7); + }) + .on('mouseout', function(){ + tooltip.transition(200).style('opacity', 0); + g.selectAll("polygon").transition(200).style("fill-opacity", cfg.opacityArea); + }) + .append("svg:title") + .text(function(j){return Math.max(j.value, 0)}); + + series++; + }); + //Tooltip + tooltip = g.append('text').style('opacity', 0).style('font-family', 'sans-serif').style('font-size', '13px'); + } +} + +</script> + + +<script type="text/javascript">var LTE_IE_8 = false;</script> +<!--[if lte IE 8]> +<script type="text/javascript">LTE_IE_8 = true;</script> +<![endif]--> + +<script id="jsonData" type="application/json">{ + "brandingData": { + "logos": [ + { + "altData": "data:image/png;base64,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", + "height": 150, + "image": "http://content.allinea.com/downloads/performance-report-logo-180.png", + "link": "https://developer.arm.com/tools-and-software/server-and-hpc/arm-architecture-tools/arm-performance-reports" + } + ] + }, + "colorData": { + "cpu": [ + 108, + 64, + 49 + ], + "cpu.memPercent": [ + 108, + 63, + 23 + ], + "cpu.openMpPercent": [ + 108, + 61, + 60 + ], + "cpu.scalarNumPercent": [ + 108, + 30, + 45 + ], + "cpu.showWaitingAcc": [ + -1, + 0, + 0 + ], + "cpu.singleCorePercent": [ + 108, + 30, + 45 + ], + "cpu.vectorNumPercent": [ + 108, + 63, + 37 + ], + "cpu.waitingAccPercent": [ + 108, + 29, + 44 + ], + "cuda": [ + 303, + 29, + 44 + ], + "cuda.error": [ + -1, + 0, + 0 + ], + "cuda.gpusInUsePercent": [ + 303, + 29, + 44 + ], + "cuda.meanMemoryPercent": [ + 303, + 34, + 35 + ], + "cuda.peakMemoryPercent": [ + 303, + 23, + 51 + ], + "energy": [ + 51, + 98, + 31 + ], + "energy.accPercent": [ + 55, + 84, + 31 + ], + "energy.accTotal.plain": [ + 51, + 98, + 31 + ], + "energy.budgetedTotal": [ + 51, + 98, + 31 + ], + "energy.cpuPercent": [ + 53, + 92, + 36 + ], + "energy.cpuTotal.plain": [ + 51, + 98, + 31 + ], + "energy.hasAccPower": [ + -1, + 0, + 0 + ], + "energy.hasBudgetedMetric": [ + -1, + 0, + 0 + ], + "energy.hasCpuPower": [ + -1, + 0, + 0 + ], + "energy.hasMetrics": [ + -1, + 0, + 0 + ], + "energy.hasTrappedCapacity": [ + -1, + 0, + 0 + ], + "energy.nodeMeanPower": [ + 45, + 77, + 40 + ], + "energy.nodePeakPower": [ + 41, + 100, + 37 + ], + "energy.otherPercent": [ + 47, + 85, + 41 + ], + "energy.total.plain": [ + 51, + 98, + 31 + ], + "energy.trapped": [ + 51, + 98, + 31 + ], + "energy.trappedPercent": [ + 46, + 91, + 32 + ], + "io": [ + 23, + 82, + 58 + ], + "io.rateError": [ + -1, + 0, + 0 + ], + "io.readPercent": [ + 23, + 82, + 58 + ], + "io.readRate": [ + 33, + 73, + 33 + ], + "io.writePercent": [ + 31, + 82, + 34 + ], + "io.writeRate": [ + 31, + 76, + 26 + ], + "memory": [ + 0, + 82, + 58 + ], + "memory.error": [ + -1, + 0, + 0 + ], + "memory.mean": [ + 0, + 82, + 58 + ], + "memory.nodePeakPercent": [ + 0, + 56, + 28 + ], + "memory.peak": [ + 0, + 56, + 44 + ], + "mpi": [ + 208, + 82, + 58 + ], + "mpi.collectivePercent": [ + 208, + 82, + 58 + ], + "mpi.collectiveRate": [ + 208, + 56, + 33 + ], + "mpi.p2pPercent": [ + 208, + 56, + 42 + ], + "mpi.p2pRate": [ + 208, + 56, + 27 + ], + "mpi.rateError": [ + -1, + 0, + 0 + ], + "openmp": [ + 108, + 49, + 44 + ], + "openmp.computePercent": [ + 108, + 61, + 60 + ], + "openmp.overheadPercent": [ + 108, + 41, + 36 + ], + "openmp.physicalCoreUtilizationPercent": [ + 110, + 24, + 57 + ], + "overview.cpu.percent": [ + 108, + 64, + 49 + ], + "overview.io.percent": [ + 23, + 82, + 58 + ], + "overview.mpi.percent": [ + 208, + 82, + 58 + ], + "overview.systemLoadAvgError": [ + -1, + 0, + 0 + ], + "overview.systemLoadPercent": [ + 121, + 18, + 47 + ], + "threads": [ + 108, + 49, + 44 + ], + "threads.computePercent": [ + 108, + 61, + 60 + ], + "threads.physicalCoreUtilizationPercent": [ + 110, + 24, + 57 + ], + "threads.syncPercent": [ + 108, + 41, + 36 + ] + }, + "data": { + "applicationDetails": { + "commandLine": "/cosma/home/ds007/dc-fraw1/performance_analysis_workshop/swift-cs-performance-workshop-2021/benchmark-slow/swiftsim/examples/swift_mpi --cosmology --self-gravity -v 1 --threads=64 -n 1 -P Restarts:enable:0 -PInitialConditions:file_name:/cosma5/data/do008/dc-fraw1/swift_initial_conditions/pmillenium/PMill-768.hdf5 p-mill-768.yml", + "exeName": "swift_mpi", + "exePath": "/cosma/home/ds007/dc-fraw1/performance_analysis_workshop/swift-cs-performance-workshop-2021/benchmark-slow/swiftsim/examples", + "gpusPerNode": { + "plain": { + "precision": 0, + "value": 0 + } + }, + "hasAcceleratorMetricsEnabled": false, + "hasEnergyMetricsEnabled": true, + "hasGpu": false, + "hostGpuMemory": { + "plain": { + "precision": 0, + "value": null + } + }, + "hostMemory": { + "plain": { + "precision": 0, + "value": 540515954688 + } + }, + "hostname": "b108.pri.cosma7.alces.network", + "inputFile": "", + "isOpenMp": false, + "logicalCoresPerNode": 64, + "nodes": { + "plain": 1 + }, + "notes": "", + "ompNumThreads": "0", + "physicalCoresPerNode": 32, + "processes": { + "plain": 1 + }, + "profiledRanks": "", + "startDate": "Thu Jan 21 15:56:08 2021", + "time": { + "plain": 1714 + } + }, + "cpu": { + "advice1": "The per-core performance is <span class=\"cpu.memPercent\">memory-bound</span>. Use a profiler to identify time-consuming loops and check their cache performance.", + "advice2": "", + "memPercent": 54.640903510684396, + "openMpPercent": 0, + "scalarNumPercent": 12.46819084754623, + "showWaitingAcc": false, + "singleCorePercent": 100, + "vectorNumPercent": 32.89090564176938, + "waitingAccPercent": 0 + }, + "cuda": { + "advice1": "", + "advice2": "", + "error": "" + }, + "energy": { + "accPercent": 0, + "accTotal": { + }, + "advice1": "Energy metrics are not available on this system.", + "advice2": "CPU metrics are not supported (no intel_rapl module)", + "cpuTotal": { + }, + "hasAccPower": false, + "hasBudgetedMetric": false, + "hasCpuPower": false, + "hasMetrics": false, + "hasTrappedCapacity": false, + "nodePeakPower": 0, + "total": { + } + }, + "io": { + "advice1": "Most of the time is spent in <span class=\"io.readPercent\">read operations</span> with <span class=\"io.readRate\">a low</span> effective transfer rate. This may be caused by contention for the filesystem or inefficient access patterns. Use an I/O profiler to investigate which write calls are affected.", + "advice2": "", + "rateError": "", + "readPercent": 100, + "readRate": 99515465.69208828, + "writePercent": 0, + "writeRate": 0 + }, + "memory": { + "advice1": "The <span class=\"memory.nodePeakPercent\">peak node memory</span> usage is very low. Larger problem sets can be run before scaling to multiple nodes.", + "advice2": "", + "error": "", + "mean": 63466727657.472, + "nodePeakPercent": 16, + "peak": 80199315456 + }, + "mpi": { + "advice1": "", + "advice2": "", + "collectivePercent": 100, + "collectiveRate": 750229748.4574106, + "p2pPercent": 0, + "p2pRate": 0, + "rateError": "" + }, + "openmp": { + "advice1": "No measurable time is spent in OpenMP regions.", + "advice2": "", + "computePercent": 0, + "overheadPercent": 0, + "physicalCoreUtilizationPercent": 200 + }, + "overview": { + "advice": "As very little time is spent in <span class=\"mpi\">MPI</span> calls, this code may also benefit from running at larger scales.", + "bound1": { + "long": "Compute-bound", + "short": "Compute", + "subsectionHeading": "CPU", + "subsectionId": "cpu", + "type": "overview.cpu.percent" + }, + "bound2": { + "long": "", + "short": "", + "subsectionHeading": "", + "subsectionId": "", + "type": "" + }, + "cpu": { + "advice": "This is <span class=\"summary_class\">very high</span>; check the CPU performance section for advice", + "percent": 94.7 + }, + "io": { + "advice": "This is <span class=\"summary_class\">low</span>; check the I/O breakdown section for optimization advice", + "percent": 5.2 + }, + "mpi": { + "advice": "This is <span class=\"summary_class\">very low</span>; this code may benefit from a higher process count", + "percent": 0.1 + }, + "systemLoadAvgError": "", + "systemLoadPercent": 161.7875 + }, + "report": { + "name": "com.allinea.performancereports.default", + "src": { + "definition": "com.allinea.performancereports.default (file:///cosma/local/arm/ddt/20.2.1/performance-reports/templates/report-default.xml)\n", + "values": "allinea:/swift_mpi_1p_1n_0t_2021-01-21_15-56" + }, + "version": { + "api": 1, + "software": "20.2.1" + } + }, + "threads": { + "advice1": "The system load is high. Check that other jobs or system processes are not running on the same nodes.", + "advice2": "", + "computePercent": 96.44998482088646, + "physicalCoreUtilizationPercent": 165.546875, + "syncPercent": 3.5500151791135397 + }, + "version": 4 + }, + "headerData": [ + { + "caption": "Executable", + "metricId": "applicationDetails.exeName", + "valueHtmlTemplate": "{{#unless (trim applicationDetails.commandLine)}}{{applicationDetails.exeName}}{{/unless}}" + }, + { + "caption": "Command", + "metricId": "applicationDetails.commandLine", + "valueHtmlTemplate": "{{applicationDetails.commandLine}}" + }, + { + "caption": "Resources", + "csvHidden": true, + "metricId": "applicationDetails.nodes.plain", + "valueHtmlTemplate": "{{> headerResourcesTemplate}}" + }, + { + "caption": "Nodes", + "metricId": "applicationDetails.nodes.plain" + }, + { + "caption": "Physical cores per node", + "metricId": "applicationDetails.physicalCoresPerNode" + }, + { + "caption": "Logical cores per node", + "metricId": "applicationDetails.logicalCoresPerNode" + }, + { + "caption": "GPUs per node available", + "metricId": "applicationDetails.gpusPerNode.plain", + "visible": "data.applicationDetails.hasGpu" + }, + { + "caption": "Memory", + "csvHidden": true, + "metricId": "applicationDetails.hostMemory.plain", + "valueHtmlTemplate": "{{> headerMemoryTemplate}}" + }, + { + "caption": "Memory per node", + "metricId": "applicationDetails.hostMemory.plain" + }, + { + "caption": "GPU memory", + "metricId": "applicationDetails.hostGpuMemory.plain", + "visible": "data.applicationDetails.hasGpu" + }, + { + "caption": "Tasks", + "metricId": "applicationDetails.processes.plain", + "valueHtmlTemplate": "{{> headerTasksTemplate}}" + }, + { + "caption": "Profiled ranks", + "metricId": "applicationDetails.profiledRanks", + "valueHtmlTemplate": "{{applicationDetails.profiledRanks}}" + }, + { + "caption": "OpenMP threads", + "metricId": "applicationDetails.ompNumThreads", + "visible": "data.applicationDetails.isOpenMp" + }, + { + "caption": "Machine", + "metricId": "applicationDetails.hostname", + "valueHtmlTemplate": "{{applicationDetails.hostname}}" + }, + { + "caption": "Start time", + "metricId": "applicationDetails.startDate", + "valueHtmlTemplate": "{{applicationDetails.startDate}}" + }, + { + "caption": "Total time", + "metricId": "applicationDetails.time.plain", + "valueHtmlTemplate": "{{> headerTimeTemplate}}" + }, + { + "caption": "Full path", + "metricId": "applicationDetails.exePath", + "valueHtmlTemplate": "{{wrappablePath applicationDetails.exePath}}" + }, + { + "caption": "Input file", + "metricId": "applicationDetails.inputFile", + "valueHtmlTemplate": "{{wrappablePath applicationDetails.inputFile}}" + }, + { + "caption": "Notes", + "metricId": "applicationDetails.notes", + "valueHtmlTemplate": "{{applicationDetails.notes}}" + } + ], + "metricData": { + "applicationDetails.commandLine": { + "displayName": "Command", + "type": "String", + "value": "applicationDetails.commandLine", + "version": 1 + }, + "applicationDetails.exeName": { + "displayName": "Executable", + "type": "String", + "value": "applicationDetails.exeName", + "version": 1 + }, + "applicationDetails.exePath": { + "displayName": "Full path", + "type": "String", + "value": "applicationDetails.exePath", + "version": 1 + }, + "applicationDetails.gpusPerNode.plain": { + "displayName": "GPUs", + "type": "DoubleWithPrecision", + "units": "GPUs", + "value": "applicationDetails.gpusPerNode.plain", + "version": 1 + }, + "applicationDetails.hasAcceleratorMetricsEnabled": { + "type": "Bool", + "value": "applicationDetails.hasAcceleratorMetricsEnabled", + "version": 1 + }, + "applicationDetails.hasEnergyMetricsEnabled": { + "type": "Bool", + "value": "applicationDetails.hasEnergyMetricsEnabled", + "version": 1 + }, + "applicationDetails.hasGpu": { + "type": "Bool", + "value": "applicationDetails.hasGpu", + "version": 1 + }, + "applicationDetails.hostGpuMemory.plain": { + "displayName": "GPU Memory", + "type": "DoubleWithPrecision", + "units": "B", + "value": "applicationDetails.hostGpuMemory.plain", + "version": 1 + }, + "applicationDetails.hostMemory.plain": { + "displayName": "Memory", + "type": "DoubleWithPrecision", + "units": "B", + "value": "applicationDetails.hostMemory.plain", + "version": 1 + }, + "applicationDetails.hostname": { + "displayName": "Machine", + "type": "String", + "value": "applicationDetails.hostname", + "version": 1 + }, + "applicationDetails.inputFile": { + "displayName": "Input file", + "type": "String", + "value": "applicationDetails.inputFile", + "version": 1 + }, + "applicationDetails.isOpenMp": { + "type": "Bool", + "value": "applicationDetails.isOpenMp", + "version": 1 + }, + "applicationDetails.logicalCoresPerNode": { + "displayName": "Logical cores per node", + "type": "Integer", + "units": "cores/node", + "value": "applicationDetails.logicalCoresPerNode", + "version": 1 + }, + "applicationDetails.nodes.plain": { + "displayName": "Resources", + "type": "Integer", + "units": "nodes", + "value": "applicationDetails.nodes.plain", + "version": 1 + }, + "applicationDetails.notes": { + "displayName": "Notes", + "type": "String", + "value": "applicationDetails.notes", + "version": 1 + }, + "applicationDetails.ompNumThreads": { + "displayName": "Number of OMP threads", + "type": "String", + "value": "applicationDetails.ompNumThreads", + "version": 1 + }, + "applicationDetails.physicalCoresPerNode": { + "displayName": "Physical cores per node", + "type": "Integer", + "units": "cores/node", + "value": "applicationDetails.physicalCoresPerNode", + "version": 1 + }, + "applicationDetails.processes.plain": { + "displayName": "Processes", + "type": "Integer", + "units": "processes", + "value": "applicationDetails.processes.plain", + "version": 1 + }, + "applicationDetails.profiledRanks": { + "displayName": "Profiled ranks", + "type": "String", + "value": "applicationDetails.profiledRanks", + "version": 4 + }, + "applicationDetails.startDate": { + "displayName": "Start time", + "type": "String", + "value": "applicationDetails.startDate", + "version": 1 + }, + "applicationDetails.time.plain": { + "displayName": "Total time", + "type": "Integer", + "units": "seconds", + "value": "applicationDetails.time.plain", + "version": 1 + }, + "cpu.advice1": { + "displayName": "Advice 1", + "type": "String", + "value": "cpu.advice1" + }, + "cpu.advice2": { + "displayName": "Advice 2", + "type": "String", + "value": "cpu.advice2" + }, + "cpu.memPercent": { + "displayName": "Memory accesses", + "type": "Double", + "units": "%", + "value": "cpu.memPercent", + "version": 1 + }, + "cpu.openMpPercent": { + "displayName": "OpenMP regions", + "type": "Double", + "units": "%", + "value": "cpu.openMpPercent", + "version": 1 + }, + "cpu.scalarNumPercent": { + "displayName": "Scalar numeric ops", + "type": "Double", + "units": "%", + "value": "cpu.scalarNumPercent", + "version": 1 + }, + "cpu.showWaitingAcc": { + "displayName": "Display time waiting for accelerators", + "type": "Bool", + "value": "cpu.showWaitingAcc", + "version": 1 + }, + "cpu.singleCorePercent": { + "displayName": "Single-core code", + "type": "Double", + "units": "%", + "value": "cpu.singleCorePercent", + "version": 1 + }, + "cpu.vectorNumPercent": { + "displayName": "Vector numeric ops", + "type": "Double", + "units": "%", + "value": "cpu.vectorNumPercent", + "version": 1 + }, + "cpu.waitingAccPercent": { + "displayName": "Waiting for accelerators", + "type": "Double", + "units": "%", + "value": "cpu.waitingAccPercent", + "version": 1 + }, + "cuda.advice1": { + "displayName": "Advice 1", + "type": "String", + "value": "cuda.advice1" + }, + "cuda.advice2": { + "displayName": "Advice 2", + "type": "String", + "value": "cuda.advice2" + }, + "cuda.error": { + "displayName": "CUDA metrics error message", + "type": "String", + "value": "cuda.error", + "version": 1 + }, + "cuda.gpusInUsePercent": { + "displayName": "GPU utilization", + "type": "Double", + "units": "%", + "value": "cuda.gpusInUsePercent", + "version": 1 + }, + "cuda.meanMemoryPercent": { + "displayName": "Mean GPU memory usage", + "type": "Double", + "units": "%", + "value": "cuda.meanMemoryPercent", + "version": 1 + }, + "cuda.peakMemoryPercent": { + "displayName": "Peak GPU memory usage", + "type": "Double", + "units": "%", + "value": "cuda.peakMemoryPercent", + "version": 1 + }, + "energy.accPercent": { + "displayName": "Accelerators", + "type": "Double", + "units": "%", + "value": "energy.accPercent", + "version": 1 + }, + "energy.accTotal.plain": { + "displayName": "GPU energy usage", + "type": "Double", + "units": "Wh", + "value": "energy.accTotal.plain", + "version": 1 + }, + "energy.advice1": { + "displayName": "Advice 1", + "type": "String", + "value": "energy.advice1" + }, + "energy.advice2": { + "displayName": "Advice 2", + "type": "String", + "value": "energy.advice2" + }, + "energy.budgetedTotal": { + "displayName": "Total energy budget", + "type": "Double", + "units": "Wh", + "value": "energy.budgetedTotal", + "version": 2 + }, + "energy.cpuPercent": { + "displayName": "CPU", + "type": "Double", + "units": "%", + "value": "energy.cpuPercent", + "version": 1 + }, + "energy.cpuTotal.plain": { + "displayName": "CPU energy usage", + "type": "Double", + "units": "Wh", + "value": "energy.cpuTotal.plain", + "version": 1 + }, + "energy.hasAccPower": { + "displayName": "Accelerator power metrics available", + "type": "Bool", + "value": "energy.hasAccPower", + "version": 1 + }, + "energy.hasBudgetedMetric": { + "displayName": "Budgeted energy metric available", + "type": "Bool", + "value": "energy.hasBudgetedMetric", + "version": 2 + }, + "energy.hasCpuPower": { + "displayName": "CPU power metric available", + "type": "Bool", + "value": "energy.hasCpuPower", + "version": 1 + }, + "energy.hasMetrics": { + "displayName": "Energy metrics available", + "type": "Bool", + "value": "energy.hasMetrics", + "version": 1 + }, + "energy.hasTrappedCapacity": { + "displayName": "Trapped capacity energy metric available", + "type": "Bool", + "value": "energy.hasTrappedCapacity", + "version": 2 + }, + "energy.nodeMeanPower": { + "displayName": "Mean node power", + "type": "Double", + "units": "W", + "value": "energy.nodeMeanPower", + "version": 1 + }, + "energy.nodePeakPower": { + "displayName": "Peak node power", + "type": "Double", + "units": "W", + "value": "energy.nodePeakPower", + "version": 1 + }, + "energy.otherPercent": { + "displayName": "System", + "type": "Double", + "units": "%", + "value": "energy.otherPercent", + "version": 1 + }, + "energy.total.plain": { + "displayName": "Total energy usage", + "type": "Double", + "units": "Wh", + "value": "energy.total.plain", + "version": 1 + }, + "energy.trapped": { + "displayName": "Trapped capacity", + "type": "Double", + "units": "Wh", + "value": "energy.trapped", + "version": 2 + }, + "energy.trappedPercent": { + "displayName": "Trapped capacity", + "type": "Double", + "units": "%", + "value": "energy.trappedPercent", + "version": 2 + }, + "io.advice1": { + "displayName": "Advice 1", + "type": "String", + "value": "io.advice1" + }, + "io.advice2": { + "displayName": "Advice 2", + "type": "String", + "value": "io.advice2" + }, + "io.rateError": { + "displayName": "I/O rate error message", + "type": "String", + "value": "io.rateError", + "version": 1 + }, + "io.readPercent": { + "displayName": "Time in reads", + "type": "Double", + "units": "%", + "value": "io.readPercent", + "version": 1 + }, + "io.readRate": { + "displayName": "Effective process read rate", + "type": "Double", + "units": "B/s", + "value": "io.readRate", + "version": 1 + }, + "io.writePercent": { + "displayName": "Time in writes", + "type": "Double", + "units": "%", + "value": "io.writePercent", + "version": 1 + }, + "io.writeRate": { + "displayName": "Effective process write rate", + "type": "Double", + "units": "B/s", + "value": "io.writeRate", + "version": 1 + }, + "memory.advice1": { + "displayName": "Advice 1", + "type": "String", + "value": "memory.advice1" + }, + "memory.advice2": { + "displayName": "Advice 2", + "type": "String", + "value": "memory.advice2" + }, + "memory.error": { + "displayName": "Memory usage error message", + "type": "String", + "value": "memory.error", + "version": 1 + }, + "memory.mean": { + "displayName": "Mean process memory usage", + "type": "Double", + "units": "B", + "value": "memory.mean", + "version": 1 + }, + "memory.nodePeakPercent": { + "displayName": "Peak node memory usage", + "type": "Double", + "units": "%", + "value": "memory.nodePeakPercent", + "version": 1 + }, + "memory.peak": { + "displayName": "Peak process memory usage", + "type": "Double", + "units": "B", + "value": "memory.peak", + "version": 1 + }, + "mpi.advice1": { + "displayName": "Advice 1", + "type": "String", + "value": "mpi.advice1" + }, + "mpi.advice2": { + "displayName": "Advice 2", + "type": "String", + "value": "mpi.advice2" + }, + "mpi.collectivePercent": { + "displayName": "Time in collective calls", + "type": "Double", + "units": "%", + "value": "mpi.collectivePercent", + "version": 1 + }, + "mpi.collectiveRate": { + "displayName": "Effective process collective rate", + "type": "Double", + "units": "B/s", + "value": "mpi.collectiveRate", + "version": 1 + }, + "mpi.p2pPercent": { + "displayName": "Time in point-to-point calls", + "type": "Double", + "units": "%", + "value": "mpi.p2pPercent", + "version": 1 + }, + "mpi.p2pRate": { + "displayName": "Effective process point-to-point rate", + "type": "Double", + "units": "B/s", + "value": "mpi.p2pRate", + "version": 1 + }, + "mpi.rateError": { + "displayName": "MPI rate error message", + "type": "String", + "value": "mpi.rateError", + "version": 1 + }, + "openmp.advice1": { + "displayName": "Advice 1", + "type": "String", + "value": "openmp.advice1" + }, + "openmp.advice2": { + "displayName": "Advice 2", + "type": "String", + "value": "openmp.advice2" + }, + "openmp.computePercent": { + "displayName": "Computation", + "type": "Double", + "units": "%", + "value": "openmp.computePercent", + "version": 1 + }, + "openmp.overheadPercent": { + "displayName": "Synchronization", + "type": "Double", + "units": "%", + "value": "openmp.overheadPercent", + "version": 1 + }, + "openmp.physicalCoreUtilizationPercent": { + "displayName": "Physical core utilization", + "type": "Double", + "units": "%", + "value": "openmp.physicalCoreUtilizationPercent", + "version": 1 + }, + "overview.advice": { + "type": "String", + "value": "overview.advice", + "version": 1 + }, + "overview.bound1.long": { + "type": "String", + "value": "overview.bound1.long", + "version": 1 + }, + "overview.bound1.short": { + "type": "String", + "value": "overview.bound1.short", + "version": 1 + }, + "overview.bound1.subsectionHeading": { + "type": "String", + "value": "overview.bound1.subsectionHeading", + "version": 3 + }, + "overview.bound1.subsectionId": { + "type": "String", + "value": "overview.bound1.subsectionId", + "version": 3 + }, + "overview.bound1.type": { + "type": "String", + "value": "overview.bound1.type", + "version": 1 + }, + "overview.bound2.long": { + "type": "String", + "value": "overview.bound2.long", + "version": 1 + }, + "overview.bound2.short": { + "type": "String", + "value": "overview.bound2.short", + "version": 1 + }, + "overview.bound2.subsectionHeading": { + "type": "String", + "value": "overview.bound2.subsectionHeading", + "version": 3 + }, + "overview.bound2.subsectionId": { + "type": "String", + "value": "overview.bound2.subsectionId", + "version": 3 + }, + "overview.bound2.type": { + "type": "String", + "value": "overview.bound2.type", + "version": 1 + }, + "overview.cpu.advice": { + "displayName": "Advice", + "type": "String", + "value": "overview.cpu.advice" + }, + "overview.cpu.percent": { + "displayName": "Compute", + "type": "Double", + "units": "%", + "value": "overview.cpu.percent", + "version": 1 + }, + "overview.io.advice": { + "displayName": "Advice", + "type": "String", + "value": "overview.io.advice" + }, + "overview.io.percent": { + "displayName": "I/O", + "type": "Double", + "units": "%", + "value": "overview.io.percent", + "version": 1 + }, + "overview.mpi.advice": { + "displayName": "Advice", + "type": "String", + "value": "overview.mpi.advice" + }, + "overview.mpi.percent": { + "displayName": "MPI", + "type": "Double", + "units": "%", + "value": "overview.mpi.percent", + "version": 1 + }, + "overview.systemLoadAvgError": { + "displayName": "System load error message", + "type": "String", + "value": "overview.systemLoadAvgError", + "version": 1 + }, + "overview.systemLoadPercent": { + "displayName": "System load", + "type": "Double", + "units": "%", + "value": "overview.systemLoadPercent", + "version": 1 + }, + "report.name": { + "type": "String", + "value": "report.name", + "version": 3 + }, + "report.src.definition": { + "type": "String", + "value": "report.src.definition", + "version": 3 + }, + "report.src.values": { + "type": "String", + "value": "report.src.values", + "version": 3 + }, + "report.version.api": { + "type": "Integer", + "value": "report.version.api", + "version": 3 + }, + "report.version.software": { + "type": "String", + "value": "report.version.software", + "version": 3 + }, + "threads.advice1": { + "displayName": "Advice 1", + "type": "String", + "value": "threads.advice1" + }, + "threads.advice2": { + "displayName": "Advice 2", + "type": "String", + "value": "threads.advice2" + }, + "threads.computePercent": { + "displayName": "Computation", + "type": "Double", + "units": "%", + "value": "threads.computePercent", + "version": 1 + }, + "threads.physicalCoreUtilizationPercent": { + "displayName": "Physical core utilization", + "type": "Double", + "units": "%", + "value": "threads.physicalCoreUtilizationPercent", + "version": 1 + }, + "threads.syncPercent": { + "displayName": "Synchronization", + "type": "Double", + "units": "%", + "value": "threads.syncPercent", + "version": 1 + }, + "version": { + "displayName": "Version", + "type": "Integer", + "value": "version", + "version": 1 + } + }, + "subsections": [ + { + "adviceHtmlTemplate": [ + "{{{cpu.advice1}}}", + "{{{cpu.advice2}}}" + ], + "colorName": "cpu", + "descriptionHtmlTemplate": "A breakdown of the <span class=\"{{self.colorName}}\" title=\"{{preciseNumber overview.cpu.percent}}\">{{percent overview.cpu.percent}}</span>% CPU time:", + "heading": "CPU", + "metrics": [ + { + "colorName": "cpu.singleCorePercent", + "metricId": "cpu.singleCorePercent", + "template": "percentageTemplate", + "visible": "data.applicationDetails.isOpenMp" + }, + { + "colorName": "cpu.openMpPercent", + "metricId": "cpu.openMpPercent", + "template": "percentageTemplate", + "visible": "data.applicationDetails.isOpenMp" + }, + { + "template": "spacerTemplate", + "visible": "data.applicationDetails.isOpenMp" + }, + { + "colorName": "cpu.scalarNumPercent", + "metricId": "cpu.scalarNumPercent", + "template": "percentageTemplate" + }, + { + "colorName": "cpu.vectorNumPercent", + "metricId": "cpu.vectorNumPercent", + "template": "percentageTemplate" + }, + { + "colorName": "cpu.memPercent", + "metricId": "cpu.memPercent", + "template": "percentageTemplate" + }, + { + "colorName": "cpu.waitingAccPercent", + "metricId": "cpu.waitingAccPercent", + "template": "percentageTemplate", + "visible": "data.cpu.showWaitingAcc" + } + ] + }, + { + "adviceHtmlTemplate": [ + "{{{mpi.advice1}}}", + "{{{mpi.advice2}}}" + ], + "colorName": "mpi", + "descriptionHtmlTemplate": "A breakdown of the <span class=\"{{self.colorName}}\" title=\"{{preciseNumber overview.mpi.percent}}\">{{percent overview.mpi.percent}}</span>% MPI time:", + "errorHtmlTemplate": "{{mpi.rateError}}", + "heading": "MPI", + "metrics": [ + { + "colorName": "mpi.collectivePercent", + "metricId": "mpi.collectivePercent", + "template": "percentageTemplate" + }, + { + "colorName": "mpi.p2pPercent", + "metricId": "mpi.p2pPercent", + "template": "percentageTemplate" + }, + { + "colorName": "mpi.collectiveRate", + "group": "rates", + "metricId": "mpi.collectiveRate", + "template": "numberTemplate" + }, + { + "colorName": "mpi.p2pRate", + "group": "rates", + "metricId": "mpi.p2pRate", + "template": "numberTemplate" + } + ] + }, + { + "adviceHtmlTemplate": [ + "{{{io.advice1}}}", + "{{{io.advice2}}}" + ], + "colorName": "io", + "descriptionHtmlTemplate": "A breakdown of the <span class=\"{{self.colorName}}\" title=\"{{preciseNumber overview.io.percent}}\">{{percent overview.io.percent}}</span>% I/O time:", + "errorHtmlTemplate": "{{io.rateError}}", + "heading": "I/O", + "metrics": [ + { + "colorName": "io.readPercent", + "metricId": "io.readPercent", + "template": "percentageTemplate" + }, + { + "colorName": "io.writePercent", + "metricId": "io.writePercent", + "template": "percentageTemplate" + }, + { + "colorName": "io.readRate", + "group": "rate", + "metricId": "io.readRate", + "template": "numberTemplate" + }, + { + "colorName": "io.writeRate", + "group": "rate", + "metricId": "io.writeRate", + "template": "numberTemplate" + } + ] + }, + { + "adviceHtmlTemplate": [ + "{{{openmp.advice1}}}", + "{{{openmp.advice2}}}" + ], + "colorName": "openmp", + "descriptionHtmlTemplate": "A breakdown of the <span class=\"{{self.colorName}}\" title=\"{{preciseNumber cpu.openMpPercent}}\">{{percent cpu.openMpPercent}}</span>% time in OpenMP regions:", + "errorHtmlTemplate": "{{overview.systemLoadAvgError}}", + "heading": "OpenMP", + "metrics": [ + { + "colorName": "openmp.computePercent", + "metricId": "openmp.computePercent", + "template": "percentageTemplate" + }, + { + "colorName": "openmp.overheadPercent", + "metricId": "openmp.overheadPercent", + "template": "percentageTemplate" + }, + { + "colorName": "openmp.physicalCoreUtilizationPercent", + "maxBarValue": 200, + "metricId": "openmp.physicalCoreUtilizationPercent", + "template": "percentageTemplate" + }, + { + "colorName": "overview.systemLoadPercent", + "maxBarValue": 200, + "metricId": "overview.systemLoadPercent", + "template": "percentageTemplate" + } + ], + "visible": "data.applicationDetails.isOpenMp" + }, + { + "adviceHtmlTemplate": [ + "{{{threads.advice1}}}", + "{{{threads.advice2}}}" + ], + "colorName": "threads", + "descriptionHtmlTemplate": "A breakdown of how multiple threads were used:", + "errorHtmlTemplate": "{{overview.systemLoadAvgError}}", + "heading": "Threads", + "hidden": "data.applicationDetails.isOpenMp", + "metrics": [ + { + "colorName": "threads.computePercent", + "metricId": "threads.computePercent", + "template": "percentageTemplate" + }, + { + "colorName": "threads.syncPercent", + "metricId": "threads.syncPercent", + "template": "percentageTemplate" + }, + { + "colorName": "threads.physicalCoreUtilizationPercent", + "maxBarValue": 200, + "metricId": "threads.physicalCoreUtilizationPercent", + "template": "percentageTemplate" + }, + { + "colorName": "overview.systemLoadPercent", + "maxBarValue": 200, + "metricId": "overview.systemLoadPercent", + "template": "percentageTemplate" + } + ] + }, + { + "adviceHtmlTemplate": [ + "{{{memory.advice1}}}", + "{{{memory.advice2}}}" + ], + "colorName": "memory", + "descriptionHtmlTemplate": "Per-process memory usage may also affect scaling:", + "errorHtmlTemplate": "{{memory.error}}", + "heading": "Memory", + "metrics": [ + { + "colorName": "memory.mean", + "group": "ram", + "metricId": "memory.mean", + "template": "numberTemplate", + "useIEC": true + }, + { + "colorName": "memory.peak", + "group": "ram", + "metricId": "memory.peak", + "template": "numberTemplate", + "useIEC": true + }, + { + "colorName": "memory.nodePeakPercent", + "metricId": "memory.nodePeakPercent", + "template": "percentageTemplate" + } + ] + }, + { + "adviceHtmlTemplate": [ + "{{{cuda.advice1}}}", + "{{{cuda.advice2}}}" + ], + "colorName": "cuda", + "descriptionHtmlTemplate": "A breakdown of how accelerators were used:", + "errorHtmlTemplate": "{{cuda.error}}", + "heading": "Accelerators", + "metrics": [ + { + "colorName": "cuda.gpusInUsePercent", + "hidden": "data.cuda.error", + "metricId": "cuda.gpusInUsePercent", + "template": "percentageTemplate" + }, + { + "colorName": "cuda.meanMemoryPercent", + "hidden": "data.cuda.error", + "metricId": "cuda.meanMemoryPercent", + "template": "percentageTemplate" + }, + { + "colorName": "cuda.peakMemoryPercent", + "hidden": "data.cuda.error", + "metricId": "cuda.peakMemoryPercent", + "template": "percentageTemplate" + } + ], + "visible": "data.applicationDetails.hasAcceleratorMetricsEnabled" + }, + { + "adviceHtmlTemplate": [ + "{{{energy.advice1}}}", + "{{{energy.advice2}}}" + ], + "colorName": "energy", + "descriptionHtmlTemplate": "A breakdown of how{{#if energy.hasMetrics}} the <span class=\"energy.total.plain\">{{toPrecision (siValue (lookupMetric \"energy.total.plain\")) 3}}</span> {{siUnits (lookupMetric \"energy.total.plain\") symbol=(lookupMetricUnits \"energy.total.plain\")}}{{else}} energy{{/if}} was used:", + "heading": "Energy", + "metrics": [ + { + "colorName": "energy.cpuPercent", + "metricId": "energy.cpuPercent", + "template": "percentageTemplate" + }, + { + "colorName": "energy.accPercent", + "metricId": "energy.accPercent", + "template": "percentageTemplate", + "visible": "data.energy.hasAccPower" + }, + { + "colorName": "energy.otherPercent", + "metricId": "energy.otherPercent", + "template": "percentageTemplate" + }, + { + "colorName": "energy.nodeMeanPower", + "group": "watts", + "metricId": "energy.nodeMeanPower", + "template": "numberTemplate" + }, + { + "colorName": "energy.nodePeakPower", + "group": "watts", + "metricId": "energy.nodePeakPower", + "template": "numberTemplate" + }, + { + "colorName": "energy.trappedPercent", + "descriptionHtmlTemplate": "{{#if energy.hasTrappedCapacity}}<span class=\"energy.trapped\">{{toPrecision (siValue (lookupMetric \"energy.trapped\")) 3}}</span> {{siUnits (lookupMetric \"energy.trapped\") symbol=(lookupMetricUnits \"energy.trapped\")}} unused capacity of <span class=\"energy.budgetedTotal\">{{toPrecision (siValue (lookupMetric \"energy.budgetedTotal\")) 3}}</span> {{siUnits (lookupMetric \"energy.budgetedTotal\") symbol=(lookupMetricUnits \"energy.budgetedTotal\")}} total available{{/if}}", + "metricId": "energy.trappedPercent", + "template": "percentageTemplate", + "visible": "data.energy.hasBudgetedMetric" + }, + { + "colorName": "energy.total.plain", + "displayName": "Total", + "metricId": "energy.total.plain" + }, + { + "colorName": "energy.cpuTotal.plain", + "displayName": "CPU", + "metricId": "energy.cpuTotal.plain", + "visible": "data.energy.hasCpuPower" + }, + { + "colorName": "energy.accTotal.plain", + "displayName": "Accelerators", + "metricId": "energy.accTotal.plain", + "visible": "data.energy.hasAccPower" + }, + { + "colorName": "energy.trapped", + "metricId": "energy.trapped", + "visible": "data.energy.hasBudgetedMetric" + } + ], + "visible": "data.applicationDetails.hasEnergyMetricsEnabled" + } + ], + "summaryData": { + "adviceHtmlTemplate": "{{{overview.advice}}}", + "bounds": [ + { + "colorName": "overview.cpu.percent", + "type": "overview.cpu.percent" + }, + { + "colorName": "overview.mpi.percent", + "type": "overview.mpi.percent" + }, + { + "colorName": "overview.io.percent", + "type": "overview.io.percent" + }, + { + "colorName": "cpu.singleCorePercent", + "type": "cpu.singleCorePercent" + }, + { + "colorName": "cpu.openMpPercent", + "type": "cpu.openMpPercent" + }, + { + "colorName": "cpu.scalarNumPercent", + "type": "cpu.scalarNumPercent" + }, + { + "colorName": "cpu.vectorNumPercent", + "type": "cpu.vectorNumPercent" + }, + { + "colorName": "cpu.memPercent", + "type": "cpu.memPercent" + }, + { + "colorName": "cpu.waitingAccPercent", + "type": "cpu.waitingAccPercent" + }, + { + "colorName": "mpi.collectivePercent", + "type": "mpi.collectivePercent" + }, + { + "colorName": "mpi.p2pPercent", + "type": "mpi.p2pPercent" + }, + { + "colorName": "mpi.collectiveRate", + "type": "mpi.collectiveRate" + }, + { + "colorName": "mpi.p2pRate", + "type": "mpi.p2pRate" + }, + { + "colorName": "io.readPercent", + "type": "io.readPercent" + }, + { + "colorName": "io.writePercent", + "type": "io.writePercent" + }, + { + "colorName": "io.readRate", + "type": "io.readRate" + }, + { + "colorName": "io.writeRate", + "type": "io.writeRate" + }, + { + "colorName": "openmp.computePercent", + "type": "openmp.computePercent" + }, + { + "colorName": "openmp.overheadPercent", + "type": "openmp.overheadPercent" + }, + { + "colorName": "openmp.physicalCoreUtilizationPercent", + "type": "openmp.physicalCoreUtilizationPercent" + }, + { + "colorName": "threads.computePercent", + "type": "threads.computePercent" + }, + { + "colorName": "threads.syncPercent", + "type": "threads.syncPercent" + }, + { + "colorName": "threads.physicalCoreUtilizationPercent", + "type": "threads.physicalCoreUtilizationPercent" + }, + { + "colorName": "overview.systemLoadPercent", + "type": "overview.systemLoadPercent" + }, + { + "colorName": "memory.mean", + "type": "memory.mean" + }, + { + "colorName": "memory.peak", + "type": "memory.peak" + }, + { + "colorName": "memory.nodePeakPercent", + "type": "memory.nodePeakPercent" + }, + { + "colorName": "cuda.gpusInUsePercent", + "type": "cuda.gpusInUsePercent" + }, + { + "colorName": "cuda.meanMemoryPercent", + "type": "cuda.meanMemoryPercent" + }, + { + "colorName": "cuda.peakMemoryPercent", + "type": "cuda.peakMemoryPercent" + }, + { + "colorName": "energy.cpuPercent", + "type": "energy.cpuPercent" + }, + { + "colorName": "energy.accPercent", + "type": "energy.accPercent" + }, + { + "colorName": "energy.otherPercent", + "type": "energy.otherPercent" + }, + { + "colorName": "energy.nodeMeanPower", + "type": "energy.nodeMeanPower" + }, + { + "colorName": "energy.nodePeakPower", + "type": "energy.nodePeakPower" + }, + { + "colorName": "energy.trappedPercent", + "type": "energy.trappedPercent" + }, + { + "colorName": "energy.total.plain", + "type": "energy.total.plain" + }, + { + "colorName": "energy.cpuTotal.plain", + "type": "energy.cpuTotal.plain" + }, + { + "colorName": "energy.accTotal.plain", + "type": "energy.accTotal.plain" + }, + { + "colorName": "energy.trapped", + "type": "energy.trapped" + }, + { + "colorName": "energy.budgetedTotal", + "type": "energy.budgetedTotal" + }, + { + "colorName": "cpu.showWaitingAcc", + "type": "cpu.showWaitingAcc" + }, + { + "colorName": "energy.hasAccPower", + "type": "energy.hasAccPower" + }, + { + "colorName": "energy.hasCpuPower", + "type": "energy.hasCpuPower" + }, + { + "colorName": "energy.hasMetrics", + "type": "energy.hasMetrics" + }, + { + "colorName": "energy.hasBudgetedMetric", + "type": "energy.hasBudgetedMetric" + }, + { + "colorName": "energy.hasTrappedCapacity", + "type": "energy.hasTrappedCapacity" + }, + { + "colorName": "io.rateError", + "type": "io.rateError" + }, + { + "colorName": "cuda.error", + "type": "cuda.error" + }, + { + "colorName": "memory.error", + "type": "memory.error" + }, + { + "colorName": "mpi.rateError", + "type": "mpi.rateError" + }, + { + "colorName": "overview.systemLoadAvgError", + "type": "overview.systemLoadAvgError" + } + ], + "footerHtmlTemplate": "This application run was <span class=\"{{overview.bound1.type}}\">{{overview.bound1.long}}</span>. A breakdown of this time and advice\n for investigating further is in the <span class=\"{{overview.bound1.subsectionId}}\">{{overview.bound1.subsectionHeading}}</span>\n {{#if overview.bound2.type}}\n and <span class=\"{{overview.bound2.subsectionId}}\">{{overview.bound2.subsectionHeading}}</span> sections below.\n {{else}}\n section below.\n {{/if}}\n ", + "headingHtmlTemplate": "Summary: {{applicationDetails.exeName}} is <span class=\"{{overview.bound1.type}}\">{{overview.bound1.long}}</span> in this configuration", + "primaryBound": "overview.bound1.type", + "rows": [ + { + "adviceHtmlTemplate": "{{{overview.cpu.advice}}}", + "colorName": "overview.cpu.percent", + "descriptionHtmlTemplate": "Time spent running application code. High values are usually good.", + "heading": "Compute", + "metricId": "overview.cpu.percent" + }, + { + "adviceHtmlTemplate": "{{{overview.mpi.advice}}}", + "colorName": "overview.mpi.percent", + "descriptionHtmlTemplate": "Time spent in MPI calls. High values are usually bad.", + "heading": "MPI", + "metricId": "overview.mpi.percent" + }, + { + "adviceHtmlTemplate": "{{{overview.io.advice}}}", + "colorName": "overview.io.percent", + "descriptionHtmlTemplate": "Time spent in filesystem I/O. High values are usually bad.", + "heading": "I/O", + "metricId": "overview.io.percent" + } + ] + } +} +</script> + +<script>// ES5.1 polyfills + +// These are mostly borrowed from the Mozilla Developer Network, or +// https://github.com/es-shims/es5-shim + +// Polyfill for IE<9 +if (!Array.prototype.indexOf) { + Array.prototype.indexOf = function(searchElement, fromIndex) { + if (this == null) { + throw new TypeError('"this" is null or not defined'); + } + + var o = Object(this); + var len = o.length >>> 0; + if (len === 0) { + return -1; + } + + var n = +fromIndex || 0; + if (Math.abs(n) === Infinity) { + n = 0; + } + + if (n >= len) { + return -1; + } + + var k = Math.max(n >= 0 ? n : len - Math.abs(n), 0); + while (k < len) { + if (k in o && o[k] === searchElement) { + return k; + } + + k++; + } + + return -1; + }; +} + +// Polyfill for FF<4, IE<9 +if (!Array.isArray) { + Array.isArray = function(arg) { + return Object.prototype.toString.call(arg) === '[object Array]'; + }; +} + +// Polyfill for IE<9 +if (!String.prototype.trim) { + (function() { + var ws = '\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003' + + '\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028' + + '\u2029\uFEFF'; + var trimBeginRegexp = new RegExp('^' + wsRegexChars + wsRegexChars + '*'); + var trimEndRegexp = new RegExp(wsRegexChars + wsRegexChars + '*$'); + + String.prototype.trim = function () { + return this.replace(trimBeginRegexp, '').replace(trimEndRegexp, ''); + }; + })(); +} + +// Polyfill for FF<1.5, IE<9 +if (!Array.prototype.map) { + Array.prototype.map = function(callback, thisArg) { + + var T, A, k; + if (this == null) { + throw new TypeError(' this is null or not defined'); + } + + var O = Object(this); + var len = O.length >>> 0; + if (typeof callback !== 'function') { + throw new TypeError(callback + ' is not a function'); + } + + if (arguments.length > 1) { + T = thisArg; + } + + A = new Array(len); + k = 0; + + while (k < len) { + var kValue, mappedValue; + + if (k in O) { + kValue = O[k]; + mappedValue = callback.call(T, kValue, k, O); + A[k] = mappedValue; + } + k++; + } + + return A; + }; +} + +var console; +if(!console) { + function Console() { + function stringifyHelper(key, value) { + if(typeof value === 'function') { + var str = value.toString(); + return str.substring(0, str.indexOf('{'))+'{...}'; + } + else { + return value; + } + } + + function argumentsToMessage() { + var messages = []; + for(var i=0; i<arguments.length; ++i) { + messages.push(JSON.stringify(arguments[i],stringifyHelper,2)); + } + + return messages.join(' '); + }; + + this.print = function() { + print.apply(this, arguments); + }; + + this.log = this.debug = this.info = this.warn = this.error = function() { + print(argumentsToMessage.apply(this, arguments)); + }; + } + + // The web console is a nicer form of logging - make it available + console = new Console(); +} + +</script> + +<script>/*! + + handlebars v4.0.5 + +Copyright (C) 2011-2015 by Yehuda Katz + +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. + +@license +*/ +!function(a,b){"object"==typeof exports&&"object"==typeof module?module.exports=b():"function"==typeof define&&define.amd?define([],b):"object"==typeof exports?exports.Handlebars=b():a.Handlebars=b()}(this,function(){return function(a){function b(d){if(c[d])return c[d].exports;var e=c[d]={exports:{},id:d,loaded:!1};return a[d].call(e.exports,e,e.exports,b),e.loaded=!0,e.exports}var c={};return b.m=a,b.c=c,b.p="",b(0)}([function(a,b,c){"use strict";function d(){var a=r();return a.compile=function(b,c){return k.compile(b,c,a)},a.precompile=function(b,c){return k.precompile(b,c,a)},a.AST=i["default"],a.Compiler=k.Compiler,a.JavaScriptCompiler=m["default"],a.Parser=j.parser,a.parse=j.parse,a}var e=c(1)["default"];b.__esModule=!0;var f=c(2),g=e(f),h=c(21),i=e(h),j=c(22),k=c(27),l=c(28),m=e(l),n=c(25),o=e(n),p=c(20),q=e(p),r=g["default"].create,s=d();s.create=d,q["default"](s),s.Visitor=o["default"],s["default"]=s,b["default"]=s,a.exports=b["default"]},function(a,b){"use strict";b["default"]=function(a){return a&&a.__esModule?a:{"default":a}},b.__esModule=!0},function(a,b,c){"use strict";function d(){var a=new h.HandlebarsEnvironment;return n.extend(a,h),a.SafeString=j["default"],a.Exception=l["default"],a.Utils=n,a.escapeExpression=n.escapeExpression,a.VM=p,a.template=function(b){return p.template(b,a)},a}var e=c(3)["default"],f=c(1)["default"];b.__esModule=!0;var g=c(4),h=e(g),i=c(18),j=f(i),k=c(6),l=f(k),m=c(5),n=e(m),o=c(19),p=e(o),q=c(20),r=f(q),s=d();s.create=d,r["default"](s),s["default"]=s,b["default"]=s,a.exports=b["default"]},function(a,b){"use strict";b["default"]=function(a){if(a&&a.__esModule)return a;var b={};if(null!=a)for(var c in a)Object.prototype.hasOwnProperty.call(a,c)&&(b[c]=a[c]);return b["default"]=a,b},b.__esModule=!0},function(a,b,c){"use strict";function d(a,b,c){this.helpers=a||{},this.partials=b||{},this.decorators=c||{},i.registerDefaultHelpers(this),j.registerDefaultDecorators(this)}var e=c(1)["default"];b.__esModule=!0,b.HandlebarsEnvironment=d;var f=c(5),g=c(6),h=e(g),i=c(7),j=c(15),k=c(17),l=e(k),m="4.0.5";b.VERSION=m;var n=7;b.COMPILER_REVISION=n;var o={1:"<= 1.0.rc.2",2:"== 1.0.0-rc.3",3:"== 1.0.0-rc.4",4:"== 1.x.x",5:"== 2.0.0-alpha.x",6:">= 2.0.0-beta.1",7:">= 4.0.0"};b.REVISION_CHANGES=o;var p="[object Object]";d.prototype={constructor:d,logger:l["default"],log:l["default"].log,registerHelper:function(a,b){if(f.toString.call(a)===p){if(b)throw new h["default"]("Arg not supported with multiple helpers");f.extend(this.helpers,a)}else this.helpers[a]=b},unregisterHelper:function(a){delete this.helpers[a]},registerPartial:function(a,b){if(f.toString.call(a)===p)f.extend(this.partials,a);else{if("undefined"==typeof b)throw new h["default"]('Attempting to register a partial called "'+a+'" as undefined');this.partials[a]=b}},unregisterPartial:function(a){delete this.partials[a]},registerDecorator:function(a,b){if(f.toString.call(a)===p){if(b)throw new h["default"]("Arg not supported with multiple decorators");f.extend(this.decorators,a)}else this.decorators[a]=b},unregisterDecorator:function(a){delete this.decorators[a]}};var q=l["default"].log;b.log=q,b.createFrame=f.createFrame,b.logger=l["default"]},function(a,b){"use strict";function c(a){return k[a]}function d(a){for(var b=1;b<arguments.length;b++)for(var c in arguments[b])Object.prototype.hasOwnProperty.call(arguments[b],c)&&(a[c]=arguments[b][c]);return a}function e(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1}function f(a){if("string"!=typeof a){if(a&&a.toHTML)return a.toHTML();if(null==a)return"";if(!a)return a+"";a=""+a}return m.test(a)?a.replace(l,c):a}function g(a){return a||0===a?p(a)&&0===a.length?!0:!1:!0}function h(a){var b=d({},a);return b._parent=a,b}function i(a,b){return a.path=b,a}function j(a,b){return(a?a+".":"")+b}b.__esModule=!0,b.extend=d,b.indexOf=e,b.escapeExpression=f,b.isEmpty=g,b.createFrame=h,b.blockParams=i,b.appendContextPath=j;var k={"&":"&","<":"<",">":">",'"':""","'":"'","`":"`","=":"="},l=/[&<>"'`=]/g,m=/[&<>"'`=]/,n=Object.prototype.toString;b.toString=n;var o=function(a){return"function"==typeof a};o(/x/)&&(b.isFunction=o=function(a){return"function"==typeof a&&"[object Function]"===n.call(a)}),b.isFunction=o;var p=Array.isArray||function(a){return a&&"object"==typeof a?"[object Array]"===n.call(a):!1};b.isArray=p},function(a,b){"use strict";function c(a,b){var e=b&&b.loc,f=void 0,g=void 0;e&&(f=e.start.line,g=e.start.column,a+=" - "+f+":"+g);for(var h=Error.prototype.constructor.call(this,a),i=0;i<d.length;i++)this[d[i]]=h[d[i]];Error.captureStackTrace&&Error.captureStackTrace(this,c),e&&(this.lineNumber=f,this.column=g)}b.__esModule=!0;var d=["description","fileName","lineNumber","message","name","number","stack"];c.prototype=new Error,b["default"]=c,a.exports=b["default"]},function(a,b,c){"use strict";function d(a){g["default"](a),i["default"](a),k["default"](a),m["default"](a),o["default"](a),q["default"](a),s["default"](a)}var e=c(1)["default"];b.__esModule=!0,b.registerDefaultHelpers=d;var f=c(8),g=e(f),h=c(9),i=e(h),j=c(10),k=e(j),l=c(11),m=e(l),n=c(12),o=e(n),p=c(13),q=e(p),r=c(14),s=e(r)},function(a,b,c){"use strict";b.__esModule=!0;var d=c(5);b["default"]=function(a){a.registerHelper("blockHelperMissing",function(b,c){var e=c.inverse,f=c.fn;if(b===!0)return f(this);if(b===!1||null==b)return e(this);if(d.isArray(b))return b.length>0?(c.ids&&(c.ids=[c.name]),a.helpers.each(b,c)):e(this);if(c.data&&c.ids){var g=d.createFrame(c.data);g.contextPath=d.appendContextPath(c.data.contextPath,c.name),c={data:g}}return f(b,c)})},a.exports=b["default"]},function(a,b,c){"use strict";var d=c(1)["default"];b.__esModule=!0;var e=c(5),f=c(6),g=d(f);b["default"]=function(a){a.registerHelper("each",function(a,b){function c(b,c,f){j&&(j.key=b,j.index=c,j.first=0===c,j.last=!!f,k&&(j.contextPath=k+b)),i+=d(a[b],{data:j,blockParams:e.blockParams([a[b],b],[k+b,null])})}if(!b)throw new g["default"]("Must pass iterator to #each");var d=b.fn,f=b.inverse,h=0,i="",j=void 0,k=void 0;if(b.data&&b.ids&&(k=e.appendContextPath(b.data.contextPath,b.ids[0])+"."),e.isFunction(a)&&(a=a.call(this)),b.data&&(j=e.createFrame(b.data)),a&&"object"==typeof a)if(e.isArray(a))for(var l=a.length;l>h;h++)h in a&&c(h,h,h===a.length-1);else{var m=void 0;for(var n in a)a.hasOwnProperty(n)&&(void 0!==m&&c(m,h-1),m=n,h++);void 0!==m&&c(m,h-1,!0)}return 0===h&&(i=f(this)),i})},a.exports=b["default"]},function(a,b,c){"use strict";var d=c(1)["default"];b.__esModule=!0;var e=c(6),f=d(e);b["default"]=function(a){a.registerHelper("helperMissing",function(){if(1===arguments.length)return void 0;throw new f["default"]('Missing helper: "'+arguments[arguments.length-1].name+'"')})},a.exports=b["default"]},function(a,b,c){"use strict";b.__esModule=!0;var d=c(5);b["default"]=function(a){a.registerHelper("if",function(a,b){return d.isFunction(a)&&(a=a.call(this)),!b.hash.includeZero&&!a||d.isEmpty(a)?b.inverse(this):b.fn(this)}),a.registerHelper("unless",function(b,c){return a.helpers["if"].call(this,b,{fn:c.inverse,inverse:c.fn,hash:c.hash})})},a.exports=b["default"]},function(a,b){"use strict";b.__esModule=!0,b["default"]=function(a){a.registerHelper("log",function(){for(var b=[void 0],c=arguments[arguments.length-1],d=0;d<arguments.length-1;d++)b.push(arguments[d]);var e=1;null!=c.hash.level?e=c.hash.level:c.data&&null!=c.data.level&&(e=c.data.level),b[0]=e,a.log.apply(a,b)})},a.exports=b["default"]},function(a,b){"use strict";b.__esModule=!0,b["default"]=function(a){a.registerHelper("lookup",function(a,b){return a&&a[b]})},a.exports=b["default"]},function(a,b,c){"use strict";b.__esModule=!0;var d=c(5);b["default"]=function(a){a.registerHelper("with",function(a,b){d.isFunction(a)&&(a=a.call(this));var c=b.fn;if(d.isEmpty(a))return b.inverse(this);var e=b.data;return b.data&&b.ids&&(e=d.createFrame(b.data),e.contextPath=d.appendContextPath(b.data.contextPath,b.ids[0])),c(a,{data:e,blockParams:d.blockParams([a],[e&&e.contextPath])})})},a.exports=b["default"]},function(a,b,c){"use strict";function d(a){g["default"](a)}var e=c(1)["default"];b.__esModule=!0,b.registerDefaultDecorators=d;var f=c(16),g=e(f)},function(a,b,c){"use strict";b.__esModule=!0;var d=c(5);b["default"]=function(a){a.registerDecorator("inline",function(a,b,c,e){var f=a;return b.partials||(b.partials={},f=function(e,f){var g=c.partials;c.partials=d.extend({},g,b.partials);var h=a(e,f);return c.partials=g,h}),b.partials[e.args[0]]=e.fn,f})},a.exports=b["default"]},function(a,b,c){"use strict";b.__esModule=!0;var d=c(5),e={methodMap:["debug","info","warn","error"],level:"info",lookupLevel:function(a){if("string"==typeof a){var b=d.indexOf(e.methodMap,a.toLowerCase());a=b>=0?b:parseInt(a,10)}return a},log:function(a){if(a=e.lookupLevel(a),"undefined"!=typeof console&&e.lookupLevel(e.level)<=a){var b=e.methodMap[a];console[b]||(b="log");for(var c=arguments.length,d=Array(c>1?c-1:0),f=1;c>f;f++)d[f-1]=arguments[f];console[b].apply(console,d)}}};b["default"]=e,a.exports=b["default"]},function(a,b){"use strict";function c(a){this.string=a}b.__esModule=!0,c.prototype.toString=c.prototype.toHTML=function(){return""+this.string},b["default"]=c,a.exports=b["default"]},function(a,b,c){"use strict";function d(a){var b=a&&a[0]||1,c=r.COMPILER_REVISION;if(b!==c){if(c>b){var d=r.REVISION_CHANGES[c],e=r.REVISION_CHANGES[b];throw new q["default"]("Template was precompiled with an older version of Handlebars than the current runtime. Please update your precompiler to a newer version ("+d+") or downgrade your runtime to an older version ("+e+").")}throw new q["default"]("Template was precompiled with a newer version of Handlebars than the current runtime. Please update your runtime to a newer version ("+a[1]+").")}}function e(a,b){function c(c,d,e){e.hash&&(d=o.extend({},d,e.hash),e.ids&&(e.ids[0]=!0)),c=b.VM.resolvePartial.call(this,c,d,e);var f=b.VM.invokePartial.call(this,c,d,e);if(null==f&&b.compile&&(e.partials[e.name]=b.compile(c,a.compilerOptions,b),f=e.partials[e.name](d,e)),null!=f){if(e.indent){for(var g=f.split("\n"),h=0,i=g.length;i>h&&(g[h]||h+1!==i);h++)g[h]=e.indent+g[h];f=g.join("\n")}return f}throw new q["default"]("The partial "+e.name+" could not be compiled when running in runtime-only mode")}function d(b){function c(b){return""+a.main(e,b,e.helpers,e.partials,g,i,h)}var f=arguments.length<=1||void 0===arguments[1]?{}:arguments[1],g=f.data;d._setup(f),!f.partial&&a.useData&&(g=j(b,g));var h=void 0,i=a.useBlockParams?[]:void 0;return a.useDepths&&(h=f.depths?b!==f.depths[0]?[b].concat(f.depths):f.depths:[b]),(c=k(a.main,c,e,f.depths||[],g,i))(b,f)}if(!b)throw new q["default"]("No environment passed to template");if(!a||!a.main)throw new q["default"]("Unknown template object: "+typeof a);a.main.decorator=a.main_d,b.VM.checkRevision(a.compiler);var e={strict:function(a,b){if(!(b in a))throw new q["default"]('"'+b+'" not defined in '+a);return a[b]},lookup:function(a,b){for(var c=a.length,d=0;c>d;d++)if(a[d]&&null!=a[d][b])return a[d][b]},lambda:function(a,b){return"function"==typeof a?a.call(b):a},escapeExpression:o.escapeExpression,invokePartial:c,fn:function(b){var c=a[b];return c.decorator=a[b+"_d"],c},programs:[],program:function(a,b,c,d,e){var g=this.programs[a],h=this.fn(a);return b||e||d||c?g=f(this,a,h,b,c,d,e):g||(g=this.programs[a]=f(this,a,h)),g},data:function(a,b){for(;a&&b--;)a=a._parent;return a},merge:function(a,b){var c=a||b;return a&&b&&a!==b&&(c=o.extend({},b,a)),c},noop:b.VM.noop,compilerInfo:a.compiler};return d.isTop=!0,d._setup=function(c){c.partial?(e.helpers=c.helpers,e.partials=c.partials,e.decorators=c.decorators):(e.helpers=e.merge(c.helpers,b.helpers),a.usePartial&&(e.partials=e.merge(c.partials,b.partials)),(a.usePartial||a.useDecorators)&&(e.decorators=e.merge(c.decorators,b.decorators)))},d._child=function(b,c,d,g){if(a.useBlockParams&&!d)throw new q["default"]("must pass block params");if(a.useDepths&&!g)throw new q["default"]("must pass parent depths");return f(e,b,a[b],c,0,d,g)},d}function f(a,b,c,d,e,f,g){function h(b){var e=arguments.length<=1||void 0===arguments[1]?{}:arguments[1],h=g;return g&&b!==g[0]&&(h=[b].concat(g)),c(a,b,a.helpers,a.partials,e.data||d,f&&[e.blockParams].concat(f),h)}return h=k(c,h,a,g,d,f),h.program=b,h.depth=g?g.length:0,h.blockParams=e||0,h}function g(a,b,c){return a?a.call||c.name||(c.name=a,a=c.partials[a]):a="@partial-block"===c.name?c.data["partial-block"]:c.partials[c.name],a}function h(a,b,c){c.partial=!0,c.ids&&(c.data.contextPath=c.ids[0]||c.data.contextPath);var d=void 0;if(c.fn&&c.fn!==i&&(c.data=r.createFrame(c.data),d=c.data["partial-block"]=c.fn,d.partials&&(c.partials=o.extend({},c.partials,d.partials))),void 0===a&&d&&(a=d),void 0===a)throw new q["default"]("The partial "+c.name+" could not be found");return a instanceof Function?a(b,c):void 0}function i(){return""}function j(a,b){return b&&"root"in b||(b=b?r.createFrame(b):{},b.root=a),b}function k(a,b,c,d,e,f){if(a.decorator){var g={};b=a.decorator(b,g,c,d&&d[0],e,f,d),o.extend(b,g)}return b}var l=c(3)["default"],m=c(1)["default"];b.__esModule=!0,b.checkRevision=d,b.template=e,b.wrapProgram=f,b.resolvePartial=g,b.invokePartial=h,b.noop=i;var n=c(5),o=l(n),p=c(6),q=m(p),r=c(4)},function(a,b){(function(c){"use strict";b.__esModule=!0,b["default"]=function(a){var b="undefined"!=typeof c?c:window,d=b.Handlebars;a.noConflict=function(){return b.Handlebars===a&&(b.Handlebars=d),a}},a.exports=b["default"]}).call(b,function(){return this}())},function(a,b){"use strict";b.__esModule=!0;var c={helpers:{helperExpression:function(a){return"SubExpression"===a.type||("MustacheStatement"===a.type||"BlockStatement"===a.type)&&!!(a.params&&a.params.length||a.hash)},scopedId:function(a){return/^\.|this\b/.test(a.original)},simpleId:function(a){return 1===a.parts.length&&!c.helpers.scopedId(a)&&!a.depth}}};b["default"]=c,a.exports=b["default"]},function(a,b,c){"use strict";function d(a,b){if("Program"===a.type)return a;h["default"].yy=n,n.locInfo=function(a){return new n.SourceLocation(b&&b.srcName,a)};var c=new j["default"](b);return c.accept(h["default"].parse(a))}var e=c(1)["default"],f=c(3)["default"];b.__esModule=!0,b.parse=d;var g=c(23),h=e(g),i=c(24),j=e(i),k=c(26),l=f(k),m=c(5);b.parser=h["default"];var n={};m.extend(n,l)},function(a,b){"use strict";var c=function(){function a(){this.yy={}}var b={trace:function(){},yy:{},symbols_:{error:2,root:3,program:4,EOF:5,program_repetition0:6,statement:7,mustache:8,block:9,rawBlock:10,partial:11,partialBlock:12,content:13,COMMENT:14,CONTENT:15,openRawBlock:16,rawBlock_repetition_plus0:17,END_RAW_BLOCK:18,OPEN_RAW_BLOCK:19,helperName:20,openRawBlock_repetition0:21,openRawBlock_option0:22,CLOSE_RAW_BLOCK:23,openBlock:24,block_option0:25,closeBlock:26,openInverse:27,block_option1:28,OPEN_BLOCK:29,openBlock_repetition0:30,openBlock_option0:31,openBlock_option1:32,CLOSE:33,OPEN_INVERSE:34,openInverse_repetition0:35,openInverse_option0:36,openInverse_option1:37,openInverseChain:38,OPEN_INVERSE_CHAIN:39,openInverseChain_repetition0:40,openInverseChain_option0:41,openInverseChain_option1:42,inverseAndProgram:43,INVERSE:44,inverseChain:45,inverseChain_option0:46,OPEN_ENDBLOCK:47,OPEN:48,mustache_repetition0:49,mustache_option0:50,OPEN_UNESCAPED:51,mustache_repetition1:52,mustache_option1:53,CLOSE_UNESCAPED:54,OPEN_PARTIAL:55,partialName:56,partial_repetition0:57,partial_option0:58,openPartialBlock:59,OPEN_PARTIAL_BLOCK:60,openPartialBlock_repetition0:61,openPartialBlock_option0:62,param:63,sexpr:64,OPEN_SEXPR:65,sexpr_repetition0:66,sexpr_option0:67,CLOSE_SEXPR:68,hash:69,hash_repetition_plus0:70,hashSegment:71,ID:72,EQUALS:73,blockParams:74,OPEN_BLOCK_PARAMS:75,blockParams_repetition_plus0:76,CLOSE_BLOCK_PARAMS:77,path:78,dataName:79,STRING:80,NUMBER:81,BOOLEAN:82,UNDEFINED:83,NULL:84,DATA:85,pathSegments:86,SEP:87,$accept:0,$end:1},terminals_:{2:"error",5:"EOF",14:"COMMENT",15:"CONTENT",18:"END_RAW_BLOCK",19:"OPEN_RAW_BLOCK",23:"CLOSE_RAW_BLOCK",29:"OPEN_BLOCK",33:"CLOSE",34:"OPEN_INVERSE",39:"OPEN_INVERSE_CHAIN",44:"INVERSE",47:"OPEN_ENDBLOCK",48:"OPEN",51:"OPEN_UNESCAPED",54:"CLOSE_UNESCAPED",55:"OPEN_PARTIAL",60:"OPEN_PARTIAL_BLOCK",65:"OPEN_SEXPR",68:"CLOSE_SEXPR",72:"ID",73:"EQUALS",75:"OPEN_BLOCK_PARAMS",77:"CLOSE_BLOCK_PARAMS",80:"STRING",81:"NUMBER",82:"BOOLEAN",83:"UNDEFINED",84:"NULL",85:"DATA",87:"SEP"},productions_:[0,[3,2],[4,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[13,1],[10,3],[16,5],[9,4],[9,4],[24,6],[27,6],[38,6],[43,2],[45,3],[45,1],[26,3],[8,5],[8,5],[11,5],[12,3],[59,5],[63,1],[63,1],[64,5],[69,1],[71,3],[74,3],[20,1],[20,1],[20,1],[20,1],[20,1],[20,1],[20,1],[56,1],[56,1],[79,2],[78,1],[86,3],[86,1],[6,0],[6,2],[17,1],[17,2],[21,0],[21,2],[22,0],[22,1],[25,0],[25,1],[28,0],[28,1],[30,0],[30,2],[31,0],[31,1],[32,0],[32,1],[35,0],[35,2],[36,0],[36,1],[37,0],[37,1],[40,0],[40,2],[41,0],[41,1],[42,0],[42,1],[46,0],[46,1],[49,0],[49,2],[50,0],[50,1],[52,0],[52,2],[53,0],[53,1],[57,0],[57,2],[58,0],[58,1],[61,0],[61,2],[62,0],[62,1],[66,0],[66,2],[67,0],[67,1],[70,1],[70,2],[76,1],[76,2]],performAction:function(a,b,c,d,e,f,g){var h=f.length-1;switch(e){case 1:return f[h-1];case 2:this.$=d.prepareProgram(f[h]);break;case 3:this.$=f[h];break;case 4:this.$=f[h];break;case 5:this.$=f[h];break;case 6:this.$=f[h];break;case 7:this.$=f[h];break;case 8:this.$=f[h];break;case 9:this.$={type:"CommentStatement",value:d.stripComment(f[h]),strip:d.stripFlags(f[h],f[h]),loc:d.locInfo(this._$)};break;case 10:this.$={type:"ContentStatement",original:f[h],value:f[h],loc:d.locInfo(this._$)};break;case 11:this.$=d.prepareRawBlock(f[h-2],f[h-1],f[h],this._$);break;case 12:this.$={path:f[h-3],params:f[h-2],hash:f[h-1]};break;case 13:this.$=d.prepareBlock(f[h-3],f[h-2],f[h-1],f[h],!1,this._$);break;case 14:this.$=d.prepareBlock(f[h-3],f[h-2],f[h-1],f[h],!0,this._$);break;case 15:this.$={open:f[h-5],path:f[h-4],params:f[h-3],hash:f[h-2],blockParams:f[h-1],strip:d.stripFlags(f[h-5],f[h])};break;case 16:this.$={path:f[h-4],params:f[h-3],hash:f[h-2],blockParams:f[h-1],strip:d.stripFlags(f[h-5],f[h])};break;case 17:this.$={path:f[h-4],params:f[h-3],hash:f[h-2],blockParams:f[h-1],strip:d.stripFlags(f[h-5],f[h])};break;case 18:this.$={strip:d.stripFlags(f[h-1],f[h-1]),program:f[h]};break;case 19:var i=d.prepareBlock(f[h-2],f[h-1],f[h],f[h],!1,this._$),j=d.prepareProgram([i],f[h-1].loc);j.chained=!0,this.$={strip:f[h-2].strip,program:j,chain:!0};break;case 20:this.$=f[h];break;case 21:this.$={path:f[h-1],strip:d.stripFlags(f[h-2],f[h])};break;case 22:this.$=d.prepareMustache(f[h-3],f[h-2],f[h-1],f[h-4],d.stripFlags(f[h-4],f[h]),this._$);break;case 23:this.$=d.prepareMustache(f[h-3],f[h-2],f[h-1],f[h-4],d.stripFlags(f[h-4],f[h]),this._$);break;case 24:this.$={type:"PartialStatement",name:f[h-3],params:f[h-2],hash:f[h-1],indent:"",strip:d.stripFlags(f[h-4],f[h]),loc:d.locInfo(this._$)};break;case 25:this.$=d.preparePartialBlock(f[h-2],f[h-1],f[h],this._$);break;case 26:this.$={path:f[h-3],params:f[h-2],hash:f[h-1],strip:d.stripFlags(f[h-4],f[h])};break;case 27:this.$=f[h];break;case 28:this.$=f[h];break;case 29:this.$={type:"SubExpression",path:f[h-3],params:f[h-2],hash:f[h-1],loc:d.locInfo(this._$)};break;case 30:this.$={type:"Hash",pairs:f[h],loc:d.locInfo(this._$)};break;case 31:this.$={type:"HashPair",key:d.id(f[h-2]),value:f[h],loc:d.locInfo(this._$)};break;case 32:this.$=d.id(f[h-1]);break;case 33:this.$=f[h];break;case 34:this.$=f[h];break;case 35:this.$={type:"StringLiteral",value:f[h],original:f[h],loc:d.locInfo(this._$)};break;case 36:this.$={type:"NumberLiteral",value:Number(f[h]),original:Number(f[h]),loc:d.locInfo(this._$)};break;case 37:this.$={type:"BooleanLiteral",value:"true"===f[h],original:"true"===f[h],loc:d.locInfo(this._$)};break;case 38:this.$={type:"UndefinedLiteral",original:void 0,value:void 0,loc:d.locInfo(this._$)};break;case 39:this.$={type:"NullLiteral",original:null,value:null,loc:d.locInfo(this._$)};break;case 40:this.$=f[h];break;case 41:this.$=f[h];break;case 42:this.$=d.preparePath(!0,f[h],this._$);break;case 43:this.$=d.preparePath(!1,f[h],this._$);break;case 44:f[h-2].push({part:d.id(f[h]),original:f[h],separator:f[h-1]}),this.$=f[h-2];break;case 45:this.$=[{part:d.id(f[h]),original:f[h]}];break;case 46:this.$=[];break;case 47:f[h-1].push(f[h]);break;case 48:this.$=[f[h]];break;case 49:f[h-1].push(f[h]);break;case 50:this.$=[];break;case 51:f[h-1].push(f[h]);break;case 58:this.$=[];break;case 59:f[h-1].push(f[h]);break;case 64:this.$=[];break;case 65:f[h-1].push(f[h]);break;case 70:this.$=[];break;case 71:f[h-1].push(f[h]);break;case 78:this.$=[];break;case 79:f[h-1].push(f[h]);break;case 82:this.$=[];break;case 83:f[h-1].push(f[h]);break;case 86:this.$=[];break;case 87:f[h-1].push(f[h]);break;case 90:this.$=[];break;case 91:f[h-1].push(f[h]);break;case 94:this.$=[];break;case 95:f[h-1].push(f[h]);break;case 98:this.$=[f[h]];break;case 99:f[h-1].push(f[h]);break;case 100:this.$=[f[h]];break;case 101:f[h-1].push(f[h])}},table:[{3:1,4:2,5:[2,46],6:3,14:[2,46],15:[2,46],19:[2,46],29:[2,46],34:[2,46],48:[2,46],51:[2,46],55:[2,46],60:[2,46]},{1:[3]},{5:[1,4]},{5:[2,2],7:5,8:6,9:7,10:8,11:9,12:10,13:11,14:[1,12],15:[1,20],16:17,19:[1,23],24:15,27:16,29:[1,21],34:[1,22],39:[2,2],44:[2,2],47:[2,2],48:[1,13],51:[1,14],55:[1,18],59:19,60:[1,24]},{1:[2,1]},{5:[2,47],14:[2,47],15:[2,47],19:[2,47],29:[2,47],34:[2,47],39:[2,47],44:[2,47],47:[2,47],48:[2,47],51:[2,47],55:[2,47],60:[2,47]},{5:[2,3],14:[2,3],15:[2,3],19:[2,3],29:[2,3],34:[2,3],39:[2,3],44:[2,3],47:[2,3],48:[2,3],51:[2,3],55:[2,3],60:[2,3]},{5:[2,4],14:[2,4],15:[2,4],19:[2,4],29:[2,4],34:[2,4],39:[2,4],44:[2,4],47:[2,4],48:[2,4],51:[2,4],55:[2,4],60:[2,4]},{5:[2,5],14:[2,5],15:[2,5],19:[2,5],29:[2,5],34:[2,5],39:[2,5],44:[2,5],47:[2,5],48:[2,5],51:[2,5],55:[2,5],60:[2,5]},{5:[2,6],14:[2,6],15:[2,6],19:[2,6],29:[2,6],34:[2,6],39:[2,6],44:[2,6],47:[2,6],48:[2,6],51:[2,6],55:[2,6],60:[2,6]},{5:[2,7],14:[2,7],15:[2,7],19:[2,7],29:[2,7],34:[2,7],39:[2,7],44:[2,7],47:[2,7],48:[2,7],51:[2,7],55:[2,7],60:[2,7]},{5:[2,8],14:[2,8],15:[2,8],19:[2,8],29:[2,8],34:[2,8],39:[2,8],44:[2,8],47:[2,8],48:[2,8],51:[2,8],55:[2,8],60:[2,8]},{5:[2,9],14:[2,9],15:[2,9],19:[2,9],29:[2,9],34:[2,9],39:[2,9],44:[2,9],47:[2,9],48:[2,9],51:[2,9],55:[2,9],60:[2,9]},{20:25,72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{20:36,72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{4:37,6:3,14:[2,46],15:[2,46],19:[2,46],29:[2,46],34:[2,46],39:[2,46],44:[2,46],47:[2,46],48:[2,46],51:[2,46],55:[2,46],60:[2,46]},{4:38,6:3,14:[2,46],15:[2,46],19:[2,46],29:[2,46],34:[2,46],44:[2,46],47:[2,46],48:[2,46],51:[2,46],55:[2,46],60:[2,46]},{13:40,15:[1,20],17:39},{20:42,56:41,64:43,65:[1,44],72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{4:45,6:3,14:[2,46],15:[2,46],19:[2,46],29:[2,46],34:[2,46],47:[2,46],48:[2,46],51:[2,46],55:[2,46],60:[2,46]},{5:[2,10],14:[2,10],15:[2,10],18:[2,10],19:[2,10],29:[2,10],34:[2,10],39:[2,10],44:[2,10],47:[2,10],48:[2,10],51:[2,10],55:[2,10],60:[2,10]},{20:46,72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{20:47,72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{20:48,72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{20:42,56:49,64:43,65:[1,44],72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{33:[2,78],49:50,65:[2,78],72:[2,78],80:[2,78],81:[2,78],82:[2,78],83:[2,78],84:[2,78],85:[2,78]},{23:[2,33],33:[2,33],54:[2,33],65:[2,33],68:[2,33],72:[2,33],75:[2,33],80:[2,33],81:[2,33],82:[2,33],83:[2,33],84:[2,33],85:[2,33]},{23:[2,34],33:[2,34],54:[2,34],65:[2,34],68:[2,34],72:[2,34],75:[2,34],80:[2,34],81:[2,34],82:[2,34],83:[2,34],84:[2,34],85:[2,34]},{23:[2,35],33:[2,35],54:[2,35],65:[2,35],68:[2,35],72:[2,35],75:[2,35],80:[2,35],81:[2,35],82:[2,35],83:[2,35],84:[2,35],85:[2,35]},{23:[2,36],33:[2,36],54:[2,36],65:[2,36],68:[2,36],72:[2,36],75:[2,36],80:[2,36],81:[2,36],82:[2,36],83:[2,36],84:[2,36],85:[2,36]},{23:[2,37],33:[2,37],54:[2,37],65:[2,37],68:[2,37],72:[2,37],75:[2,37],80:[2,37],81:[2,37],82:[2,37],83:[2,37],84:[2,37],85:[2,37]},{23:[2,38],33:[2,38],54:[2,38],65:[2,38],68:[2,38],72:[2,38],75:[2,38],80:[2,38],81:[2,38],82:[2,38],83:[2,38],84:[2,38],85:[2,38]},{23:[2,39],33:[2,39],54:[2,39],65:[2,39],68:[2,39],72:[2,39],75:[2,39],80:[2,39],81:[2,39],82:[2,39],83:[2,39],84:[2,39],85:[2,39]},{23:[2,43],33:[2,43],54:[2,43],65:[2,43],68:[2,43],72:[2,43],75:[2,43],80:[2,43],81:[2,43],82:[2,43],83:[2,43],84:[2,43],85:[2,43],87:[1,51]},{72:[1,35],86:52},{23:[2,45],33:[2,45],54:[2,45],65:[2,45],68:[2,45],72:[2,45],75:[2,45],80:[2,45],81:[2,45],82:[2,45],83:[2,45],84:[2,45],85:[2,45],87:[2,45]},{52:53,54:[2,82],65:[2,82],72:[2,82],80:[2,82],81:[2,82],82:[2,82],83:[2,82],84:[2,82],85:[2,82]},{25:54,38:56,39:[1,58],43:57,44:[1,59],45:55,47:[2,54]},{28:60,43:61,44:[1,59],47:[2,56]},{13:63,15:[1,20],18:[1,62]},{15:[2,48],18:[2,48]},{33:[2,86],57:64,65:[2,86],72:[2,86],80:[2,86],81:[2,86],82:[2,86],83:[2,86],84:[2,86],85:[2,86]},{33:[2,40],65:[2,40],72:[2,40],80:[2,40],81:[2,40],82:[2,40],83:[2,40],84:[2,40],85:[2,40]},{33:[2,41],65:[2,41],72:[2,41],80:[2,41],81:[2,41],82:[2,41],83:[2,41],84:[2,41],85:[2,41]},{20:65,72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{26:66,47:[1,67]},{30:68,33:[2,58],65:[2,58],72:[2,58],75:[2,58],80:[2,58],81:[2,58],82:[2,58],83:[2,58],84:[2,58],85:[2,58]},{33:[2,64],35:69,65:[2,64],72:[2,64],75:[2,64],80:[2,64],81:[2,64],82:[2,64],83:[2,64],84:[2,64],85:[2,64]},{21:70,23:[2,50],65:[2,50],72:[2,50],80:[2,50],81:[2,50],82:[2,50],83:[2,50],84:[2,50],85:[2,50]},{33:[2,90],61:71,65:[2,90],72:[2,90],80:[2,90],81:[2,90],82:[2,90],83:[2,90],84:[2,90],85:[2,90]},{20:75,33:[2,80],50:72,63:73,64:76,65:[1,44],69:74,70:77,71:78,72:[1,79],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{72:[1,80]},{23:[2,42],33:[2,42],54:[2,42],65:[2,42],68:[2,42],72:[2,42],75:[2,42],80:[2,42],81:[2,42],82:[2,42],83:[2,42],84:[2,42],85:[2,42],87:[1,51]},{20:75,53:81,54:[2,84],63:82,64:76,65:[1,44],69:83,70:77,71:78,72:[1,79],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{26:84,47:[1,67]},{47:[2,55]},{4:85,6:3,14:[2,46],15:[2,46],19:[2,46],29:[2,46],34:[2,46],39:[2,46],44:[2,46],47:[2,46],48:[2,46],51:[2,46],55:[2,46],60:[2,46]},{47:[2,20]},{20:86,72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{4:87,6:3,14:[2,46],15:[2,46],19:[2,46],29:[2,46],34:[2,46],47:[2,46],48:[2,46],51:[2,46],55:[2,46],60:[2,46]},{26:88,47:[1,67]},{47:[2,57]},{5:[2,11],14:[2,11],15:[2,11],19:[2,11],29:[2,11],34:[2,11],39:[2,11],44:[2,11],47:[2,11],48:[2,11],51:[2,11],55:[2,11],60:[2,11]},{15:[2,49],18:[2,49]},{20:75,33:[2,88],58:89,63:90,64:76,65:[1,44],69:91,70:77,71:78,72:[1,79],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{65:[2,94],66:92,68:[2,94],72:[2,94],80:[2,94],81:[2,94],82:[2,94],83:[2,94],84:[2,94],85:[2,94]},{5:[2,25],14:[2,25],15:[2,25],19:[2,25],29:[2,25],34:[2,25],39:[2,25],44:[2,25],47:[2,25],48:[2,25],51:[2,25],55:[2,25],60:[2,25]},{20:93,72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{20:75,31:94,33:[2,60],63:95,64:76,65:[1,44],69:96,70:77,71:78,72:[1,79],75:[2,60],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{20:75,33:[2,66],36:97,63:98,64:76,65:[1,44],69:99,70:77,71:78,72:[1,79],75:[2,66],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{20:75,22:100,23:[2,52],63:101,64:76,65:[1,44],69:102,70:77,71:78,72:[1,79],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{20:75,33:[2,92],62:103,63:104,64:76,65:[1,44],69:105,70:77,71:78,72:[1,79],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{33:[1,106]},{33:[2,79],65:[2,79],72:[2,79],80:[2,79],81:[2,79],82:[2,79],83:[2,79],84:[2,79],85:[2,79]},{33:[2,81]},{23:[2,27],33:[2,27],54:[2,27],65:[2,27],68:[2,27],72:[2,27],75:[2,27],80:[2,27],81:[2,27],82:[2,27],83:[2,27],84:[2,27],85:[2,27]},{23:[2,28],33:[2,28],54:[2,28],65:[2,28],68:[2,28],72:[2,28],75:[2,28],80:[2,28],81:[2,28],82:[2,28],83:[2,28],84:[2,28],85:[2,28]},{23:[2,30],33:[2,30],54:[2,30],68:[2,30],71:107,72:[1,108],75:[2,30]},{23:[2,98],33:[2,98],54:[2,98],68:[2,98],72:[2,98],75:[2,98]},{23:[2,45],33:[2,45],54:[2,45],65:[2,45],68:[2,45],72:[2,45],73:[1,109],75:[2,45],80:[2,45],81:[2,45],82:[2,45],83:[2,45],84:[2,45],85:[2,45],87:[2,45]},{23:[2,44],33:[2,44],54:[2,44],65:[2,44],68:[2,44],72:[2,44],75:[2,44],80:[2,44],81:[2,44],82:[2,44],83:[2,44],84:[2,44],85:[2,44],87:[2,44]},{54:[1,110]},{54:[2,83],65:[2,83],72:[2,83],80:[2,83],81:[2,83],82:[2,83],83:[2,83],84:[2,83],85:[2,83]},{54:[2,85]},{5:[2,13],14:[2,13],15:[2,13],19:[2,13],29:[2,13],34:[2,13],39:[2,13],44:[2,13],47:[2,13],48:[2,13],51:[2,13],55:[2,13],60:[2,13]},{38:56,39:[1,58],43:57,44:[1,59],45:112,46:111,47:[2,76]},{33:[2,70],40:113,65:[2,70],72:[2,70],75:[2,70],80:[2,70],81:[2,70],82:[2,70],83:[2,70],84:[2,70],85:[2,70]},{47:[2,18]},{5:[2,14],14:[2,14],15:[2,14],19:[2,14],29:[2,14],34:[2,14],39:[2,14],44:[2,14],47:[2,14],48:[2,14],51:[2,14],55:[2,14],60:[2,14]},{33:[1,114]},{33:[2,87],65:[2,87],72:[2,87],80:[2,87],81:[2,87],82:[2,87],83:[2,87],84:[2,87],85:[2,87]},{33:[2,89]},{20:75,63:116,64:76,65:[1,44],67:115,68:[2,96],69:117,70:77,71:78,72:[1,79],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{33:[1,118]},{32:119,33:[2,62],74:120,75:[1,121]},{33:[2,59],65:[2,59],72:[2,59],75:[2,59],80:[2,59],81:[2,59],82:[2,59],83:[2,59],84:[2,59],85:[2,59]},{33:[2,61],75:[2,61]},{33:[2,68],37:122,74:123,75:[1,121]},{33:[2,65],65:[2,65],72:[2,65],75:[2,65],80:[2,65],81:[2,65],82:[2,65],83:[2,65],84:[2,65],85:[2,65]},{33:[2,67],75:[2,67]},{23:[1,124]},{23:[2,51],65:[2,51],72:[2,51],80:[2,51],81:[2,51],82:[2,51],83:[2,51],84:[2,51],85:[2,51]},{23:[2,53]},{33:[1,125]},{33:[2,91],65:[2,91],72:[2,91],80:[2,91],81:[2,91],82:[2,91],83:[2,91],84:[2,91],85:[2,91]},{33:[2,93]},{5:[2,22],14:[2,22],15:[2,22],19:[2,22],29:[2,22],34:[2,22],39:[2,22],44:[2,22],47:[2,22],48:[2,22],51:[2,22],55:[2,22],60:[2,22]},{23:[2,99],33:[2,99],54:[2,99],68:[2,99],72:[2,99],75:[2,99]},{73:[1,109]},{20:75,63:126,64:76,65:[1,44],72:[1,35],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{5:[2,23],14:[2,23],15:[2,23],19:[2,23],29:[2,23],34:[2,23],39:[2,23],44:[2,23],47:[2,23],48:[2,23],51:[2,23],55:[2,23],60:[2,23]},{47:[2,19]},{47:[2,77]},{20:75,33:[2,72],41:127,63:128,64:76,65:[1,44],69:129,70:77,71:78,72:[1,79],75:[2,72],78:26,79:27,80:[1,28],81:[1,29],82:[1,30],83:[1,31],84:[1,32],85:[1,34],86:33},{5:[2,24],14:[2,24],15:[2,24],19:[2,24],29:[2,24],34:[2,24],39:[2,24],44:[2,24],47:[2,24],48:[2,24],51:[2,24],55:[2,24],60:[2,24]},{68:[1,130]},{65:[2,95],68:[2,95],72:[2,95],80:[2,95],81:[2,95],82:[2,95],83:[2,95],84:[2,95],85:[2,95]},{68:[2,97]},{5:[2,21],14:[2,21],15:[2,21],19:[2,21],29:[2,21],34:[2,21],39:[2,21],44:[2,21],47:[2,21],48:[2,21],51:[2,21],55:[2,21],60:[2,21]},{33:[1,131]},{33:[2,63]},{72:[1,133],76:132},{33:[1,134]},{33:[2,69]},{15:[2,12]},{14:[2,26],15:[2,26],19:[2,26],29:[2,26],34:[2,26],47:[2,26],48:[2,26],51:[2,26],55:[2,26],60:[2,26]},{23:[2,31],33:[2,31],54:[2,31],68:[2,31],72:[2,31],75:[2,31]},{33:[2,74],42:135,74:136,75:[1,121]},{33:[2,71],65:[2,71],72:[2,71],75:[2,71],80:[2,71],81:[2,71],82:[2,71],83:[2,71],84:[2,71],85:[2,71]},{33:[2,73],75:[2,73]},{23:[2,29],33:[2,29],54:[2,29],65:[2,29],68:[2,29],72:[2,29],75:[2,29],80:[2,29],81:[2,29],82:[2,29],83:[2,29],84:[2,29],85:[2,29]},{14:[2,15],15:[2,15],19:[2,15],29:[2,15],34:[2,15],39:[2,15],44:[2,15],47:[2,15],48:[2,15],51:[2,15],55:[2,15],60:[2,15]},{72:[1,138],77:[1,137]},{72:[2,100],77:[2,100]},{14:[2,16],15:[2,16],19:[2,16],29:[2,16],34:[2,16], +44:[2,16],47:[2,16],48:[2,16],51:[2,16],55:[2,16],60:[2,16]},{33:[1,139]},{33:[2,75]},{33:[2,32]},{72:[2,101],77:[2,101]},{14:[2,17],15:[2,17],19:[2,17],29:[2,17],34:[2,17],39:[2,17],44:[2,17],47:[2,17],48:[2,17],51:[2,17],55:[2,17],60:[2,17]}],defaultActions:{4:[2,1],55:[2,55],57:[2,20],61:[2,57],74:[2,81],83:[2,85],87:[2,18],91:[2,89],102:[2,53],105:[2,93],111:[2,19],112:[2,77],117:[2,97],120:[2,63],123:[2,69],124:[2,12],136:[2,75],137:[2,32]},parseError:function(a,b){throw new Error(a)},parse:function(a){function b(){var a;return a=c.lexer.lex()||1,"number"!=typeof a&&(a=c.symbols_[a]||a),a}var c=this,d=[0],e=[null],f=[],g=this.table,h="",i=0,j=0,k=0;this.lexer.setInput(a),this.lexer.yy=this.yy,this.yy.lexer=this.lexer,this.yy.parser=this,"undefined"==typeof this.lexer.yylloc&&(this.lexer.yylloc={});var l=this.lexer.yylloc;f.push(l);var m=this.lexer.options&&this.lexer.options.ranges;"function"==typeof this.yy.parseError&&(this.parseError=this.yy.parseError);for(var n,o,p,q,r,s,t,u,v,w={};;){if(p=d[d.length-1],this.defaultActions[p]?q=this.defaultActions[p]:((null===n||"undefined"==typeof n)&&(n=b()),q=g[p]&&g[p][n]),"undefined"==typeof q||!q.length||!q[0]){var x="";if(!k){v=[];for(s in g[p])this.terminals_[s]&&s>2&&v.push("'"+this.terminals_[s]+"'");x=this.lexer.showPosition?"Parse error on line "+(i+1)+":\n"+this.lexer.showPosition()+"\nExpecting "+v.join(", ")+", got '"+(this.terminals_[n]||n)+"'":"Parse error on line "+(i+1)+": Unexpected "+(1==n?"end of input":"'"+(this.terminals_[n]||n)+"'"),this.parseError(x,{text:this.lexer.match,token:this.terminals_[n]||n,line:this.lexer.yylineno,loc:l,expected:v})}}if(q[0]instanceof Array&&q.length>1)throw new Error("Parse Error: multiple actions possible at state: "+p+", token: "+n);switch(q[0]){case 1:d.push(n),e.push(this.lexer.yytext),f.push(this.lexer.yylloc),d.push(q[1]),n=null,o?(n=o,o=null):(j=this.lexer.yyleng,h=this.lexer.yytext,i=this.lexer.yylineno,l=this.lexer.yylloc,k>0&&k--);break;case 2:if(t=this.productions_[q[1]][1],w.$=e[e.length-t],w._$={first_line:f[f.length-(t||1)].first_line,last_line:f[f.length-1].last_line,first_column:f[f.length-(t||1)].first_column,last_column:f[f.length-1].last_column},m&&(w._$.range=[f[f.length-(t||1)].range[0],f[f.length-1].range[1]]),r=this.performAction.call(w,h,j,i,this.yy,q[1],e,f),"undefined"!=typeof r)return r;t&&(d=d.slice(0,-1*t*2),e=e.slice(0,-1*t),f=f.slice(0,-1*t)),d.push(this.productions_[q[1]][0]),e.push(w.$),f.push(w._$),u=g[d[d.length-2]][d[d.length-1]],d.push(u);break;case 3:return!0}}return!0}},c=function(){var a={EOF:1,parseError:function(a,b){if(!this.yy.parser)throw new Error(a);this.yy.parser.parseError(a,b)},setInput:function(a){return this._input=a,this._more=this._less=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},input:function(){var a=this._input[0];this.yytext+=a,this.yyleng++,this.offset++,this.match+=a,this.matched+=a;var b=a.match(/(?:\r\n?|\n).*/g);return b?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),a},unput:function(a){var b=a.length,c=a.split(/(?:\r\n?|\n)/g);this._input=a+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-b-1),this.offset-=b;var d=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),c.length-1&&(this.yylineno-=c.length-1);var e=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:c?(c.length===d.length?this.yylloc.first_column:0)+d[d.length-c.length].length-c[0].length:this.yylloc.first_column-b},this.options.ranges&&(this.yylloc.range=[e[0],e[0]+this.yyleng-b]),this},more:function(){return this._more=!0,this},less:function(a){this.unput(this.match.slice(a))},pastInput:function(){var a=this.matched.substr(0,this.matched.length-this.match.length);return(a.length>20?"...":"")+a.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var a=this.match;return a.length<20&&(a+=this._input.substr(0,20-a.length)),(a.substr(0,20)+(a.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var a=this.pastInput(),b=new Array(a.length+1).join("-");return a+this.upcomingInput()+"\n"+b+"^"},next:function(){if(this.done)return this.EOF;this._input||(this.done=!0);var a,b,c,d,e;this._more||(this.yytext="",this.match="");for(var f=this._currentRules(),g=0;g<f.length&&(c=this._input.match(this.rules[f[g]]),!c||b&&!(c[0].length>b[0].length)||(b=c,d=g,this.options.flex));g++);return b?(e=b[0].match(/(?:\r\n?|\n).*/g),e&&(this.yylineno+=e.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:e?e[e.length-1].length-e[e.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+b[0].length},this.yytext+=b[0],this.match+=b[0],this.matches=b,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._input=this._input.slice(b[0].length),this.matched+=b[0],a=this.performAction.call(this,this.yy,this,f[d],this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),a?a:void 0):""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var a=this.next();return"undefined"!=typeof a?a:this.lex()},begin:function(a){this.conditionStack.push(a)},popState:function(){return this.conditionStack.pop()},_currentRules:function(){return this.conditions[this.conditionStack[this.conditionStack.length-1]].rules},topState:function(){return this.conditionStack[this.conditionStack.length-2]},pushState:function(a){this.begin(a)}};return a.options={},a.performAction=function(a,b,c,d){function e(a,c){return b.yytext=b.yytext.substr(a,b.yyleng-c)}switch(c){case 0:if("\\\\"===b.yytext.slice(-2)?(e(0,1),this.begin("mu")):"\\"===b.yytext.slice(-1)?(e(0,1),this.begin("emu")):this.begin("mu"),b.yytext)return 15;break;case 1:return 15;case 2:return this.popState(),15;case 3:return this.begin("raw"),15;case 4:return this.popState(),"raw"===this.conditionStack[this.conditionStack.length-1]?15:(b.yytext=b.yytext.substr(5,b.yyleng-9),"END_RAW_BLOCK");case 5:return 15;case 6:return this.popState(),14;case 7:return 65;case 8:return 68;case 9:return 19;case 10:return this.popState(),this.begin("raw"),23;case 11:return 55;case 12:return 60;case 13:return 29;case 14:return 47;case 15:return this.popState(),44;case 16:return this.popState(),44;case 17:return 34;case 18:return 39;case 19:return 51;case 20:return 48;case 21:this.unput(b.yytext),this.popState(),this.begin("com");break;case 22:return this.popState(),14;case 23:return 48;case 24:return 73;case 25:return 72;case 26:return 72;case 27:return 87;case 28:break;case 29:return this.popState(),54;case 30:return this.popState(),33;case 31:return b.yytext=e(1,2).replace(/\\"/g,'"'),80;case 32:return b.yytext=e(1,2).replace(/\\'/g,"'"),80;case 33:return 85;case 34:return 82;case 35:return 82;case 36:return 83;case 37:return 84;case 38:return 81;case 39:return 75;case 40:return 77;case 41:return 72;case 42:return b.yytext=b.yytext.replace(/\\([\\\]])/g,"$1"),72;case 43:return"INVALID";case 44:return 5}},a.rules=[/^(?:[^\x00]*?(?=(\{\{)))/,/^(?:[^\x00]+)/,/^(?:[^\x00]{2,}?(?=(\{\{|\\\{\{|\\\\\{\{|$)))/,/^(?:\{\{\{\{(?=[^/]))/,/^(?:\{\{\{\{\/[^\s!"#%-,\.\/;->@\[-\^`\{-~]+(?=[=}\s\/.])\}\}\}\})/,/^(?:[^\x00]*?(?=(\{\{\{\{)))/,/^(?:[\s\S]*?--(~)?\}\})/,/^(?:\()/,/^(?:\))/,/^(?:\{\{\{\{)/,/^(?:\}\}\}\})/,/^(?:\{\{(~)?>)/,/^(?:\{\{(~)?#>)/,/^(?:\{\{(~)?#\*?)/,/^(?:\{\{(~)?\/)/,/^(?:\{\{(~)?\^\s*(~)?\}\})/,/^(?:\{\{(~)?\s*else\s*(~)?\}\})/,/^(?:\{\{(~)?\^)/,/^(?:\{\{(~)?\s*else\b)/,/^(?:\{\{(~)?\{)/,/^(?:\{\{(~)?&)/,/^(?:\{\{(~)?!--)/,/^(?:\{\{(~)?![\s\S]*?\}\})/,/^(?:\{\{(~)?\*?)/,/^(?:=)/,/^(?:\.\.)/,/^(?:\.(?=([=~}\s\/.)|])))/,/^(?:[\/.])/,/^(?:\s+)/,/^(?:\}(~)?\}\})/,/^(?:(~)?\}\})/,/^(?:"(\\["]|[^"])*")/,/^(?:'(\\[']|[^'])*')/,/^(?:@)/,/^(?:true(?=([~}\s)])))/,/^(?:false(?=([~}\s)])))/,/^(?:undefined(?=([~}\s)])))/,/^(?:null(?=([~}\s)])))/,/^(?:-?[0-9]+(?:\.[0-9]+)?(?=([~}\s)])))/,/^(?:as\s+\|)/,/^(?:\|)/,/^(?:([^\s!"#%-,\.\/;->@\[-\^`\{-~]+(?=([=~}\s\/.)|]))))/,/^(?:\[(\\\]|[^\]])*\])/,/^(?:.)/,/^(?:$)/],a.conditions={mu:{rules:[7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44],inclusive:!1},emu:{rules:[2],inclusive:!1},com:{rules:[6],inclusive:!1},raw:{rules:[3,4,5],inclusive:!1},INITIAL:{rules:[0,1,44],inclusive:!0}},a}();return b.lexer=c,a.prototype=b,b.Parser=a,new a}();b.__esModule=!0,b["default"]=c},function(a,b,c){"use strict";function d(){var a=arguments.length<=0||void 0===arguments[0]?{}:arguments[0];this.options=a}function e(a,b,c){void 0===b&&(b=a.length);var d=a[b-1],e=a[b-2];return d?"ContentStatement"===d.type?(e||!c?/\r?\n\s*?$/:/(^|\r?\n)\s*?$/).test(d.original):void 0:c}function f(a,b,c){void 0===b&&(b=-1);var d=a[b+1],e=a[b+2];return d?"ContentStatement"===d.type?(e||!c?/^\s*?\r?\n/:/^\s*?(\r?\n|$)/).test(d.original):void 0:c}function g(a,b,c){var d=a[null==b?0:b+1];if(d&&"ContentStatement"===d.type&&(c||!d.rightStripped)){var e=d.value;d.value=d.value.replace(c?/^\s+/:/^[ \t]*\r?\n?/,""),d.rightStripped=d.value!==e}}function h(a,b,c){var d=a[null==b?a.length-1:b-1];if(d&&"ContentStatement"===d.type&&(c||!d.leftStripped)){var e=d.value;return d.value=d.value.replace(c?/\s+$/:/[ \t]+$/,""),d.leftStripped=d.value!==e,d.leftStripped}}var i=c(1)["default"];b.__esModule=!0;var j=c(25),k=i(j);d.prototype=new k["default"],d.prototype.Program=function(a){var b=!this.options.ignoreStandalone,c=!this.isRootSeen;this.isRootSeen=!0;for(var d=a.body,i=0,j=d.length;j>i;i++){var k=d[i],l=this.accept(k);if(l){var m=e(d,i,c),n=f(d,i,c),o=l.openStandalone&&m,p=l.closeStandalone&&n,q=l.inlineStandalone&&m&&n;l.close&&g(d,i,!0),l.open&&h(d,i,!0),b&&q&&(g(d,i),h(d,i)&&"PartialStatement"===k.type&&(k.indent=/([ \t]+$)/.exec(d[i-1].original)[1])),b&&o&&(g((k.program||k.inverse).body),h(d,i)),b&&p&&(g(d,i),h((k.inverse||k.program).body))}}return a},d.prototype.BlockStatement=d.prototype.DecoratorBlock=d.prototype.PartialBlockStatement=function(a){this.accept(a.program),this.accept(a.inverse);var b=a.program||a.inverse,c=a.program&&a.inverse,d=c,i=c;if(c&&c.chained)for(d=c.body[0].program;i.chained;)i=i.body[i.body.length-1].program;var j={open:a.openStrip.open,close:a.closeStrip.close,openStandalone:f(b.body),closeStandalone:e((d||b).body)};if(a.openStrip.close&&g(b.body,null,!0),c){var k=a.inverseStrip;k.open&&h(b.body,null,!0),k.close&&g(d.body,null,!0),a.closeStrip.open&&h(i.body,null,!0),!this.options.ignoreStandalone&&e(b.body)&&f(d.body)&&(h(b.body),g(d.body))}else a.closeStrip.open&&h(b.body,null,!0);return j},d.prototype.Decorator=d.prototype.MustacheStatement=function(a){return a.strip},d.prototype.PartialStatement=d.prototype.CommentStatement=function(a){var b=a.strip||{};return{inlineStandalone:!0,open:b.open,close:b.close}},b["default"]=d,a.exports=b["default"]},function(a,b,c){"use strict";function d(){this.parents=[]}function e(a){this.acceptRequired(a,"path"),this.acceptArray(a.params),this.acceptKey(a,"hash")}function f(a){e.call(this,a),this.acceptKey(a,"program"),this.acceptKey(a,"inverse")}function g(a){this.acceptRequired(a,"name"),this.acceptArray(a.params),this.acceptKey(a,"hash")}var h=c(1)["default"];b.__esModule=!0;var i=c(6),j=h(i);d.prototype={constructor:d,mutating:!1,acceptKey:function(a,b){var c=this.accept(a[b]);if(this.mutating){if(c&&!d.prototype[c.type])throw new j["default"]('Unexpected node type "'+c.type+'" found when accepting '+b+" on "+a.type);a[b]=c}},acceptRequired:function(a,b){if(this.acceptKey(a,b),!a[b])throw new j["default"](a.type+" requires "+b)},acceptArray:function(a){for(var b=0,c=a.length;c>b;b++)this.acceptKey(a,b),a[b]||(a.splice(b,1),b--,c--)},accept:function(a){if(a){if(!this[a.type])throw new j["default"]("Unknown type: "+a.type,a);this.current&&this.parents.unshift(this.current),this.current=a;var b=this[a.type](a);return this.current=this.parents.shift(),!this.mutating||b?b:b!==!1?a:void 0}},Program:function(a){this.acceptArray(a.body)},MustacheStatement:e,Decorator:e,BlockStatement:f,DecoratorBlock:f,PartialStatement:g,PartialBlockStatement:function(a){g.call(this,a),this.acceptKey(a,"program")},ContentStatement:function(){},CommentStatement:function(){},SubExpression:e,PathExpression:function(){},StringLiteral:function(){},NumberLiteral:function(){},BooleanLiteral:function(){},UndefinedLiteral:function(){},NullLiteral:function(){},Hash:function(a){this.acceptArray(a.pairs)},HashPair:function(a){this.acceptRequired(a,"value")}},b["default"]=d,a.exports=b["default"]},function(a,b,c){"use strict";function d(a,b){if(b=b.path?b.path.original:b,a.path.original!==b){var c={loc:a.path.loc};throw new q["default"](a.path.original+" doesn't match "+b,c)}}function e(a,b){this.source=a,this.start={line:b.first_line,column:b.first_column},this.end={line:b.last_line,column:b.last_column}}function f(a){return/^\[.*\]$/.test(a)?a.substr(1,a.length-2):a}function g(a,b){return{open:"~"===a.charAt(2),close:"~"===b.charAt(b.length-3)}}function h(a){return a.replace(/^\{\{~?\!-?-?/,"").replace(/-?-?~?\}\}$/,"")}function i(a,b,c){c=this.locInfo(c);for(var d=a?"@":"",e=[],f=0,g="",h=0,i=b.length;i>h;h++){var j=b[h].part,k=b[h].original!==j;if(d+=(b[h].separator||"")+j,k||".."!==j&&"."!==j&&"this"!==j)e.push(j);else{if(e.length>0)throw new q["default"]("Invalid path: "+d,{loc:c});".."===j&&(f++,g+="../")}}return{type:"PathExpression",data:a,depth:f,parts:e,original:d,loc:c}}function j(a,b,c,d,e,f){var g=d.charAt(3)||d.charAt(2),h="{"!==g&&"&"!==g,i=/\*/.test(d);return{type:i?"Decorator":"MustacheStatement",path:a,params:b,hash:c,escaped:h,strip:e,loc:this.locInfo(f)}}function k(a,b,c,e){d(a,c),e=this.locInfo(e);var f={type:"Program",body:b,strip:{},loc:e};return{type:"BlockStatement",path:a.path,params:a.params,hash:a.hash,program:f,openStrip:{},inverseStrip:{},closeStrip:{},loc:e}}function l(a,b,c,e,f,g){e&&e.path&&d(a,e);var h=/\*/.test(a.open);b.blockParams=a.blockParams;var i=void 0,j=void 0;if(c){if(h)throw new q["default"]("Unexpected inverse block on decorator",c);c.chain&&(c.program.body[0].closeStrip=e.strip),j=c.strip,i=c.program}return f&&(f=i,i=b,b=f),{type:h?"DecoratorBlock":"BlockStatement",path:a.path,params:a.params,hash:a.hash,program:b,inverse:i,openStrip:a.strip,inverseStrip:j,closeStrip:e&&e.strip,loc:this.locInfo(g)}}function m(a,b){if(!b&&a.length){var c=a[0].loc,d=a[a.length-1].loc;c&&d&&(b={source:c.source,start:{line:c.start.line,column:c.start.column},end:{line:d.end.line,column:d.end.column}})}return{type:"Program",body:a,strip:{},loc:b}}function n(a,b,c,e){return d(a,c),{type:"PartialBlockStatement",name:a.path,params:a.params,hash:a.hash,program:b,openStrip:a.strip,closeStrip:c&&c.strip,loc:this.locInfo(e)}}var o=c(1)["default"];b.__esModule=!0,b.SourceLocation=e,b.id=f,b.stripFlags=g,b.stripComment=h,b.preparePath=i,b.prepareMustache=j,b.prepareRawBlock=k,b.prepareBlock=l,b.prepareProgram=m,b.preparePartialBlock=n;var p=c(6),q=o(p)},function(a,b,c){"use strict";function d(){}function e(a,b,c){if(null==a||"string"!=typeof a&&"Program"!==a.type)throw new k["default"]("You must pass a string or Handlebars AST to Handlebars.precompile. You passed "+a);b=b||{},"data"in b||(b.data=!0),b.compat&&(b.useDepths=!0);var d=c.parse(a,b),e=(new c.Compiler).compile(d,b);return(new c.JavaScriptCompiler).compile(e,b)}function f(a,b,c){function d(){var d=c.parse(a,b),e=(new c.Compiler).compile(d,b),f=(new c.JavaScriptCompiler).compile(e,b,void 0,!0);return c.template(f)}function e(a,b){return f||(f=d()),f.call(this,a,b)}if(void 0===b&&(b={}),null==a||"string"!=typeof a&&"Program"!==a.type)throw new k["default"]("You must pass a string or Handlebars AST to Handlebars.compile. You passed "+a);"data"in b||(b.data=!0),b.compat&&(b.useDepths=!0);var f=void 0;return e._setup=function(a){return f||(f=d()),f._setup(a)},e._child=function(a,b,c,e){return f||(f=d()),f._child(a,b,c,e)},e}function g(a,b){if(a===b)return!0;if(l.isArray(a)&&l.isArray(b)&&a.length===b.length){for(var c=0;c<a.length;c++)if(!g(a[c],b[c]))return!1;return!0}}function h(a){if(!a.path.parts){var b=a.path;a.path={type:"PathExpression",data:!1,depth:0,parts:[b.original+""],original:b.original+"",loc:b.loc}}}var i=c(1)["default"];b.__esModule=!0,b.Compiler=d,b.precompile=e,b.compile=f;var j=c(6),k=i(j),l=c(5),m=c(21),n=i(m),o=[].slice;d.prototype={compiler:d,equals:function(a){var b=this.opcodes.length;if(a.opcodes.length!==b)return!1;for(var c=0;b>c;c++){var d=this.opcodes[c],e=a.opcodes[c];if(d.opcode!==e.opcode||!g(d.args,e.args))return!1}b=this.children.length;for(var c=0;b>c;c++)if(!this.children[c].equals(a.children[c]))return!1;return!0},guid:0,compile:function(a,b){this.sourceNode=[],this.opcodes=[],this.children=[],this.options=b,this.stringParams=b.stringParams,this.trackIds=b.trackIds,b.blockParams=b.blockParams||[];var c=b.knownHelpers;if(b.knownHelpers={helperMissing:!0,blockHelperMissing:!0,each:!0,"if":!0,unless:!0,"with":!0,log:!0,lookup:!0},c)for(var d in c)d in c&&(b.knownHelpers[d]=c[d]);return this.accept(a)},compileProgram:function(a){var b=new this.compiler,c=b.compile(a,this.options),d=this.guid++;return this.usePartial=this.usePartial||c.usePartial,this.children[d]=c,this.useDepths=this.useDepths||c.useDepths,d},accept:function(a){if(!this[a.type])throw new k["default"]("Unknown type: "+a.type,a);this.sourceNode.unshift(a);var b=this[a.type](a);return this.sourceNode.shift(),b},Program:function(a){this.options.blockParams.unshift(a.blockParams);for(var b=a.body,c=b.length,d=0;c>d;d++)this.accept(b[d]);return this.options.blockParams.shift(),this.isSimple=1===c,this.blockParams=a.blockParams?a.blockParams.length:0,this},BlockStatement:function(a){h(a);var b=a.program,c=a.inverse;b=b&&this.compileProgram(b),c=c&&this.compileProgram(c);var d=this.classifySexpr(a);"helper"===d?this.helperSexpr(a,b,c):"simple"===d?(this.simpleSexpr(a),this.opcode("pushProgram",b),this.opcode("pushProgram",c),this.opcode("emptyHash"),this.opcode("blockValue",a.path.original)):(this.ambiguousSexpr(a,b,c),this.opcode("pushProgram",b),this.opcode("pushProgram",c),this.opcode("emptyHash"),this.opcode("ambiguousBlockValue")),this.opcode("append")},DecoratorBlock:function(a){var b=a.program&&this.compileProgram(a.program),c=this.setupFullMustacheParams(a,b,void 0),d=a.path;this.useDecorators=!0,this.opcode("registerDecorator",c.length,d.original)},PartialStatement:function(a){this.usePartial=!0;var b=a.program;b&&(b=this.compileProgram(a.program));var c=a.params;if(c.length>1)throw new k["default"]("Unsupported number of partial arguments: "+c.length,a);c.length||(this.options.explicitPartialContext?this.opcode("pushLiteral","undefined"):c.push({type:"PathExpression",parts:[],depth:0}));var d=a.name.original,e="SubExpression"===a.name.type;e&&this.accept(a.name),this.setupFullMustacheParams(a,b,void 0,!0);var f=a.indent||"";this.options.preventIndent&&f&&(this.opcode("appendContent",f),f=""),this.opcode("invokePartial",e,d,f),this.opcode("append")},PartialBlockStatement:function(a){this.PartialStatement(a)},MustacheStatement:function(a){this.SubExpression(a),a.escaped&&!this.options.noEscape?this.opcode("appendEscaped"):this.opcode("append")},Decorator:function(a){this.DecoratorBlock(a)},ContentStatement:function(a){a.value&&this.opcode("appendContent",a.value)},CommentStatement:function(){},SubExpression:function(a){h(a);var b=this.classifySexpr(a);"simple"===b?this.simpleSexpr(a):"helper"===b?this.helperSexpr(a):this.ambiguousSexpr(a)},ambiguousSexpr:function(a,b,c){var d=a.path,e=d.parts[0],f=null!=b||null!=c;this.opcode("getContext",d.depth),this.opcode("pushProgram",b),this.opcode("pushProgram",c),d.strict=!0,this.accept(d),this.opcode("invokeAmbiguous",e,f)},simpleSexpr:function(a){var b=a.path;b.strict=!0,this.accept(b),this.opcode("resolvePossibleLambda")},helperSexpr:function(a,b,c){var d=this.setupFullMustacheParams(a,b,c),e=a.path,f=e.parts[0];if(this.options.knownHelpers[f])this.opcode("invokeKnownHelper",d.length,f);else{if(this.options.knownHelpersOnly)throw new k["default"]("You specified knownHelpersOnly, but used the unknown helper "+f,a);e.strict=!0,e.falsy=!0,this.accept(e),this.opcode("invokeHelper",d.length,e.original,n["default"].helpers.simpleId(e))}},PathExpression:function(a){this.addDepth(a.depth),this.opcode("getContext",a.depth);var b=a.parts[0],c=n["default"].helpers.scopedId(a),d=!a.depth&&!c&&this.blockParamIndex(b);d?this.opcode("lookupBlockParam",d,a.parts):b?a.data?(this.options.data=!0,this.opcode("lookupData",a.depth,a.parts,a.strict)):this.opcode("lookupOnContext",a.parts,a.falsy,a.strict,c):this.opcode("pushContext")},StringLiteral:function(a){this.opcode("pushString",a.value)},NumberLiteral:function(a){this.opcode("pushLiteral",a.value)},BooleanLiteral:function(a){this.opcode("pushLiteral",a.value)},UndefinedLiteral:function(){this.opcode("pushLiteral","undefined")},NullLiteral:function(){this.opcode("pushLiteral","null")},Hash:function(a){var b=a.pairs,c=0,d=b.length;for(this.opcode("pushHash");d>c;c++)this.pushParam(b[c].value);for(;c--;)this.opcode("assignToHash",b[c].key);this.opcode("popHash")},opcode:function(a){this.opcodes.push({opcode:a,args:o.call(arguments,1),loc:this.sourceNode[0].loc})},addDepth:function(a){a&&(this.useDepths=!0)},classifySexpr:function(a){var b=n["default"].helpers.simpleId(a.path),c=b&&!!this.blockParamIndex(a.path.parts[0]),d=!c&&n["default"].helpers.helperExpression(a),e=!c&&(d||b);if(e&&!d){var f=a.path.parts[0],g=this.options;g.knownHelpers[f]?d=!0:g.knownHelpersOnly&&(e=!1)}return d?"helper":e?"ambiguous":"simple"},pushParams:function(a){for(var b=0,c=a.length;c>b;b++)this.pushParam(a[b])},pushParam:function(a){var b=null!=a.value?a.value:a.original||"";if(this.stringParams)b.replace&&(b=b.replace(/^(\.?\.\/)*/g,"").replace(/\//g,".")),a.depth&&this.addDepth(a.depth),this.opcode("getContext",a.depth||0),this.opcode("pushStringParam",b,a.type),"SubExpression"===a.type&&this.accept(a);else{if(this.trackIds){var c=void 0;if(!a.parts||n["default"].helpers.scopedId(a)||a.depth||(c=this.blockParamIndex(a.parts[0])),c){var d=a.parts.slice(1).join(".");this.opcode("pushId","BlockParam",c,d)}else b=a.original||b,b.replace&&(b=b.replace(/^this(?:\.|$)/,"").replace(/^\.\//,"").replace(/^\.$/,"")),this.opcode("pushId",a.type,b)}this.accept(a)}},setupFullMustacheParams:function(a,b,c,d){var e=a.params;return this.pushParams(e),this.opcode("pushProgram",b),this.opcode("pushProgram",c),a.hash?this.accept(a.hash):this.opcode("emptyHash",d),e},blockParamIndex:function(a){for(var b=0,c=this.options.blockParams.length;c>b;b++){var d=this.options.blockParams[b],e=d&&l.indexOf(d,a);if(d&&e>=0)return[b,e]}}}},function(a,b,c){"use strict";function d(a){this.value=a}function e(){}function f(a,b,c,d){var e=b.popStack(),f=0,g=c.length;for(a&&g--;g>f;f++)e=b.nameLookup(e,c[f],d);return a?[b.aliasable("container.strict"),"(",e,", ",b.quotedString(c[f]),")"]:e}var g=c(1)["default"];b.__esModule=!0;var h=c(4),i=c(6),j=g(i),k=c(5),l=c(29),m=g(l);e.prototype={nameLookup:function(a,b){return e.isValidJavaScriptVariableName(b)?[a,".",b]:[a,"[",JSON.stringify(b),"]"]},depthedLookup:function(a){return[this.aliasable("container.lookup"),'(depths, "',a,'")']},compilerInfo:function(){var a=h.COMPILER_REVISION,b=h.REVISION_CHANGES[a];return[a,b]},appendToBuffer:function(a,b,c){return k.isArray(a)||(a=[a]),a=this.source.wrap(a,b),this.environment.isSimple?["return ",a,";"]:c?["buffer += ",a,";"]:(a.appendToBuffer=!0,a)},initializeBuffer:function(){return this.quotedString("")},compile:function(a,b,c,d){this.environment=a,this.options=b,this.stringParams=this.options.stringParams,this.trackIds=this.options.trackIds,this.precompile=!d,this.name=this.environment.name,this.isChild=!!c,this.context=c||{decorators:[],programs:[],environments:[]},this.preamble(),this.stackSlot=0,this.stackVars=[],this.aliases={},this.registers={list:[]},this.hashes=[],this.compileStack=[],this.inlineStack=[],this.blockParams=[],this.compileChildren(a,b),this.useDepths=this.useDepths||a.useDepths||a.useDecorators||this.options.compat,this.useBlockParams=this.useBlockParams||a.useBlockParams;var e=a.opcodes,f=void 0,g=void 0,h=void 0,i=void 0;for(h=0,i=e.length;i>h;h++)f=e[h],this.source.currentLocation=f.loc,g=g||f.loc,this[f.opcode].apply(this,f.args);if(this.source.currentLocation=g,this.pushSource(""),this.stackSlot||this.inlineStack.length||this.compileStack.length)throw new j["default"]("Compile completed with content left on stack");this.decorators.isEmpty()?this.decorators=void 0:(this.useDecorators=!0,this.decorators.prepend("var decorators = container.decorators;\n"),this.decorators.push("return fn;"),d?this.decorators=Function.apply(this,["fn","props","container","depth0","data","blockParams","depths",this.decorators.merge()]):(this.decorators.prepend("function(fn, props, container, depth0, data, blockParams, depths) {\n"),this.decorators.push("}\n"),this.decorators=this.decorators.merge()));var k=this.createFunctionContext(d);if(this.isChild)return k;var l={compiler:this.compilerInfo(),main:k};this.decorators&&(l.main_d=this.decorators,l.useDecorators=!0);var m=this.context,n=m.programs,o=m.decorators;for(h=0,i=n.length;i>h;h++)n[h]&&(l[h]=n[h],o[h]&&(l[h+"_d"]=o[h],l.useDecorators=!0));return this.environment.usePartial&&(l.usePartial=!0),this.options.data&&(l.useData=!0),this.useDepths&&(l.useDepths=!0),this.useBlockParams&&(l.useBlockParams=!0),this.options.compat&&(l.compat=!0),d?l.compilerOptions=this.options:(l.compiler=JSON.stringify(l.compiler),this.source.currentLocation={start:{line:1,column:0}},l=this.objectLiteral(l),b.srcName?(l=l.toStringWithSourceMap({file:b.destName}),l.map=l.map&&l.map.toString()):l=l.toString()),l},preamble:function(){this.lastContext=0,this.source=new m["default"](this.options.srcName),this.decorators=new m["default"](this.options.srcName)},createFunctionContext:function(a){var b="",c=this.stackVars.concat(this.registers.list);c.length>0&&(b+=", "+c.join(", "));var d=0;for(var e in this.aliases){var f=this.aliases[e];this.aliases.hasOwnProperty(e)&&f.children&&f.referenceCount>1&&(b+=", alias"+ ++d+"="+e,f.children[0]="alias"+d)}var g=["container","depth0","helpers","partials","data"];(this.useBlockParams||this.useDepths)&&g.push("blockParams"),this.useDepths&&g.push("depths");var h=this.mergeSource(b);return a?(g.push(h),Function.apply(this,g)):this.source.wrap(["function(",g.join(","),") {\n ",h,"}"])},mergeSource:function(a){var b=this.environment.isSimple,c=!this.forceBuffer,d=void 0,e=void 0,f=void 0,g=void 0;return this.source.each(function(a){a.appendToBuffer?(f?a.prepend(" + "):f=a,g=a):(f&&(e?f.prepend("buffer += "):d=!0,g.add(";"),f=g=void 0),e=!0,b||(c=!1))}),c?f?(f.prepend("return "),g.add(";")):e||this.source.push('return "";'):(a+=", buffer = "+(d?"":this.initializeBuffer()),f?(f.prepend("return buffer + "),g.add(";")):this.source.push("return buffer;")),a&&this.source.prepend("var "+a.substring(2)+(d?"":";\n")),this.source.merge()},blockValue:function(a){var b=this.aliasable("helpers.blockHelperMissing"),c=[this.contextName(0)];this.setupHelperArgs(a,0,c);var d=this.popStack();c.splice(1,0,d),this.push(this.source.functionCall(b,"call",c))},ambiguousBlockValue:function(){var a=this.aliasable("helpers.blockHelperMissing"),b=[this.contextName(0)];this.setupHelperArgs("",0,b,!0),this.flushInline();var c=this.topStack();b.splice(1,0,c),this.pushSource(["if (!",this.lastHelper,") { ",c," = ",this.source.functionCall(a,"call",b),"}"])},appendContent:function(a){this.pendingContent?a=this.pendingContent+a:this.pendingLocation=this.source.currentLocation,this.pendingContent=a},append:function(){if(this.isInline())this.replaceStack(function(a){return[" != null ? ",a,' : ""']}),this.pushSource(this.appendToBuffer(this.popStack()));else{var a=this.popStack();this.pushSource(["if (",a," != null) { ",this.appendToBuffer(a,void 0,!0)," }"]),this.environment.isSimple&&this.pushSource(["else { ",this.appendToBuffer("''",void 0,!0)," }"])}},appendEscaped:function(){this.pushSource(this.appendToBuffer([this.aliasable("container.escapeExpression"),"(",this.popStack(),")"]))},getContext:function(a){this.lastContext=a},pushContext:function(){this.pushStackLiteral(this.contextName(this.lastContext))},lookupOnContext:function(a,b,c,d){var e=0;d||!this.options.compat||this.lastContext?this.pushContext():this.push(this.depthedLookup(a[e++])),this.resolvePath("context",a,e,b,c)},lookupBlockParam:function(a,b){this.useBlockParams=!0,this.push(["blockParams[",a[0],"][",a[1],"]"]),this.resolvePath("context",b,1)},lookupData:function(a,b,c){a?this.pushStackLiteral("container.data(data, "+a+")"):this.pushStackLiteral("data"),this.resolvePath("data",b,0,!0,c)},resolvePath:function(a,b,c,d,e){var g=this;if(this.options.strict||this.options.assumeObjects)return void this.push(f(this.options.strict&&e,this,b,a));for(var h=b.length;h>c;c++)this.replaceStack(function(e){var f=g.nameLookup(e,b[c],a);return d?[" && ",f]:[" != null ? ",f," : ",e]})},resolvePossibleLambda:function(){this.push([this.aliasable("container.lambda"),"(",this.popStack(),", ",this.contextName(0),")"])},pushStringParam:function(a,b){this.pushContext(),this.pushString(b),"SubExpression"!==b&&("string"==typeof a?this.pushString(a):this.pushStackLiteral(a))},emptyHash:function(a){this.trackIds&&this.push("{}"),this.stringParams&&(this.push("{}"),this.push("{}")),this.pushStackLiteral(a?"undefined":"{}")},pushHash:function(){this.hash&&this.hashes.push(this.hash),this.hash={values:[],types:[],contexts:[],ids:[]}},popHash:function(){var a=this.hash;this.hash=this.hashes.pop(),this.trackIds&&this.push(this.objectLiteral(a.ids)),this.stringParams&&(this.push(this.objectLiteral(a.contexts)),this.push(this.objectLiteral(a.types))),this.push(this.objectLiteral(a.values))},pushString:function(a){this.pushStackLiteral(this.quotedString(a))},pushLiteral:function(a){this.pushStackLiteral(a)},pushProgram:function(a){null!=a?this.pushStackLiteral(this.programExpression(a)):this.pushStackLiteral(null)},registerDecorator:function(a,b){var c=this.nameLookup("decorators",b,"decorator"),d=this.setupHelperArgs(b,a);this.decorators.push(["fn = ",this.decorators.functionCall(c,"",["fn","props","container",d])," || fn;"])},invokeHelper:function(a,b,c){var d=this.popStack(),e=this.setupHelper(a,b),f=c?[e.name," || "]:"",g=["("].concat(f,d);this.options.strict||g.push(" || ",this.aliasable("helpers.helperMissing")),g.push(")"),this.push(this.source.functionCall(g,"call",e.callParams))},invokeKnownHelper:function(a,b){var c=this.setupHelper(a,b);this.push(this.source.functionCall(c.name,"call",c.callParams))},invokeAmbiguous:function(a,b){this.useRegister("helper");var c=this.popStack();this.emptyHash();var d=this.setupHelper(0,a,b),e=this.lastHelper=this.nameLookup("helpers",a,"helper"),f=["(","(helper = ",e," || ",c,")"];this.options.strict||(f[0]="(helper = ",f.push(" != null ? helper : ",this.aliasable("helpers.helperMissing"))),this.push(["(",f,d.paramsInit?["),(",d.paramsInit]:[],"),","(typeof helper === ",this.aliasable('"function"')," ? ",this.source.functionCall("helper","call",d.callParams)," : helper))"])},invokePartial:function(a,b,c){var d=[],e=this.setupParams(b,1,d);a&&(b=this.popStack(),delete e.name),c&&(e.indent=JSON.stringify(c)),e.helpers="helpers",e.partials="partials",e.decorators="container.decorators",a?d.unshift(b):d.unshift(this.nameLookup("partials",b,"partial")),this.options.compat&&(e.depths="depths"), +e=this.objectLiteral(e),d.push(e),this.push(this.source.functionCall("container.invokePartial","",d))},assignToHash:function(a){var b=this.popStack(),c=void 0,d=void 0,e=void 0;this.trackIds&&(e=this.popStack()),this.stringParams&&(d=this.popStack(),c=this.popStack());var f=this.hash;c&&(f.contexts[a]=c),d&&(f.types[a]=d),e&&(f.ids[a]=e),f.values[a]=b},pushId:function(a,b,c){"BlockParam"===a?this.pushStackLiteral("blockParams["+b[0]+"].path["+b[1]+"]"+(c?" + "+JSON.stringify("."+c):"")):"PathExpression"===a?this.pushString(b):"SubExpression"===a?this.pushStackLiteral("true"):this.pushStackLiteral("null")},compiler:e,compileChildren:function(a,b){for(var c=a.children,d=void 0,e=void 0,f=0,g=c.length;g>f;f++){d=c[f],e=new this.compiler;var h=this.matchExistingProgram(d);null==h?(this.context.programs.push(""),h=this.context.programs.length,d.index=h,d.name="program"+h,this.context.programs[h]=e.compile(d,b,this.context,!this.precompile),this.context.decorators[h]=e.decorators,this.context.environments[h]=d,this.useDepths=this.useDepths||e.useDepths,this.useBlockParams=this.useBlockParams||e.useBlockParams):(d.index=h,d.name="program"+h,this.useDepths=this.useDepths||d.useDepths,this.useBlockParams=this.useBlockParams||d.useBlockParams)}},matchExistingProgram:function(a){for(var b=0,c=this.context.environments.length;c>b;b++){var d=this.context.environments[b];if(d&&d.equals(a))return b}},programExpression:function(a){var b=this.environment.children[a],c=[b.index,"data",b.blockParams];return(this.useBlockParams||this.useDepths)&&c.push("blockParams"),this.useDepths&&c.push("depths"),"container.program("+c.join(", ")+")"},useRegister:function(a){this.registers[a]||(this.registers[a]=!0,this.registers.list.push(a))},push:function(a){return a instanceof d||(a=this.source.wrap(a)),this.inlineStack.push(a),a},pushStackLiteral:function(a){this.push(new d(a))},pushSource:function(a){this.pendingContent&&(this.source.push(this.appendToBuffer(this.source.quotedString(this.pendingContent),this.pendingLocation)),this.pendingContent=void 0),a&&this.source.push(a)},replaceStack:function(a){var b=["("],c=void 0,e=void 0,f=void 0;if(!this.isInline())throw new j["default"]("replaceStack on non-inline");var g=this.popStack(!0);if(g instanceof d)c=[g.value],b=["(",c],f=!0;else{e=!0;var h=this.incrStack();b=["((",this.push(h)," = ",g,")"],c=this.topStack()}var i=a.call(this,c);f||this.popStack(),e&&this.stackSlot--,this.push(b.concat(i,")"))},incrStack:function(){return this.stackSlot++,this.stackSlot>this.stackVars.length&&this.stackVars.push("stack"+this.stackSlot),this.topStackName()},topStackName:function(){return"stack"+this.stackSlot},flushInline:function(){var a=this.inlineStack;this.inlineStack=[];for(var b=0,c=a.length;c>b;b++){var e=a[b];if(e instanceof d)this.compileStack.push(e);else{var f=this.incrStack();this.pushSource([f," = ",e,";"]),this.compileStack.push(f)}}},isInline:function(){return this.inlineStack.length},popStack:function(a){var b=this.isInline(),c=(b?this.inlineStack:this.compileStack).pop();if(!a&&c instanceof d)return c.value;if(!b){if(!this.stackSlot)throw new j["default"]("Invalid stack pop");this.stackSlot--}return c},topStack:function(){var a=this.isInline()?this.inlineStack:this.compileStack,b=a[a.length-1];return b instanceof d?b.value:b},contextName:function(a){return this.useDepths&&a?"depths["+a+"]":"depth"+a},quotedString:function(a){return this.source.quotedString(a)},objectLiteral:function(a){return this.source.objectLiteral(a)},aliasable:function(a){var b=this.aliases[a];return b?(b.referenceCount++,b):(b=this.aliases[a]=this.source.wrap(a),b.aliasable=!0,b.referenceCount=1,b)},setupHelper:function(a,b,c){var d=[],e=this.setupHelperArgs(b,a,d,c),f=this.nameLookup("helpers",b,"helper"),g=this.aliasable(this.contextName(0)+" != null ? "+this.contextName(0)+" : {}");return{params:d,paramsInit:e,name:f,callParams:[g].concat(d)}},setupParams:function(a,b,c){var d={},e=[],f=[],g=[],h=!c,i=void 0;h&&(c=[]),d.name=this.quotedString(a),d.hash=this.popStack(),this.trackIds&&(d.hashIds=this.popStack()),this.stringParams&&(d.hashTypes=this.popStack(),d.hashContexts=this.popStack());var j=this.popStack(),k=this.popStack();(k||j)&&(d.fn=k||"container.noop",d.inverse=j||"container.noop");for(var l=b;l--;)i=this.popStack(),c[l]=i,this.trackIds&&(g[l]=this.popStack()),this.stringParams&&(f[l]=this.popStack(),e[l]=this.popStack());return h&&(d.args=this.source.generateArray(c)),this.trackIds&&(d.ids=this.source.generateArray(g)),this.stringParams&&(d.types=this.source.generateArray(f),d.contexts=this.source.generateArray(e)),this.options.data&&(d.data="data"),this.useBlockParams&&(d.blockParams="blockParams"),d},setupHelperArgs:function(a,b,c,d){var e=this.setupParams(a,b,c);return e=this.objectLiteral(e),d?(this.useRegister("options"),c.push("options"),["options=",e]):c?(c.push(e),""):e}},function(){for(var a="break else new var case finally return void catch for switch while continue function this with default if throw delete in try do instanceof typeof abstract enum int short boolean export interface static byte extends long super char final native synchronized class float package throws const goto private transient debugger implements protected volatile double import public let yield await null true false".split(" "),b=e.RESERVED_WORDS={},c=0,d=a.length;d>c;c++)b[a[c]]=!0}(),e.isValidJavaScriptVariableName=function(a){return!e.RESERVED_WORDS[a]&&/^[a-zA-Z_$][0-9a-zA-Z_$]*$/.test(a)},b["default"]=e,a.exports=b["default"]},function(a,b,c){"use strict";function d(a,b,c){if(f.isArray(a)){for(var d=[],e=0,g=a.length;g>e;e++)d.push(b.wrap(a[e],c));return d}return"boolean"==typeof a||"number"==typeof a?a+"":a}function e(a){this.srcFile=a,this.source=[]}b.__esModule=!0;var f=c(5),g=void 0;try{}catch(h){}g||(g=function(a,b,c,d){this.src="",d&&this.add(d)},g.prototype={add:function(a){f.isArray(a)&&(a=a.join("")),this.src+=a},prepend:function(a){f.isArray(a)&&(a=a.join("")),this.src=a+this.src},toStringWithSourceMap:function(){return{code:this.toString()}},toString:function(){return this.src}}),e.prototype={isEmpty:function(){return!this.source.length},prepend:function(a,b){this.source.unshift(this.wrap(a,b))},push:function(a,b){this.source.push(this.wrap(a,b))},merge:function(){var a=this.empty();return this.each(function(b){a.add([" ",b,"\n"])}),a},each:function(a){for(var b=0,c=this.source.length;c>b;b++)a(this.source[b])},empty:function(){var a=this.currentLocation||{start:{}};return new g(a.start.line,a.start.column,this.srcFile)},wrap:function(a){var b=arguments.length<=1||void 0===arguments[1]?this.currentLocation||{start:{}}:arguments[1];return a instanceof g?a:(a=d(a,this,b),new g(b.start.line,b.start.column,this.srcFile,a))},functionCall:function(a,b,c){return c=this.generateList(c),this.wrap([a,b?"."+b+"(":"(",c,")"])},quotedString:function(a){return'"'+(a+"").replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029")+'"'},objectLiteral:function(a){var b=[];for(var c in a)if(a.hasOwnProperty(c)){var e=d(a[c],this);"undefined"!==e&&b.push([this.quotedString(c),":",e])}var f=this.generateList(b);return f.prepend("{"),f.add("}"),f},generateList:function(a){for(var b=this.empty(),c=0,e=a.length;e>c;c++)c&&b.add(","),b.add(d(a[c],this));return b},generateArray:function(a){var b=this.generateList(a);return b.prepend("["),b.add("]"),b}},b["default"]=e,a.exports=b["default"]}])});</script> + +<script>/*********************************************** +Copyright 2010 - 2012 Chris Winberry <chris@winberry.net>. All rights reserved. +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. +***********************************************/ +/* v2.0.0 */ + +(function () { + +var exports; +if (typeof(module) !== 'undefined' && typeof(module.exports) !== 'undefined') { + exports = module.exports; +} else { + exports = {}; + this.htmlparser = exports; +} + +function inherits (ctor, superCtor) { + var tempCtor = function(){}; + tempCtor.prototype = superCtor.prototype; + ctor.super_ = superCtor; + ctor.prototype = new tempCtor(); + ctor.prototype.constructor = ctor; +} + +var Mode = { + Text: 'text', + Tag: 'tag', + Attr: 'attr', + CData: 'cdata', + Doctype: 'doctype', + Comment: 'comment' +}; + +function Parser (builder, options) { + this._options = options ? options : { }; + // if (this._options.includeLocation === undefined) { + // this._options.includeLocation = false; //Include position of element (row, col) on nodes + // } + this._validateBuilder(builder); + var self = this; + this._builder = builder; + this.reset(); +} + +if (typeof(module) !== 'undefined' && typeof(module.exports) !== 'undefined') { + + var Stream = require('stream'); + inherits(Parser, Stream); + + Parser.prototype.writable = true; + Parser.prototype.write = function(data) { + if(data instanceof Buffer) { + data = data.toString(); + } + this.parseChunk(data); + }; + + Parser.prototype.end = function(data) { + if (arguments.length) { + this.write(data); + } + this.writable = false; + this.done(); + }; + + Parser.prototype.destroy = function() { + this.writable = false; + }; + +} + + //**Public**// + Parser.prototype.reset = function Parser$reset () { + this._state = { + mode: Mode.Text, + pos: 0, + data: null, + pendingText: null, + pendingWrite: null, + lastTag: null, + isScript: false, + needData: false, + output: [], + done: false//, + // line: 1, + // col: 1 + }; + this._builder.reset(); + }; + + Parser.prototype.parseChunk = function Parser$parseChunk (chunk) { + this._state.needData = false; + this._state.data = (this._state.data !== null) ? + this._state.data.substr(this.pos) + chunk + : + chunk + ; + while (this._state.pos < this._state.data.length && !this._state.needData) { + this._parse(this._state); + } + }; + + Parser.prototype.parseComplete = function Parser$parseComplete (data) { + this.reset(); + this.parseChunk(data); + this.done(); + }; + + Parser.prototype.done = function Parser$done () { + this._state.done = true; + this._parse(this._state); + this._flushWrite(); + this._builder.done(); + }; + + //**Private**// + Parser.prototype._validateBuilder = function Parser$_validateBuilder (builder) { + if ((typeof builder) != "object") { + throw new Error("Builder is not an object"); + } + if ((typeof builder.reset) != "function") { + throw new Error("Builder method 'reset' is invalid"); + } + if ((typeof builder.done) != "function") { + throw new Error("Builder method 'done' is invalid"); + } + if ((typeof builder.write) != "function") { + throw new Error("Builder method 'write' is invalid"); + } + if ((typeof builder.error) != "function") { + throw new Error("Builder method 'error' is invalid"); + } + }; + + Parser.prototype._parse = function Parser$_parse () { + switch (this._state.mode) { + case Mode.Text: + return this._parseText(this._state); + case Mode.Tag: + return this._parseTag(this._state); + case Mode.Attr: + return this._parseAttr(this._state); + case Mode.CData: + return this._parseCData(this._state); + case Mode.Doctype: + return this._parseDoctype(this._state); + case Mode.Comment: + return this._parseComment(this._state); + } + }; + + Parser.prototype._writePending = function Parser$_writePending (node) { + if (!this._state.pendingWrite) { + this._state.pendingWrite = []; + } + this._state.pendingWrite.push(node); + }; + + Parser.prototype._flushWrite = function Parser$_flushWrite () { + if (this._state.pendingWrite) { + for (var i = 0, len = this._state.pendingWrite.length; i < len; i++) { + var node = this._state.pendingWrite[i]; + this._builder.write(node); + } + this._state.pendingWrite = null; + } + }; + + Parser.prototype._write = function Parser$_write (node) { + this._flushWrite(); + this._builder.write(node); + }; + + Parser._re_parseText_scriptClose = /<\s*\/\s*script/ig; + Parser.prototype._parseText = function Parser$_parseText () { + var state = this._state; + var foundPos; + if (state.isScript) { + Parser._re_parseText_scriptClose.lastIndex = state.pos; + foundPos = Parser._re_parseText_scriptClose.exec(state.data); + foundPos = (foundPos) ? + foundPos.index + : + -1 + ; + } else { + foundPos = state.data.indexOf('<', state.pos); + } + var text = (foundPos === -1) ? state.data.substring(state.pos, state.data.length) : state.data.substring(state.pos, foundPos); + if (foundPos < 0 && state.done) { + foundPos = state.data.length; + } + if (foundPos < 0) { + if (state.isScript) { + state.needData = true; + return; + } + if (!state.pendingText) { + state.pendingText = []; + } + state.pendingText.push(state.data.substring(state.pos, state.data.length)); + state.pos = state.data.length; + } else { + if (state.pendingText) { + state.pendingText.push(state.data.substring(state.pos, foundPos)); + text = state.pendingText.join(''); + state.pendingText = null; + } else { + text = state.data.substring(state.pos, foundPos); + } + if (text !== '') { + this._write({ type: Mode.Text, data: text }); + } + state.pos = foundPos + 1; + state.mode = Mode.Tag; + } + }; + + Parser.re_parseTag = /\s*(\/?)\s*([^\s>\/]+)(\s*)\??(>?)/g; + Parser.prototype._parseTag = function Parser$_parseTag () { + var state = this._state; + Parser.re_parseTag.lastIndex = state.pos; + var match = Parser.re_parseTag.exec(state.data); + if (match) { + if (!match[1] && match[2].substr(0, 3) === '!--') { + state.mode = Mode.Comment; + state.pos += 3; + return; + } + if (!match[1] && match[2].substr(0, 8) === '![CDATA[') { + state.mode = Mode.CData; + state.pos += 8; + return; + } + if (!match[1] && match[2].substr(0, 8) === '!DOCTYPE') { + state.mode = Mode.Doctype; + state.pos += 8; + return; + } + if (!state.done && (state.pos + match[0].length) === state.data.length) { + //We're at the and of the data, might be incomplete + state.needData = true; + return; + } + var raw; + if (match[4] === '>') { + state.mode = Mode.Text; + raw = match[0].substr(0, match[0].length - 1); + } else { + state.mode = Mode.Attr; + raw = match[0]; + } + state.pos += match[0].length; + var tag = { type: Mode.Tag, name: match[1] + match[2], raw: raw }; + if (state.mode === Mode.Attr) { + state.lastTag = tag; + } + if (tag.name.toLowerCase() === 'script') { + state.isScript = true; + } else if (tag.name.toLowerCase() === '/script') { + state.isScript = false; + } + if (state.mode === Mode.Attr) { + this._writePending(tag); + } else { + this._write(tag); + } + } else { + //TODO: end of tag? + //TODO: push to pending? + state.needData = true; + } + }; + + Parser.re_parseAttr_findName = /\s*([^=<>\s'"\/]+)\s*/g; + Parser.prototype._parseAttr_findName = function Parser$_parseAttr_findName () { + Parser.re_parseAttr_findName.lastIndex = this._state.pos; + var match = Parser.re_parseAttr_findName.exec(this._state.data); + if (!match) { + return null; + } + if (this._state.pos + match[0].length !== Parser.re_parseAttr_findName.lastIndex) { + return null; + } + return { + match: match[0] + , name: match[1] + }; + }; + Parser.re_parseAttr_findValue = /\s*=\s*(?:'([^']*)'|"([^"]*)"|([^'"\s\/>]+))\s*/g; + Parser.re_parseAttr_findValue_last = /\s*=\s*['"]?(.*)$/g; + Parser.prototype._parseAttr_findValue = function Parser$_parseAttr_findValue () { + var state = this._state; + Parser.re_parseAttr_findValue.lastIndex = state.pos; + var match = Parser.re_parseAttr_findValue.exec(state.data); + if (!match) { + if (!state.done) { + return null; + } + Parser.re_parseAttr_findValue_last.lastIndex = state.pos; + match = Parser.re_parseAttr_findValue_last.exec(state.data); + if (!match) { + return null; + } + return { + match: match[0] + , value: (match[1] !== '') ? match[1] : null + }; + } + if (state.pos + match[0].length !== Parser.re_parseAttr_findValue.lastIndex) { + return null; + } + return { + match: match[0] + , value: match[1] || match[2] || match[3] + }; + }; + Parser.re_parseAttr_splitValue = /\s*=\s*['"]?/g; + Parser.re_parseAttr_selfClose = /(\s*\/\s*)(>?)/g; + Parser.prototype._parseAttr = function Parser$_parseAttr () { + var state = this._state; + var name_data = this._parseAttr_findName(state); + if (!name_data || name_data.name === '?') { + Parser.re_parseAttr_selfClose.lastIndex = state.pos; + var matchTrailingSlash = Parser.re_parseAttr_selfClose.exec(state.data); + if (matchTrailingSlash && matchTrailingSlash.index === state.pos) { + if (!state.done && !matchTrailingSlash[2] && state.pos + matchTrailingSlash[0].length === state.data.length) { + state.needData = true; + return; + } + state.lastTag.raw += matchTrailingSlash[1]; + // state.output.push({ type: Mode.Tag, name: '/' + state.lastTag.name, raw: null }); + this._write({ type: Mode.Tag, name: '/' + state.lastTag.name, raw: null }); + state.pos += matchTrailingSlash[1].length; + } + var foundPos = state.data.indexOf('>', state.pos); + if (foundPos < 0) { + if (state.done) { //TODO: is this needed? + state.lastTag.raw += state.data.substr(state.pos); + state.pos = state.data.length; + return; + } + state.needData = true; + } else { + // state.lastTag = null; + state.pos = foundPos + 1; + state.mode = Mode.Text; + } + return; + } + if (!state.done && state.pos + name_data.match.length === state.data.length) { + state.needData = true; + return null; + } + state.pos += name_data.match.length; + var value_data = this._parseAttr_findValue(state); + if (value_data) { + if (!state.done && state.pos + value_data.match.length === state.data.length) { + state.needData = true; + state.pos -= name_data.match.length; + return; + } + state.pos += value_data.match.length; + } else { + Parser.re_parseAttr_splitValue.lastIndex = state.pos; + if (Parser.re_parseAttr_splitValue.exec(state.data)) { + state.needData = true; + state.pos -= name_data.match.length; + return; + } + value_data = { + match: '' + , value: null + }; + } + state.lastTag.raw += name_data.match + value_data.match; + + this._writePending({ type: Mode.Attr, name: name_data.name, data: value_data.value }); + }; + + Parser.re_parseCData_findEnding = /\]{1,2}$/; + Parser.prototype._parseCData = function Parser$_parseCData () { + var state = this._state; + var foundPos = state.data.indexOf(']]>', state.pos); + if (foundPos < 0 && state.done) { + foundPos = state.data.length; + } + if (foundPos < 0) { + Parser.re_parseCData_findEnding.lastIndex = state.pos; + var matchPartialCDataEnd = Parser.re_parseCData_findEnding.exec(state.data); + if (matchPartialCDataEnd) { + state.needData = true; + return; + } + if (!state.pendingText) { + state.pendingText = []; + } + state.pendingText.push(state.data.substr(state.pos, state.data.length)); + state.pos = state.data.length; + state.needData = true; + } else { + var text; + if (state.pendingText) { + state.pendingText.push(state.data.substring(state.pos, foundPos)); + text = state.pendingText.join(''); + state.pendingText = null; + } else { + text = state.data.substring(state.pos, foundPos); + } + this._write({ type: Mode.CData, data: text }); + state.mode = Mode.Text; + state.pos = foundPos + 3; + } + }; + + Parser.prototype._parseDoctype = function Parser$_parseDoctype () { + var state = this._state; + var foundPos = state.data.indexOf('>', state.pos); + if (foundPos < 0 && state.done) { + foundPos = state.data.length; + } + if (foundPos < 0) { + Parser.re_parseCData_findEnding.lastIndex = state.pos; + if (!state.pendingText) { + state.pendingText = []; + } + state.pendingText.push(state.data.substr(state.pos, state.data.length)); + state.pos = state.data.length; + state.needData = true; + } else { + var text; + if (state.pendingText) { + state.pendingText.push(state.data.substring(state.pos, foundPos)); + text = state.pendingText.join(''); + state.pendingText = null; + } else { + text = state.data.substring(state.pos, foundPos); + } + this._write({ type: Mode.Doctype, data: text }); + state.mode = Mode.Text; + state.pos = foundPos + 1; + } + }; + + Parser.re_parseComment_findEnding = /\-{1,2}$/; + Parser.prototype._parseComment = function Parser$_parseComment () { + var state = this._state; + var foundPos = state.data.indexOf('-->', state.pos); + if (foundPos < 0 && state.done) { + foundPos = state.data.length; + } + if (foundPos < 0) { + Parser.re_parseComment_findEnding.lastIndex = state.pos; + var matchPartialCommentEnd = Parser.re_parseComment_findEnding.exec(state.data); + if (matchPartialCommentEnd) { + state.needData = true; + return; + } + if (!state.pendingText) { + state.pendingText = []; + } + state.pendingText.push(state.data.substr(state.pos, state.data.length)); + state.pos = state.data.length; + state.needData = true; + } else { + var text; + if (state.pendingText) { + state.pendingText.push(state.data.substring(state.pos, foundPos)); + text = state.pendingText.join(''); + state.pendingText = null; + } else { + text = state.data.substring(state.pos, foundPos); + } + // state.output.push({ type: Mode.Comment, data: text }); + this._write({ type: Mode.Comment, data: text }); + state.mode = Mode.Text; + state.pos = foundPos + 3; + } + }; + + +function HtmlBuilder (callback, options) { + this.reset(); + this._options = options ? options : { }; + if (this._options.ignoreWhitespace === undefined) { + this._options.ignoreWhitespace = false; //Keep whitespace-only text nodes + } + if (this._options.includeLocation === undefined) { + this._options.includeLocation = false; //Include position of element (row, col) on nodes + } + if (this._options.verbose === undefined) { + this._options.verbose = true; //Keep data property for tags and raw property for all + } + if (this._options.enforceEmptyTags === undefined) { + this._options.enforceEmptyTags = true; //Don't allow children for HTML tags defined as empty in spec + } + if (this._options.caseSensitiveTags === undefined) { + this._options.caseSensitiveTags = false; //Lowercase all tag names + } + if (this._options.caseSensitiveAttr === undefined) { + this._options.caseSensitiveAttr = false; //Lowercase all attribute names + } + if ((typeof callback) == "function") { + this._callback = callback; + } +} + + //**"Static"**// + //HTML Tags that shouldn't contain child nodes + HtmlBuilder._emptyTags = { + area: 1 + , base: 1 + , basefont: 1 + , br: 1 + , col: 1 + , frame: 1 + , hr: 1 + , img: 1 + , input: 1 + , isindex: 1 + , link: 1 + , meta: 1 + , param: 1 + , embed: 1 + , '?xml': 1 + }; + //Regex to detect whitespace only text nodes + HtmlBuilder.reWhitespace = /^\s*$/; + + //**Public**// + //Properties// + HtmlBuilder.prototype.dom = null; //The hierarchical object containing the parsed HTML + //Methods// + //Resets the builder back to starting state + HtmlBuilder.prototype.reset = function HtmlBuilder$reset() { + this.dom = []; + // this._raw = []; + this._done = false; + this._tagStack = []; + this._lastTag = null; + this._tagStack.last = function HtmlBuilder$_tagStack$last () { + return(this.length ? this[this.length - 1] : null); + }; + this._line = 1; + this._col = 1; + }; + //Signals the builder that parsing is done + HtmlBuilder.prototype.done = function HtmlBuilder$done () { + this._done = true; + this.handleCallback(null); + }; + + HtmlBuilder.prototype.error = function HtmlBuilder$error (error) { + this.handleCallback(error); + }; + + HtmlBuilder.prototype.handleCallback = function HtmlBuilder$handleCallback (error) { + if ((typeof this._callback) != "function") { + if (error) { + throw error; + } else { + return; + } + } + this._callback(error, this.dom); + }; + + HtmlBuilder.prototype.isEmptyTag = function HtmlBuilder$isEmptyTag (element) { + var name = element.name.toLowerCase(); + if (name.charAt(0) == '?') { + return true; + } + if (name.charAt(0) == '/') { + name = name.substring(1); + } + return this._options.enforceEmptyTags && !!HtmlBuilder._emptyTags[name]; + }; + + HtmlBuilder.prototype._getLocation = function HtmlBuilder$_getLocation () { + return { line: this._line, col: this._col }; + }; + + // HtmlBuilder.reLineSplit = /(\r\n|\r|\n)/g; + HtmlBuilder.prototype._updateLocation = function HtmlBuilder$_updateLocation (node) { + var positionData = (node.type === Mode.Tag) ? node.raw : node.data; + if (positionData === null) { + return; + } + // var lines = positionData.split(HtmlBuilder.reLineSplit); + var lines = positionData.split("\n"); + this._line += lines.length - 1; + if (lines.length > 1) { + this._col = 1; + } + this._col += lines[lines.length - 1].length; + if (node.type === Mode.Tag) { + this._col += 2; + } else if (node.type === Mode.Comment) { + this._col += 7; + } else if (node.type === Mode.CData) { + this._col += 12; + } + }; + + HtmlBuilder.prototype._copyElement = function HtmlBuilder$_copyElement (element) { + var newElement = { type: element.type }; + + if (this._options.verbose && element['raw'] !== undefined) { + newElement.raw = element.raw; + } + if (element['name'] !== undefined) { + switch (element.type) { + + case Mode.Tag: + newElement.name = this._options.caseSensitiveTags ? + element.name + : + element.name.toLowerCase() + ; + break; + + case Mode.Attr: + newElement.name = this._options.caseSensitiveAttr ? + element.name + : + element.name.toLowerCase() + ; + break; + + default: + newElement.name = this._options.caseSensitiveTags ? + element.name + : + element.name.toLowerCase() + ; + break; + + } + } + if (element['data'] !== undefined) { + newElement.data = element.data; + } + if (element.location) { + newElement.location = { line: element.location.line, col: element.location.col }; + } + + return newElement; + }; + + HtmlBuilder.prototype.write = function HtmlBuilder$write (element) { + // this._raw.push(element); + if (this._done) { + this.handleCallback(new Error("Writing to the builder after done() called is not allowed without a reset()")); + } + if (this._options.includeLocation) { + if (element.type !== Mode.Attr) { + element.location = this._getLocation(); + this._updateLocation(element); + } + } + if (element.type === Mode.Text && this._options.ignoreWhitespace) { + if (HtmlBuilder.reWhitespace.test(element.data)) { + return; + } + } + var parent; + var node; + if (!this._tagStack.last()) { //There are no parent elements + //If the element can be a container, add it to the tag stack and the top level list + if (element.type === Mode.Tag) { + if (element.name.charAt(0) != "/") { //Ignore closing tags that obviously don't have an opening tag + node = this._copyElement(element); + this.dom.push(node); + if (!this.isEmptyTag(node)) { //Don't add tags to the tag stack that can't have children + this._tagStack.push(node); + } + this._lastTag = node; + } + } else if (element.type === Mode.Attr && this._lastTag) { + if (!this._lastTag.attributes) { + this._lastTag.attributes = {}; + } + this._lastTag.attributes[this._options.caseSensitiveAttr ? element.name : element.name.toLowerCase()] = + element.data; + } else { //Otherwise just add to the top level list + this.dom.push(this._copyElement(element)); + } + } else { //There are parent elements + //If the element can be a container, add it as a child of the element + //on top of the tag stack and then add it to the tag stack + if (element.type === Mode.Tag) { + if (element.name.charAt(0) == "/") { + //This is a closing tag, scan the tagStack to find the matching opening tag + //and pop the stack up to the opening tag's parent + var baseName = this._options.caseSensitiveTags ? + element.name.substring(1) + : + element.name.substring(1).toLowerCase() + ; + if (!this.isEmptyTag(element)) { + var pos = this._tagStack.length - 1; + while (pos > -1 && this._tagStack[pos--].name != baseName) { } + if (pos > -1 || this._tagStack[0].name == baseName) { + while (pos < this._tagStack.length - 1) { + this._tagStack.pop(); + } + } + } + } + else { //This is not a closing tag + parent = this._tagStack.last(); + if (element.type === Mode.Attr) { + if (!parent.attributes) { + parent.attributes = {}; + } + parent.attributes[this._options.caseSensitiveAttr ? element.name : element.name.toLowerCase()] = + element.data; + } else { + node = this._copyElement(element); + if (!parent.children) { + parent.children = []; + } + parent.children.push(node); + if (!this.isEmptyTag(node)) { //Don't add tags to the tag stack that can't have children + this._tagStack.push(node); + } + if (element.type === Mode.Tag) { + this._lastTag = node; + } + } + } + } + else { //This is not a container element + parent = this._tagStack.last(); + if (element.type === Mode.Attr) { + if (!parent.attributes) { + parent.attributes = {}; + } + parent.attributes[this._options.caseSensitiveAttr ? element.name : element.name.toLowerCase()] = + element.data; + } else { + if (!parent.children) { + parent.children = []; + } + parent.children.push(this._copyElement(element)); + } + } + } + }; + + + //**Private**// + //Properties// + HtmlBuilder.prototype._options = null; //Builder options for how to behave + HtmlBuilder.prototype._callback = null; //Callback to respond to when parsing done + HtmlBuilder.prototype._done = false; //Flag indicating whether builder has been notified of parsing completed + HtmlBuilder.prototype._tagStack = null; //List of parents to the currently element being processed + //Methods// + + +function RssBuilder (callback) { + RssBuilder.super_.call(this, callback, { ignoreWhitespace: true, verbose: false, enforceEmptyTags: false, caseSensitiveTags: true }); +} +inherits(RssBuilder, HtmlBuilder); + + RssBuilder.prototype.done = function RssBuilder$done () { + var feed = {}; + var feedRoot; + + var found = DomUtils.getElementsByTagName(function (value) { return(value == "rss" || value == "feed"); }, this.dom, false); + if (found.length) { + feedRoot = found[0]; + } + if (feedRoot) { + if (feedRoot.name == "rss") { + feed.type = "rss"; + feedRoot = feedRoot.children[0]; //<channel/> + feed.id = ""; + try { + feed.title = DomUtils.getElementsByTagName("title", feedRoot.children, false)[0].children[0].data; + } catch (ex) { } + try { + feed.link = DomUtils.getElementsByTagName("link", feedRoot.children, false)[0].children[0].data; + } catch (ex) { } + try { + feed.description = DomUtils.getElementsByTagName("description", feedRoot.children, false)[0].children[0].data; + } catch (ex) { } + try { + feed.updated = new Date(DomUtils.getElementsByTagName("lastBuildDate", feedRoot.children, false)[0].children[0].data); + } catch (ex) { } + try { + feed.author = DomUtils.getElementsByTagName("managingEditor", feedRoot.children, false)[0].children[0].data; + } catch (ex) { } + feed.items = []; + DomUtils.getElementsByTagName("item", feedRoot.children).forEach(function (item, index, list) { + var entry = {}; + try { + entry.id = DomUtils.getElementsByTagName("guid", item.children, false)[0].children[0].data; + } catch (ex) { } + try { + entry.title = DomUtils.getElementsByTagName("title", item.children, false)[0].children[0].data; + } catch (ex) { } + try { + entry.link = DomUtils.getElementsByTagName("link", item.children, false)[0].children[0].data; + } catch (ex) { } + try { + entry.description = DomUtils.getElementsByTagName("description", item.children, false)[0].children[0].data; + } catch (ex) { } + try { + entry.pubDate = new Date(DomUtils.getElementsByTagName("pubDate", item.children, false)[0].children[0].data); + } catch (ex) { } + feed.items.push(entry); + }); + } else { + feed.type = "atom"; + try { + feed.id = DomUtils.getElementsByTagName("id", feedRoot.children, false)[0].children[0].data; + } catch (ex) { } + try { + feed.title = DomUtils.getElementsByTagName("title", feedRoot.children, false)[0].children[0].data; + } catch (ex) { } + try { + feed.link = DomUtils.getElementsByTagName("link", feedRoot.children, false)[0].attributes.href; + } catch (ex) { } + try { + feed.description = DomUtils.getElementsByTagName("subtitle", feedRoot.children, false)[0].children[0].data; + } catch (ex) { } + try { + feed.updated = new Date(DomUtils.getElementsByTagName("updated", feedRoot.children, false)[0].children[0].data); + } catch (ex) { } + try { + feed.author = DomUtils.getElementsByTagName("email", feedRoot.children, true)[0].children[0].data; + } catch (ex) { } + feed.items = []; + DomUtils.getElementsByTagName("entry", feedRoot.children).forEach(function (item, index, list) { + var entry = {}; + try { + entry.id = DomUtils.getElementsByTagName("id", item.children, false)[0].children[0].data; + } catch (ex) { } + try { + entry.title = DomUtils.getElementsByTagName("title", item.children, false)[0].children[0].data; + } catch (ex) { } + try { + entry.link = DomUtils.getElementsByTagName("link", item.children, false)[0].attributes.href; + } catch (ex) { } + try { + entry.description = DomUtils.getElementsByTagName("summary", item.children, false)[0].children[0].data; + } catch (ex) { } + try { + entry.pubDate = new Date(DomUtils.getElementsByTagName("updated", item.children, false)[0].children[0].data); + } catch (ex) { } + feed.items.push(entry); + }); + } + + this.dom = feed; + } + RssBuilder.super_.prototype.done.call(this); + }; + + var DomUtils = { + testElement: function DomUtils$testElement (options, element) { + if (!element) { + return false; + } + + for (var key in options) { + if (!options.hasOwnProperty(key)) { + continue; + } + if (key == "tag_name") { + if (element.type !== Mode.Tag) { + return false; + } + if (!options["tag_name"](element.name)) { + return false; + } + } else if (key == "tag_type") { + if (!options["tag_type"](element.type)) { + return false; + } + } else if (key == "tag_contains") { + if (element.type !== Mode.Text && element.type !== Mode.Comment && element.type !== Mode.CData) { + return false; + } + if (!options["tag_contains"](element.data)) { + return false; + } + } else { + if (!element.attributes || !options[key](element.attributes[key])) { + return false; + } + } + } + + return true; + } + + , getElements: function DomUtils$getElements (options, currentElement, recurse, limit) { + recurse = (recurse === undefined || recurse === null) || !!recurse; + limit = isNaN(parseInt(limit)) ? -1 : parseInt(limit); + + if (!currentElement) { + return([]); + } + + var found = []; + var elementList; + + function getTest (checkVal) { + return function (value) { + return(value == checkVal); + }; + } + for (var key in options) { + if ((typeof options[key]) != "function") { + options[key] = getTest(options[key]); + } + } + + if (DomUtils.testElement(options, currentElement)) { + found.push(currentElement); + } + + if (limit >= 0 && found.length >= limit) { + return(found); + } + + if (recurse && currentElement.children) { + elementList = currentElement.children; + } else if (currentElement instanceof Array) { + elementList = currentElement; + } else { + return(found); + } + + for (var i = 0; i < elementList.length; i++) { + found = found.concat(DomUtils.getElements(options, elementList[i], recurse, limit)); + if (limit >= 0 && found.length >= limit) { + break; + } + } + + return(found); + } + + , getElementById: function DomUtils$getElementById (id, currentElement, recurse) { + var result = DomUtils.getElements({ id: id }, currentElement, recurse, 1); + return(result.length ? result[0] : null); + } + + , getElementsByTagName: function DomUtils$getElementsByTagName (name, currentElement, recurse, limit) { + return(DomUtils.getElements({ tag_name: name }, currentElement, recurse, limit)); + } + + , getElementsByTagType: function DomUtils$getElementsByTagType (type, currentElement, recurse, limit) { + return(DomUtils.getElements({ tag_type: type }, currentElement, recurse, limit)); + } + }; + +exports.Parser = Parser; + +exports.HtmlBuilder = HtmlBuilder; + +exports.RssBuilder = RssBuilder; + +exports.ElementType = Mode; + +exports.DomUtils = DomUtils; + +})(); +</script> + +<script>// General, useful functions +var allinea = {}; + +// Initialise functions that only require ECMAScript, and no browser API +(function initAllinea() { + function isArrayLike(obj) { + if (!obj || obj.window === obj) { + return false; + } + + // Support: iOS 8.2 (not reproducible in simulator) + // "length" in obj used to prevent JIT error (gh-11508) + var length = "length" in Object(obj) && obj.length; + + if (obj.nodeType === 1 && length) { + return true; + } + + return allinea.isString(obj) || allinea.isArray(obj) || length === 0 || + (typeof length === 'number' && length > 0 && (length - 1) in obj); + } + + allinea.isArray = Array.isArray; + + allinea.isString = function isString(value) { + return typeof value === 'string'; + }; + + allinea.isFunction = function isFunction(value) { + return typeof value === 'function'; + }; + + allinea.isObject = function isObject(value) { + return value !== null && typeof value === 'object'; + }; + + // This forEach implementation is adapted from Angular.js + // angular.js is Copyright (c) 2010-2015 Google, Inc. http://angularjs.org + // angular.js is MIT Licensed + allinea.forEach = function forEach(obj, iterator, context) { + var key, length; + if (obj) { + if (allinea.isFunction(obj)) { + for (key in obj) { + // Need to check if hasOwnProperty exists, + // as on IE8 the result of querySelectorAll is an object without a hasOwnProperty function + if (key != 'prototype' && key != 'length' && key != 'name' && (!obj.hasOwnProperty || obj.hasOwnProperty(key))) { + iterator.call(context, obj[key], key, obj); + } + } + } + else if (allinea.isArray(obj) || isArrayLike(obj)) { + var isPrimitive = typeof obj !== 'object'; + for (key = 0, length = obj.length; key < length; key++) { + if (isPrimitive || key in obj) { + iterator.call(context, obj[key], key, obj); + } + } + } + else if (obj.forEach && obj.forEach !== forEach) { + obj.forEach(iterator, context, obj); + } + else if (typeof obj.hasOwnProperty === 'function') { + // Slow path for objects inheriting Object.prototype, hasOwnProperty check needed + for (key in obj) { + if (obj.hasOwnProperty(key)) { + iterator.call(context, obj[key], key, obj); + } + } + } + else { + // Slow path for objects which do not have a method `hasOwnProperty` + for (key in obj) { + if (Object.prototype.hasOwnProperty.call(obj, key)) { + iterator.call(context, obj[key], key, obj); + } + } + } + } + return obj; + }; + + // Find the first element of an array that the predicate returns truthy for + allinea.find = function find(obj, predicate, context) { + var key, length; + if (obj) { + if (allinea.isFunction(obj)) { + for (key in obj) { + // Need to check if hasOwnProperty exists, + // as on IE8 the result of querySelectorAll is an object without a hasOwnProperty function + if (key != 'prototype' && key != 'length' && key != 'name' && (!obj.hasOwnProperty || obj.hasOwnProperty(key))) { + if(predicate.call(context, obj[key], key, obj)) { + return obj[key]; + } + } + } + } + else if (allinea.isArray(obj) || isArrayLike(obj)) { + var isPrimitive = typeof obj !== 'object'; + for (key = 0, length = obj.length; key < length; key++) { + if (isPrimitive || key in obj) { + if(predicate.call(context, obj[key], key, obj)) { + return obj[key]; + } + } + } + } + else if (typeof obj.hasOwnProperty === 'function') { + for (key in obj) { + if (obj.hasOwnProperty(key)) { + if(predicate.call(context, obj[key], key, obj)) { + return obj[key]; + } + } + } + } + else { + for (key in obj) { + if (Object.prototype.hasOwnProperty.call(obj, key)) { + if(predicate.call(context, obj[key], key, obj)) { + return obj[key]; + } + } + } + } + } + return undefined; + }; + + allinea.replaceAll = function replaceAll(inputStr, replaceStr, withStr) { + return inputStr.split(replaceStr).join(withStr); + }; + + // Remove all elements from an array that predicate returns truthy for and + // return all removed elements. + allinea.remove = function remove(array, predicate) { + var i = array.length; + var result = []; + while(i--) { + if(predicate(array[i], i, array)) { + result.unshift(array.splice(i, 1)[0]); + } + } + return result; + }; + + // Remove CDATA wrappers from a string + allinea.removeCdata = function removeCdata(s) { + var cdataRe = /<!\[CDATA\[([\s\S]*?)\]\]>/g; + return s.replace(cdataRe, '$1'); + }; + + // Generates a unique ID based on given string that is suitable for the + // global "id" HTML attribute. + // + // Calling this function twice (or more) with the same input string will + // result in different results to ensure uniqueness, for example: + // 1st: name -> name + // 2nd: name -> name2 + allinea.makeId = function makeId(str) { + // From https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/id + // "Using characters except ASCII letters and digits, '_', '-' and '.' may cause + // compatibility problems, as they weren't allowed in HTML 4. + // Though this restriction has been lifted in HTML 5, an ID should start + // with a letter for compatibility." + var filterAway = /[^a-zA-Z0-9_\-.]/gi; + var cleanId = str.replace(filterAway, '').toLowerCase(); + + // Additionally, we filter trailing numbers away as we don't want them + // to conflict with our counter we might add to ensure uniqueness, i.e. + // we don't want that to happen: + // 1st: name2 -> name2 + // 2nd: name -> name + // 3rd: name -> name2 # conflicts with 1st! + var filterTrailingNumberAway = /[0-9]*$/; + cleanId = cleanId.replace(filterTrailingNumberAway, ''); + + // Ensure ID starts with letter. + var hasLeadingLetter = /^[a-z]/; + if (cleanId.match(hasLeadingLetter) === null) { + cleanId = "x" + cleanId; + } + + // If we already have such ID, add counter to ensure uniqueness + if (this.idCounters.hasOwnProperty(cleanId)) { + var counter = ++this.idCounters[cleanId]; + this.idCounters[cleanId] = counter; + return cleanId + counter; + } + + this.idCounters[cleanId] = 1; + return cleanId; + }; + allinea.idCounters = {}; + + // Lookup an object or array member using dot notation + allinea.lookup = function lookup(obj, path) { + if(path) { + path = path.split('.'); + while(path.length > 0 && obj !== undefined) { + if(allinea.isObject(obj)) { + obj = obj[path.shift()]; + } + else { + return undefined; + } + } + } + return obj; + }; + + // Convert a value to a boolean, with tolerance for falsy values that have + // been converted to strings + allinea.toBool = function toBool(value) { + var falsyStrings = [ + ''+false, + ''+0, + ''+-0, + ''+null, + ''+undefined, + ''+NaN + ]; + + if (falsyStrings.indexOf(value) >= 0) { + return false; + } + else { + return !!value; + } + }; + + // Checks that the data/metric is valid. It works similarly to toBool. + // However, in this case we do not count 0 as being a false value. + allinea.isMetricValueValid = function isMetricValueValid(value) { + var zeroValues = [ + ''+0, + ''+-0, + 0, + -0 + ] + + if (zeroValues.indexOf(value) >= 0) { + return true; + } + else { + return allinea.toBool(value); + } + }; + +})(); + +// Initialise functions that require the browser API +var document; +(function initAllineaBrowser() { + if(document && document.getElementById) { + // Retrieve JSON content from an element with the specified id, or return + // null if the element was not found + allinea.getElementJson = function getElementJson(id) { + var elem = document.getElementById(id); + if(elem) { + return JSON.parse(allinea.removeCdata(elem.innerHTML)); + } + else { + return null; + } + }; + } + + if(document && document.getElementById) { + // set the innerHTML of an element with the specified id + allinea.setElementInnerHtml = function setElementInnerHtml(id, html) { + var elem = document.getElementById(id); + if(elem) { + elem.innerHTML = html; + } + }; + } + + if(document && document.createElement && document.getElementsByTagName) { + // Use to insert CSS rules dynamically (adapted from + // https://davidwalsh.name/add-rules-stylesheets) + allinea.sheet = (function sheet() { + // Create the <style> tag + var style = document.createElement("style"); + + // WebKit hack :( + try { + style.appendChild(document.createTextNode("")); + } catch (err) { /* ignore silently in IE8 */ } + + // Add the <style> element to the page + var head = document.head; + if (typeof head == 'undefined') { + // for IE8 + head = document.getElementsByTagName('head')[0]; + } + head.appendChild(style); + return style.sheet; + })(); + } +})(); +</script> + +<script>var ReportEngine; +var document; + +(function initReportEngine() { + // Map of helpers the report engine automatically provides + var builtinHelpers = { + all: { + // Use like {{#condenseSpace}}any template text{{/condenseSpace}} to + // trim the string and replace all blocks of whitespace with a single + // space. + condenseSpace: function condenseSpace(options) { + if(arguments.length !== 1 || !options.fn) { + throw new Error('invalid usage of condenseSpace'); + } + + var output = options.fn(this); + return output.trim().replace(/\s+/g, ' '); + }, + + // Use like {{#trim}}any template text{{/trim}} to trim a string, or + // like {{trim variable}} to trim the value of the specified variable + trim: function trim() { + if(arguments.length < 1 || arguments.length > 2) { + throw new Error('invalid usage of trim'); + } + + var options = arguments[arguments.length-1]; + + if(options.fn) { + // block form + if(arguments.length !== 1) { + throw new Error('invalid usage of trim, no arguments should be passed when used as a block'); + } + + return options.fn(this).trim(); + } + else { + // function form + if(arguments.length !== 2) { + throw new Error('invalid usage of trim, an argument is required when used as a function'); + } + + var string = ''+arguments[0]; + return string.trim(); + } + }, + + // Use like {{#trimLeft}}any template text{{/trimLeft}} to left-trim a string, or + // like {{trimLeft variable}} to left-trim the value of the specified variable + trimLeft: function trimLeft() { + if(arguments.length < 1 || arguments.length > 2) { + throw new Error('invalid usage of trimLeft'); + } + + var options = arguments[arguments.length-1]; + + if(options.fn) { + // block form + if(arguments.length !== 1) { + throw new Error('invalid usage of trimLeft, no arguments should be passed when used as a block'); + } + + return options.fn(this).replace(/^\s+/, ""); + } + else { + // function form + if(arguments.length !== 2) { + throw new Error('invalid usage of trimLeft, an argument is required when used as a function'); + } + + var string = ''+arguments[0]; + return string.replace(/^\s+/, ""); + } + }, + + // Use like {{toFixed value precision}} to format a number using + // fixed-point notation. + toFixed: function toFixed(value, precision) { + if(arguments.length !== 3) { + throw new Error('invalid usage of toFixed'); + } + + return (+value || 0).toFixed(+precision || 0); + }, + + // Use like {{toPrecision value precision}} to format a number to + // specified precision. Precision must be between 1 and 21. + // Any other precision will be changed to the closest one. + toPrecision: function toPrecision(value, precision) { + if(arguments.length !== 3) { + throw new Error('invalid usage of toPrecision'); + } + + if (isFinite(precision)) { + if (precision > 21) + precision = 21; + if (precision < 1) + precision = 1; + } else { + precision = undefined; + } + + return (+value || 0).toPrecision(precision); + }, + + // Use like {{#makeId}}{{name}}{{/makeId}} to generate an ID based on + // name. + makeId: function makeId(options) { + return allinea.makeId(options.fn(this)); + }, + + // Use like {{#if (toBool value)}}...{{/if}} to convert value to a boolean with + // parsing of strings containing falsy values. + toBool: allinea.toBool, + + // Use like {{#if (greater a b)}}...{{/if}} to test a>b + greater: function greater(a, b, options) { + if(arguments.length !== 3) { + throw new Error('invalid usage of greater'); + } + + return a > b; + }, + + // Use like {{#if (less a b)}}...{{/if}} to test a<b + less: function less(a, b, options) { + if(arguments.length !== 3) { + throw new Error('invalid usage of less'); + } + + return a < b; + }, + + // Use like {{isEqual x y}} to test if a === b + // As you might expect, a boolean is returned + isEqual: function isEqual(lhs, rhs, options) { + return lhs === rhs; + }, + + // Use like {{add x y}} to calculate x+y + // x and y will be cast to numbers, and treated as 0 if undefined + add: function add(x, y, options) { + if(arguments.length !== 3) { + throw new Error('invalid usage of add'); + } + + return (+x||0)+(+y||0); + }, + + // Use like {{sub x y}} to calculate x-y + // x and y will be cast to numbers, and treated as 0 if undefined + sub: function sub(x, y, options) { + if(arguments.length !== 3) { + throw new Error('invalid usage of sub'); + } + + return (+x||0)-(+y||0); + }, + + // Use like {{div x y}} to calculate x/y + // x and y will be cast to numbers, and treated as 0 if undefined + div: function div(x, y, options) { + if(arguments.length !== 3) { + throw new Error('invalid usage of div'); + } + + return (+x||0)/(+y||0); + }, + + // Use like {{if (notNull x)}} to test if any arguments are null or undefined + anyNotNull: function anyNotNull() { + // NB: the last argument to a helper is always the Handlebars + // options structure + var options = arguments[arguments.length-1]; + + for(var i=0; i<arguments.length-1; ++i) { + // note: intentional weak equality to cover null and undefined + if(arguments[i] != null) { + return true; + } + } + + return false; + }, + + // Use like {{if (allNull x)}} to test if all arguments are null or undefined + allNull: function allNull() { + return !builtinHelpers.all.anyNotNull.apply(this, arguments); + }, + + // Use like {{increment 'myCounter'}} to add one to "myCounter" in the + // current scope. If the counter does not exist it is initialised to 0. + // Optionally, the scope can be passed with + // {{increment 'myCounter' scope=..}} + increment: function increment(key, options) { + if(arguments.length !== 2) { + throw new Error('invalid usage of increment'); + } + + var scope = this; + if(options.hash && options.hash.scope) { + scope = options.hash.scope; + } + + if(!allinea.isObject(scope)) { + throw new Error('scope for increment must be an object'); + } + + if(typeof scope[key] === 'number') { + ++scope[key]; + } + else { + scope[key] = 0; + } + }, + + // Use like {{#if (isOdd value)}}...{{/if}} to conditionally include + // content if a value is odd + isOdd: function isOdd(value, options) { + if(arguments.length !== 2) { + throw new Error('invalid usage of increment'); + } + + return (Math.abs(value)%2) === 1; + }, + + // Use like {{lookup object path}} to read a dotted path from an object + lookup: function lookup(object, path, options) { + if(arguments.length !== 3) { + throw new Error('invalid usage of lookup'); + } + + if(path && !allinea.isString(path)) { + throw new Error('path for lookup must be a string or falsy value'); + } + + return allinea.lookup(object, path); + }, + + // Use like {{find array key-path value [path]}} to find an object in an + // array with the specified value, optionally returning the specified path + find: function find(array, keyPath, value, resultPath, options) { + if(arguments.length < 4 || arguments.length > 5) { + throw new Error('invalid usage of find'); + } + + if(arguments.length === 4) { + options = resultPath; + resultPath = ''; + } + + if(!allinea.isArray(array)) { + throw new Error('array parameter to find must be an array'); + } + + if(keyPath && !allinea.isString(keyPath)) { + throw new Error('keyPath parameter to find must be a string or falsy'); + } + + if(resultPath && !allinea.isString(resultPath)) { + throw new Error('resultPath parameter to find must be a string or falsy'); + } + + for(var i=0; i<array.length; ++i) { + if(allinea.lookup(array[i], keyPath) === value) { + return allinea.lookup(array[i], resultPath); + } + } + + return undefined; + }, + + // Use like {{textToHtml string}} to convert a string to HTML + textToHtml: function textToHtml(string, options) { + return new Handlebars.SafeString(ReportEngine.textToHtml(string)); + }, + + // Use like {{htmlToText string}} to convert HTML to text + // Note: use {{{triple-stashes}}} if you don't want Handlebars to + // escape the result! + htmlToText: function htmlToText(string, options) { + return ReportEngine.htmlToText(string, options.hash); + }, + + // Use like {{#if isHtml}}...{{/if}} to test whether the template + // engine is running in HTML mode + isHtml: function isHtml() { + return false; + }, + + // Use like {{wrappablePath string}} to add zero width spaces after + // forward slashes (HTML only) + wrappablePath: function wrappablePath(string, options) { + if(arguments.length != 2) { + throw new Error('invalid usage of wrappablePath'); + } + + return string; + }, + + // Use like {{formatToMimeType "all"}} to get a suitable mime type + // for a partial type + formatToMimeType: function formatToMimeType(format, options) { + if(arguments.length != 2) { + throw new Error('invalid usage of formatToMimeType'); + } + + switch(format) { + case 'text': + return 'text/plain'; + case 'html': + return 'text/html'; + case 'all': + return 'text/x.allinea-template'; + } + + return ''; + }, + }, + + html: { + isHtml: function isHtml() { + return true; + }, + + wrappablePath: function wrappablePath(string, options) { + if(arguments.length != 2) { + throw new Error('invalid usage of wrappablePath'); + } + + string = Handlebars.escapeExpression(string); + return new Handlebars.SafeString(string.replace(/\//g, '/​')); + } + } + }; + + // Constructor for a ReportEngine, this lets us create multiple ReportEngine + // instances e.g. for unit tests to create clean environments. + function ReportEngineObject() { + var self = this; + + // Map of format to Handlebars template rendering engines + self.engines = { + html: Handlebars.create(), + text: Handlebars.create() + }; + + // Map from format to partial name to partial rendering function + self.partials = { + html: {}, + text: {} + }; + + // Initialisation functions + self.initFunctions = []; + self.afterRenderFunctions = []; + + self.registerHelpers(builtinHelpers); + + // The "eval" helper is special, it needs to know about the engine + // for the format it is being invoked under + + // Use like {{eval templateText context}} to dynamically evaluate a template + // Use like {{#with (eval templateText context)}}...{{/with}} to dynamically + // evaluate templateText, then render it into the body as "this" + // Use like {{#each (eval templateArray context)}}...{{/each}} to dynamically + // evaluate every member of the array, then render it into the body as + // "this". + // NB: avoid where possible, compiling templates is expensive + allinea.forEach(self.engines, function registerEvalHelper(engine, format) { + engine.registerHelper('eval', function evalHelper(templateText, context, options) { + if(arguments.length < 2 || arguments.length > 3) { + throw new Error('invalid usage of eval'); + } + + if(arguments.length === 2) { + // if the context is not specified, default it to this + options = context; + context = this; + } + + for (var key in options.hash) { + context[key] = options.hash[key]; + } + + var innerOptions = {data:{root:options.data.root}}; + + if(allinea.isArray(templateText)) { + var result = []; + allinea.forEach(templateText, function evalArrayElement(template) { + if(template && !allinea.isString(template)) { + throw new Error('template text for eval must be a string or falsy'); + } + + var val = template + ? new engine.SafeString(engine.compile(template)(context,innerOptions)) + : ''; + result.push(val); + }); + return result; + } + else if(templateText) { + if(!allinea.isString(templateText)) { + throw new Error('template text for eval must be a string or falsy'); + } + + return new engine.SafeString(engine.compile(templateText)(context,innerOptions)); + } + else { + return ''; + } + }); + }); + + if(document && document.addEventListener) { + document.addEventListener('DOMContentLoaded', function invokeInitFunctions() { + self.invokeInitFunctions(); + }, false); + } + + // Ensure there is an error template + self.registerPartial('errorTemplate', 'text', '{{{message}}}\n\n{{#if stack}}<pre>{{{stack}}}</pre>{{/if}}'); + + if(self.loadHtmlTemplates) { + self.onInit(self.loadHtmlTemplates); + } + } + + // Initialise functions that only require ECMAScript, and no browser API + + // Function to create a new ReportEngine instance, e.g. call ReportEngine.create() + // to create an isolated instance for unit tests. + ReportEngineObject.prototype.create = function createReportEngine() { + return new ReportEngineObject(); + }; + + // Helper function to convert text to HTML (with proper escaping and respect + // for newlines) + ReportEngineObject.prototype.textToHtml = function escapeString(string) { + if(!allinea.isString(string)) { + throw new Error('textToHtml expected string argument'); + } + + return '<span style="white-space:pre-line">'+Handlebars.escapeExpression(string)+'</span>'; + }; + + // given a string, apply word wrapping (at spaces) at the specified column + function wrapText(string, wrapColumn) { + var wrappableChars = [ + // conventional spaces + ' ', + '\t', + // fixed width spaces + '\u2000','\u2001','\u2002','\u2003','\u2004','\u2005','\u2006', + '\u2007','\u2008','\u2009','\u200a', + // zero width space + '\u200b', + // medium mathematical space + '\u205f', + // ideographic space + '\u3000', + ]; + var len = string.length; + var result = string.split(''); // JS string are immutable, convert to array + + var startOfLine = 0; + var lastSpaceOnLine = undefined; + + for (var i=0; i<len; ++i) { + var c = string[i]; + + if (c === '\n') { + startOfLine = i+1; + lastSpaceOnLine = undefined; + } + else if (wrappableChars.indexOf(c) !== -1) { + lastSpaceOnLine = i; + } + + var lineLength = i-startOfLine+1; + if (lineLength > wrapColumn && lastSpaceOnLine !== undefined) { + result[lastSpaceOnLine] = '\n'; + startOfLine = lastSpaceOnLine+1; + lastSpaceOnLine = undefined; + } + } + + return result.join(''); + } + + // given a string, replace all blocks of whitespace with a single space + // note: does not adjust non-breaking or fixed width spaces. + function collapseWhitespace(string) { + return string.replace(/[ \r\n\t]+/g, ' '); + } + + // table mapping HTML entity name to a unicode character + var htmlEntities = { + apos:'\u0027',quot:'\u0022',amp:'\u0026',lt:'\u003C',gt:'\u003E',nbsp:'\u00A0',iexcl:'\u00A1',cent:'\u00A2',pound:'\u00A3', + curren:'\u00A4',yen:'\u00A5',brvbar:'\u00A6',sect:'\u00A7',uml:'\u00A8',copy:'\u00A9',ordf:'\u00AA',laquo:'\u00AB', + not:'\u00AC',shy:'\u00AD',reg:'\u00AE',macr:'\u00AF',deg:'\u00B0',plusmn:'\u00B1',sup2:'\u00B2',sup3:'\u00B3', + acute:'\u00B4',micro:'\u00B5',para:'\u00B6',middot:'\u00B7',cedil:'\u00B8',sup1:'\u00B9',ordm:'\u00BA',raquo:'\u00BB', + frac14:'\u00BC',frac12:'\u00BD',frac34:'\u00BE',iquest:'\u00BF',Agrave:'\u00C0',Aacute:'\u00C1',Acirc:'\u00C2',Atilde:'\u00C3', + Auml:'\u00C4',Aring:'\u00C5',AElig:'\u00C6',Ccedil:'\u00C7',Egrave:'\u00C8',Eacute:'\u00C9',Ecirc:'\u00CA',Euml:'\u00CB', + Igrave:'\u00CC',Iacute:'\u00CD',Icirc:'\u00CE',Iuml:'\u00CF',ETH:'\u00D0',Ntilde:'\u00D1',Ograve:'\u00D2',Oacute:'\u00D3', + Ocirc:'\u00D4',Otilde:'\u00D5',Ouml:'\u00D6',times:'\u00D7',Oslash:'\u00D8',Ugrave:'\u00D9',Uacute:'\u00DA',Ucirc:'\u00DB', + Uuml:'\u00DC',Yacute:'\u00DD',THORN:'\u00DE',szlig:'\u00DF',agrave:'\u00E0',aacute:'\u00E1',acirc:'\u00E2',atilde:'\u00E3', + auml:'\u00E4',aring:'\u00E5',aelig:'\u00E6',ccedil:'\u00E7',egrave:'\u00E8',eacute:'\u00E9',ecirc:'\u00EA',euml:'\u00EB', + igrave:'\u00EC',iacute:'\u00ED',icirc:'\u00EE',iuml:'\u00EF',eth:'\u00F0',ntilde:'\u00F1',ograve:'\u00F2',oacute:'\u00F3', + ocirc:'\u00F4',otilde:'\u00F5',ouml:'\u00F6',divide:'\u00F7',oslash:'\u00F8',ugrave:'\u00F9',uacute:'\u00FA',ucirc:'\u00FB', + uuml:'\u00FC',yacute:'\u00FD',thorn:'\u00FE',yuml:'\u00FF',OElig:'\u0152',oelig:'\u0153',Scaron:'\u0160',scaron:'\u0161', + Yuml:'\u0178',fnof:'\u0192',circ:'\u02C6',tilde:'\u02DC',Alpha:'\u0391',Beta:'\u0392',Gamma:'\u0393',Delta:'\u0394', + Epsilon:'\u0395',Zeta:'\u0396',Eta:'\u0397',Theta:'\u0398',Iota:'\u0399',Kappa:'\u039A',Lambda:'\u039B',Mu:'\u039C', + Nu:'\u039D',Xi:'\u039E',Omicron:'\u039F',Pi:'\u03A0',Rho:'\u03A1',Sigma:'\u03A3',Tau:'\u03A4',Upsilon:'\u03A5', + Phi:'\u03A6',Chi:'\u03A7',Psi:'\u03A8',Omega:'\u03A9',alpha:'\u03B1',beta:'\u03B2',gamma:'\u03B3',delta:'\u03B4', + epsilon:'\u03B5',zeta:'\u03B6',eta:'\u03B7',theta:'\u03B8',iota:'\u03B9',kappa:'\u03BA',lambda:'\u03BB',mu:'\u03BC', + nu:'\u03BD',xi:'\u03BE',omicron:'\u03BF',pi:'\u03C0',rho:'\u03C1',sigmaf:'\u03C2',sigma:'\u03C3',tau:'\u03C4', + upsilon:'\u03C5',phi:'\u03C6',chi:'\u03C7',psi:'\u03C8',omega:'\u03C9',thetasym:'\u03D1',upsih:'\u03D2',piv:'\u03D6', + ensp:'\u2002',emsp:'\u2003',thinsp:'\u2009',zwnj:'\u200C',zwj:'\u200D',lrm:'\u200E',rlm:'\u200F',ndash:'\u2013', + mdash:'\u2014',lsquo:'\u2018',rsquo:'\u2019',sbquo:'\u201A',ldquo:'\u201C',rdquo:'\u201D',bdquo:'\u201E',dagger:'\u2020', + Dagger:'\u2021',bull:'\u2022',hellip:'\u2026',permil:'\u2030',prime:'\u2032',Prime:'\u2033',lsaquo:'\u2039',rsaquo:'\u203A', + oline:'\u203E',frasl:'\u2044',euro:'\u20AC',image:'\u2111',weierp:'\u2118',real:'\u211C',trade:'\u2122',alefsym:'\u2135', + larr:'\u2190',uarr:'\u2191',rarr:'\u2192',darr:'\u2193',harr:'\u2194',crarr:'\u21B5',lArr:'\u21D0',uArr:'\u21D1', + rArr:'\u21D2',dArr:'\u21D3',hArr:'\u21D4',forall:'\u2200',part:'\u2202',exist:'\u2203',empty:'\u2205',nabla:'\u2207', + isin:'\u2208',notin:'\u2209',ni:'\u220B',prod:'\u220F',sum:'\u2211',minus:'\u2212',lowast:'\u2217',radic:'\u221A', + prop:'\u221D',infin:'\u221E',ang:'\u2220',and:'\u2227',or:'\u2228',cap:'\u2229',cup:'\u222A',int:'\u222B', + there4:'\u2234',sim:'\u223C',cong:'\u2245',asymp:'\u2248',ne:'\u2260',equiv:'\u2261',le:'\u2264',ge:'\u2265', + sub:'\u2282',sup:'\u2283',nsub:'\u2284',sube:'\u2286',supe:'\u2287',oplus:'\u2295',otimes:'\u2297',perp:'\u22A5', + sdot:'\u22C5',lceil:'\u2308',rceil:'\u2309',lfloor:'\u230A',rfloor:'\u230B',lang:'\u2329',rang:'\u232A',loz:'\u25CA', + spades:'\u2660',clubs:'\u2663',hearts:'\u2665',diams:'\u2666', + }; + + // given a string, decode all HTML entities + function decode(string) { + return string.replace(/&([a-zA-Z0-9]+);/g, function replaceHtmlNamedEnt(match, name) { + return htmlEntities[name]; + }).replace(/&#([0-9]+);/g, function replaceHtmlDecEnt(match, number) { + return String.fromCharCode(+number); + }).replace(/&#x([0-9a-fA-F]+);/g, function replaceHtmlHexEnt(match, number) { + return String.fromCharCode(parseInt(number,16)); + }); + } + + // given parsed html, convert it to plain text, see htmlToText for options + function parsedHtmlToText(parsed, options) { + var blockElements = [ + 'p', + 'div', + 'h1', + 'h2', + 'h3', + 'h4', + 'h5', + 'h6', + 'ul', + 'ol', + 'pre', + ]; + + var result = ''; + allinea.forEach(parsed, function htmlElementToText(element) { + switch(element.type) { + case 'tag': + if(element.name === 'br') { + result += '\n'; + } + else if(blockElements.indexOf(element.name) !== -1) { + if(result.length > 0 && result.slice(-1) !== '\n') { + result += '\n'; + } + } + + result += parsedHtmlToText(element.children, options); + + if(element.name === 'p') { + result += '\n\n'; + } + else if(blockElements.indexOf(element.name) !== -1) { + if(result.length === 0 || result.slice(-1) !== '\n') { + result += '\n'; + } + } + break; + + case 'text': + element.data = decode(element.data); + + if(options.collapseWhitespace) { + element.data = collapseWhitespace(element.data); + } + + if(options.wrap) { + element.data = wrapText(element.data, options.wrap); + } + + result += element.data; + break; + } + }); + return result; + } + + // Helper function to convert HTML to text (stripping tags) + // options is an optional object (hash), which may contain some or all of + // the following keys: + // wrap: column to wrap text at (or false to disable wrapping) + // collapseWhitespace: truthy to replace all consecutive whitespace with + // a single space + ReportEngineObject.prototype.htmlToText = function htmlToText(string, options) { + if(!allinea.isString(string)) { + if (typeof string === 'object' && string.toString && typeof string.toString === 'function') { + string = string.toString(); + } else { + throw new Error('htmlToText expected string argument'); + } + } + + if(options !== undefined && !allinea.isObject(options)) { + throw new Error('htmlToText options must be object'); + } + + var handler = new htmlparser.HtmlBuilder(function handleHtmlResult(error, dom) { + if(error) { + throw new Error(error); + } + }); + var parser = new htmlparser.Parser(handler); + + parser.parseComplete(string); + + var defaultOptions = { + wrap: false, + collapseWhitespace: true + }; + + options = options || {}; + + for(key in defaultOptions) { + if(!(key in options)) { + options[key] = defaultOptions[key]; + } + } + + return parsedHtmlToText(handler.dom, options); + }; + + // Internal map used to convert between formats + var formatMap = { + html: { + text: function htmlPartialToText(partial) { + return ReportEngineObject.prototype.htmlToText( + partial.replace(/\{\{([^>#\/{}][^{}]*?)\}\}(?!})/g, function(match, key) { + if(key === 'else') { + return match; + } + else { + return '{{{'+key+'}}}'; + } + }) + ); + } + }, + + text: { + html: function textPartialToHtml(partial) { + return ReportEngineObject.prototype.textToHtml( + partial.replace(/\{\{\{(.*?)\}\}\}/g, '{{$1}}') + ); + } + } + }; + + // Internal helper to compile a partial and put it in the right place + function compileAndRegisterPartial(reportEngine, name, format, partial) { + var engine = reportEngine.engines[format]; + var compiledPartial = engine.compile(partial); + reportEngine.partials[format][name] = compiledPartial; + engine.registerPartial(name, compiledPartial); + } + + /* + Register a partial template with the report engine. + + Where possible this will generate partials for other formats that have + not already been specified. + + name: The name of the partial + format: The format of the partial - either "text", "html" or "all" + partial: The content of the partial. + */ + ReportEngineObject.prototype.registerPartial = function registerPartial(name, format, partial) { + if(!allinea.isString(name)) { + throw new Error('name must be a string'); + } + + if(!allinea.isString(format)) { + throw new Error('format must be a string'); + } + + if(!allinea.isString(partial)) { + throw new Error('partial must be a string'); + } + + var self = this; + + if(format === 'all') { + allinea.forEach(this.partials, function(otherPartials, otherFormat) { + compileAndRegisterPartial(self, name, otherFormat, partial); + }); + } + else { + if(!this.partials[format]) { + throw new Error('Invalid format "'+format+'"'); + } + + compileAndRegisterPartial(this, name, format, partial); + + if(formatMap[format]) { + allinea.forEach(this.partials, function(otherPartials, otherFormat) { + if(format !== otherFormat && formatMap[format][otherFormat] && otherPartials[name] === undefined) { + compileAndRegisterPartial( + self, + name, + otherFormat, + formatMap[format][otherFormat](partial) + ); + } + }); + } + } + }; + + /* + Determine if a partial exists, if format is unspecified will test all + formats + */ + ReportEngineObject.prototype.hasPartial = function hasPartial(name, format) { + if(!allinea.isString(name)) { + throw new Error('name must be a string'); + } + + if(format !== undefined && !allinea.isString(format)) { + throw new Error('format must be a string'); + } + + if(format === undefined) { + for(format in this.partials) { + if(this.partials.hasOwnProperty(format) && !this.hasPartial(name, format)) + return false; + } + + return true; + } + else { + return this.partials[format] && this.partials[format][name] !== undefined; + } + }; + + /* + Register helper functions with the report engine. Helper functions + are used by the Handlebars engine - see the Handlebars.js documentation + for more details. + + The parameter is a map from format, to helper name to function, e.g. + + { + all: { + isText: function() { return false; } + }, + + text: { + isText: function() { return true; } + } + } + + Could be used to install a helper called isText with one implementation + for all formats other than text, and one implementation for the text + format. + + fns: An object mapping formats to sets of functions to install, the + Special format "all" may be used to register helpers with all + formats. + */ + ReportEngineObject.prototype.registerHelpers = function registerHelpers(fns) { + if(!allinea.isObject(fns)) { + throw new Error('fns must be an object'); + } + + allinea.forEach(this.engines, function registerHelpersWithEngine(engine, format) { + if(fns.all) { + engine.registerHelper(fns.all); + } + if(fns[format]) { + engine.registerHelper(fns[format]); + } + }); + }; + + /* + Render the named template of the specified format data as the context + */ + ReportEngineObject.prototype.render = function render(templateName, format, data ) { + if(!allinea.isString(templateName)) { + throw new Error('templateName must be a string'); + } + + if(!allinea.isString(format)) { + throw new Error('format must be a string'); + } + + if(!allinea.isObject(data)) { + throw new Error('data must be an object'); + } + + if(!this.partials[format]) { + throw new Error('Invalid format "'+format+'"'); + } + + if(!this.partials[format][templateName]) { + throw new Error('Invalid template "'+templateName+'" for '+format); + } + + return this.partials[format][templateName](data); + }; + + // Initialise functions that require the browser API + + if(document && document.addEventListener && document.getElementsByTagName) { + function invokeFunctions(fns, config, args) { + if(config !== undefined && !allinea.isObject(config)) { + throw new Error('config must be an object'); + } + + try { + var self = this; + allinea.forEach(fns, function invokeFunction(fn) { + fn.apply(self, args); + }); + } + catch(e) { + if(!config || !config.quiet) { + console.error(e); + } + + if(document && document.body && this.partials.html.errorTemplate) { + document.body.innerHTML = this.partials.html.errorTemplate(e); + } + } + } + /* + Register a function to be called when a template has been fully loaded. + + Note, this allows the report engine to trap errors from dynamic + content during initialisation. + + fn: The function to call. + */ + ReportEngineObject.prototype.onInit = function onInit(fn) { + if(!allinea.isFunction(fn)) { + throw new Error('fn must be a function'); + } + + this.initFunctions.push(fn); + }; + + /* + Invoke all the init functions registered with this ReportEngine via + onInit. + */ + ReportEngineObject.prototype.invokeInitFunctions = function invokeInitFunctions(config) { + // NB: arguments is not an array, but it behaves like one so we + // can use Array functions on it + var args = Array.prototype.slice.call(arguments, 1) + + return invokeFunctions.call(this, this.initFunctions, config, args); + }; + + /* + Register a function to be called when the DOM has been built from a + template + + Note, this allows the report engine to trap errors from dynamic + content during initialisation. + + fn: The function to call. + */ + ReportEngineObject.prototype.afterRender = function onInit(fn) { + if(!allinea.isFunction(fn)) { + throw new Error('fn must be a function'); + } + + this.afterRenderFunctions.push(fn); + }; + + /* + Invoke all the post-render functions registered with this ReportEngine via + afterRender. + */ + ReportEngineObject.prototype.invokeAfterRenderFunctions = function invokeAfterRenderFunctions(config) { + // NB: arguments is not an array, but it behaves like one so we + // can use Array functions on it + var args = Array.prototype.slice.call(arguments, 1) + + return invokeFunctions.call(this, this.afterRenderFunctions, config, args); + }; + + /* + Dynamically register HTML templates from <script> tags with + type="text/html" and an id. + + The <script> tags will be removed from the page. + */ + ReportEngineObject.prototype.loadHtmlTemplates = function loadHtmlTemplates() { + var scripts = document.getElementsByTagName('script'); + var loadedScripts = []; + var self = this; + + allinea.forEach(scripts, function loadScriptAsTemplate(script) { + if (script && script.innerHTML && script.id) { + // text/html mime type for HTML templates + if(script.type === "text/html") { + self.registerPartial(script.id, 'html', script.innerHTML.trim()); + loadedScripts.unshift(script); + } + // text/plain mime type for text templates + else if(script.type === "text/plain") { + self.registerPartial(script.id, 'text', script.innerHTML.trim()); + loadedScripts.unshift(script); + } + // private/internal mime type for "all" + else if(script.type === "text/x.allinea-template") { + self.registerPartial(script.id, 'all', script.innerHTML.trim()); + loadedScripts.unshift(script); + } + } + }); + + for (i = 0, l = loadedScripts.length; i < l; i++) { + loadedScripts[i].parentNode.removeChild(loadedScripts[i]); + } + }; + } + + + // Create the global instance + ReportEngine = new ReportEngineObject(); +})(); +</script> + +<script>// Hacky function to simulate Math.fround function if not supported. +Math.fround = Math.fround || function(x) { + return Math.round(x * 1000000000) / 1000000000; +}; + +// Performance Reports specific functions +var perfReports = {}; +var window; +(function initPerfReports() { + // Format our byte value numbers to show at most 2 decimal places, but only if required to attain 3 digits of precision + // 1234.56 -> "1234" + // 12.3456 -> "12.3" + // 1.23456 -> "1.23" + // 0.00000 -> "0.00" + perfReports.formatNumber = function formatNumber(num) { + if(num !== null && num !== '' && isFinite(num)) { + if (num >= 100) return Number(num).toFixed(0); // 1234.56 -> 1234 + if (num >= 10) return Number(num).toFixed(1); // 12.3456 -> 12.3 + else return Number(num).toFixed(2); // 1.23456 -> 1.23 and 0 -> 0.00 + } + else { + return 'not supported '; + } + }; + + perfReports.formatPreciseNumber = function formatPreciseNumber(num) { + if(num !== null && num !== '' && isFinite(num)) { + // Divide by 1 removes trailing zeros + var accurate = "" + Number(num).toPrecision(6) / 1; + var formatted = "" + perfReports.formatNumber(num); + if (accurate.length >= formatted.length) { + return accurate; + } + return formatted; + } else { + return 'not supported '; + } + }; + + // SI scaling factors PR understands + perfReports.siFactors = [ + {factor: Math.pow(10, 9), prefix: 'G'}, + {factor: Math.pow(10, 6), prefix: 'M'}, + {factor: Math.pow(10, 3), prefix: 'k'}, + {factor: Math.pow(10, 0), prefix: ''}, + ]; + + // IEC scaling factors PR understands + perfReports.iecFactors = [ + {factor: Math.pow(2, 30), prefix: 'Gi'}, + {factor: Math.pow(2, 20), prefix: 'Mi'}, + {factor: Math.pow(2, 10), prefix: 'ki'}, + {factor: Math.pow(2, 0), prefix: ''}, + ]; + + // Select the appropriate factor for a given value + perfReports.chooseFactor = function chooseFactor(value, factors) { + for(var i=0; i<factors.length; ++i) { + if(Math.abs(value) >= factors[i].factor) { + return factors[i]; + } + } + + return factors[factors.length-1]; + }; + + // Return a value scaled according to the factors + perfReports.factorValue = function factorValue(value, factors) { + if(value != null) { + var factor = perfReports.chooseFactor(value, factors); + return value/factor.factor; + } + else { + return value; + } + }; + + // Return the units for a particular scale + perfReports.factorUnits = function factorUnits(value, factors, options) { + // Only bytes and bytes/s vary the unit/symbol used at the moment + var knownUnits = { + 'B': 'bytes', + 'B/s': 'bytes/s' + }; + var knownSymbols = { + 'bytes': 'B', + 'bytes/s': 'B/s' + }; + var factor = perfReports.chooseFactor(value, factors); + // prefer an explicit symbol, then a known mapping from units to symbol, then the units themselves + var symbol = options.symbol || knownSymbols[options.units] || options.units || ''; + // prefer explicit units, then a known mapping from symbol to units, then the symbol itself + var units = options.units || knownUnits[options.symbol] || options.symbol || ''; + return factor.prefix ? factor.prefix + symbol : units; + }; + + // Performance reports utility functions + perfReports.templateHelpers = { + // Use like {{number myNumberValue}} to apply formatNumber to myNumberValue + number: perfReports.formatNumber, + // Use like {{preciseNumber myNumberValue}} to apply toString to myNumberValue + preciseNumber: perfReports.formatPreciseNumber, + // Use like {{percent myNumberValue}} to format myNumberValue as a + // percentage (without % sign) + percent: function percent(value, options) { + if(value !== null && value !== '' && isFinite(+value)) { + if(+value > 0 && +value < 0.1) { + return '<0.1'; + } + else { + return (+value).toFixed(1); + } + } + else { + return 'not supported '; + } + }, + // Use like {{barWidth myNumberValue}} to force myNumberValue to a + // valid % bar width + barWidth: function barWidth(value, options) { + if(value !== null && value !== '' && isFinite(+value)) { + return Math.min(100, +value); + } + else { + return '0'; + } + }, + + + // Use like {{#if (isVisible ctx)}}any template text{{/if}} to show or + // hide content based on the value of "ctx.visible" and "ctx.hidden" + // (visible takes priority over hidden). If ctx.visible or ctx.hidden + // are strings they are resolved as dotted paths into the root scope. + // In some cases, some metrics can have a value of 0 but we still + // want to show them if that is the case. + isVisible: function isVisible(ctx, options) { + if(ctx.visible !== undefined) { + if(allinea.isString(ctx.visible)) { + return allinea.isMetricValueValid(allinea.lookup(options.data.root, ctx.visible)); + } + else { + return allinea.toBool(ctx.visible); + } + } + else { + if(allinea.isString(ctx.hidden)) { + return !allinea.isMetricValueValid(allinea.lookup(options.data.root, ctx.hidden)); + } + else { + return !allinea.toBool(ctx.hidden); + } + } + }, + + // Use like {{#each (normaliseMetrics metrics)}}...{{/each}} + // to normalise a set of metrics and loop over the results + normaliseMetrics: function(metrics, options) { + var newMetrics = []; + var maxValues = {}; + var numberOfMetricsInGroup = {}; //Map holding number of metrics in each group + + allinea.forEach(metrics, function(metric) { + function valueOrNull(val) { + if(typeof(val) === 'number') { + return isFinite(val) ? val : null; + } + else { + return null; + } + } + + var newMetric = Handlebars.Utils.extend(metric,{}); + newMetric.def = options.data.root.metricData[metric.metricId]; + + if(metric.metricId && !newMetric.def) { + console.warn('unknown metric: '+metric.metricId); + } + + var metricValue = allinea.lookup(options.data.root.data, newMetric.def && newMetric.def.value); + + if(!allinea.isObject(metricValue)) { + metricValue = {mean: metricValue}; + } + + newMetric.value = { + mean: valueOrNull(metricValue.mean), + min: valueOrNull(metricValue.min), + max: valueOrNull(metricValue.max), + stdev: valueOrNull(metricValue.stdev), + }; + + if(metric.group !== undefined) { + maxValues[metric.group] = Math.max( + maxValues[metric.group] || 0, + metric.value.min || 0, + metric.value.mean || 0, + metric.value.max || 0, + metric.maxBarValue || 0 + ); + //Increment number of metrics in this group + numberOfMetricsInGroup[metric.group] = (numberOfMetricsInGroup[metric.group] || 0) + 1; + } + + newMetrics.push(newMetric); + }); + + allinea.forEach(newMetrics, function(metric) { + metric.normalisedValue = metric.value; + + if(metric.group !== undefined) { + if(maxValues[metric.group] > 0) { + metric.normalisedValue = { + min: 100.0*metric.value.min/maxValues[metric.group], + mean: 100.0*metric.value.mean/maxValues[metric.group], + max: 100.0*metric.value.max/maxValues[metric.group], + stdev: 100.0*metric.value.stdev/maxValues[metric.group] + }; + } + //Don't show a bar for groups with only one item + metric.noBar = numberOfMetricsInGroup[metric.group] <= 1; + } + else if(metric.maxBarValue !== undefined) { + metric.normalisedValue = { + min: 100.0*metric.value.min/metric.maxBarValue, + mean: 100.0*metric.value.mean/metric.maxBarValue, + max: 100.0*metric.value.max/metric.maxBarValue, + stdev: 100.0*metric.value.stdev/metric.maxBarValue, + }; + } + }); + + return newMetrics; + }, + + // Use like {{lookupMetric metricId}} to get the value of a metric + lookupMetric: function lookupMetric(metricId, options) { + if(arguments.length !== 2) { + // one argument when used by a template that is! + throw new Error('lookupMetric requires one argument'); + } + + var metricDef = options.data.root.metricData[metricId]; + if(!metricDef || !metricDef.value) { + return undefined; + } + + var metricValue = allinea.lookup(options.data.root.data, metricDef.value); + + // Handle formatted metrics + if (metricValue && typeof metricValue === 'object' && metricValue.plain !== undefined) { + metricValue = metricValue.plain; + } + + // Handle double precision metrics + if (metricValue && typeof metricValue === 'object' && metricValue.value !== undefined) { + metricValue = metricValue.value; + } + + return metricValue; + }, + + // Use like {{lookupMetricDisplayName metricId}} to get the display name of a metric + lookupMetricDisplayName: function lookupMetricDisplayName(metricId, options) { + if(arguments.length !== 2) { + // one argument when used by a template that is! + throw new Error('lookupMetricDisplayName requires one argument'); + } + + var metricDef = options.data.root.metricData[metricId]; + if(!metricDef || !metricDef.displayName) { + return ''; + } + + return metricDef.displayName; + }, + + // Use like {{lookupMetricUnits metricId}} to get the units of a metric + lookupMetricUnits: function lookupMetricUnits(metricId, options) { + if(arguments.length !== 2) { + // one argument when used by a template that is! + throw new Error('lookupMetricUnits requires one argument'); + } + + var metricDef = options.data.root.metricData[metricId]; + if(!metricDef || !metricDef.units) { + return ''; + } + + return metricDef.units; + }, + + // Use like {{siValue value}} to get an S.I. scaled version of value + siValue: function siValue(value, options) { + return perfReports.factorValue(value, perfReports.siFactors); + }, + + // Use like {{siUnits value symbol="symbol" units="units"}} to get the + // units for a value + siUnits: function siUnits(value, options) { + return perfReports.factorUnits(value, perfReports.siFactors, options.hash); + }, + + // Use like {{iecValue value}} to get a scaled version of value + iecValue: function iecValue(value, options) { + return perfReports.factorValue(value, perfReports.iecFactors); + }, + + // Use like {{iecUnits value symbol="symbol" units="units"}} to get the + // units for a value. Symbol is used when a prefix is required, + // otherwise units is used. + iecUnits: function iecUnits(value, options) { + return perfReports.factorUnits(value, perfReports.iecFactors, options.hash); + }, + + // Use like {{customUnits value units}} to get the custom unit to + // display. The units should be in plural form. This function will try + // to remove trailing 'es' (where applicable) or 's'. + // e.g. {{customUnits 1 buses/hour}} will return 'bus/hour'. + customUnits: function customUnits(value, units) { + if (value !== 1) + return units; + + return units.split('/').map(function stripPlural(unit) { + if (unit.length === 1) + return unit; + + if (unit.substring(unit.length - 3) === 'ses') + return unit.substring(0, unit.length - 2); + + if (unit.substring(unit.length - 1) === 's') + return unit.substring(0, unit.length - 1); + + return unit; + }).join('/'); + }, + + // Use like {{percentToBar value}} to get a text bar representation + // of the percentage value. e.g. {{percentToBar 51}} will return + // '|=====|'. The maximum bar length is 21. + percentToBar: function percentToBar(value) { + value = Math.max(+value || 0, 0); + + var ret = '|'; + var numberOfEquals = Math.min( + Math.round(value/10), + 20 + ); + + ret += Array(numberOfEquals).join('='); + + if (value > 0) { + ret += '|'; + } + + return ret; + }, + + // Use like {{padLeft value maxLength}} to get a right aligned + // string filled with spaces before it. e.g. {{padLeft 'foo' 5}} + // will return ' foo'. If the value is longer than the maxLength, the + // result will be truncated from the end. + padLeft: function padLeft() { + if(arguments.length < 2 || arguments.length > 3) { + throw new Error('invalid usage of padLeft'); + } + + var options = arguments[arguments.length-1]; + var maxLength = arguments[arguments.length-2]; + var value = undefined; + + if(options.fn) { + // block form + if(arguments.length !== 2) { + throw new Error('invalid usage of padLeft, an argument is required when used as a block'); + } + + value = options.fn(this); + } + else { + // function form + if(arguments.length !== 3) { + throw new Error('invalid usage of padLeft, two arguments are required when used as a function'); + } + + value = arguments[0]; + } + + value = String(value); + maxLength = Math.max(+maxLength || 0, 0); + + var str = Array(maxLength + 1).join(' ') + value; + + return str.substring(str.length - maxLength); + }, + + // Use like {{padRight value maxLength}} to get a left aligned + // string filled with spaces after it. e.g. {{padRight 'foo' 5}} + // will return 'foo '. If the value is longer than the maxLength, the + // result will be truncated from the end. + padRight: function padRight() { + if(arguments.length < 2 || arguments.length > 3) { + throw new Error('invalid usage of padRight'); + } + + var options = arguments[arguments.length-1]; + var maxLength = arguments[arguments.length-2]; + var value = undefined; + + if(options.fn) { + // block form + if(arguments.length !== 2) { + throw new Error('invalid usage of padRight, an argument is required when used as a block'); + } + + value = options.fn(this); + } + else { + // function form + if(arguments.length !== 3) { + throw new Error('invalid usage of padRight, two arguments are required when used as a function'); + } + + value = arguments[0]; + } + + value = String(value); + maxLength = Math.max(+maxLength || 0, 0); + + var str = value + Array(maxLength + 1).join(' '); + + return str.substring(0, maxLength); + }, + + // Use like {{#csvEscape}}foo{{bar}}fooz{{/csvEscape}}, or {{csvEscape string}} + // to get an escaped string that can be embedded in a CSV file. + // e.g. 'foo " bar' will return '"foo "" bar"' + csvEscape: function csvEscape() { + if(arguments.length < 1 || arguments.length > 2) { + throw new Error('invalid usage of csvEscape'); + } + + var options = arguments[arguments.length-1]; + var value = undefined; + + if(options.fn) { + // block form + if(arguments.length !== 1) { + throw new Error('invalid usage of csvEscape, no arguments should be passed when used as a block'); + } + + value = options.fn(this); + } + else { + // function form + if(arguments.length !== 2) { + throw new Error('invalid usage of csvEscape, an argument is required when used as a function'); + } + + value = arguments[0]; + } + + value = String(value).replace(/"/g, '""'); + + if (value.indexOf(',') !== -1 || value.indexOf(' ') !== -1 || value.indexOf('\n') !== -1 || value.indexOf('"') !== -1) { + value = '"' + value + '"'; + } + + return value; + }, + }; + + // Merge two color codes together. + // Color codes shall be arrays containing three values (representing the + // three HSL components of a color). If a value is missing, it will be + // defaulted to zero. + perfReports.mergeColor = function mergeColor(c1, c2) { + var c = [0, 0, 0]; + + if (c1) { + c[0] = (+c1[0] || 0); + c[1] = (+c1[1] || 0); + c[2] = (+c1[2] || 0); + } + + if (c2) { + c[0] += (+c2[0] || 0); + c[1] += (+c2[1] || 0); + c[2] += (+c2[2] || 0); + } + + if (c[0] < 0) c[0] = 0; + if (c[0] > 360) c[0] = 360; + + if (c[1] < 0) c[1] = 0; + if (c[1] > 100) c[1] = 100; + + if (c[2] < 0) c[2] = 0; + if (c[2] > 100) c[2] = 100; + + return c; + }; + + // Compute the color code of a given colorName (i.e. 'cpu.mem'). + // If the color code cannot be found, "rgb(0, 0, 0)" will be returned. + perfReports.computeColor = function computeColor(colorData, colorName) { + if (!colorData) { + return "rgb(0, 0, 0)"; + } + + var color = [0, 0, 0]; + + // Either 'colorName' is stored explicitly as a hsl array, or the final hsl + // colour array should be derived by taking a 'default' value and modifying it + // according to the deltas held in the 'non-default' values. For example: + // + // colorData = { + // "cpu.multi_core": [77, 88, 99], + // "cpu": { + // "default": [100, 50, 50], + // "single_core": [ 5,-10, 15] + // } + // } + // + // If 'colorName' === "cpu.multi_core" return [77, 88, 99] + // If 'colorName' === "cpu.single_core" return [105, 40, 65] + // (the sum of [100, 50, 50] and [5,-10, 15]) + + if (colorData[colorName]===undefined || !Array.isArray(colorData[colorName])) + { + // 'colorName' is either not defined, or is defined but is not a hsl array. + var colorNames = colorName.split('.'); + for (var i in colorNames) { + colorData = colorData[colorNames[i]]; + if (colorData === undefined) { + return "rgb(0, 0, 0)"; + } else if (Array.isArray(colorData)) { + color = perfReports.mergeColor(color, colorData); + } else { + color = perfReports.mergeColor(color, colorData["default"]); + } + } + } + else + { + // Colour is held as an absolute value in the form of a hsl array + color = colorData[colorName]; + } + + // Return computed color + return perfReports.hslToRgb( + color[0] / 360, + color[1] / 100, + color[2] / 100); + }; + + // From http://axonflux.com/handy-rgb-to-hsl-and-rgb-to-hsv-color-model-c + /** + * Converts an HSL color value to RGB. Conversion formula + * adapted from http://en.wikipedia.org/wiki/HSL_color_space. + * Assumes h, s, and l are contained in the set [0, 1] and + * returns r, g, and b in the set [0, 255]. + * + * @param Number h The hue + * @param Number s The saturation + * @param Number l The lightness + * @return String The RGB representation + */ + perfReports.hslToRgb = function hslToRgb(h, s, l){ + var r, g, b; + + function hue2rgb(p, q, t){ + if(t < 0) t += 1; + if(t > 1) t -= 1; + if(t < 1/6) return p + (q - p) * 6 * t; + if(t < 1/2) return q; + if(t < 2/3) return p + (q - p) * (2/3 - t) * 6; + return p; + } + + var q = l < 0.5 ? l * (1 + s) : l + s - l * s; + var p = 2 * l - q; + r = hue2rgb(p, q, h + 1/3); + g = hue2rgb(p, q, h); + b = hue2rgb(p, q, h - 1/3); + + return "rgb(" + + Math.round(Math.fround(r) * 255) + ", " + + Math.round(Math.fround(g) * 255) + ", " + + Math.round(Math.fround(b) * 255) + ")"; + }; + + // Set the title of the document + perfReports.setDocumentTitleFromTemplate = function setDocumentTitleFromTemplate(context) { + if(ReportEngine.hasPartial('titleTemplate')) { + document.title = ReportEngine.render( + 'titleTemplate', + 'html', + context + ); + } + }; + + // Create CSS rules for perf-report colors + perfReports.makeCssColorRules = function makeCssColorRules(colorData, colorName, colorValue) { + + if (Array.isArray(colorData)) { + allinea.sheet.insertRule( + "[class='" + colorName + "'] " + + "{ color : " + + perfReports.hslToRgb( + colorValue[0] / 360, + colorValue[1] / 100, + colorValue[2] / 100 + ) + + "; }", + 0 + ); + allinea.sheet.insertRule( + "[class='bar'] [class='" + colorName + "'] " + + "{ background-color : " + + perfReports.hslToRgb( + colorValue[0] / 360, + colorValue[1] / 100, + colorValue[2] / 100 + ) + + "; }", + 0 + ); + } else { + colorValue = perfReports.mergeColor(colorValue, colorData["default"]); + for (var key in colorData) { + var newColorName; + var newColorValue; + if (key !== "default") { + newColorName = colorName ? colorName + "." + key : key; + newColorValue = perfReports.mergeColor(colorValue, colorData[key]); + } else { + newColorName = colorName; + newColorValue = colorValue; + } + + makeCssColorRules(colorData[key], newColorName, newColorValue); + } + } + }; + + if(window && window.d3) { + // get radar chart data + perfReports.makeRadarData = function makeRadarData(jsonData) { + var result = { + data: [], + axisColors: [], + maxAxis: null, + options: { + w: 200, + h: 200, + factor: 0.7, + fontSize: 16, + radius: 0, + opacityArea: 0.64, + maxValue: 100, + color: function() { return '#bb58d6'; } + } + }; + + var maxValue; + + if(!jsonData || !jsonData.summaryData || !jsonData.summaryData.rows) { + return null; + } + + for(var i=0; i<jsonData.summaryData.rows.length; ++i) { + var row = jsonData.summaryData.rows[i]; + + if(!perfReports.templateHelpers.isVisible(row,{data:{root:jsonData}})) { + continue; + } + + // prefer the chartLabel, but fallback to the heading if not + // specified + var axis = row.chartLabel || row.heading; + var value = perfReports.templateHelpers.lookupMetric( + row.metricId, + {data:{root:jsonData}} + ); + + if(result.maxAxis === null || value > maxValue) { + maxValue = value; + result.maxAxis = result.data.length; + } + + result.data.push({ + axis: axis, + value: value + }); + result.axisColors.push( + perfReports.computeColor(jsonData.colorData, row.colorName) + ); + } + + if(jsonData.summaryData.primaryBound) { + var bound = allinea.lookup(jsonData.data, jsonData.summaryData.primaryBound); + if(bound) { + result.options.color = function() { + return perfReports.computeColor(jsonData.colorData, bound); + } + } + } + else if(result.maxAxis !== null) { + result.options.color = function() { + return result.axisColors[result.maxAxis]; + } + } + + return result.data.length >= 3 ? result : null; + }; + } + + if(document && document.getElementById) { + perfReports.toggleMetric = function toggleMetric(event, id) { + event.preventDefault(); + + var e = document.getElementById(id); + + var classes = e.className.match(/\S+/g) || [], + index = classes.indexOf('show'); + + if(index >= 0) { + classes.splice(index, 1) + } + else { + classes.push('show'); + } + + e.className = classes.join(' '); + } + } +})(); + +ReportEngine.registerHelpers({all: perfReports.templateHelpers}); + +if(ReportEngine.afterRender) { + ReportEngine.afterRender(perfReports.setDocumentTitleFromTemplate); + + ReportEngine.afterRender(function createColorCss(jsonData) { + if (jsonData && jsonData.colorData) { + perfReports.makeCssColorRules(jsonData.colorData); + } + }); + + if(perfReports.makeRadarData) { + ReportEngine.afterRender(function renderRadarChar(jsonData) { + var radarData = perfReports.makeRadarData(jsonData); + + for(var i=0; i<radarData.axisColors.length; ++i) { + allinea.sheet.insertRule( + "#time_radar .legend_axis" + i + "{ fill: " + radarData.axisColors[i] + "}", + 0 + ); + } + + RadarChart.draw("#time_radar", [ radarData.data ], radarData.options); + }); + } +} + +</script> + +<script id="errorTemplate" type="text/html"> + <div id="content"> + <div id="error"> + <p>An error has occurred: .</p> + + + + <p> + Please contact <a href="https://developer.arm.com/products/software-development-tools/hpc/get-support">support</a> and + let us know which web browser you are using, the browser version, and attach this report if possible. + </p> + </div> + </div> +</script> + +<script id="applicationDetailsTemplate" type="text/html"><table> + {{#each headerData}} + {{#if (isVisible this)}} + {{#with (trim (eval valueHtmlTemplate @root.data self=this)) as |valueHtml|}} + <tr> + <td class="details_key">{{../caption}}:</td> + <td id="{{../id}}">{{{valueHtml}}}</td> + </tr> + {{/with}} + {{/if}} + {{/each}} +</table> +</script> + +<script id="headerMemoryTemplate" type="text/html">{{#with applicationDetails}} + {{#if hostMemory.plain.value}} + {{#with (lookupMetric "applicationDetails.hostMemory.plain") as |value|}} + {{#with (lookupMetricUnits "applicationDetails.hostMemory.plain") as |units|}}{{toFixed (iecValue value) 0}} {{iecUnits value symbol=units}} per node{{/with ~}} + {{/with ~}} + {{#if hasGpu ~}} + {{#with (lookupMetric "applicationDetails.hostGpuMemory.plain") as |value| ~}} + {{#with (lookupMetricUnits "applicationDetails.hostGpuMemory.plain") as |units|}}, {{toFixed (iecValue value) 0}} {{iecUnits value symbol=units}} per GPU{{/with}} + {{/with}} + {{/if}} + {{/if}} +{{/with}} +</script> + +<script id="headerResourcesTemplate" type="text/html">{{#with applicationDetails}} + {{#if nodes.plain}} + {{#with (lookupMetric "applicationDetails.nodes.plain") as |value|}} + {{#with (lookupMetricUnits "applicationDetails.nodes.plain") as |units|}} + {{value}} {{customUnits value units}} + {{/with}} + {{/with}} + {{#if physicalCoresPerNode}} + ({{physicalCoresPerNode}} physical, + {{logicalCoresPerNode}} logical cores per node) + {{/if}} + {{#if hasGpu}} + <br /> + {{#with (lookupMetric "applicationDetails.gpusPerNode.plain") as |value|}} + {{#with (lookupMetricUnits "applicationDetails.gpusPerNode.plain") as |units|}} + {{value}} {{customUnits value units}} per node available + {{/with}} + {{/with}} + {{/if}} + {{/if}} +{{/with}} +</script> + +<script id="headerTasksTemplate" type="text/html">{{#with applicationDetails}} + {{#if processes}} + {{#with (lookupMetric "applicationDetails.processes.plain") as |value|}} + {{#with (lookupMetricUnits "applicationDetails.processes.plain") as |units|}}{{value}} {{customUnits value units}}{{/with ~}} + {{/with ~}} + {{#if isOpenMp}}, OMP_NUM_THREADS was {{ompNumThreads}}{{/if}} + {{/if}} +{{/with}} +</script> + +<script id="headerTimeTemplate" type="text/html">{{#with applicationDetails}} + {{#if time}} + {{#with (lookupMetric "applicationDetails.time.plain") as |value|}} + {{#with (lookupMetricUnits "applicationDetails.time.plain") as |units|}} + {{value}} {{customUnits value units}} + {{/with}} + {{/with}} + {{#if (greater time.plain 60) }} + {{#with (lookupMetric "applicationDetails.time.plain") as |value|}} + {{#with (lookupMetricUnits "applicationDetails.time.plain") as |units|}} + (about {{toFixed (div value 60) 0}} {{customUnits value "minutes"}}) + {{/with}} + {{/with}} + {{/if}} + {{/if}} +{{/with}} +</script> + +<script id="html_template" type="text/html"><div id="content"> + <div class="header"> + <div class="logo" id="logo"> + {{>logoTemplate}} + </div> + <div class="header_left"> + <div class="application_details" id="applicationDetails"> + {{>applicationDetailsTemplate}} + </div> + </div> + <div id="time_radar"></div> + <div class="clear"></div> + </div> + <hr /> + <!--[if lte IE 8]> + <div id="error"> + <p><strong>Your browser is out of date!</strong></p> + <p>The graphs in this Performance Report require a modern browser.</p> + <p><a href="http://browsehappy.com/">Upgrade your browser</a> for the best experience!</p> + </div> + <![endif]--> + + <div class="summary" id="summary"> + {{>summaryTemplate}} + </div> + <hr /> + <div class="subsections" id="subsections"> + {{>subsectionsTemplate}} + </div> +</div> +</script> + +<script id="logoTemplate" type="text/html">{{#each brandingData.logos}}<div> + {{#if link}}<a href="{{link}}" target="_blank">{{/if}} + <img src="{{image}}" width="130" height="{{height}}" + {{#if altData}}onerror="this.onerror=null;this.src='{{altData}}'"{{/if}} + /> + {{#if link}}</a>{{/if}} +</div>{{/each}} +</script> + +<script id="subsectionsTemplate" type="text/html">{{#*inline "metricName"}} + {{~#if (anyNotNull metric.value.min metric.value.max metric.value.stdev metric.descriptionHtmlTemplate)~}} + <a href title="click for more information" class="toggle" onclick="perfReports.toggleMetric(event,'{{metric.def.displayName}} detail')"> + {{~/if~}} + {{#if metric.tooltip}} + <abbr title="{{metric.tooltip}}"> + {{/if}} + {{#if metric.displayName}} + {{metric.displayName}} + {{else}} + {{metric.def.displayName}} + {{/if}} + {{#if metric.tooltip}} + </abbr> + {{/if}} + {{~#if (anyNotNull metric.value.min metric.value.max metric.value.stdev metric.descriptionHtmlTemplate)~}} + </a> + {{~/if~}} +{{/inline}} + +{{#*inline "metricValue"}} + {{#if useIEC}} + <span class="{{colorName}}" title="{{preciseNumber (iecValue value)}}"> + {{number (iecValue value)}} + </span> + <span> + {{iecUnits value symbol=def.units}} + </span> + {{else}} + <span class="{{colorName}}" title="{{preciseNumber (siValue value)}}"> + {{number (siValue value)}} + </span> + <span> + {{siUnits value symbol=def.units}} + </span> + {{/if}} +{{/inline}} + +{{#*inline "metricBar"}} + {{#if (anyNotNull metric.value.min metric.value.max)}} + <div class="barBox" style=" + left: {{barWidth metric.normalisedValue.min}}%; + top: 0.5em; margin-top: -2px; + height: 9px; + width: 1px; + min-width: 1px; + max-width: 1px; + "></div> + <div class="barBox" style=" + left: {{barWidth metric.normalisedValue.max}}%; + top: 0.5em; margin-top: -2px; + height: 9px; + width: 1px; + min-width: 1px; + max-width: 1px; + "></div> + <div class="barBox" style=" + left: {{barWidth metric.normalisedValue.min}}%; + width: {{barWidth (sub metric.normalisedValue.max metric.normalisedValue.min)}}%; + top: 0.5em; margin-top: 2px; + height: 1px; + "></div> + {{/if}} + <div class="{{colorName}}" style=" + width: {{barWidth metric.normalisedValue.mean}}%; + height: 1em"></div> + <div style="width:50px; height: 0px"></div> +{{/inline}} + +{{#*inline "percentageDetailSection"}} + {{#condenseSpace}} + {{#if metric.descriptionHtmlTemplate}} + <span class="inlinedDescription">{{{eval metric.descriptionHtmlTemplate @root.data}}}</span> + {{/if}} + + {{#if (anyNotNull metric.value.min metric.value.max metric.value.stdev)}} + <table class="tip"> + {{#if (anyNotNull metric.value.min)}}<tr> + <th class="right_cell">Min</th> + <td class="right_cell"><span class="{{colorName}}" title="{{preciseNumber metric.value.min}}">{{percent metric.value.min}}</span>%</td> + <td>Rank {{metric.value.minRank}} on {{metric.value.minNode}}</span></td> + </tr>{{/if}} + {{#if (anyNotNull metric.value.mean)}}<tr> + <th class="right_cell">Mean</th> + <td class="right_cell"><span class="{{colorName}}" title="{{preciseNumber metric.value.mean}}">{{percent metric.value.mean}}</span>%</td> + <td></td> + </tr>{{/if}} + {{#if (anyNotNull metric.value.max)}}<tr> + <th class="right_cell">Max</th> + <td class="right_cell"><span class="{{colorName}}" title="{{preciseNumber metric.value.max}}">{{percent metric.value.max}}</span>%</td> + <td>Rank {{metric.value.maxRank}} on {{metric.value.maxNode}}</span></td> + </tr>{{/if}} + {{#if (anyNotNull metric.value.stdev)}}<tr> + <th class="right_cell">S.D.</th> + <td class="right_cell"><span class="{{colorName}}" title="{{preciseNumber metric.value.stdev}}">{{percent metric.value.stdev}}</span>%</td> + <td></td> + </tr>{{/if}} + </table> + {{/if}} + {{/condenseSpace}} +{{/inline}} + +{{#*inline "numberDetailSection"}} + {{#condenseSpace}} + {{!-- + dirk (malp) Test Min/Max (% and 0) more, investigate style differences. + dirk (malp) Min/Max chart color is currently black. + See https://github.com/bgrins/TinyColor for shades? + --}} + + {{#if metric.descriptionHtmlTemplate}} + <span class="inlinedDescription">{{{eval metric.descriptionHtmlTemplate @root.data self=metric}}}</span> + {{/if}} + + {{#if (anyNotNull metric.value.min metric.value.max metric.value.stdev)}} + <table class="tip"> + {{#if (anyNotNull metric.value.min)}}<tr> + <th class="right_cell">Min</th> + <td class="right_cell"> + {{> metricValue metric value=metric.value.min}} + </td> + <td>Rank {{metric.value.minRank}} on {{metric.value.minNode}}</span></td> + </tr>{{/if}} + <tr> + <th class="right_cell">Mean</th> + <td class="right_cell"> + {{> metricValue metric value=metric.value.mean}} + </td> + <td></td> + </tr> + {{#if (anyNotNull metric.value.max)}}<tr> + <th class="right_cell">Max</th> + <td class="right_cell"> + {{> metricValue metric value=metric.value.max}} + </td> + <td>Rank {{metric.value.maxRank}} on {{metric.value.maxNode}}</span></td> + </tr>{{/if}} + {{#if (anyNotNull metric.value.stdev)}}<tr> + <th class="right_cell">S.D.</th> + <td class="right_cell"> + {{> metricValue metric value=metric.value.stdev}} + </td> + <td></td> + </tr>{{/if}} + </table> + {{/if}} + {{/condenseSpace}} +{{/inline}} + +{{#*inline "percentageTemplate"}} + <tr id="{{#makeId}}subsection-metric-{{metric.def.displayName}}{{/makeId}}"> + <td style="white-space: nowrap;">{{>metricName}}</td> + <td style="white-space: nowrap;" class="right_cell"><span class="{{colorName}}" title="{{preciseNumber metric.value.mean}}">{{percent metric.value.mean}}</span>%</td> + {{#unless metric.noBar}} + <td style="white-space: nowrap;" class="bar">{{>metricBar}}</td> + {{/unless}} + <td style="width:100%"></td> + </tr> + <tr> + <td colspan="4" id="{{metric.def.displayName}} detail" class="metricDetail"><div>{{>percentageDetailSection}}</div></td> + </tr> +{{/inline}} + +{{#*inline "numberTemplate"}} + <tr id="{{#makeId}}subsection-metric-{{metric.def.displayName}}{{/makeId}}"> + <td style="white-space: nowrap;">{{>metricName}}</td> + <td style="white-space: nowrap;" class="right_cell"> + {{> metricValue metric value=metric.value.mean}} + </td> + {{#unless metric.noBar}} + <td style="white-space: nowrap;" class="bar">{{>metricBar}}</td> + {{/unless}} + <td style="width:100%"></td> + </tr> + <tr> + <td colspan="4" id="{{metric.def.displayName}} detail" class="metricDetail"><div>{{>numberDetailSection}}</div></td> + </tr> +{{/inline}} + +{{#*inline "spacerTemplate"}} + <tr class="spacer"><td></td><td></td><td></td><td></td></tr> +{{/inline}} + +{{#each subsections}}{{#if (isVisible this)}}<div class="subsection" id="{{#makeId}}subsection-{{heading}}{{/makeId}}"> + {{increment 'subsectionIndex' scope=..}} + <h2 class="{{colorName}}">{{heading}}</h2> + <div>{{eval descriptionHtmlTemplate @root.data self=this}}</div> + <table class="metric_chart_table"> + {{#each (normaliseMetrics metrics)}}{{#if template}}{{#if (isVisible this)}} + {{> (lookup this 'template') metric=this}} + {{/if}}{{/if}}{{/each}} + </table> + <div> + {{#each (eval adviceHtmlTemplate @root.data self=this)}}{{#if this}}<div class="explanation">{{this}}</div>{{/if}}{{/each}} + </div> + {{#with (eval errorHtmlTemplate @root.data self=this)}}{{#if this}}<div class="explanation">{{this}}</div>{{/if}}{{/with}} +</div> +<!-- it would be nice to do this with CSS, but IE8... :( --> +{{#if (isOdd ../subsectionIndex)}}<div class="clear"></div>{{/if}} +{{/if}}{{/each}} +<div class="clear"></div> +</script> + +<script id="summaryTemplate" type="text/html"><div class="heading">{{eval summaryData.headingHtmlTemplate @root.data self=summaryData}}</div> +<table class="summary_table"> + {{#each summaryData.rows}}{{#if (isVisible this)}}<tr id="{{#makeId}}summary-entry-{{heading}}{{/makeId}}"> + <td><h2 class="{{colorName}}">{{heading}}</h2></td> + {{#with (lookupMetric metricId) as |value|}} + <td class="percent" title="{{preciseNumber value}}">{{percent value}}%</td> + <td class="bar_graph"><div class="bar"><div class="{{../colorName}}" style="width: {{barWidth value}}%"></div></div></td> + {{/with}} + <td class="details"><p>{{eval descriptionHtmlTemplate @root.data self=this}}</p><p>{{eval adviceHtmlTemplate @root.data self=this}}</p></td> + </tr>{{/if}}{{/each}} +</table> +<div class="overview_general_advice"> + <p>{{eval summaryData.footerHtmlTemplate @root.data self=summaryData}}</p> + <p>{{eval summaryData.adviceHtmlTemplate @root.data self=summaryData}}</p> +</div> +</script> + +<script id="titleTemplate" type="text/html">{{data.applicationDetails.exeName}} - Performance Report +</script> + +<script id="csv_template" type="text/plain">Name,Value +{{!-- Output header metrics --}} +{{#each headerData}} + {{#unless csvHidden}} + {{#if (isVisible this)}} + {{#with (lookupMetricUnits metricId) as |units|}} + {{~#csvEscape~}} + {{{../../caption}}} ({{units}}) + {{~/csvEscape~}}, + {{~#csvEscape~}} + {{{lookupMetric ../../metricId}}} + {{~/csvEscape}} + + {{else}} + {{~#csvEscape~}} + {{{caption}}} + {{~/csvEscape~}}, + {{~#csvEscape~}} + {{{lookupMetric metricId}}} + {{~/csvEscape}} + + {{/with}} + {{/if}} + {{/unless}} +{{/each}} +{{!-- Output bound --}} +{{#csvEscape~}} + Bound +{{~/csvEscape~}}, +{{~#csvEscape~}} + {{{data.overview.bound1.long}}} +{{~/csvEscape}} + + +{{!-- Output summary metrics --}} +{{#each summaryData.rows}} + {{#if (isVisible this)}} + {{#with (lookupMetricUnits metricId) as |units|}} + {{~#csvEscape~}} + {{#condenseSpace}}{{{../../heading}}}{{/condenseSpace}} ({{units}}) + {{~/csvEscape}}, + {{~#csvEscape~}} + {{{lookupMetric ../../metricId}}} + {{~/csvEscape}} + + {{else}} + {{~#csvEscape~}} + {{{heading}}} + {{~/csvEscape~}}, + {{~#csvEscape~}} + {{{lookupMetric metricId}}} + {{~/csvEscape}} + + {{/with}} + {{/if}} +{{/each}} +{{!-- Output overview advice --}} +{{#csvEscape~}} + Overview advice +{{~/csvEscape~}}, +{{~#csvEscape~}} + {{{htmlToText (eval summaryData.adviceHtmlTemplate @root.data self=summaryData)}}} +{{~/csvEscape}} + + +{{#*inline "metricName"~}} +{{#if displayName}}{{{displayName}}}{{else}}{{{lookupMetricDisplayName metricId}}}{{/if}} +{{~/inline}} +{{!-- Output subections --}} +{{#each subsections}} + {{#if (isVisible this)}} + {{!-- Output subsection metrics --}} + {{#each metrics}} + {{#if (isVisible this)}} + {{#with (lookupMetricUnits metricId) as |units|}} + {{~#csvEscape~}} + {{{../../../heading}}} {{>metricName ../..}} ({{units}}) + {{~/csvEscape~}}, + {{~#csvEscape~}} + {{{lookupMetric ../../metricId}}} + {{~/csvEscape}} + + {{else}} + {{~#csvEscape~}} + {{{../heading}}} {{>metricName ../..}} + {{~/csvEscape~}}, + {{~#csvEscape~}} + {{{lookupMetric metricId}}} + {{~/csvEscape}} + + {{/with}} + {{/if}} + {{/each}} + {{!-- Output subsection advices --}} + {{#each (eval adviceHtmlTemplate @root.data self=this)}} + {{#with (htmlToText this) as |advice|}} + {{~#csvEscape~}} + {{{../../../heading}}} Advice {{add @index 1}} + {{~/csvEscape~}}, + {{~#csvEscape~}} + {{{advice}}} + {{~/csvEscape}} + + {{else}} + {{~#csvEscape~}} + {{{../heading}}} Advice {{add @index 1}} + {{~/csvEscape}}, + {{/with}} + {{/each}} + {{~#csvEscape~}} + {{{heading}}} Error + {{~/csvEscape}}, + {{~#csvEscape~}} + {{{htmlToText (eval errorHtmlTemplate @root.data self=this)}}} + {{~/csvEscape}} + + + {{/if}} +{{/each}} +</script> + +<script id="headerResourcesTemplate" type="text/plain">{{#*inline "coresPerNodeString"~}} + {{physicalCoresPerNode}} physical, {{logicalCoresPerNode}} logical cores per node +{{~/inline}} +{{#*inline "gpusPerNodeString"~}} + {{~#with (lookupMetric "applicationDetails.gpusPerNode.plain") as |value|~}} + {{~#with (lookupMetricUnits "applicationDetails.gpusPerNode.plain") as |units|~}} + {{value}} {{customUnits value units}} per node available + {{~/with~}} + {{~/with~}} +{{~/inline~}} + +{{~#with applicationDetails~}} + {{~#if nodes.plain~}} + {{~#with (lookupMetric "applicationDetails.nodes.plain") as |value|~}} + {{~#with (lookupMetricUnits "applicationDetails.nodes.plain") as |units|~}} + {{value}} {{customUnits value units}} + {{~/with~}} + {{~/with~}} + {{~#if physicalCoresPerNode~}} + {{! leading space }} ( + {{~> coresPerNodeString~}} + {{~#if hasGpu~}} + , {{> gpusPerNodeString~}} + {{~/if~}} + ) + {{~else~}} + {{~#if hasGpu~}} + {{! leading space }} ({{> gpusPerNodeString}}) + {{~/if~}} + {{~/if~}} + {{~/if~}} +{{~/with~}} +</script> + +<script id="text_header" type="text/plain">{{#each headerData}} + {{#if (isVisible this)}} + {{#trimLeft}} + {{#with (trim (eval valueHtmlTemplate @root.data self=this)) as |valueHtml|}} + {{#padRight 15}}{{{../../caption}}}:{{/padRight}} {{{htmlToText valueHtml}}} + {{/with}} + {{/trimLeft}} + {{/if}} +{{/each}} +</script> + +<script id="text_subsections" type="text/plain">{{!---------------------------------------------------------------------------}} +{{#*inline "metricName"~}} +{{#if displayName}}{{displayName}}{{else}}{{def.displayName}}{{/if}} +{{~/inline}} +{{!---------------------------------------------------------------------------}} +{{#*inline "percentageTemplate"}} + {{~#padRight 42}}{{>metricName metric}}:{{/padRight~}} + {{#if (isEqual (trim (percent metric.value.mean)) "not supported")}} + {{~trim (percent metric.value.mean)}} + {{else}} + {{~#padLeft 8}}{{{percent metric.value.mean}}}%{{/padLeft}} {{{percentToBar metric.value.mean}}} + {{/if}} +{{/inline}} +{{!---------------------------------------------------------------------------}} +{{#*inline "metricValue"}} + {{#if useIEC}} + {{~#padLeft 8}}{{number (iecValue value)}}{{/padLeft}} {{iecUnits value symbol=def.units}} + {{else}} + {{~#padLeft 8}}{{number (siValue value)}}{{/padLeft}} {{siUnits value symbol=def.units}} + {{/if}} +{{/inline}} +{{!---------------------------------------------------------------------------}} +{{#*inline "numberTemplate"}} + {{~#padRight 42}}{{>metricName metric}}:{{/padRight~}} + {{#if (isEqual (trim (number metric.value.mean)) "not supported")}} + {{~trim (number metric.value.mean)}} + {{else}} + {{~> metricValue metric value=metric.value.mean }} + {{/if}} +{{/inline}} +{{!---------------------------------------------------------------------------}} +{{#*inline "spacerTemplate"}} +{{/inline}} +{{!---------------------------------------------------------------------------}} +{{#each subsections}} + {{#if (isVisible this)}} + {{#trimLeft}} + {{{heading}}}: + {{/trimLeft}} + {{#trimLeft}} + {{#with (trim (eval descriptionHtmlTemplate @root.data self=this)) as |descHtml|}} + {{{htmlToText descHtml}}} + {{/with}} + {{/trimLeft}} + {{#each (normaliseMetrics metrics)}} + {{#if template}} + {{#if (isVisible this)}} + {{!-- {for example, numberTemplate or percentTemplate}} --}} + {{~> (lookup this 'template') metric=this}} + {{/if}} + {{/if}} + {{/each}} + {{#each (eval adviceHtmlTemplate @root.data self=this) as |adviceHtml|}} + {{#if (trim adviceHtml)}} + {{~#trim}}{{{htmlToText adviceHtml}}}{{/trim}} + {{/if}} + {{/each}} + {{#trimLeft}} + {{#with (trim (eval errorHtmlTemplate @root.data self=this)) as |errorHtml|}} + {{{htmlToText errorHtml}}} + {{/with}} + {{/trimLeft}} + {{!-- {{the below whitespace is here for dramatic effect}} --}} + + {{/if}} +{{/each}} +</script> + +<script id="text_summary" type="text/plain">{{#with summaryData}} + {{#trimLeft}} + {{#with (trim (eval headingHtmlTemplate @root.data self=this)) as |valueHtml|}} + {{{htmlToText valueHtml}}} + {{/with}} + {{/trimLeft}} + {{#each rows}} + {{#trimLeft}} + {{#with (lookupMetric metricId) as |value|}} + {{#padRight 42}}{{{../../heading}}}:{{/padRight}} {{~#padLeft 8}}{{percent value}}%{{/padLeft}} {{{percentToBar value}}} + {{/with}} + {{/trimLeft}} + {{/each}} + {{#trimLeft}} + {{{htmlToText (eval footerHtmlTemplate @root.data self=this)}}} + {{/trimLeft}} + {{#trimLeft}} + {{{htmlToText (eval adviceHtmlTemplate @root.data self=this)}}} + {{/trimLeft}} +{{/with}} +</script> + +<script id="text_template" type="text/plain">{{>text_header}} + +{{>text_summary}} + +{{>text_subsections}} +</script> + +<script> + ReportEngine.onInit(function renderReport() { + var jsonData = allinea.getElementJson('jsonData'); + document.body.innerHTML = ReportEngine.render( + 'html_template', + 'html', + jsonData + ); + ReportEngine.invokeAfterRenderFunctions({}, jsonData); + }); +</script> + +</head> + +<body> + <div id="content"> + <div id="error"> + <p><strong>Error: JavaScript is not running</strong></p> + <p>This report requires <strong>JavaScript</strong>, which is disabled or not working.</p> + <p>Check whether your JavaScript support is enabled or try another browser.</p> + <p>Remember, you can always contact <a href="https://developer.arm.com/products/software-development-tools/hpc/get-support">support</a>, we're very nice!</p> + <p>Let us know which web browser you are using, the browser version, and attach this report if possible.</p> + </div> + </div> +</body> + +</html> diff --git a/report/day1/benchmark-slow/swift_mpi_1p_1n_2021-01-21_15-56.txt b/report/day1/benchmark-slow/swift_mpi_1p_1n_2021-01-21_15-56.txt new file mode 100644 index 0000000000000000000000000000000000000000..d13c387db186e837f4901b71140d6bcd3aa46d7b --- /dev/null +++ b/report/day1/benchmark-slow/swift_mpi_1p_1n_2021-01-21_15-56.txt @@ -0,0 +1,62 @@ +Command: /cosma/home/ds007/dc-fraw1/performance_analysis_workshop/swift-cs-performance-workshop-2021/benchmark-slow/swiftsim/examples/swift_mpi --cosmology --self-gravity -v 1 --threads=64 -n 1 -P Restarts:enable:0 -PInitialConditions:file_name:/cosma5/data/do008/dc-fraw1/swift_initial_conditions/pmillenium/PMill-768.hdf5 p-mill-768.yml +Resources: 1 node (32 physical, 64 logical cores per node) +Memory: 503 GiB per node +Tasks: 1 process +Machine: b108.pri.cosma7.alces.network +Start time: Thu Jan 21 15:56:08 2021 +Total time: 1714 seconds (about 29 minutes) +Full path: /cosma/home/ds007/dc-fraw1/performance_analysis_workshop/swift-cs-performance-workshop-2021/benchmark-slow/swiftsim/examples + +Summary: swift_mpi is Compute-bound in this configuration +Compute: 94.7% |========| +MPI: 0.1% || +I/O: 5.2% || +This application run was Compute-bound. A breakdown of this time and advice for investigating further is in the CPU section below. +As very little time is spent in MPI calls, this code may also benefit from running at larger scales. + +CPU: +A breakdown of the 94.7% CPU time: +Scalar numeric ops: 12.5% || +Vector numeric ops: 32.9% |==| +Memory accesses: 54.6% |====| +The per-core performance is memory-bound. Use a profiler to identify time-consuming loops and check their cache performance. + +MPI: +A breakdown of the 0.1% MPI time: +Time in collective calls: 100.0% |=========| +Time in point-to-point calls: 0.0% | +Effective process collective rate: 750 MB/s +Effective process point-to-point rate: 0.00 bytes/s + +I/O: +A breakdown of the 5.2% I/O time: +Time in reads: 100.0% |=========| +Time in writes: 0.0% | +Effective process read rate: 99.5 MB/s +Effective process write rate: 0.00 bytes/s +Most of the time is spent in read operations with a low effective transfer rate. This may be caused by contention for the filesystem or inefficient access patterns. Use an I/O profiler to investigate which write calls are affected. + +Threads: +A breakdown of how multiple threads were used: +Computation: 96.4% |=========| +Synchronization: 3.6% || +Physical core utilization: 165.5% |================| +System load: 161.8% |===============| +The system load is high. Check that other jobs or system processes are not running on the same nodes. + +Memory: +Per-process memory usage may also affect scaling: +Mean process memory usage: 59.1 GiB +Peak process memory usage: 74.7 GiB +Peak node memory usage: 16.0% |=| +The peak node memory usage is very low. Larger problem sets can be run before scaling to multiple nodes. + +Energy: +A breakdown of how energy was used: +CPU: not supported +System: not supported +Mean node power: not supported +Peak node power: 0.00 W +Energy metrics are not available on this system. +CPU metrics are not supported (no intel_rapl module) +