

































<style>
.labeled-checkbox {
  display: flex;
  white-space: nowrap;
}
</style>



















<template id="overlay-template">
<style>
    overlay-mask {
      left: 0;
      padding: 8px;
      position: absolute;
      top: 0;
      z-index: 1000;
      font-family: sans-serif;
      -webkit-justify-content: center;
      background: rgba(0, 0, 0, 0.8);
      display: -webkit-flex;
      height: 100%;
      left: 0;
      position: fixed;
      top: 0;
      width: 100%;
    }
    overlay-mask:focus {
      outline: none;
    }
    overlay-vertical-centering-container {
      -webkit-justify-content: center;
      -webkit-flex-direction: column;
      display: -webkit-flex;
    }
    overlay-frame {
      z-index: 1100;
      background: rgb(255, 255, 255);
      border: 1px solid #ccc;
      margin: 75px;
      display: -webkit-flex;
      -webkit-flex-direction: column;
    }
    title-bar {
      -webkit-align-items: center;
      -webkit-flex-direction: row;
      border-bottom: 1px solid #ccc;
      background-color: #ddd;
      display: -webkit-flex;
      padding: 5px;
      -webkit-flex: 0 0 auto;
    }
    title {
      display: inline;
      font-weight: bold;
      -webkit-box-flex: 1;
      -webkit-flex: 1 1 auto;
    }
    close-button {
      -webkit-align-self: flex-end;
      border: 1px solid #eee;
      background-color: #999;
      font-size: 10pt;
      font-weight: bold;
      padding: 2px;
      text-align: center;
      width: 16px;
    }
    close-button:hover {
      background-color: #ddd;
      border-color: black;
      cursor: pointer;
    }
    overlay-content {
      display: -webkit-flex;
      -webkit-flex: 1 1 auto;
      -webkit-flex-direction: column;
      overflow-y: auto;
      padding: 10px;
      min-width: 300px;
    }
    button-bar {
      -webkit-align-items: baseline;
      border-top: 1px solid #ccc;
      display: -webkit-flex;
      -webkit-flex: 0 0 auto;
      -webkit-flex-direction: row-reverse;
      padding: 4px;
    }
  </style>
<overlay-mask>
<overlay-vertical-centering-container>
<overlay-frame>
<title-bar>
<title></title>
<close-button>&#x2715</close-button>
</title-bar>
<overlay-content>
<content></content>
</overlay-content>
<button-bar></button-bar>
</overlay-frame>
</overlay-vertical-centering-container>
</overlay-mask>
</template>




<style>
x-drag-handle{-webkit-user-select:none;box-sizing:border-box;display:block}x-drag-handle.horizontal-drag-handle{background-image:-webkit-gradient(linear,0 0,0 100%,from(#e5e5e5),to(#d1d1d1));border-bottom:1px solid #8e8e8e;border-top:1px solid white;cursor:ns-resize;height:7px;position:relative;z-index:10}x-drag-handle.vertical-drag-handle{background-image:-webkit-gradient(linear,0 0,100% 0,from(#e5e5e5),to(#d1d1d1));border-left:1px solid white;border-right:1px solid #8e8e8e;cursor:ew-resize;position:relative;width:7px;z-index:10}
</style>







<polymer-element name="tracing-analysis-tab-view" constructor="TracingAnalysisTabView">
<template>
<style>
      :host {
        display: flex;
        flex-flow: column nowrap;
        overflow: hidden;
        box-sizing: border-box;
      }

      tab-strip[tabs-hidden] {
        display: none;
      }

      tab-strip {
        background-color: rgb(236, 236, 236);
        border-bottom: 1px solid #8e8e8e;
        display: flex;
        flex: 0 0 auto;
        flex-flow: row;
        overflow-x: auto;
        padding: 0 10px 0 10px;
        font-size: 12px;
      }

      tab-button {
        display: block;
        flex: 0 0 auto;
        padding: 4px 15px 1px 15px;
        margin-top: 2px;
      }

      tab-button[selected=true] {
        background-color: white;
        border: 1px solid rgb(163, 163, 163);
        border-bottom: none;
        padding: 3px 14px 1px 14px;
      }

      tabs-content-container {
        display: flex;
        flex: 1 1 auto;
        overflow: auto;
        width: 100%;
      }

      ::content > * {
        flex: 1 1 auto;
      }

      ::content > *:not([selected]) {
        display: none;
      }

      button-label {
        display: inline;
      }
    </style>
<tab-strip>
<template repeat="{{tab in tabs_}}">
<tab-button button-id="{{ tab.id }}" on-click="{{ tabButtonSelectHandler_ }}" selected="{{ selectedTab_.id === tab.id }}">
<button-label>{{ tab.label ? tab.label : 'No Label'}}</button-label>
</tab-button>
</template>
</tab-strip>
<tabs-content-container id="content-container">
<content></content>
</tabs-content-container>
</template>

</polymer-element>



<polymer-element name="tracing-analysis-sub-view" constructor="TracingAnalysisSubView">

</polymer-element>








<polymer-element name="tv-c-a-time-span">
<template>
<style>
    :host {
      display: flex;
      flex-direction: row;
      align-items: center;
    }
    #warning {
      margin-left: 4px;
      font-size: 66%;
    }
    </style>
<span id="content"></span>
<span id="warning" style="display:none">&#9888;</span>
</template>

</polymer-element>



<polymer-element name="tv-c-a-time-stamp">
<template>
</template>

</polymer-element>
































































































































































































































































































<polymer-element name="tv-c-analysis-link" is="a">
<template>
<style>
    :host {
      display: inline;
      color: -webkit-link;
      cursor: pointer;
      text-decoration: underline;
      /* TODO(nduca): Whitespace is forced to normal here because the
         analysis_results.css forces everything under it to pre. This is insane.
         When that horrible evil class dies, then we can rip this white-space
         restriction out.
       */
      white-space: normal;
      cursor: pointer;
    }
    </style>
<content></content>
</template>

</polymer-element>




<polymer-element name="tv-c-analysis-generic-object-view" is="HTMLUnknownElement">
<template>
<style>
    :host {
      display: block;
      font-family: monospace;
    }
    </style>
</template>

</polymer-element>
<polymer-element name="tv-c-analysis-generic-object-view-with-label" is="HTMLUnknownElement">
<template>
<style>
    :host {
      display: block;
    }
    </style>
</template>

</polymer-element>



<polymer-element name="tv-c-a-stack-frame">
<template>
<style>
    :host {
      display: flex;
      flex-direction: row;
      align-items: center;
    }
    </style>
<tv-c-analysis-generic-object-view id="ov">
</tv-c-analysis-generic-object-view>
</template>

</polymer-element>


<polymer-element name="tracing-analysis-toggle-container" constructor="TracingAnalysisToggleContainer">
<template>
<style>
      :host(:[visible]) {
        display: flex;
      }

      :host(:not([visible])) {
        display: none;
      }

      ::content > * {
        flex: 0 1 auto;
      }

    </style>
<content></content>
</template>

</polymer-element>




<polymer-element name="tracing-analysis-nested-table">
<template>
<style>
      :host {
        display: flex;
        flex-direction: column;
      }

      table {
        font-size: 12px;

        flex: 1 1 auto;
        align-self: stretch;
        border-collapse: separate;
        border-spacing: 0;
        border-width: 0;
        -webkit-user-select: initial;
      }

      tr > td {
        padding: 2px 4px 2px 4px;
        vertical-align: text-top;
      }

      button.toggle-button {
        height: 15px;
        line-height: 60%;
        vertical-align: middle;
        width: 100%;
      }

      button > * {
        height: 15px;
        vertical-align: middle;
      }

      td.button-column {
        width: 30px;
      }


      table > thead > tr > td.sensitive:hover {
        background-color: #fcfcfc;
      }

      table > thead > tr > td {
        font-weight: bold;
        text-align: left;

        background-color: #eee;
        white-space: nowrap;
        overflow: hidden;
        text-overflow: ellipsis;

        border-top: 1px solid #ffffff;
        border-bottom: 1px solid #aaa;
      }

      table > tfoot {
        background-color: #eee;
        font-weight: bold;
      }

      table > tbody > tr:hover,
      table > tfoot > tr:hover {
        background-color: #e6e6e6
      }

      table > tbody.has-footer > tr:last-child > td {
        border-bottom: 1px solid #aaa;
      }

      table > tfoot > tr:first-child > td {
        border-top: 1px solid #ffffff;
      }

      expand-button {
        -webkit-user-select: none;
        display: inline-block;
        cursor: pointer;
        font-size: 9px;
        min-width: 8px;
        max-width: 8px;
      }

      .button-expanded {
        transform: rotate(90deg);
      }
    </style>
<table>
<thead id="head">
</thead>
<tbody id="body">
</tbody>
<tfoot id="foot">
</tfoot>
</table>
</template>

</polymer-element>
<polymer-element name="tracing-analysis-header-cell" constructor="TracingAnalysisHeaderCell" on-tap="onTap_">
<template>
<style>
    :host {
      -webkit-user-select: none;
      display: flex;
    }

    span {
      flex: 0 1 auto;
    }

    side-element {
      -webkit-user-select: none;
      flex: 1 0 auto;
      padding-left: 4px;
      vertical-align: top;
      font-size: 15px;
      font-family: sans-serif;
      display: inline;
      line-height: 85%;
    }
  </style>
<span>{{ cellTitle_ }}</span><side-element id="side"></side-element>
</template>

</polymer-element>



<style>
.sortable-table>thead>tr>td{cursor:pointer!important}
</style>













<polymer-element name="tv-c-single-slice-sub-view" extends="tracing-analysis-sub-view">
<template>
<style>
    :host {
      display: flex;
      flex-direction: column;
    }
    #table {
      font-family: monospace;
      flex: 1 1 auto;
      align-self: stretch;
    }
    </style>
<tracing-analysis-nested-table id="table">
</tracing-analysis-nested-table>
</template>

</polymer-element>

<style>
.analysis-header{font-weight:bold}.analysis-results{font-family:monospace;white-space:pre}.analysis-results *{-webkit-user-select:text!important;cursor:text}.analysis-table{border-collapse:collapse;border-width:0;margin-bottom:25px;width:100%}.analysis-table tr>td:first-child{padding-left:2px}.analysis-table tr>td{padding:2px 4px 2px 4px;vertical-align:text-top;width:150px}.analysis-table td td{padding:0;width:auto}.analysis-table-header{text-align:left}.analysis-table-row{vertical-align:top}.analysis-table-row:nth-child(2n+0){background-color:#e2e2e2}.analysis-table-row-inverted:nth-child(2n+1){background-color:#e2e2e2}.selection-changing-link{color:-webkit-link;cursor:pointer;text-decoration:underline}.analysis-table thead{background-color:#e2e2e2;font-weight:bold}.analysis-table tfoot{font-weight:bold}
</style>













<polymer-element name="tv-c-multi-slice-sub-view" extends="tracing-analysis-sub-view">
<template>

<style>
    :host {
      display: flex;
    }
    #content {
      flex: 1 1 auto;
    }
    </style>
<div id="content"></div>
</template>

</polymer-element>





<polymer-element name="tv-c-a-selection-summary-table">
<template>
<style>
    :host {
      display: flex;
    }
    #table {
      flex: 1 1 auto;
      align-self: stretch;
    }
    </style>
<tracing-analysis-nested-table id="table">
</tracing-analysis-nested-table>
</template>

</polymer-element>

















<polymer-element name="tv-c-a-multi-event-summary-table">
<template>
<style>
    :host {
      display: flex;
    }
    #table {
      flex: 1 1 auto;
      align-self: stretch;
    }
    </style>
<tracing-analysis-nested-table id="table">
</tracing-analysis-nested-table>
</template>

</polymer-element>







<polymer-element name="tv-c-a-multi-event-details-table">
<template>
<style>
    :host {
      display: flex;
      flex-direction: column;
    }
    #table {
      flex: 1 1 auto;
      align-self: stretch;
    }

    #titletable {
      font-weight: bold;
    }

    #title-info {
      font-size: 12px;
    }
    </style>
<tracing-analysis-nested-table id="titletable">
</tracing-analysis-nested-table>
<tracing-analysis-nested-table id="table">
</tracing-analysis-nested-table>
</template>

</polymer-element>








<polymer-element name="tv-c-a-multi-event-sub-view" extends="tracing-analysis-sub-view">
<template>
<style>
    :host {
      display: flex;
      overflow: auto;
    }
    #content {
      display: flex;
      flex-direction: column;
      flex: 0 1 auto;
      align-self: stretch;
    }
    #content > * {
      flex: 0 0 auto;
      align-self: stretch;
    }
    tv-c-a-multi-event-summary-table {
      border-bottom: 1px solid #aaa;
    }

    tv-c-a-selection-summary-table  {
      margin-top: 1.25em;
      border-top: 1px solid #aaa;
      background-color: #eee;
      font-weight: bold;
      margin-bottom: 1.25em;
      border-bottom: 1px solid #aaa;
    }
    </style>
<div id="content"></div>
</template>

</polymer-element>









<polymer-element name="tv-c-single-thread-time-slice-sub-view" extends="tracing-analysis-sub-view">
<template>
<style>
    table {
      border-collapse: collapse;
      border-width: 0;
      margin-bottom: 25px;
      width: 100%;
    }

    table tr > td:first-child {
      padding-left: 2px;
    }

    table tr > td {
      padding: 2px 4px 2px 4px;
      vertical-align: text-top;
      width: 150px;
    }

    table td td {
      padding: 0 0 0 0;
      width: auto;
    }
    tr {
      vertical-align: top;
    }

    tr:nth-child(2n+0) {
      background-color: #e2e2e2;
    }
    </style>
<table>
<tr>
<td>Running process:</td><td id="process-name"></td>
</tr>
<tr>
<td>Running thread:</td><td id="thread-name"></td>
</tr>
<tr>
<td>State:</td>
<td><b><span id="state"></span></b></td>
</tr>
<tr>
<td>Start:</td><td id="start"></td>
</tr>
<tr>
<td>Duration:</td><td id="duration"></td>
</tr>
<tr>
<td>On CPU:</td><td id="on-cpu"></td>
</tr>
<tr>
<td>Running instead:</td><td id="running-instead"></td>
</tr>
<tr>
<td>Args:</td><td id="args"></td>
</tr>
</table>
</template>

</polymer-element>





<polymer-element name="tv-c-single-cpu-slice-sub-view" extends="tracing-analysis-sub-view">
<template>
<style>
    table {
      border-collapse: collapse;
      border-width: 0;
      margin-bottom: 25px;
      width: 100%;
    }

    table tr > td:first-child {
      padding-left: 2px;
    }

    table tr > td {
      padding: 2px 4px 2px 4px;
      vertical-align: text-top;
      width: 150px;
    }

    table td td {
      padding: 0 0 0 0;
      width: auto;
    }
    tr {
      vertical-align: top;
    }

    tr:nth-child(2n+0) {
      background-color: #e2e2e2;
    }
    </style>
<table>
<tr>
<td>Running process:</td><td id="process-name"></td>
</tr>
<tr>
<td>Running thread:</td><td id="thread-name"></td>
</tr>
<tr>
<td>Start:</td><td id="start"></td>
</tr>
<tr>
<td>Duration:</td><td id="duration"></td>
</tr>
<tr>
<td>Active slices:</td><td id="running-thread"></td>
</tr>
</table>
</template>

</polymer-element>




<polymer-element name="tv-c-single-instant-event-sub-view" extends="tracing-analysis-sub-view">
<template>
<style>
    :host {
      display: block;
    }
    </style>
<div id="content"></div>
</template>

</polymer-element>



<polymer-element name="tv-c-multi-instant-event-sub-view" extends="tracing-analysis-sub-view">
<template>
<style>
    :host {
      display: block;
    }
    </style>
<div id="content"></div>
</template>

</polymer-element>





<polymer-element name="tv-c-counter-sample-sub-view" extends="tracing-analysis-sub-view">

</polymer-element>



<polymer-element name="tv-c-single-flow-event-sub-view" extends="tracing-analysis-sub-view">
<template>
<style>
    :host {
      display: block;
    }
    </style>
<div id="content"></div>
</template>

</polymer-element>



<polymer-element name="tv-c-multi-flow-event-sub-view" extends="tracing-analysis-sub-view">
<template>
<style>
    :host {
      display: block;
    }
    </style>
<div id="content"></div>
</template>

</polymer-element>













<polymer-element name="tv-c-single-object-instance-sub-view" extends="tracing-analysis-sub-view">
<template>
<style>
    :host {
      display: block;
    }

    #snapshots > * {
      display: block;
    }

    :host {
      overflow: auto;
      display: block;
    }

    * {
      -webkit-user-select: text;
    }

    .title {
      border-bottom: 1px solid rgb(128, 128, 128);
      font-size: 110%;
      font-weight: bold;
    }

    td, th {
      font-family: monospace;
      vertical-align: top;
    }
    </style>
<div id="content"></div>
</template>

</polymer-element>














<polymer-element name="tv-c-single-object-snapshot-sub-view" extends="tracing-analysis-sub-view">
<template>
<style>
    #args {
      white-space: pre;
    }

    :host {
      overflow: auto;
      display: flex;
    }

    * {
      -webkit-user-select: text;
    }

    .title {
      border-bottom: 1px solid rgb(128, 128, 128);
      font-size: 110%;
      font-weight: bold;
    }

    td, th {
      font-family: monospace;
      vertical-align: top;
    }
    </style>
<content></content>
</template>

</polymer-element>




<polymer-element name="tv-c-multi-object-sub-view" extends="tracing-analysis-sub-view">

</polymer-element>



<polymer-element name="tv-c-single-sample-sub-view" extends="tracing-analysis-sub-view">

</polymer-element>


<polymer-element name="tv-c-multi-sample-sub-view" extends="tracing-analysis-sub-view">
<template>
<style>
    :host {
      display: block;
    }
    </style>
<div id="content"></div>
</template>

</polymer-element>



<polymer-element name="tv-c-single-interaction-record-sub-view" extends="tracing-analysis-sub-view">

</polymer-element>




<polymer-element name="tv-c-multi-interaction-record-sub-view" extends="tracing-analysis-sub-view">

</polymer-element>



<polymer-element name="tv-c-single-alert-sub-view" extends="tracing-analysis-sub-view">

</polymer-element>




<polymer-element name="tv-c-multi-alert-sub-view" extends="tracing-analysis-sub-view">

</polymer-element>



<polymer-element name="tv-c-single-global-memory-dump-sub-view" extends="tracing-analysis-sub-view">

</polymer-element>




<polymer-element name="tv-c-multi-global-memory-dump-sub-view" extends="tracing-analysis-sub-view">

</polymer-element>




























<polymer-element name="tracing-analysis-view" constructor="TracingAnalysisView">
<template>
<style>
      :host {
        background-color: white;
        display: flex;
        flex-direction: column;
        height: 275px;
        overflow: auto;
      }

      :host(.tall-mode) {
        height: 525px;
      }

      ::content > * {
        flex: 1 0 auto;
      }
    </style>
<content></content>
</template>

</polymer-element>


































<style>
.mouse-mode-selector{-webkit-user-drag:element;-webkit-user-select:none;background:#DDD;border:1px solid #BBB;border-radius:4px;box-shadow:0 1px 2px rgba(0,0,0,0.2);left:calc(100% - 120px);position:absolute;top:100px;user-select:none;width:29px;z-index:20}.mouse-mode-icon{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAChCAYAAACbBNzvAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABV0RVh0Q3JlYXRpb24gVGltZQA3LzE2LzEzRNEKUwAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAA9aSURBVHic7V1rTFvl//+UrgUmZWMpbLa6cLErwpYxkqLGkjAG88WSbmumGUllvlmAJctMRtybvlHrLXiJUekMIZuYSCL5gS+EuLIXGEGjqCsllCEW6xQECgzWG7S05/+C/zkp9LTn0gsL6ych9JzznOdzPj19Luf5PN/nCN59913ixRdfRFdXFxLx/2GDgCAIYmpqCoWFhUjE/4cNae+99x4AIFH/Hzak7nDqDu+wOyyw2WzEdl9EMpG23ReQbKQE73Q8coJ3bfcFWK1W/Pbbb/D7/UhLi/37DwaDEIvFKC8vR0lJSdjxbRVstVoxPDyMxx9/HAUFBcjMzIRAIOCdXzAYhNvtht1ux/DwMACEid5WwSMjI3jyySdRXFwMsVgMoVAYk2CCIJCZmYns7GyMjo5iZGQkPoKXl5exd+9e3hdGIhgMIj8/H5mZmRCJRIyCyQ5NJBAEgUAgAKFQiIKCAiwsLISl4VxoHA4H+vv74Xa7uZ4aBqFQiOzsbIhEIojFYojFYohEItq/8fFxXLlyBUtLSxHThOaxZ88eCIXC2AWPj48DAH799deYBaelpUEoFLL6++qrrwAAH3zwAav0YrGYthLkJHh6ehpzc3MAgPn5eUxPT8csWiAQMJbboaEhmM1mAIDFYsHQ0BDvPDkJtlgsYdt+v59LFrxw/fr1sG2Xy8UrL06C6+vrw7bFYjEvYi747rvvwrYlEgmvvDjV0g6HI+p2ohBP3qh32OFwoLe3l1VGvb29sNvtvC8kFCMjI9DpdKzS6nQ6mEwm1nnTPg/7/X6MjY1hcnKS/VX+P/bu3YuysjLk5uYypv36669x8uRJZGRkQCQSwev1oqOjAz09PZx5CwsLcenSJRw+fBh+vx+rq6swmUx46aWXNqWjvcMDAwO8xAIbnZKBgQFeNXhzczMvscBGp6S5uRk//vhj1HS0grVaLYqLi3kRy+Vy1NXVRe0RRcKNGzeg0Wh48apUKnR1daG6ujpqOtpKy+VyQa1Wo6SkBLdv38aFCxeoY5988gn1+fLly9TnL774ApWVlXjiiSfgdDqxtrbG+aJ9Ph/0ej3OnDkDvV6PW7duUceOHDlCfR4dHaU+v/DCC7h27RrUajWcTidWV1ejctAKJggCKysryMzMhE6nw+zsLO3Joft1Oh0ePHiApaUlduqi8BYVFaGvr48Vb19fHyfeqM2Sz+dj3QTEs4lKJC+njsfWJoptkxUrtjZRbJssOnASXFtbG3U7UXjrrbeibnMBJ8FZWVkoKysDABQUFCArK4s3MRcoFArqrlZXV0OhUPDOi5Ngn8+Hw4cPQyqV4tlnn4XP5+NNTIIgmH0An8+HV155BUqlEq+++ior3kAgQLuf84jH2toajh8/jvX1da6n0sLj8SAjI4MxHUEQ+PTTT1nlSRAEHjx4QHtsW8e0RCIR7HY79uzZE/GOcEUgEEAgEMDff/8NkUgUdnxbBR85cgRmsxkCgQD5+fkRh2XYIhAI4P79+5iamoLD4cCxY8fC0myr4KeeegoCgQBWqxVzc3NIS0uLedQyGAxi165dKC8vR1FRUVialHu405ESvNPxyAlOuYfJRMo9fFjdw3iBq3vIBDbu4bYK3uoextKtJEH2yWNyD8nyEG8wuYcffvgha3cxru6h3W5Hf39/QoyzaE6fyWRCQ0MDZ+MsLu7h8vIyent7sby8zIk8VkxNTUGn08Fms8UlP04Nn9/vR39/f9w8JLZwu91obGzk5CFFAq+Wfnh4mDKok4mWlha0trbGlAfvrs3k5CQGBgaSYoiHoqenB1evXk2OIb4VDocDJpMp6eXaYrGgsbGRV7mOufPq8XgwMDCQ9HI9NzeHq1evci7XvDseUqkUWq0W6enpCAaDcDqd8Hq9fLNjDaVSiRs3bkAikfDi5XSHxWIxampqAAALCwsYGhrC7Ows5ufnEypWIpHAYDAAACYmJnD9+nXevJwEnzp1CjKZDBUVFQCAsbGxpJTfjz76CFVVVWhqagIAdHR08G6XWQuuqanB7t274fV6UVpaiuzsbAAbTzyJhMFggEKhgNfrRX19PWQyGQDAaDTyyo+V4JqaGshkMsricLlcOH78OICNCWp8p0cwwWAwoKqqahPvG2+8AWDji+7u7uacJyvBMpksrKxkZWVR0yLGxsY4E7NBVVVVGK9CoaCmRXR0dHDOk5VguorB5/OhoqICYrE4YZ2PSLxXrlyBRCLhNcE1pufh1dVVXLx4EWlpaRGnJzCBjXtId87g4GBU3ri5h1uJ5+fnY8mCtXvIhTflHoYg5R4mEyn3MAl45KyWlOCdjkdOcMo9TCZS7mHKPeSGhLmH5LBOrAGXXN1DcliHrgdFgsk95CzYbrfDbDbD7/ejrKwstpmtNO5hJJhMJrS2tsLtdqOpqQlarTZi2mjuIWvBfr8fZrN50/iz2WzG9PQ0nn/+edonEzZgij10uVwwGo2bxp+NRiOGhobw+uuv005hjtk9JENz6AbbyWCuRESp2Ww2NDc30w62WywW6HQ6zoOIrO5wbm4uzp8/j5WVFXR2dm46VldXh3379mF5eTku86dDUVxcjK6uLthstrClqrq6unDo0CHOvKwE+/1+LC4uUqG0oZiYmIhaicQCkvfu3bthxwYGBnhVmpy6NnSD7kxxQvEA3Zo+fIsQJ8F040j379/nRcwFdF4037FwToLphkUXFxd5EXMB3chkUgQ7nc6wfT6fL+Gm+H///Re2z+Vy8TLFGSut/v5+RsPsm2++AbDR84pXLFNDQwPjelxnz54FsBFK+/nnn7PKl/EOa7VaVmHvYrE4au+HK27evMkq7F0ikeDmzZus82UU7HK5qG8yGs6ePct73gUdfD4f2tvbGdO1t7dzaocZBRMEAaFQSBnhdKipqYFQKORlm0TjzcvLo4xwOhgMBuTl5XHiZVVp+f1+yGQy2iDq4uJiyGSyhFRcfr8fVVVVtEHUGo0GVVVVnHlZ19JerxdqtRpSqZTaJ5VKoVarEzrdwev1Qq/XQ6lUUvuUSiX0ej0vXk7N0srKCjQaDbXmjUajwcrKCmfSULD5Oa6srKCtrQ0SiQQSiQRtbW2MvHFzD0MrsXhUUmzdw9BKjKmSiqt7SBBE3Conru4hOa8kWqBnyj3cgl0EQcQ0cMYWW3kIgkiKe7iVV2C1Won09PSYxLCB1+tFZmYmtb22tobt4E1LBimATaQAkiKWjveR85ZSgnc6Uu5hMpFyD1PuITekYg/ZxB52dXXFTMo2n1D38NSpU7zjDEP/yHzisnJpIsBm5dJ45rntgpONuITTJirctqWlJabjdGAUvNUEp0NouxcvtLa2MgZhmUwmzqKjCrbb7aw9HC5pmWAymVivb2kymTgFe0RslrbeNTa1rtlshkgkQn5+PusL2Iqtd42NdWM0GpGVlYWTJ08ypo14h/nGI8Uax8Q3XJbteREFV1ZW8iLmex6Ja9euJfS8iD9puVyOmpoa3L59G8DmVUq3glzNlAzoimVgvrq6GmlpadDr9QA2r1K6FeRqpmRAFxveiIK9Xi8VZ/jLL78whulUVFTELJbkJeMMjUYjI29TUxNrsQBDX5qMM4w0qE2iuLgYpaWlcXMPyThDphWMNRoN6uvrOfGyskvVanXUNGq1Oq5WKclL/qwjQa/Xc+Zl1dNi8nFi9ZeSyZvqS0erjbmAbT6kT7X1lQp8QeYTyasKE8w3aJJvPh6PBwRBYGZmJi68MzMzqdjDUDx67mEsFxwrUrGHSUCqWdrpSAne6dix7uFzzz1HW0s/FO7h/v37UVBQgMceeyxm99DlcsFut2NwcBACgSDsnTHb7h4ePHgQxcXFcTPTMjIyIJFIcOfOHfz+++8Pl2DSPSTftxQv93DXrl0oKirCnTt3wtIwFhq62aputxtms5maCR8pHROEQiEkEgntew/X1tbC3mu4tLSE9vZ2nD9/njZd6Pn79u3jHoo3OTmJsbExnDlzBsDGWLXdbqcNoent7YVCocChQ4dYh+VFij3s7u5GR0cH9YWaTCbcunVr0yMkmfbChQvQarXQarVUWF4wGER6ejp7wdPT0zCbzfB4PJv2R7NT/H4/rFYrJicnUVZWxnowPtTpGxoagtFoDAsIi2anuN1ufPnll+ju7salS5dw4sQJKk+64hH2FTgcDgwPD4eJZQu/3w+bzcZ5JSSLxYL333+fNvqNDdxuN3p6ehjPDxMsl8tjjkw5ceIENfOVLVQqFd58882YeA0GA7WiWiSECfb5fPjpp58AbKyBx/bCpVIp6urqAADff/895wf6tbU1fPbZZwCAjz/+mPHCSSiVSsr3eueddxh5aWtpMrwuJyeH9cuczp07R5UZvktO/fnnnwCAY8eOoa+vj9U5nZ2d1CsH2fhaUZulwcFB1kGNi4uLjK/gYwuDwcCJ9+2332add9RmyW63w+12Q6FQIC8vD5cvX8bCwgI19VcqlcJms8HhcGBycjJuSz6aTCbMzs5Cq9Xi6NGjGB0dxcTEBJxOJyQSCZRKJUZGRjAyMoL//e9/jBFsoaAVLJfLKZvD4XBQ37ZEItlUph0OB238gVwu5ySQhEqlopo+i8VCtbsymWxTmb579y6t46BSqRg5aAXX1tbi22+/DZvY5XQ6aQMuQyGVSlFbW8trgb6WlhY0NDRgYmJi0/6ZmRnGYVylUomWlhbGeGbaMuzxeKDRaKhVDdkgOzsblZWVOHfuHO82fH19HW1tbWhqamL9ul2ZTIbXXnsNnZ2drN7yFfFFjy6XC6WlpVCpVFhaWsK///5LVfnz8/PIy8sDAOzevRu5ubnIycmBx+OJKZ6YIAj4fD7U19ejsbERf/zxB4aHhykrdHx8HE8//TQAYP/+/VAqlVAoFJx4I1ZapGiyrBw4cAD37t2DXC7HgQMHAGx0QXNycrC+vh63VR5Cecnw3J6eHqhUKpSXlwPY6OI+88wzALiHxnN6PPz555/D9h08eJATIR/Qzd9gE/FKh9SYFlvI5XKqPMUCrlFuKpUKp0+fZkwXDAZp93MSLBaLUVJSgqNHjyIjIwNerzfmOR0ul4sx9lAikeD06dN4+eWXIZVKGXnj5h5evHgRXq8XHo+Hd9MTCpFIhHv37iEnJydqp/+HH36A1+uFy+VirKTi6h7Gug7tVpDuIUEQKCwsjOge/vPPP6zyCwQCWF5exl9//YX5+Xla93DbzTSbzQar1Yr19fW4uoclJSUp9xB4BJullOCdjkdO8P8BGCQ0hnF1DxUAAAAASUVORK5CYII=)}.mouse-mode-selector .drag-handle{background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAChCAYAAACbBNzvAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABV0RVh0Q3JlYXRpb24gVGltZQA3LzE2LzEzRNEKUwAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAA9aSURBVHic7V1rTFvl//+UrgUmZWMpbLa6cLErwpYxkqLGkjAG88WSbmumGUllvlmAJctMRtybvlHrLXiJUekMIZuYSCL5gS+EuLIXGEGjqCsllCEW6xQECgzWG7S05/+C/zkp9LTn0gsL6ych9JzznOdzPj19Luf5PN/nCN59913ixRdfRFdXFxLx/2GDgCAIYmpqCoWFhUjE/4cNae+99x4AIFH/Hzak7nDqDu+wOyyw2WzEdl9EMpG23ReQbKQE73Q8coJ3bfcFWK1W/Pbbb/D7/UhLi/37DwaDEIvFKC8vR0lJSdjxbRVstVoxPDyMxx9/HAUFBcjMzIRAIOCdXzAYhNvtht1ux/DwMACEid5WwSMjI3jyySdRXFwMsVgMoVAYk2CCIJCZmYns7GyMjo5iZGQkPoKXl5exd+9e3hdGIhgMIj8/H5mZmRCJRIyCyQ5NJBAEgUAgAKFQiIKCAiwsLISl4VxoHA4H+vv74Xa7uZ4aBqFQiOzsbIhEIojFYojFYohEItq/8fFxXLlyBUtLSxHThOaxZ88eCIXC2AWPj48DAH799deYBaelpUEoFLL6++qrrwAAH3zwAav0YrGYthLkJHh6ehpzc3MAgPn5eUxPT8csWiAQMJbboaEhmM1mAIDFYsHQ0BDvPDkJtlgsYdt+v59LFrxw/fr1sG2Xy8UrL06C6+vrw7bFYjEvYi747rvvwrYlEgmvvDjV0g6HI+p2ohBP3qh32OFwoLe3l1VGvb29sNvtvC8kFCMjI9DpdKzS6nQ6mEwm1nnTPg/7/X6MjY1hcnKS/VX+P/bu3YuysjLk5uYypv36669x8uRJZGRkQCQSwev1oqOjAz09PZx5CwsLcenSJRw+fBh+vx+rq6swmUx46aWXNqWjvcMDAwO8xAIbnZKBgQFeNXhzczMvscBGp6S5uRk//vhj1HS0grVaLYqLi3kRy+Vy1NXVRe0RRcKNGzeg0Wh48apUKnR1daG6ujpqOtpKy+VyQa1Wo6SkBLdv38aFCxeoY5988gn1+fLly9TnL774ApWVlXjiiSfgdDqxtrbG+aJ9Ph/0ej3OnDkDvV6PW7duUceOHDlCfR4dHaU+v/DCC7h27RrUajWcTidWV1ejctAKJggCKysryMzMhE6nw+zsLO3Joft1Oh0ePHiApaUlduqi8BYVFaGvr48Vb19fHyfeqM2Sz+dj3QTEs4lKJC+njsfWJoptkxUrtjZRbJssOnASXFtbG3U7UXjrrbeibnMBJ8FZWVkoKysDABQUFCArK4s3MRcoFArqrlZXV0OhUPDOi5Ngn8+Hw4cPQyqV4tlnn4XP5+NNTIIgmH0An8+HV155BUqlEq+++ior3kAgQLuf84jH2toajh8/jvX1da6n0sLj8SAjI4MxHUEQ+PTTT1nlSRAEHjx4QHtsW8e0RCIR7HY79uzZE/GOcEUgEEAgEMDff/8NkUgUdnxbBR85cgRmsxkCgQD5+fkRh2XYIhAI4P79+5iamoLD4cCxY8fC0myr4KeeegoCgQBWqxVzc3NIS0uLedQyGAxi165dKC8vR1FRUVialHu405ESvNPxyAlOuYfJRMo9fFjdw3iBq3vIBDbu4bYK3uoextKtJEH2yWNyD8nyEG8wuYcffvgha3cxru6h3W5Hf39/QoyzaE6fyWRCQ0MDZ+MsLu7h8vIyent7sby8zIk8VkxNTUGn08Fms8UlP04Nn9/vR39/f9w8JLZwu91obGzk5CFFAq+Wfnh4mDKok4mWlha0trbGlAfvrs3k5CQGBgaSYoiHoqenB1evXk2OIb4VDocDJpMp6eXaYrGgsbGRV7mOufPq8XgwMDCQ9HI9NzeHq1evci7XvDseUqkUWq0W6enpCAaDcDqd8Hq9fLNjDaVSiRs3bkAikfDi5XSHxWIxampqAAALCwsYGhrC7Ows5ufnEypWIpHAYDAAACYmJnD9+nXevJwEnzp1CjKZDBUVFQCAsbGxpJTfjz76CFVVVWhqagIAdHR08G6XWQuuqanB7t274fV6UVpaiuzsbAAbTzyJhMFggEKhgNfrRX19PWQyGQDAaDTyyo+V4JqaGshkMsricLlcOH78OICNCWp8p0cwwWAwoKqqahPvG2+8AWDji+7u7uacJyvBMpksrKxkZWVR0yLGxsY4E7NBVVVVGK9CoaCmRXR0dHDOk5VguorB5/OhoqICYrE4YZ2PSLxXrlyBRCLhNcE1pufh1dVVXLx4EWlpaRGnJzCBjXtId87g4GBU3ri5h1uJ5+fnY8mCtXvIhTflHoYg5R4mEyn3MAl45KyWlOCdjkdOcMo9TCZS7mHKPeSGhLmH5LBOrAGXXN1DcliHrgdFgsk95CzYbrfDbDbD7/ejrKwstpmtNO5hJJhMJrS2tsLtdqOpqQlarTZi2mjuIWvBfr8fZrN50/iz2WzG9PQ0nn/+edonEzZgij10uVwwGo2bxp+NRiOGhobw+uuv005hjtk9JENz6AbbyWCuRESp2Ww2NDc30w62WywW6HQ6zoOIrO5wbm4uzp8/j5WVFXR2dm46VldXh3379mF5eTku86dDUVxcjK6uLthstrClqrq6unDo0CHOvKwE+/1+LC4uUqG0oZiYmIhaicQCkvfu3bthxwYGBnhVmpy6NnSD7kxxQvEA3Zo+fIsQJ8F040j379/nRcwFdF4037FwToLphkUXFxd5EXMB3chkUgQ7nc6wfT6fL+Gm+H///Re2z+Vy8TLFGSut/v5+RsPsm2++AbDR84pXLFNDQwPjelxnz54FsBFK+/nnn7PKl/EOa7VaVmHvYrE4au+HK27evMkq7F0ikeDmzZus82UU7HK5qG8yGs6ePct73gUdfD4f2tvbGdO1t7dzaocZBRMEAaFQSBnhdKipqYFQKORlm0TjzcvLo4xwOhgMBuTl5XHiZVVp+f1+yGQy2iDq4uJiyGSyhFRcfr8fVVVVtEHUGo0GVVVVnHlZ19JerxdqtRpSqZTaJ5VKoVarEzrdwev1Qq/XQ6lUUvuUSiX0ej0vXk7N0srKCjQaDbXmjUajwcrKCmfSULD5Oa6srKCtrQ0SiQQSiQRtbW2MvHFzD0MrsXhUUmzdw9BKjKmSiqt7SBBE3Conru4hOa8kWqBnyj3cgl0EQcQ0cMYWW3kIgkiKe7iVV2C1Won09PSYxLCB1+tFZmYmtb22tobt4E1LBimATaQAkiKWjveR85ZSgnc6Uu5hMpFyD1PuITekYg/ZxB52dXXFTMo2n1D38NSpU7zjDEP/yHzisnJpIsBm5dJ45rntgpONuITTJirctqWlJabjdGAUvNUEp0NouxcvtLa2MgZhmUwmzqKjCrbb7aw9HC5pmWAymVivb2kymTgFe0RslrbeNTa1rtlshkgkQn5+PusL2Iqtd42NdWM0GpGVlYWTJ08ypo14h/nGI8Uax8Q3XJbteREFV1ZW8iLmex6Ja9euJfS8iD9puVyOmpoa3L59G8DmVUq3glzNlAzoimVgvrq6GmlpadDr9QA2r1K6FeRqpmRAFxveiIK9Xi8VZ/jLL78whulUVFTELJbkJeMMjUYjI29TUxNrsQBDX5qMM4w0qE2iuLgYpaWlcXMPyThDphWMNRoN6uvrOfGyskvVanXUNGq1Oq5WKclL/qwjQa/Xc+Zl1dNi8nFi9ZeSyZvqS0erjbmAbT6kT7X1lQp8QeYTyasKE8w3aJJvPh6PBwRBYGZmJi68MzMzqdjDUDx67mEsFxwrUrGHSUCqWdrpSAne6dix7uFzzz1HW0s/FO7h/v37UVBQgMceeyxm99DlcsFut2NwcBACgSDsnTHb7h4ePHgQxcXFcTPTMjIyIJFIcOfOHfz+++8Pl2DSPSTftxQv93DXrl0oKirCnTt3wtIwFhq62aputxtms5maCR8pHROEQiEkEgntew/X1tbC3mu4tLSE9vZ2nD9/njZd6Pn79u3jHoo3OTmJsbExnDlzBsDGWLXdbqcNoent7YVCocChQ4dYh+VFij3s7u5GR0cH9YWaTCbcunVr0yMkmfbChQvQarXQarVUWF4wGER6ejp7wdPT0zCbzfB4PJv2R7NT/H4/rFYrJicnUVZWxnowPtTpGxoagtFoDAsIi2anuN1ufPnll+ju7salS5dw4sQJKk+64hH2FTgcDgwPD4eJZQu/3w+bzcZ5JSSLxYL333+fNvqNDdxuN3p6ehjPDxMsl8tjjkw5ceIENfOVLVQqFd58882YeA0GA7WiWiSECfb5fPjpp58AbKyBx/bCpVIp6urqAADff/895wf6tbU1fPbZZwCAjz/+mPHCSSiVSsr3eueddxh5aWtpMrwuJyeH9cuczp07R5UZvktO/fnnnwCAY8eOoa+vj9U5nZ2d1CsH2fhaUZulwcFB1kGNi4uLjK/gYwuDwcCJ9+2332add9RmyW63w+12Q6FQIC8vD5cvX8bCwgI19VcqlcJms8HhcGBycjJuSz6aTCbMzs5Cq9Xi6NGjGB0dxcTEBJxOJyQSCZRKJUZGRjAyMoL//e9/jBFsoaAVLJfLKZvD4XBQ37ZEItlUph0OB238gVwu5ySQhEqlopo+i8VCtbsymWxTmb579y6t46BSqRg5aAXX1tbi22+/DZvY5XQ6aQMuQyGVSlFbW8trgb6WlhY0NDRgYmJi0/6ZmRnGYVylUomWlhbGeGbaMuzxeKDRaKhVDdkgOzsblZWVOHfuHO82fH19HW1tbWhqamL9ul2ZTIbXXnsNnZ2drN7yFfFFjy6XC6WlpVCpVFhaWsK///5LVfnz8/PIy8sDAOzevRu5ubnIycmBx+OJKZ6YIAj4fD7U19ejsbERf/zxB4aHhykrdHx8HE8//TQAYP/+/VAqlVAoFJx4I1ZapGiyrBw4cAD37t2DXC7HgQMHAGx0QXNycrC+vh63VR5Cecnw3J6eHqhUKpSXlwPY6OI+88wzALiHxnN6PPz555/D9h08eJATIR/Qzd9gE/FKh9SYFlvI5XKqPMUCrlFuKpUKp0+fZkwXDAZp93MSLBaLUVJSgqNHjyIjIwNerzfmOR0ul4sx9lAikeD06dN4+eWXIZVKGXnj5h5evHgRXq8XHo+Hd9MTCpFIhHv37iEnJydqp/+HH36A1+uFy+VirKTi6h7Gug7tVpDuIUEQKCwsjOge/vPPP6zyCwQCWF5exl9//YX5+Xla93DbzTSbzQar1Yr19fW4uoclJSUp9xB4BJullOCdjkdO8P8BGCQ0hnF1DxUAAAAASUVORK5CYII=) 2px 3px no-repeat;background-repeat:no-repeat;border-bottom:1px solid #bcbcbc;cursor:move;display:block;height:13px;width:27px}.mouse-mode-selector .pan-scan-mode-button{background-image:url(data:image/png;base64,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);background-position:0 -10px}.mouse-mode-selector .pan-scan-mode-button.active{background-position:-30px -10px}.mouse-mode-selector .selection-mode-button{background-image:url(data:image/png;base64,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);background-position:0 -40px}.mouse-mode-selector .selection-mode-button.active{background-position:-30px -40px}.mouse-mode-selector .zoom-mode-button{background-image:url(data:image/png;base64,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);background-position:0 -70px}.mouse-mode-selector .zoom-mode-button.active{background-position:-30px -70px}.mouse-mode-selector .timing-mode-button{background-image:url(data:image/png;base64,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);background-position:0 -100px;border-bottom:0}.mouse-mode-selector .timing-mode-button.active{background-position:-30px -100px}.mouse-mode-selector .rotate-mode-button{background-image:url(data:image/png;base64,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);background-position:0 -130px;border-bottom:0}.mouse-mode-selector .rotate-mode-button.active{background-position:-30px -130px}
</style>
<style>
.tool-button{background-position:center center;background-repeat:no-repeat;border-bottom:1px solid #bcbcbc;border-top:1px solid #f1f1f1;cursor:pointer;height:30px}.tool-button.active{cursor:auto}
</style>
<template id="mouse-mode-selector-template">
<div class="drag-handle"></div>
<div class="buttons">
</div>
</template>






















































































<style>
.track-button{background-color:rgba(255,255,255,0.5);border:1px solid rgba(0,0,0,0.1);color:rgba(0,0,0,0.2);font-size:10px;height:12px;text-align:center;width:12px}.track-button:hover{background-color:rgba(255,255,255,1.0);border:1px solid rgba(0,0,0,0.5);box-shadow:0 0 .05em rgba(0,0,0,0.4);color:rgba(0,0,0,1)}.track-close-button{left:2px;position:absolute;top:2px}.track-collapse-button{left:3px;position:absolute;top:2px}
</style>





<style>
.drawing-container{-webkit-box-flex:1;display:inline;overflow:auto;position:relative}.drawing-container-canvas{-webkit-box-flex:1;display:block;pointer-events:none;position:absolute;top:0}
</style>


















<style>
.heading-track{-webkit-box-align:stretch;-webkit-box-orient:horizontal;display:-webkit-box;margin:0;padding:0 5px 0 0}.heading-track>heading{-webkit-box-sizing:border-box;background-color:#f3f5f7;border-right:1px solid #8e8e8e;box-sizing:border-box;display:-webkit-flex;-webkit-flex-direction:row;align-items:center;overflow-x:hidden;padding-right:5px;text-align:left;text-overflow:ellipsis;white-space:nowrap}.heading-track>heading>.heading-arrow{-webkit-flex:0 0 auto;margin-left:5px;margin-right:5px;width:8px;font-family:sans-serif}
</style>











<style>
.chart-track {
  height: 30px;
  position: relative;
}
</style>















<style>
.object-instance-track{height:18px}
</style>






















<style>
.rect-track{height:18px}
</style>














<style>
.spacing-track{height:4px}
</style>
























<style>
.thread-track{-webkit-box-orient:vertical;display:-webkit-box;position:relative}
</style>











<style>
.process-track-header{-webkit-flex:0 0 auto;background-image:-webkit-gradient(linear,0 0,100% 0,from(#e5e5e5),to(#d1d1d1));border-bottom:1px solid #8e8e8e;border-top:1px solid white;font-size:75%}.process-track-base:not(.expanded)>.track:not(.inverse-expand){display:none}.process-track-base.expanded>.track.inverse-expand{display:none}.process-track-name:before{content:'\25B8';padding:0 5px}.process-track-base.expanded .process-track-name:before{content:'\25BE'}
</style>































<style>
.letter-dot-track {
  height: 18px;
}
</style>
























<style>
.model-track {
  -webkit-box-flex: 1;
}
</style>



<style>
.ruler-track{height:12px}.ruler-track.tall-mode{height:30px}
</style>








<style>
body *{-webkit-user-select:none;box-sizing:border-box}
</style>
<style>
.timeline-track-view *{-webkit-user-select:none;cursor:default}.timeline-track-view .tool-button{cursor:pointer}.timeline-track-view{-webkit-box-orient:vertical;display:-webkit-box;position:relative}.model-track-container{-webkit-box-flex:1;overflow:auto}.drag-box{background-color:rgba(0,0,255,0.25);border:1px solid #000060;font-size:75%;position:fixed}.timeline-track-view>.hint-text{position:absolute;bottom:6px;right:6px;font-size:8pt}
</style>





















<polymer-element name="tracing-find-control" constructor="TracingFindControl">
<template>
<style>
      div.root {
        -webkit-user-select: none;
        display: -webkit-flex;
        position: relative;
      }
      input {
        -webkit-user-select: auto;
        background-color: #f8f8f8;
        border: 1px solid rgba(0, 0, 0, 0.5);
        box-sizing: border-box;
        height: 19px;
        margin-bottom: 1px;
        margin-left: 0;
        margin-right: 0;
        margin-top: 1px;
        padding: 0;
        width: 170px;
      }
      input:focus {
        background-color: white;
      }
      .button {
        background-color: #f8f8f8;
        border: 1px solid rgba(0, 0, 0, 0.5);
        border-left: none;
        font-size: 14px;
        height: 17px;
        margin-left: 0;
        margin-top: 1px;
      }
      .button :first-of-type {
        margin-right: 0;
      }
      #hitCount {
        height: 19px;
        left: 0;
        opacity: 0.25;
        pointer-events: none;
        position: absolute;
        text-align: right;
        top: 2px;
        width: 170px;
        z-index: 1;
      }
      #spinner {
        visibility: hidden;
        width: 8px;
        height: 8px;
        left: 154px;
        pointer-events: none;
        position: absolute;
        top: 4px;
        z-index: 1;

        border: 2px solid transparent;
        border-bottom: 2px solid rgba(0, 0, 0, 0.5);
        border-right: 2px solid rgba(0, 0, 0, 0.5);
        border-radius: 50%;

        animation: spin 1s linear infinite;
      }
      @keyframes spin { 100% { transform: rotate(360deg); } }
    </style>
<div class="root">
<input type="text" id="filter" on-input="{{ filterTextChanged }}" on-keypress="{{ filterKeyPress }}" on-keydown="{{ filterKeyDown }}" on-blur="{{ filterBlur }}" on-focus="{{ filterFocus }}" on-mouseup="{{ filterMouseUp }}" />
<div id="spinner"></div>
<div class="button" on-click="{{ findPrevious }}">&larr;</div>
<div class="button" on-click="{{ findNext }}">&rarr;</div>
<div id="hitCount">0 of 0</div>
</div>
</template>

</polymer-element>



<polymer-element name="tv-c-scripting-object">

</polymer-element>



<polymer-element name="tv-e-tquery-context">

</polymer-element>



<polymer-element name="tv-e-tquery-filter" extends="tv-c-scripting-object">

</polymer-element>



<polymer-element name="tv-e-tquery-filter-has-ancestor" extends="tv-e-tquery-filter">

</polymer-element>



<polymer-element name="tv-e-tquery-filter-has-title" extends="tv-e-tquery-filter">

</polymer-element>









<polymer-element name="tv-e-tquery" extends="tv-c-scripting-object">

</polymer-element>




<polymer-element name="tv-c-scripting-controller">

</polymer-element>





<polymer-element name="tracing-scripting-control" constructor="TracingScriptingControl">
<template>
<style>
      :host {
        flex: 1 1 auto;
      }
      .root {
        font-family: monospace;
        cursor: text;

        padding: 2px;
        margin: 2px;
        border: 1px solid rgba(0, 0, 0, 0.5);
        background: white;

        height: 100px;
        overflow-y: auto;

        transition-property: opacity, height, padding, margin;
        transition-duration: .2s;
        transition-timing-function: ease-out;
      }
      .hidden {
        margin-top: 0px;
        margin-bottom: 0px;
        padding-top: 0px;
        padding-bottom: 0px;
        height: 0px;
        opacity: 0;
      }
      .focused {
        outline: auto 5px -webkit-focus-ring-color;
      }
      #history {
        -webkit-user-select: text;
        color: #777;
      }
      #prompt {
        -webkit-user-select: text;
        -webkit-user-modify: read-write-plaintext-only;
        text-overflow: clip !important;
        text-decoration: none !important;
      }
      #prompt:focus {
        outline: none;
      }
      #prompt br {
        display: none;
      }
      #prompt ::before {
        content: ">";
        color: #468;
      }
    </style>
<div id="root" class="root hidden" tabindex="0" on-focus="{{ onConsoleFocus }}">
<div id="history"></div>
<div id="prompt" on-keypress="{{ promptKeyPress }}" on-keydown="{{ promptKeyDown }}" on-blur="{{ onConsoleBlur }}">
</div></div></template>

</polymer-element>



<polymer-element name="tv-c-side-panel">

</polymer-element>





<polymer-element name="tv-c-side-panel-container" is="HTMLUnknownElement">
<template>
<style>
    :host {
      align-items: stretch;
      display: -webkit-flex;
    }

    :host[expanded] > active-panel-container {
      -webkit-flex: 1 1 auto;
      border-left: 1px solid black;
      display: -webkit-flex;
    }

    :host:not([expanded]) > active-panel-container {
      display: none;
    }

    tab-strip {
      -webkit-flex: 0 0 auto;
      -webkit-flex-direction: column;
      -webkit-user-select: none;
      background-color: rgb(236, 236, 236);
      border-left: 1px solid black;
      cursor: default;
      display: -webkit-flex;
      min-width: 18px; /* workaround for flexbox and writing-mode mixing bug */
      padding: 10px 0 10px 0;
      font-size: 12px;
    }

    tab-strip > tab-strip-label {
      -webkit-writing-mode: vertical-rl;
      display: inline;
      margin-right: 1px;
      min-height: 20px;
      padding: 15px 3px 15px 1px;
    }

    tab-strip >
        tab-strip-label:not([enabled]) {
      color: rgb(128, 128, 128);
    }

    tab-strip > tab-strip-label[selected] {
      background-color: white;
      border: 1px solid rgb(163, 163, 163);
      border-left: none;
      padding: 14px 2px 14px 1px;
    }
    </style>
<active-panel-container id="active_panel_container">
</active-panel-container>
<tab-strip id="tab_strip"></tab-strip>
</template>

</polymer-element>



<style>
x-timeline-view{-webkit-flex-direction:column;cursor:default;display:-webkit-flex;font-family:sans-serif;padding:0}x-timeline-view>.control>.title{font-size:14px;height:22px;padding-left:2px;padding-right:8px;padding-top:2px;flex:1 0 auto}x-timeline-view>.control{background-color:#e6e6e6;background-image:-webkit-gradient(linear,0 0,0 100%,from(#e5e5e5),to(#d1d1d1));flex:0 0 auto;overflow-x:auto}x-timeline-view>.control>.bar{display:flex}x-timeline-view>.control::-webkit-scrollbar{height:0}x-timeline-view>.control>.bar>#right-controls{margin-left:auto}x-timeline-view>.control>#collapsing-controls{display:-webkit-flex}x-timeline-view>.control .controls{display:-webkit-flex;flex:0 0 auto}x-timeline-view>.control>.bar>span{padding-left:5px;padding-right:10px}x-timeline-view>.control>.bar>.controls button,x-timeline-view>.control>.bar>.controls label{font-size:14px;height:22px;margin:1px 2px 1px 2px}x-timeline-view>.control>.bar>.spacer{-webkit-flex:1 1 auto}x-timeline-view>middle-container{-webkit-flex:1 1 auto;-webkit-flex-direction:row;border-bottom:1px solid #8e8e8e;display:-webkit-flex;min-height:0}x-timeline-view>middle-container>track-view-container{-webkit-flex:1 1 auto;display:-webkit-flex;min-height:0;min-width:0}x-timeline-view>middle-container>track-view-container>*{-webkit-flex:1 1 auto}x-timeline-view>middle-container>x-timeline-view-side-panel-container{-webkit-flex:0 0 auto}x-timeline-view>x-drag-handle{-webkit-flex:0 0 auto}x-timeline-view>tracing-analysis-view{-webkit-flex:0 0 auto}x-timeline-view .selection{margin:2px}x-timeline-view .selection ul{margin:0}.button{background-color:#f8f8f8;border:1px solid rgba(0,0,0,0.5);color:rgba(0,0,0,0.8);font-size:14px;height:19px;margin:1px;min-width:23px;text-align:center}.button:hover{background-color:rgba(255,255,255,1.0);border:1px solid rgba(0,0,0,0.8);box-shadow:0 0 .05em rgba(0,0,0,0.4);color:rgba(0,0,0,1)}.view-info-button{padding-left:4px;padding-right:4px;width:auto}.view-info-button:hover{border:solid 1px}.metadata-dialog-text{font-family:monospace;overflow:auto;white-space:pre}.view-help-text{-webkit-flex:1 1 auto;-webkit-flex-direction:row;display:-webkit-flex;width:700px}.view-help-text .column{width:50%}.view-help-text h2{font-size:1.2em;margin:0;margin-top:5px;text-align:center}.view-help-text h3{margin:0;margin-left:126px;margin-top:10px}.view-help-text .pair{-webkit-flex:1 1 auto;-webkit-flex-direction:row;display:-webkit-flex}.view-help-text .command{font-family:monospace;margin-right:5px;text-align:right;width:150px}.view-help-text .action{font-size:.9em;text-align:left;width:200px}.view-help-text .mouse-mode-icon{border:1px solid #888;border-radius:3px;box-shadow:inset 0 0 2px rgba(0,0,0,0.3);display:inline-block;height:26px;margin-right:1px;position:relative;top:4px;width:27px;zoom:.75}.view-help-text .mouse-mode-icon.pan-mode{background-position:-1px -11px}.view-help-text .mouse-mode-icon.select-mode{background-position:-1px -41px}.view-help-text .mouse-mode-icon.zoom-mode{background-position:-1px -71px}.view-help-text .mouse-mode-icon.timing-mode{background-position:-1px -101px}
</style>













<template id="timeline-view-template">
<div class="control">
<div class="bar">
<div id="left-controls" class="controls"></div>
<div class="title">^_^</div>
<div id="right-controls" class="controls"></div>
</div>
<div id="collapsing-controls" class="controls"></div>
</div>
<middle-container>
<track-view-container></track-view-container>
<tv-c-side-panel-container></tv-c-side-panel-container>
</middle-container>
<x-drag-handle></x-drag-handle>
<tracing-analysis-view id="analysis"></tracing-analysis-view>
</template>
<template id="help-btn-template">
<div class="button view-help-button">?</div>
<div class="view-help-text">
<div class="column left">
<h2>Navigation</h2>
<div class="pair">
<div class="command">w/s</div>
<div class="action">Zoom in/out (+shift: faster)</div>
</div>
<div class="pair">
<div class="command">a/d</div>
<div class="action">Pan left/right (+shift: faster)</div>
</div>
<div class="pair">
<div class="command">&rarr;/shift-TAB</div>
<div class="action">Select previous event</div>
</div>
<div class="pair">
<div class="command">&larr;/TAB</div>
<div class="action">Select next event</div>
</div>
<h2>Mouse Controls</h2>
<div class="pair">
<div class="command">click</div>
<div class="action">Select event</div>
</div>
<div class="pair">
<div class="command">alt-mousewheel</div>
<div class="action">Zoom in/out</div>
</div>
<h3>
<span class="mouse-mode-icon select-mode"></span>
        Select mode
      </h3>
<div class="pair">
<div class="command">drag</div>
<div class="action">Box select</div>
</div>
<div class="pair">
<div class="command">double click</div>
<div class="action">Select all events with same title</div>
</div>
<h3>
<span class="mouse-mode-icon pan-mode"></span>
        Pan mode
      </h3>
<div class="pair">
<div class="command">drag</div>
<div class="action">Pan the view</div>
</div>
<h3>
<span class="mouse-mode-icon zoom-mode"></span>
        Zoom mode
      </h3>
<div class="pair">
<div class="command">drag</div>
<div class="action">Zoom in/out by dragging up/down</div>
</div>
<h3>
<span class="mouse-mode-icon timing-mode"></span>
        Timing mode
      </h3>
<div class="pair">
<div class="command">drag</div>
<div class="action">Create or move markers</div>
</div>
<div class="pair">
<div class="command">double click</div>
<div class="action">Set marker range to slice</div>
</div>
</div>
<div class="column right">
<h2>General</h2>
<div class="pair">
<div class="command">1-4</div>
<div class="action">Switch mouse mode</div>
</div>
<div class="pair">
<div class="command">shift</div>
<div class="action">Hold for temporary select</div>
</div>
<div class="pair">
<div class="command">space</div>
<div class="action">Hold for temporary pan</div>
</div>
<div class="pair">
<div class="command"><span class="mod"></span></div>
<div class="action">Hold for temporary zoom</div>
</div>
<div class="pair">
<div class="command">/</div>
<div class="action">Search</div>
</div>
<div class="pair">
<div class="command">enter</div>
<div class="action">Step through search results</div>
</div>
<div class="pair">
<div class="command">f</div>
<div class="action">Zoom into selection</div>
</div>
<div class="pair">
<div class="command">z/0</div>
<div class="action">Reset zoom and pan</div>
</div>
<div class="pair">
<div class="command">g/G</div>
<div class="action">Toggle 60hz grid</div>
</div>
<div class="pair">
<div class="command">v</div>
<div class="action">Highlight VSync</div>
</div>
<div class="pair">
<div class="command">h</div>
<div class="action">Toggle low/high details</div>
</div>
<div class="pair">
<div class="command">m</div>
<div class="action">Mark current selection</div>
</div>
<div class="pair">
<div class="command">`</div>
<div class="action">Show or hide the scripting console</div>
</div>
<div class="pair">
<div class="command">?</div>
<div class="action">Show help</div>
</div>
</div>
</div>
</template>
<template id="metadata-btn-template">
<div class="button view-metadata-button view-info-button">Metadata</div>
<div class="info-button-text metadata-dialog-text"></div>
</template>
<template id="console-btn-template">
<div class="button view-console-button">&#187;</div>
</template>


























































































































































<style>
  * /deep/ .chart-base #title {
    font-size: 16pt;
  }

  * /deep/ .chart-base {
    font-size: 12pt;
    -webkit-user-select: none;
    cursor: default;
  }

  * /deep/ .chart-base .axis path,
  * /deep/ .chart-base .axis line {
    fill: none;
    shape-rendering: crispEdges;
    stroke: #000;
  }
</style>
<template id="chart-base-template">
<svg> 
<g xmlns="http://www.w3.org/2000/svg" id="chart-area">
</g><g class="x axis"></g>
<g class="y axis"></g>
<text id="title"></text>
</svg>
</template>







<style>
* /deep/ .line-chart .line{fill:none;stroke-width:1.5px}* /deep/ .line-chart #brushes>rect{fill:#c0c0c0}
</style>










<polymer-element name="tv-e-analysis-side-panel-alerts" extends="tv-c-side-panel">
<template>
<style>
    :host {
      display: block;
      width: 250px;
    }
    #content {
      flex-direction: column;
      display: flex;
    }
    </style>
<div id="content">
<toolbar id="toolbar"></toolbar>
<result-area id="result_area"></result-area>
</div>
</template>

</polymer-element>









































<script>

// Copyright (c) 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

/* WARNING: This file is auto generated.
 *
 * Do not edit directly.
 */

/**
 * @license
 * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
 * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
 * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
 * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
 * Code distributed by Google as part of the polymer project is also
 * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
 */
// @version 0.5.5
window.PolymerGestures={},function(a){var b=!1,c=document.createElement("meta");if(c.createShadowRoot){var d=c.createShadowRoot(),e=document.createElement("span");d.appendChild(e),c.addEventListener("testpath",function(a){a.path&&(b=a.path[0]===e),a.stopPropagation()});var f=new CustomEvent("testpath",{bubbles:!0});document.head.appendChild(c),e.dispatchEvent(f),c.parentNode.removeChild(c),d=e=null}c=null;var g={shadow:function(a){return a?a.shadowRoot||a.webkitShadowRoot:void 0},canTarget:function(a){return a&&Boolean(a.elementFromPoint)},targetingShadow:function(a){var b=this.shadow(a);return this.canTarget(b)?b:void 0},olderShadow:function(a){var b=a.olderShadowRoot;if(!b){var c=a.querySelector("shadow");c&&(b=c.olderShadowRoot)}return b},allShadows:function(a){for(var b=[],c=this.shadow(a);c;)b.push(c),c=this.olderShadow(c);return b},searchRoot:function(a,b,c){var d,e;return a?(d=a.elementFromPoint(b,c),d?e=this.targetingShadow(d):a!==document&&(e=this.olderShadow(a)),this.searchRoot(e,b,c)||d):void 0},owner:function(a){if(!a)return document;for(var b=a;b.parentNode;)b=b.parentNode;return b.nodeType!=Node.DOCUMENT_NODE&&b.nodeType!=Node.DOCUMENT_FRAGMENT_NODE&&(b=document),b},findTarget:function(a){if(b&&a.path&&a.path.length)return a.path[0];var c=a.clientX,d=a.clientY,e=this.owner(a.target);return e.elementFromPoint(c,d)||(e=document),this.searchRoot(e,c,d)},findTouchAction:function(a){var c;if(b&&a.path&&a.path.length){for(var d=a.path,e=0;e<d.length;e++)if(c=d[e],c.nodeType===Node.ELEMENT_NODE&&c.hasAttribute("touch-action"))return c.getAttribute("touch-action")}else for(c=a.target;c;){if(c.nodeType===Node.ELEMENT_NODE&&c.hasAttribute("touch-action"))return c.getAttribute("touch-action");c=c.parentNode||c.host}return"auto"},LCA:function(a,b){if(a===b)return a;if(a&&!b)return a;if(b&&!a)return b;if(!b&&!a)return document;if(a.contains&&a.contains(b))return a;if(b.contains&&b.contains(a))return b;var c=this.depth(a),d=this.depth(b),e=c-d;for(e>=0?a=this.walk(a,e):b=this.walk(b,-e);a&&b&&a!==b;)a=a.parentNode||a.host,b=b.parentNode||b.host;return a},walk:function(a,b){for(var c=0;a&&b>c;c++)a=a.parentNode||a.host;return a},depth:function(a){for(var b=0;a;)b++,a=a.parentNode||a.host;return b},deepContains:function(a,b){var c=this.LCA(a,b);return c===a},insideNode:function(a,b,c){var d=a.getBoundingClientRect();return d.left<=b&&b<=d.right&&d.top<=c&&c<=d.bottom},path:function(a){var c;if(b&&a.path&&a.path.length)c=a.path;else{c=[];for(var d=this.findTarget(a);d;)c.push(d),d=d.parentNode||d.host}return c}};a.targetFinding=g,a.findTarget=g.findTarget.bind(g),a.deepContains=g.deepContains.bind(g),a.insideNode=g.insideNode}(window.PolymerGestures),function(){function a(a){return"html /deep/ "+b(a)}function b(a){return'[touch-action="'+a+'"]'}function c(a){return"{ -ms-touch-action: "+a+"; touch-action: "+a+";}"}var d=["none","auto","pan-x","pan-y",{rule:"pan-x pan-y",selectors:["pan-x pan-y","pan-y pan-x"]},"manipulation"],e="",f="string"==typeof document.head.style.touchAction,g=!window.ShadowDOMPolyfill&&document.head.createShadowRoot;if(f){d.forEach(function(d){String(d)===d?(e+=b(d)+c(d)+"\n",g&&(e+=a(d)+c(d)+"\n")):(e+=d.selectors.map(b)+c(d.rule)+"\n",g&&(e+=d.selectors.map(a)+c(d.rule)+"\n"))});var h=document.createElement("style");h.textContent=e,document.head.appendChild(h)}}(),function(a){var b=["bubbles","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","pageX","pageY"],c=[!1,!1,null,null,0,0,0,0,!1,!1,!1,!1,0,null,0,0],d=function(){return function(){}},e={preventTap:d,makeBaseEvent:function(a,b){var c=document.createEvent("Event");return c.initEvent(a,b.bubbles||!1,b.cancelable||!1),c.preventTap=e.preventTap(c),c},makeGestureEvent:function(a,b){b=b||Object.create(null);for(var c,d=this.makeBaseEvent(a,b),e=0,f=Object.keys(b);e<f.length;e++)c=f[e],"bubbles"!==c&&"cancelable"!==c&&(d[c]=b[c]);return d},makePointerEvent:function(a,d){d=d||Object.create(null);for(var e,f=this.makeBaseEvent(a,d),g=2;g<b.length;g++)e=b[g],f[e]=d[e]||c[g];f.buttons=d.buttons||0;var h=0;return h=d.pressure?d.pressure:f.buttons?.5:0,f.x=f.clientX,f.y=f.clientY,f.pointerId=d.pointerId||0,f.width=d.width||0,f.height=d.height||0,f.pressure=h,f.tiltX=d.tiltX||0,f.tiltY=d.tiltY||0,f.pointerType=d.pointerType||"",f.hwTimestamp=d.hwTimestamp||0,f.isPrimary=d.isPrimary||!1,f._source=d._source||"",f}};a.eventFactory=e}(window.PolymerGestures),function(a){function b(){if(c){var a=new Map;return a.pointers=d,a}this.keys=[],this.values=[]}var c=window.Map&&window.Map.prototype.forEach,d=function(){return this.size};b.prototype={set:function(a,b){var c=this.keys.indexOf(a);c>-1?this.values[c]=b:(this.keys.push(a),this.values.push(b))},has:function(a){return this.keys.indexOf(a)>-1},"delete":function(a){var b=this.keys.indexOf(a);b>-1&&(this.keys.splice(b,1),this.values.splice(b,1))},get:function(a){var b=this.keys.indexOf(a);return this.values[b]},clear:function(){this.keys.length=0,this.values.length=0},forEach:function(a,b){this.values.forEach(function(c,d){a.call(b,c,this.keys[d],this)},this)},pointers:function(){return this.keys.length}},a.PointerMap=b}(window.PolymerGestures),function(a){var b,c=["bubbles","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","buttons","pointerId","width","height","pressure","tiltX","tiltY","pointerType","hwTimestamp","isPrimary","type","target","currentTarget","which","pageX","pageY","timeStamp","preventTap","tapPrevented","_source"],d=[!1,!1,null,null,0,0,0,0,!1,!1,!1,!1,0,null,0,0,0,0,0,0,0,"",0,!1,"",null,null,0,0,0,0,function(){},!1],e="undefined"!=typeof SVGElementInstance,f=a.eventFactory,g={IS_IOS:!1,pointermap:new a.PointerMap,requiredGestures:new a.PointerMap,eventMap:Object.create(null),eventSources:Object.create(null),eventSourceList:[],gestures:[],dependencyMap:{down:{listeners:0,index:-1},up:{listeners:0,index:-1}},gestureQueue:[],registerSource:function(a,b){var c=b,d=c.events;d&&(d.forEach(function(a){c[a]&&(this.eventMap[a]=c[a].bind(c))},this),this.eventSources[a]=c,this.eventSourceList.push(c))},registerGesture:function(a,b){var c=Object.create(null);c.listeners=0,c.index=this.gestures.length;for(var d,e=0;e<b.exposes.length;e++)d=b.exposes[e].toLowerCase(),this.dependencyMap[d]=c;this.gestures.push(b)},register:function(a,b){for(var c,d=this.eventSourceList.length,e=0;d>e&&(c=this.eventSourceList[e]);e++)c.register.call(c,a,b)},unregister:function(a){for(var b,c=this.eventSourceList.length,d=0;c>d&&(b=this.eventSourceList[d]);d++)b.unregister.call(b,a)},down:function(a){this.requiredGestures.set(a.pointerId,b),this.fireEvent("down",a)},move:function(a){a.type="move",this.fillGestureQueue(a)},up:function(a){this.fireEvent("up",a),this.requiredGestures["delete"](a.pointerId)},cancel:function(a){a.tapPrevented=!0,this.fireEvent("up",a),this.requiredGestures["delete"](a.pointerId)},addGestureDependency:function(a,b){var c=a._pgEvents;if(c&&b)for(var d,e,f,g=Object.keys(c),h=0;h<g.length;h++)f=g[h],c[f]>0&&(d=this.dependencyMap[f],e=d?d.index:-1,b[e]=!0)},eventHandler:function(c){var d=c.type;if("touchstart"===d||"mousedown"===d||"pointerdown"===d||"MSPointerDown"===d)if(c._handledByPG||(b={}),this.IS_IOS){var e=c;if("touchstart"===d){var f=c.changedTouches[0];e={target:c.target,clientX:f.clientX,clientY:f.clientY,path:c.path}}for(var g,h=c.path||a.targetFinding.path(e),i=0;i<h.length;i++)g=h[i],this.addGestureDependency(g,b)}else this.addGestureDependency(c.currentTarget,b);if(!c._handledByPG){var j=this.eventMap&&this.eventMap[d];j&&j(c),c._handledByPG=!0}},listen:function(a,b){for(var c,d=0,e=b.length;e>d&&(c=b[d]);d++)this.addEvent(a,c)},unlisten:function(a,b){for(var c,d=0,e=b.length;e>d&&(c=b[d]);d++)this.removeEvent(a,c)},addEvent:function(a,b){a.addEventListener(b,this.boundHandler)},removeEvent:function(a,b){a.removeEventListener(b,this.boundHandler)},makeEvent:function(a,b){var c=f.makePointerEvent(a,b);return c.preventDefault=b.preventDefault,c.tapPrevented=b.tapPrevented,c._target=c._target||b.target,c},fireEvent:function(a,b){var c=this.makeEvent(a,b);return this.dispatchEvent(c)},cloneEvent:function(a){for(var b,f=Object.create(null),g=0;g<c.length;g++)b=c[g],f[b]=a[b]||d[g],("target"===b||"relatedTarget"===b)&&e&&f[b]instanceof SVGElementInstance&&(f[b]=f[b].correspondingUseElement);return f.preventDefault=function(){a.preventDefault()},f},dispatchEvent:function(a){var b=a._target;if(b){b.dispatchEvent(a);var c=this.cloneEvent(a);c.target=b,this.fillGestureQueue(c)}},gestureTrigger:function(){for(var a,b,c=0;c<this.gestureQueue.length;c++)if(a=this.gestureQueue[c],b=a._requiredGestures)for(var d,e,f=0;f<this.gestures.length;f++)b[f]&&(d=this.gestures[f],e=d[a.type],e&&e.call(d,a));this.gestureQueue.length=0},fillGestureQueue:function(a){this.gestureQueue.length||requestAnimationFrame(this.boundGestureTrigger),a._requiredGestures=this.requiredGestures.get(a.pointerId),this.gestureQueue.push(a)}};g.boundHandler=g.eventHandler.bind(g),g.boundGestureTrigger=g.gestureTrigger.bind(g),a.dispatcher=g,a.activateGesture=function(a,b){var c=b.toLowerCase(),d=g.dependencyMap[c];if(d){var e=g.gestures[d.index];if(a._pgListeners||(g.register(a),a._pgListeners=0),e){var f,h=e.defaultActions&&e.defaultActions[c];switch(a.nodeType){case Node.ELEMENT_NODE:f=a;break;case Node.DOCUMENT_FRAGMENT_NODE:f=a.host;break;default:f=null}h&&f&&!f.hasAttribute("touch-action")&&f.setAttribute("touch-action",h)}a._pgEvents||(a._pgEvents={}),a._pgEvents[c]=(a._pgEvents[c]||0)+1,a._pgListeners++}return Boolean(d)},a.addEventListener=function(b,c,d,e){d&&(a.activateGesture(b,c),b.addEventListener(c,d,e))},a.deactivateGesture=function(a,b){var c=b.toLowerCase(),d=g.dependencyMap[c];return d&&(a._pgListeners>0&&a._pgListeners--,0===a._pgListeners&&g.unregister(a),a._pgEvents&&(a._pgEvents[c]>0?a._pgEvents[c]--:a._pgEvents[c]=0)),Boolean(d)},a.removeEventListener=function(b,c,d,e){d&&(a.deactivateGesture(b,c),b.removeEventListener(c,d,e))}}(window.PolymerGestures),function(a){var b=a.dispatcher,c=b.pointermap,d=25,e=[0,1,4,2],f=0,g=/Linux.*Firefox\//i,h=function(){if(g.test(navigator.userAgent))return!1;try{return 1===new MouseEvent("test",{buttons:1}).buttons}catch(a){return!1}}(),i={POINTER_ID:1,POINTER_TYPE:"mouse",events:["mousedown","mousemove","mouseup"],exposes:["down","up","move"],register:function(a){b.listen(a,this.events)},unregister:function(a){a.nodeType!==Node.DOCUMENT_NODE&&b.unlisten(a,this.events)},lastTouches:[],isEventSimulatedFromTouch:function(a){for(var b,c=this.lastTouches,e=a.clientX,f=a.clientY,g=0,h=c.length;h>g&&(b=c[g]);g++){var i=Math.abs(e-b.x),j=Math.abs(f-b.y);if(d>=i&&d>=j)return!0}},prepareEvent:function(a){var c=b.cloneEvent(a);if(c.pointerId=this.POINTER_ID,c.isPrimary=!0,c.pointerType=this.POINTER_TYPE,c._source="mouse",!h){var d=a.type,g=e[a.which]||0;"mousedown"===d?f|=g:"mouseup"===d&&(f&=~g),c.buttons=f}return c},mousedown:function(d){if(!this.isEventSimulatedFromTouch(d)){var e=(c.has(this.POINTER_ID),this.prepareEvent(d));e.target=a.findTarget(d),c.set(this.POINTER_ID,e.target),b.down(e)}},mousemove:function(a){if(!this.isEventSimulatedFromTouch(a)){var d=c.get(this.POINTER_ID);if(d){var e=this.prepareEvent(a);e.target=d,0===(h?e.buttons:e.which)?(h||(f=e.buttons=0),b.cancel(e),this.cleanupMouse(e.buttons)):b.move(e)}}},mouseup:function(d){if(!this.isEventSimulatedFromTouch(d)){var e=this.prepareEvent(d);e.relatedTarget=a.findTarget(d),e.target=c.get(this.POINTER_ID),b.up(e),this.cleanupMouse(e.buttons)}},cleanupMouse:function(a){0===a&&c["delete"](this.POINTER_ID)}};a.mouseEvents=i}(window.PolymerGestures),function(a){var b=a.dispatcher,c=(a.targetFinding.allShadows.bind(a.targetFinding),b.pointermap),d=(Array.prototype.map.call.bind(Array.prototype.map),2500),e=25,f=200,g=20,h=!1,i={IS_IOS:!1,events:["touchstart","touchmove","touchend","touchcancel"],exposes:["down","up","move"],register:function(a,c){(this.IS_IOS?c:!c)&&b.listen(a,this.events)},unregister:function(a){this.IS_IOS||b.unlisten(a,this.events)},scrollTypes:{EMITTER:"none",XSCROLLER:"pan-x",YSCROLLER:"pan-y"},touchActionToScrollType:function(a){var b=a,c=this.scrollTypes;return b===c.EMITTER?"none":b===c.XSCROLLER?"X":b===c.YSCROLLER?"Y":"XY"},POINTER_TYPE:"touch",firstTouch:null,isPrimaryTouch:function(a){return this.firstTouch===a.identifier},setPrimaryTouch:function(a){(0===c.pointers()||1===c.pointers()&&c.has(1))&&(this.firstTouch=a.identifier,this.firstXY={X:a.clientX,Y:a.clientY},this.firstTarget=a.target,this.scrolling=null,this.cancelResetClickCount())},removePrimaryPointer:function(a){a.isPrimary&&(this.firstTouch=null,this.firstXY=null,this.resetClickCount())},clickCount:0,resetId:null,resetClickCount:function(){var a=function(){this.clickCount=0,this.resetId=null}.bind(this);this.resetId=setTimeout(a,f)},cancelResetClickCount:function(){this.resetId&&clearTimeout(this.resetId)},typeToButtons:function(a){var b=0;return("touchstart"===a||"touchmove"===a)&&(b=1),b},findTarget:function(b,d){if("touchstart"===this.currentTouchEvent.type){if(this.isPrimaryTouch(b)){var e={clientX:b.clientX,clientY:b.clientY,path:this.currentTouchEvent.path,target:this.currentTouchEvent.target};return a.findTarget(e)}return a.findTarget(b)}return c.get(d)},touchToPointer:function(a){var c=this.currentTouchEvent,d=b.cloneEvent(a),e=d.pointerId=a.identifier+2;d.target=this.findTarget(a,e),d.bubbles=!0,d.cancelable=!0,d.detail=this.clickCount,d.buttons=this.typeToButtons(c.type),d.width=a.webkitRadiusX||a.radiusX||0,d.height=a.webkitRadiusY||a.radiusY||0,d.pressure=a.webkitForce||a.force||.5,d.isPrimary=this.isPrimaryTouch(a),d.pointerType=this.POINTER_TYPE,d._source="touch";var f=this;return d.preventDefault=function(){f.scrolling=!1,f.firstXY=null,c.preventDefault()},d},processTouches:function(a,b){var d=a.changedTouches;this.currentTouchEvent=a;for(var e,f,g=0;g<d.length;g++)e=d[g],f=this.touchToPointer(e),"touchstart"===a.type&&c.set(f.pointerId,f.target),c.has(f.pointerId)&&b.call(this,f),("touchend"===a.type||a._cancel)&&this.cleanUpPointer(f)},shouldScroll:function(b){if(this.firstXY){var c,d=a.targetFinding.findTouchAction(b),e=this.touchActionToScrollType(d);if("none"===e)c=!1;else if("XY"===e)c=!0;else{var f=b.changedTouches[0],g=e,h="Y"===e?"X":"Y",i=Math.abs(f["client"+g]-this.firstXY[g]),j=Math.abs(f["client"+h]-this.firstXY[h]);c=i>=j}return c}},findTouch:function(a,b){for(var c,d=0,e=a.length;e>d&&(c=a[d]);d++)if(c.identifier===b)return!0},vacuumTouches:function(a){var b=a.touches;if(c.pointers()>=b.length){var d=[];c.forEach(function(a,c){if(1!==c&&!this.findTouch(b,c-2)){var e=a;d.push(e)}},this),d.forEach(function(a){this.cancel(a),c["delete"](a.pointerId)},this)}},touchstart:function(a){this.vacuumTouches(a),this.setPrimaryTouch(a.changedTouches[0]),this.dedupSynthMouse(a),this.scrolling||(this.clickCount++,this.processTouches(a,this.down))},down:function(a){b.down(a)},touchmove:function(a){if(h)a.cancelable&&this.processTouches(a,this.move);else if(this.scrolling){if(this.firstXY){var b=a.changedTouches[0],c=b.clientX-this.firstXY.X,d=b.clientY-this.firstXY.Y,e=Math.sqrt(c*c+d*d);e>=g&&(this.touchcancel(a),this.scrolling=!0,this.firstXY=null)}}else null===this.scrolling&&this.shouldScroll(a)?this.scrolling=!0:(this.scrolling=!1,a.preventDefault(),this.processTouches(a,this.move))},move:function(a){b.move(a)},touchend:function(a){this.dedupSynthMouse(a),this.processTouches(a,this.up)},up:function(c){c.relatedTarget=a.findTarget(c),b.up(c)},cancel:function(a){b.cancel(a)},touchcancel:function(a){a._cancel=!0,this.processTouches(a,this.cancel)},cleanUpPointer:function(a){c["delete"](a.pointerId),this.removePrimaryPointer(a)},dedupSynthMouse:function(b){var c=a.mouseEvents.lastTouches,e=b.changedTouches[0];if(this.isPrimaryTouch(e)){var f={x:e.clientX,y:e.clientY};c.push(f);var g=function(a,b){var c=a.indexOf(b);c>-1&&a.splice(c,1)}.bind(null,c,f);setTimeout(g,d)}}},j=Event.prototype.stopImmediatePropagation||Event.prototype.stopPropagation;document.addEventListener("click",function(b){var c=b.clientX,d=b.clientY,f=function(a){var b=Math.abs(c-a.x),f=Math.abs(d-a.y);return e>=b&&e>=f},g=a.mouseEvents.lastTouches.some(f),h=a.targetFinding.path(b);if(g){for(var k=0;k<h.length;k++)if(h[k]===i.firstTarget)return;b.preventDefault(),j.call(b)}},!0),a.touchEvents=i}(window.PolymerGestures),function(a){var b=a.dispatcher,c=b.pointermap,d=window.MSPointerEvent&&"number"==typeof window.MSPointerEvent.MSPOINTER_TYPE_MOUSE,e={events:["MSPointerDown","MSPointerMove","MSPointerUp","MSPointerCancel"],register:function(a){b.listen(a,this.events)},unregister:function(a){a.nodeType!==Node.DOCUMENT_NODE&&b.unlisten(a,this.events)},POINTER_TYPES:["","unavailable","touch","pen","mouse"],prepareEvent:function(a){var c=a;return c=b.cloneEvent(a),d&&(c.pointerType=this.POINTER_TYPES[a.pointerType]),c._source="ms",c},cleanup:function(a){c["delete"](a)},MSPointerDown:function(d){var e=this.prepareEvent(d);e.target=a.findTarget(d),c.set(d.pointerId,e.target),b.down(e)},MSPointerMove:function(a){var d=c.get(a.pointerId);if(d){var e=this.prepareEvent(a);e.target=d,b.move(e)}},MSPointerUp:function(d){var e=this.prepareEvent(d);e.relatedTarget=a.findTarget(d),e.target=c.get(e.pointerId),b.up(e),this.cleanup(d.pointerId)},MSPointerCancel:function(d){var e=this.prepareEvent(d);e.relatedTarget=a.findTarget(d),e.target=c.get(e.pointerId),b.cancel(e),this.cleanup(d.pointerId)}};a.msEvents=e}(window.PolymerGestures),function(a){var b=a.dispatcher,c=b.pointermap,d={events:["pointerdown","pointermove","pointerup","pointercancel"],prepareEvent:function(a){var c=b.cloneEvent(a);return c._source="pointer",c},register:function(a){b.listen(a,this.events)},unregister:function(a){a.nodeType!==Node.DOCUMENT_NODE&&b.unlisten(a,this.events)},cleanup:function(a){c["delete"](a)},pointerdown:function(d){var e=this.prepareEvent(d);e.target=a.findTarget(d),c.set(e.pointerId,e.target),b.down(e)},pointermove:function(a){var d=c.get(a.pointerId);if(d){var e=this.prepareEvent(a);e.target=d,b.move(e)}},pointerup:function(d){var e=this.prepareEvent(d);e.relatedTarget=a.findTarget(d),e.target=c.get(e.pointerId),b.up(e),this.cleanup(d.pointerId)},pointercancel:function(d){var e=this.prepareEvent(d);e.relatedTarget=a.findTarget(d),e.target=c.get(e.pointerId),b.cancel(e),this.cleanup(d.pointerId)}};a.pointerEvents=d}(window.PolymerGestures),function(a){var b=a.dispatcher,c=window.navigator;window.PointerEvent?b.registerSource("pointer",a.pointerEvents):c.msPointerEnabled?b.registerSource("ms",a.msEvents):(b.registerSource("mouse",a.mouseEvents),void 0!==window.ontouchstart&&b.registerSource("touch",a.touchEvents));var d=navigator.userAgent,e=d.match(/iPad|iPhone|iPod/)&&"ontouchstart"in window;b.IS_IOS=e,a.touchEvents.IS_IOS=e,b.register(document,!0)}(window.PolymerGestures),function(a){var b=a.dispatcher,c=a.eventFactory,d=new a.PointerMap,e={events:["down","move","up"],exposes:["trackstart","track","trackx","tracky","trackend"],defaultActions:{track:"none",trackx:"pan-y",tracky:"pan-x"},WIGGLE_THRESHOLD:4,clampDir:function(a){return a>0?1:-1},calcPositionDelta:function(a,b){var c=0,d=0;return a&&b&&(c=b.pageX-a.pageX,d=b.pageY-a.pageY),{x:c,y:d}},fireTrack:function(a,b,d){var e=d,f=this.calcPositionDelta(e.downEvent,b),g=this.calcPositionDelta(e.lastMoveEvent,b);if(g.x)e.xDirection=this.clampDir(g.x);else if("trackx"===a)return;if(g.y)e.yDirection=this.clampDir(g.y);else if("tracky"===a)return;var h={bubbles:!0,cancelable:!0,trackInfo:e.trackInfo,relatedTarget:b.relatedTarget,pointerType:b.pointerType,pointerId:b.pointerId,_source:"track"};"tracky"!==a&&(h.x=b.x,h.dx=f.x,h.ddx=g.x,h.clientX=b.clientX,h.pageX=b.pageX,h.screenX=b.screenX,h.xDirection=e.xDirection),"trackx"!==a&&(h.dy=f.y,h.ddy=g.y,h.y=b.y,h.clientY=b.clientY,h.pageY=b.pageY,h.screenY=b.screenY,h.yDirection=e.yDirection);var i=c.makeGestureEvent(a,h);e.downTarget.dispatchEvent(i)},down:function(a){if(a.isPrimary&&("mouse"===a.pointerType?1===a.buttons:!0)){var b={downEvent:a,downTarget:a.target,trackInfo:{},lastMoveEvent:null,xDirection:0,yDirection:0,tracking:!1};d.set(a.pointerId,b)}},move:function(a){var b=d.get(a.pointerId);if(b){if(!b.tracking){var c=this.calcPositionDelta(b.downEvent,a),e=c.x*c.x+c.y*c.y;e>this.WIGGLE_THRESHOLD&&(b.tracking=!0,b.lastMoveEvent=b.downEvent,this.fireTrack("trackstart",a,b))}b.tracking&&(this.fireTrack("track",a,b),this.fireTrack("trackx",a,b),this.fireTrack("tracky",a,b)),b.lastMoveEvent=a}},up:function(a){var b=d.get(a.pointerId);b&&(b.tracking&&this.fireTrack("trackend",a,b),d["delete"](a.pointerId))}};b.registerGesture("track",e)}(window.PolymerGestures),function(a){var b=a.dispatcher,c=a.eventFactory,d={HOLD_DELAY:200,WIGGLE_THRESHOLD:16,events:["down","move","up"],exposes:["hold","holdpulse","release"],heldPointer:null,holdJob:null,pulse:function(){var a=Date.now()-this.heldPointer.timeStamp,b=this.held?"holdpulse":"hold";this.fireHold(b,a),this.held=!0},cancel:function(){clearInterval(this.holdJob),this.held&&this.fireHold("release"),this.held=!1,this.heldPointer=null,this.target=null,this.holdJob=null},down:function(a){a.isPrimary&&!this.heldPointer&&(this.heldPointer=a,this.target=a.target,this.holdJob=setInterval(this.pulse.bind(this),this.HOLD_DELAY))},up:function(a){this.heldPointer&&this.heldPointer.pointerId===a.pointerId&&this.cancel()},move:function(a){if(this.heldPointer&&this.heldPointer.pointerId===a.pointerId){var b=a.clientX-this.heldPointer.clientX,c=a.clientY-this.heldPointer.clientY;b*b+c*c>this.WIGGLE_THRESHOLD&&this.cancel()}},fireHold:function(a,b){var d={bubbles:!0,cancelable:!0,pointerType:this.heldPointer.pointerType,pointerId:this.heldPointer.pointerId,x:this.heldPointer.clientX,y:this.heldPointer.clientY,_source:"hold"};b&&(d.holdTime=b);var e=c.makeGestureEvent(a,d);this.target.dispatchEvent(e)}};b.registerGesture("hold",d)}(window.PolymerGestures),function(a){var b=a.dispatcher,c=a.eventFactory,d=new a.PointerMap,e={events:["down","up"],exposes:["tap"],down:function(a){a.isPrimary&&!a.tapPrevented&&d.set(a.pointerId,{target:a.target,buttons:a.buttons,x:a.clientX,y:a.clientY})},shouldTap:function(a,b){var c=!0;return"mouse"===a.pointerType&&(c=1^a.buttons&&1&b.buttons),c&&!a.tapPrevented},up:function(b){var e=d.get(b.pointerId);if(e&&this.shouldTap(b,e)){var f=a.targetFinding.LCA(e.target,b.relatedTarget);if(f){var g=c.makeGestureEvent("tap",{bubbles:!0,cancelable:!0,x:b.clientX,y:b.clientY,detail:b.detail,pointerType:b.pointerType,pointerId:b.pointerId,altKey:b.altKey,ctrlKey:b.ctrlKey,metaKey:b.metaKey,shiftKey:b.shiftKey,_source:"tap"});f.dispatchEvent(g)}}d["delete"](b.pointerId)}};c.preventTap=function(a){return function(){a.tapPrevented=!0,d["delete"](a.pointerId)}},b.registerGesture("tap",e)}(window.PolymerGestures),function(a){var b=a.dispatcher,c=a.eventFactory,d=new a.PointerMap,e=180/Math.PI,f={events:["down","up","move","cancel"],exposes:["pinchstart","pinch","pinchend","rotate"],defaultActions:{pinch:"none",rotate:"none"},reference:{},down:function(b){if(d.set(b.pointerId,b),2==d.pointers()){var c=this.calcChord(),e=this.calcAngle(c);this.reference={angle:e,diameter:c.diameter,target:a.targetFinding.LCA(c.a.target,c.b.target)},this.firePinch("pinchstart",c.diameter,c)}},up:function(a){var b=d.get(a.pointerId),c=d.pointers();if(b){if(2===c){var e=this.calcChord();this.firePinch("pinchend",e.diameter,e)}d["delete"](a.pointerId)}},move:function(a){d.has(a.pointerId)&&(d.set(a.pointerId,a),d.pointers()>1&&this.calcPinchRotate())},cancel:function(a){this.up(a)},firePinch:function(a,b,d){var e=b/this.reference.diameter,f=c.makeGestureEvent(a,{bubbles:!0,cancelable:!0,scale:e,centerX:d.center.x,centerY:d.center.y,_source:"pinch"});this.reference.target.dispatchEvent(f)},fireRotate:function(a,b){var d=Math.round((a-this.reference.angle)%360),e=c.makeGestureEvent("rotate",{bubbles:!0,cancelable:!0,angle:d,centerX:b.center.x,centerY:b.center.y,_source:"pinch"});this.reference.target.dispatchEvent(e)},calcPinchRotate:function(){var a=this.calcChord(),b=a.diameter,c=this.calcAngle(a);b!=this.reference.diameter&&this.firePinch("pinch",b,a),c!=this.reference.angle&&this.fireRotate(c,a)},calcChord:function(){var a=[];d.forEach(function(b){a.push(b)});for(var b,c,e,f=0,g={a:a[0],b:a[1]},h=0;h<a.length;h++)for(var i=a[h],j=h+1;j<a.length;j++){var k=a[j];b=Math.abs(i.clientX-k.clientX),c=Math.abs(i.clientY-k.clientY),e=b+c,e>f&&(f=e,g={a:i,b:k})}return b=Math.abs(g.a.clientX+g.b.clientX)/2,c=Math.abs(g.a.clientY+g.b.clientY)/2,g.center={x:b,y:c},g.diameter=f,g},calcAngle:function(a){var b=a.a.clientX-a.b.clientX,c=a.a.clientY-a.b.clientY;return(360+Math.atan2(c,b)*e)%360}};b.registerGesture("pinch",f)}(window.PolymerGestures),function(a){"use strict";function b(a,b){if(!a)throw new Error("ASSERT: "+b)}function c(a){return a>=48&&57>=a}function d(a){return 32===a||9===a||11===a||12===a||160===a||a>=5760&&" ᠎             　﻿".indexOf(String.fromCharCode(a))>0}function e(a){return 10===a||13===a||8232===a||8233===a}function f(a){return 36===a||95===a||a>=65&&90>=a||a>=97&&122>=a}function g(a){return 36===a||95===a||a>=65&&90>=a||a>=97&&122>=a||a>=48&&57>=a}function h(a){return"this"===a}function i(){for(;Y>X&&d(W.charCodeAt(X));)++X}function j(){var a,b;for(a=X++;Y>X&&(b=W.charCodeAt(X),g(b));)++X;return W.slice(a,X)}function k(){var a,b,c;return a=X,b=j(),c=1===b.length?S.Identifier:h(b)?S.Keyword:"null"===b?S.NullLiteral:"true"===b||"false"===b?S.BooleanLiteral:S.Identifier,{type:c,value:b,range:[a,X]}}function l(){var a,b,c=X,d=W.charCodeAt(X),e=W[X];switch(d){case 46:case 40:case 41:case 59:case 44:case 123:case 125:case 91:case 93:case 58:case 63:return++X,{type:S.Punctuator,value:String.fromCharCode(d),range:[c,X]};default:if(a=W.charCodeAt(X+1),61===a)switch(d){case 37:case 38:case 42:case 43:case 45:case 47:case 60:case 62:case 124:return X+=2,{type:S.Punctuator,value:String.fromCharCode(d)+String.fromCharCode(a),range:[c,X]};case 33:case 61:return X+=2,61===W.charCodeAt(X)&&++X,{type:S.Punctuator,value:W.slice(c,X),range:[c,X]}}}return b=W[X+1],e===b&&"&|".indexOf(e)>=0?(X+=2,{type:S.Punctuator,value:e+b,range:[c,X]}):"<>=!+-*%&|^/".indexOf(e)>=0?(++X,{type:S.Punctuator,value:e,range:[c,X]}):void s({},V.UnexpectedToken,"ILLEGAL")}function m(){var a,d,e;if(e=W[X],b(c(e.charCodeAt(0))||"."===e,"Numeric literal must start with a decimal digit or a decimal point"),d=X,a="","."!==e){for(a=W[X++],e=W[X],"0"===a&&e&&c(e.charCodeAt(0))&&s({},V.UnexpectedToken,"ILLEGAL");c(W.charCodeAt(X));)a+=W[X++];e=W[X]}if("."===e){for(a+=W[X++];c(W.charCodeAt(X));)a+=W[X++];e=W[X]}if("e"===e||"E"===e)if(a+=W[X++],e=W[X],("+"===e||"-"===e)&&(a+=W[X++]),c(W.charCodeAt(X)))for(;c(W.charCodeAt(X));)a+=W[X++];else s({},V.UnexpectedToken,"ILLEGAL");return f(W.charCodeAt(X))&&s({},V.UnexpectedToken,"ILLEGAL"),{type:S.NumericLiteral,value:parseFloat(a),range:[d,X]}}function n(){var a,c,d,f="",g=!1;for(a=W[X],b("'"===a||'"'===a,"String literal must starts with a quote"),c=X,++X;Y>X;){if(d=W[X++],d===a){a="";break}if("\\"===d)if(d=W[X++],d&&e(d.charCodeAt(0)))"\r"===d&&"\n"===W[X]&&++X;else switch(d){case"n":f+="\n";break;case"r":f+="\r";break;case"t":f+="	";break;case"b":f+="\b";break;case"f":f+="\f";break;case"v":f+="";break;default:f+=d}else{if(e(d.charCodeAt(0)))break;f+=d}}return""!==a&&s({},V.UnexpectedToken,"ILLEGAL"),{type:S.StringLiteral,value:f,octal:g,range:[c,X]}}function o(a){return a.type===S.Identifier||a.type===S.Keyword||a.type===S.BooleanLiteral||a.type===S.NullLiteral}function p(){var a;return i(),X>=Y?{type:S.EOF,range:[X,X]}:(a=W.charCodeAt(X),40===a||41===a||58===a?l():39===a||34===a?n():f(a)?k():46===a?c(W.charCodeAt(X+1))?m():l():c(a)?m():l())}function q(){var a;return a=$,X=a.range[1],$=p(),X=a.range[1],a}function r(){var a;a=X,$=p(),X=a}function s(a,c){var d,e=Array.prototype.slice.call(arguments,2),f=c.replace(/%(\d)/g,function(a,c){return b(c<e.length,"Message reference must be in range"),e[c]});throw d=new Error(f),d.index=X,d.description=f,d}function t(a){s(a,V.UnexpectedToken,a.value)}function u(a){var b=q();(b.type!==S.Punctuator||b.value!==a)&&t(b)}function v(a){return $.type===S.Punctuator&&$.value===a}function w(a){return $.type===S.Keyword&&$.value===a}function x(){var a=[];for(u("[");!v("]");)v(",")?(q(),a.push(null)):(a.push(bb()),v("]")||u(","));return u("]"),Z.createArrayExpression(a)}function y(){var a;return i(),a=q(),a.type===S.StringLiteral||a.type===S.NumericLiteral?Z.createLiteral(a):Z.createIdentifier(a.value)}function z(){var a,b;return a=$,i(),(a.type===S.EOF||a.type===S.Punctuator)&&t(a),b=y(),u(":"),Z.createProperty("init",b,bb())}function A(){var a=[];for(u("{");!v("}");)a.push(z()),v("}")||u(",");return u("}"),Z.createObjectExpression(a)}function B(){var a;return u("("),a=bb(),u(")"),a}function C(){var a,b,c;return v("(")?B():(a=$.type,a===S.Identifier?c=Z.createIdentifier(q().value):a===S.StringLiteral||a===S.NumericLiteral?c=Z.createLiteral(q()):a===S.Keyword?w("this")&&(q(),c=Z.createThisExpression()):a===S.BooleanLiteral?(b=q(),b.value="true"===b.value,c=Z.createLiteral(b)):a===S.NullLiteral?(b=q(),b.value=null,c=Z.createLiteral(b)):v("[")?c=x():v("{")&&(c=A()),c?c:void t(q()))}function D(){var a=[];if(u("("),!v(")"))for(;Y>X&&(a.push(bb()),!v(")"));)u(",");return u(")"),a}function E(){var a;return a=q(),o(a)||t(a),Z.createIdentifier(a.value)}function F(){return u("."),E()}function G(){var a;return u("["),a=bb(),u("]"),a}function H(){var a,b,c;for(a=C();;)if(v("["))c=G(),a=Z.createMemberExpression("[",a,c);else if(v("."))c=F(),a=Z.createMemberExpression(".",a,c);else{if(!v("("))break;b=D(),a=Z.createCallExpression(a,b)}return a}function I(){var a,b;return $.type!==S.Punctuator&&$.type!==S.Keyword?b=ab():v("+")||v("-")||v("!")?(a=q(),b=I(),b=Z.createUnaryExpression(a.value,b)):w("delete")||w("void")||w("typeof")?s({},V.UnexpectedToken):b=ab(),b}function J(a){var b=0;if(a.type!==S.Punctuator&&a.type!==S.Keyword)return 0;switch(a.value){case"||":b=1;break;case"&&":b=2;break;case"==":case"!=":case"===":case"!==":b=6;break;case"<":case">":case"<=":case">=":case"instanceof":b=7;break;case"in":b=7;break;case"+":case"-":b=9;break;case"*":case"/":case"%":b=11}return b}function K(){var a,b,c,d,e,f,g,h;if(g=I(),b=$,c=J(b),0===c)return g;for(b.prec=c,q(),e=I(),d=[g,b,e];(c=J($))>0;){for(;d.length>2&&c<=d[d.length-2].prec;)e=d.pop(),f=d.pop().value,g=d.pop(),a=Z.createBinaryExpression(f,g,e),d.push(a);b=q(),b.prec=c,d.push(b),a=I(),d.push(a)}for(h=d.length-1,a=d[h];h>1;)a=Z.createBinaryExpression(d[h-1].value,d[h-2],a),h-=2;return a}function L(){var a,b,c;return a=K(),v("?")&&(q(),b=L(),u(":"),c=L(),a=Z.createConditionalExpression(a,b,c)),a}function M(){var a,b;return a=q(),a.type!==S.Identifier&&t(a),b=v("(")?D():[],Z.createFilter(a.value,b)}function N(){for(;v("|");)q(),M()}function O(){i(),r();var a=bb();a&&(","===$.value||"in"==$.value&&a.type===U.Identifier?Q(a):(N(),"as"===$.value?P(a):Z.createTopLevel(a))),$.type!==S.EOF&&t($)}function P(a){q();var b=q().value;Z.createAsExpression(a,b)}function Q(a){var b;","===$.value&&(q(),$.type!==S.Identifier&&t($),b=q().value),q();var c=bb();N(),Z.createInExpression(a.name,b,c)}function R(a,b){return Z=b,W=a,X=0,Y=W.length,$=null,_={labelSet:{}},O()}var S,T,U,V,W,X,Y,Z,$,_;S={BooleanLiteral:1,EOF:2,Identifier:3,Keyword:4,NullLiteral:5,NumericLiteral:6,Punctuator:7,StringLiteral:8},T={},T[S.BooleanLiteral]="Boolean",T[S.EOF]="<end>",T[S.Identifier]="Identifier",T[S.Keyword]="Keyword",T[S.NullLiteral]="Null",T[S.NumericLiteral]="Numeric",T[S.Punctuator]="Punctuator",T[S.StringLiteral]="String",U={ArrayExpression:"ArrayExpression",BinaryExpression:"BinaryExpression",CallExpression:"CallExpression",ConditionalExpression:"ConditionalExpression",EmptyStatement:"EmptyStatement",ExpressionStatement:"ExpressionStatement",Identifier:"Identifier",Literal:"Literal",LabeledStatement:"LabeledStatement",LogicalExpression:"LogicalExpression",MemberExpression:"MemberExpression",ObjectExpression:"ObjectExpression",Program:"Program",Property:"Property",ThisExpression:"ThisExpression",UnaryExpression:"UnaryExpression"},V={UnexpectedToken:"Unexpected token %0",UnknownLabel:"Undefined label '%0'",Redeclaration:"%0 '%1' has already been declared"};
var ab=H,bb=L;a.esprima={parse:R}}(this),function(a){"use strict";function b(a,b,d,e){var f;try{if(f=c(a),f.scopeIdent&&(d.nodeType!==Node.ELEMENT_NODE||"TEMPLATE"!==d.tagName||"bind"!==b&&"repeat"!==b))throw Error("as and in can only be used within <template bind/repeat>")}catch(g){return void console.error("Invalid expression syntax: "+a,g)}return function(a,b,c){var d=f.getBinding(a,e,c);return f.scopeIdent&&d&&(b.polymerExpressionScopeIdent_=f.scopeIdent,f.indexIdent&&(b.polymerExpressionIndexIdent_=f.indexIdent)),d}}function c(a){var b=q[a];if(!b){var c=new j;esprima.parse(a,c),b=new l(c),q[a]=b}return b}function d(a){this.value=a,this.valueFn_=void 0}function e(a){this.name=a,this.path=Path.get(a)}function f(a,b,c){this.computed="["==c,this.dynamicDeps="function"==typeof a||a.dynamicDeps||this.computed&&!(b instanceof d),this.simplePath=!this.dynamicDeps&&(b instanceof e||b instanceof d)&&(a instanceof f||a instanceof e),this.object=this.simplePath?a:i(a),this.property=!this.computed||this.simplePath?b:i(b)}function g(a,b){this.name=a,this.args=[];for(var c=0;c<b.length;c++)this.args[c]=i(b[c])}function h(){throw Error("Not Implemented")}function i(a){return"function"==typeof a?a:a.valueFn()}function j(){this.expression=null,this.filters=[],this.deps={},this.currentPath=void 0,this.scopeIdent=void 0,this.indexIdent=void 0,this.dynamicDeps=!1}function k(a){this.value_=a}function l(a){if(this.scopeIdent=a.scopeIdent,this.indexIdent=a.indexIdent,!a.expression)throw Error("No expression found.");this.expression=a.expression,i(this.expression),this.filters=a.filters,this.dynamicDeps=a.dynamicDeps}function m(a){return String(a).replace(/[A-Z]/g,function(a){return"-"+a.toLowerCase()})}function n(a,b){for(;a[t]&&!Object.prototype.hasOwnProperty.call(a,b);)a=a[t];return a}function o(a){switch(a){case"":return!1;case"false":case"null":case"true":return!0}return isNaN(Number(a))?!1:!0}function p(){}var q=Object.create(null);d.prototype={valueFn:function(){if(!this.valueFn_){var a=this.value;this.valueFn_=function(){return a}}return this.valueFn_}},e.prototype={valueFn:function(){if(!this.valueFn_){var a=(this.name,this.path);this.valueFn_=function(b,c){return c&&c.addPath(b,a),a.getValueFrom(b)}}return this.valueFn_},setValue:function(a,b){return 1==this.path.length&&(a=n(a,this.path[0])),this.path.setValueFrom(a,b)}},f.prototype={get fullPath(){if(!this.fullPath_){var a=this.object instanceof f?this.object.fullPath.slice():[this.object.name];a.push(this.property instanceof e?this.property.name:this.property.value),this.fullPath_=Path.get(a)}return this.fullPath_},valueFn:function(){if(!this.valueFn_){var a=this.object;if(this.simplePath){var b=this.fullPath;this.valueFn_=function(a,c){return c&&c.addPath(a,b),b.getValueFrom(a)}}else if(this.computed){var c=this.property;this.valueFn_=function(b,d,e){var f=a(b,d,e),g=c(b,d,e);return d&&d.addPath(f,[g]),f?f[g]:void 0}}else{var b=Path.get(this.property.name);this.valueFn_=function(c,d,e){var f=a(c,d,e);return d&&d.addPath(f,b),b.getValueFrom(f)}}}return this.valueFn_},setValue:function(a,b){if(this.simplePath)return this.fullPath.setValueFrom(a,b),b;var c=this.object(a),d=this.property instanceof e?this.property.name:this.property(a);return c[d]=b}},g.prototype={transform:function(a,b,c,d,e){var f=a,g=f[this.name];if(!g&&(g=c[this.name],!g))return void console.error("Cannot find function or filter: "+this.name);if(d?g=g.toModel:"function"==typeof g.toDOM&&(g=g.toDOM),"function"!=typeof g)return void console.error("Cannot find function or filter: "+this.name);for(var h=e||[],j=0;j<this.args.length;j++)h.push(i(this.args[j])(a,b,c));return g.apply(f,h)}};var r={"+":function(a){return+a},"-":function(a){return-a},"!":function(a){return!a}},s={"+":function(a,b){return a+b},"-":function(a,b){return a-b},"*":function(a,b){return a*b},"/":function(a,b){return a/b},"%":function(a,b){return a%b},"<":function(a,b){return b>a},">":function(a,b){return a>b},"<=":function(a,b){return b>=a},">=":function(a,b){return a>=b},"==":function(a,b){return a==b},"!=":function(a,b){return a!=b},"===":function(a,b){return a===b},"!==":function(a,b){return a!==b},"&&":function(a,b){return a&&b},"||":function(a,b){return a||b}};j.prototype={createUnaryExpression:function(a,b){if(!r[a])throw Error("Disallowed operator: "+a);return b=i(b),function(c,d,e){return r[a](b(c,d,e))}},createBinaryExpression:function(a,b,c){if(!s[a])throw Error("Disallowed operator: "+a);switch(b=i(b),c=i(c),a){case"||":return this.dynamicDeps=!0,function(a,d,e){return b(a,d,e)||c(a,d,e)};case"&&":return this.dynamicDeps=!0,function(a,d,e){return b(a,d,e)&&c(a,d,e)}}return function(d,e,f){return s[a](b(d,e,f),c(d,e,f))}},createConditionalExpression:function(a,b,c){return a=i(a),b=i(b),c=i(c),this.dynamicDeps=!0,function(d,e,f){return a(d,e,f)?b(d,e,f):c(d,e,f)}},createIdentifier:function(a){var b=new e(a);return b.type="Identifier",b},createMemberExpression:function(a,b,c){var d=new f(b,c,a);return d.dynamicDeps&&(this.dynamicDeps=!0),d},createCallExpression:function(a,b){if(!(a instanceof e))throw Error("Only identifier function invocations are allowed");var c=new g(a.name,b);return function(a,b,d){return c.transform(a,b,d,!1)}},createLiteral:function(a){return new d(a.value)},createArrayExpression:function(a){for(var b=0;b<a.length;b++)a[b]=i(a[b]);return function(b,c,d){for(var e=[],f=0;f<a.length;f++)e.push(a[f](b,c,d));return e}},createProperty:function(a,b,c){return{key:b instanceof e?b.name:b.value,value:c}},createObjectExpression:function(a){for(var b=0;b<a.length;b++)a[b].value=i(a[b].value);return function(b,c,d){for(var e={},f=0;f<a.length;f++)e[a[f].key]=a[f].value(b,c,d);return e}},createFilter:function(a,b){this.filters.push(new g(a,b))},createAsExpression:function(a,b){this.expression=a,this.scopeIdent=b},createInExpression:function(a,b,c){this.expression=c,this.scopeIdent=a,this.indexIdent=b},createTopLevel:function(a){this.expression=a},createThisExpression:h},k.prototype={open:function(){return this.value_},discardChanges:function(){return this.value_},deliver:function(){},close:function(){}},l.prototype={getBinding:function(a,b,c){function d(){if(h)return h=!1,g;i.dynamicDeps&&f.startReset();var c=i.getValue(a,i.dynamicDeps?f:void 0,b);return i.dynamicDeps&&f.finishReset(),c}function e(c){return i.setValue(a,c,b),c}if(c)return this.getValue(a,void 0,b);var f=new CompoundObserver,g=this.getValue(a,f,b),h=!0,i=this;return new ObserverTransform(f,d,e,!0)},getValue:function(a,b,c){for(var d=i(this.expression)(a,b,c),e=0;e<this.filters.length;e++)d=this.filters[e].transform(a,b,c,!1,[d]);return d},setValue:function(a,b,c){for(var d=this.filters?this.filters.length:0;d-->0;)b=this.filters[d].transform(a,void 0,c,!0,[b]);return this.expression.setValue?this.expression.setValue(a,b):void 0}};var t="@"+Math.random().toString(36).slice(2);p.prototype={styleObject:function(a){var b=[];for(var c in a)b.push(m(c)+": "+a[c]);return b.join("; ")},tokenList:function(a){var b=[];for(var c in a)a[c]&&b.push(c);return b.join(" ")},prepareInstancePositionChanged:function(a){var b=a.polymerExpressionIndexIdent_;if(b)return function(a,c){a.model[b]=c}},prepareBinding:function(a,c,d){var e=Path.get(a);{if(o(a)||!e.valid)return b(a,c,d,this);if(1==e.length)return function(a,b,c){if(c)return e.getValueFrom(a);var d=n(a,e[0]);return new PathObserver(d,e)}}},prepareInstanceModel:function(a){var b=a.polymerExpressionScopeIdent_;if(b){var c=a.templateInstance?a.templateInstance.model:a.model,d=a.polymerExpressionIndexIdent_;return function(a){return u(c,a,b,d)}}}};var u="__proto__"in{}?function(a,b,c,d){var e={};return e[c]=b,e[d]=void 0,e[t]=a,e.__proto__=a,e}:function(a,b,c,d){var e=Object.create(a);return Object.defineProperty(e,c,{value:b,configurable:!0,writable:!0}),Object.defineProperty(e,d,{value:void 0,configurable:!0,writable:!0}),Object.defineProperty(e,t,{value:a,configurable:!0,writable:!0}),e};a.PolymerExpressions=p,p.getExpression=c}(this),Polymer={version:"0.5.5"},"function"==typeof window.Polymer&&(Polymer={}),function(a){function b(a,b){return b=b||[],b.map||(b=[b]),a.apply(this,b.map(d))}function c(a,c,d){var e;switch(arguments.length){case 0:return;case 1:e=null;break;case 2:e=c.apply(this);break;default:e=b(d,c)}f[a]=e}function d(a){return f[a]}function e(a,c){HTMLImports.whenImportsReady(function(){b(c,a)})}var f={};a.marshal=d,a.modularize=c,a.using=e}(window),window.WebComponents||(window.WebComponents||(WebComponents={flush:function(){},flags:{log:{}}},Platform=WebComponents,CustomElements={useNative:!0,ready:!0,takeRecords:function(){},"instanceof":function(a,b){return a instanceof b}},HTMLImports={useNative:!0},addEventListener("HTMLImportsLoaded",function(){document.dispatchEvent(new CustomEvent("WebComponentsReady",{bubbles:!0}))}),ShadowDOMPolyfill=null,wrap=unwrap=function(a){return a}),window.HTMLImports=window.HTMLImports||{flags:{}},function(a){function b(a,b){b=b||o,d(function(){f(a,b)},b)}function c(a){return"complete"===a.readyState||a.readyState===r}function d(a,b){if(c(b))a&&a();else{var e=function(){("complete"===b.readyState||b.readyState===r)&&(b.removeEventListener(s,e),d(a,b))};b.addEventListener(s,e)}}function e(a){a.target.__loaded=!0}function f(a,b){function c(){h==i&&a&&a()}function d(a){e(a),h++,c()}var f=b.querySelectorAll("link[rel=import]"),h=0,i=f.length;if(i)for(var j,k=0;i>k&&(j=f[k]);k++)g(j)?d.call(j,{target:j}):(j.addEventListener("load",d),j.addEventListener("error",d));else c()}function g(a){return l?a.__loaded||a["import"]&&"loading"!==a["import"].readyState:a.__importParsed}function h(a){for(var b,c=0,d=a.length;d>c&&(b=a[c]);c++)i(b)&&j(b)}function i(a){return"link"===a.localName&&"import"===a.rel}function j(a){var b=a["import"];b?e({target:a}):(a.addEventListener("load",e),a.addEventListener("error",e))}var k="import",l=Boolean(k in document.createElement("link")),m=Boolean(window.ShadowDOMPolyfill),n=function(a){return m?ShadowDOMPolyfill.wrapIfNeeded(a):a},o=n(document),p={get:function(){var a=HTMLImports.currentScript||document.currentScript||("complete"!==document.readyState?document.scripts[document.scripts.length-1]:null);return n(a)},configurable:!0};Object.defineProperty(document,"_currentScript",p),Object.defineProperty(o,"_currentScript",p);var q=/Trident/.test(navigator.userAgent),r=q?"complete":"interactive",s="readystatechange";l&&(new MutationObserver(function(a){for(var b,c=0,d=a.length;d>c&&(b=a[c]);c++)b.addedNodes&&h(b.addedNodes)}).observe(document.head,{childList:!0}),function(){if("loading"===document.readyState)for(var a,b=document.querySelectorAll("link[rel=import]"),c=0,d=b.length;d>c&&(a=b[c]);c++)j(a)}()),b(function(){HTMLImports.ready=!0,HTMLImports.readyTime=(new Date).getTime(),o.dispatchEvent(new CustomEvent("HTMLImportsLoaded",{bubbles:!0}))}),a.IMPORT_LINK_TYPE=k,a.useNative=l,a.rootDocument=o,a.whenReady=b,a.isIE=q}(HTMLImports),function(){var a=document.createElement("style");a.textContent="body {transition: opacity ease-in 0.2s; } \nbody[unresolved] {opacity: 0; display: block; overflow: hidden; } \n";var b=document.querySelector("head");b.insertBefore(a,b.firstChild)}(Platform)),function(a){"use strict";function b(){function a(a){b=a}if("function"!=typeof Object.observe||"function"!=typeof Array.observe)return!1;var b=[],c={},d=[];return Object.observe(c,a),Array.observe(d,a),c.id=1,c.id=2,delete c.id,d.push(1,2),d.length=0,Object.deliverChangeRecords(a),5!==b.length?!1:"add"!=b[0].type||"update"!=b[1].type||"delete"!=b[2].type||"splice"!=b[3].type||"splice"!=b[4].type?!1:(Object.unobserve(c,a),Array.unobserve(d,a),!0)}function c(){if("undefined"!=typeof chrome&&chrome.app&&chrome.app.runtime)return!1;if("undefined"!=typeof navigator&&navigator.getDeviceStorage)return!1;try{var a=new Function("","return true;");return a()}catch(b){return!1}}function d(a){return+a===a>>>0&&""!==a}function e(a){return+a}function f(a){return a===Object(a)}function g(a,b){return a===b?0!==a||1/a===1/b:R(a)&&R(b)?!0:a!==a&&b!==b}function h(a){if(void 0===a)return"eof";var b=a.charCodeAt(0);switch(b){case 91:case 93:case 46:case 34:case 39:case 48:return a;case 95:case 36:return"ident";case 32:case 9:case 10:case 13:case 160:case 65279:case 8232:case 8233:return"ws"}return b>=97&&122>=b||b>=65&&90>=b?"ident":b>=49&&57>=b?"number":"else"}function i(){}function j(a){function b(){if(!(m>=a.length)){var b=a[m+1];return"inSingleQuote"==n&&"'"==b||"inDoubleQuote"==n&&'"'==b?(m++,d=b,o.append(),!0):void 0}}for(var c,d,e,f,g,j,k,l=[],m=-1,n="beforePath",o={push:function(){void 0!==e&&(l.push(e),e=void 0)},append:function(){void 0===e?e=d:e+=d}};n;)if(m++,c=a[m],"\\"!=c||!b(n)){if(f=h(c),k=W[n],g=k[f]||k["else"]||"error","error"==g)return;if(n=g[0],j=o[g[1]]||i,d=void 0===g[2]?c:g[2],j(),"afterPath"===n)return l}}function k(a){return V.test(a)}function l(a,b){if(b!==X)throw Error("Use Path.get to retrieve path objects");for(var c=0;c<a.length;c++)this.push(String(a[c]));Q&&this.length&&(this.getValueFrom=this.compiledGetValueFromFn())}function m(a){if(a instanceof l)return a;if((null==a||0==a.length)&&(a=""),"string"!=typeof a){if(d(a.length))return new l(a,X);a=String(a)}var b=Y[a];if(b)return b;var c=j(a);if(!c)return Z;var b=new l(c,X);return Y[a]=b,b}function n(a){return d(a)?"["+a+"]":'["'+a.replace(/"/g,'\\"')+'"]'}function o(b){for(var c=0;_>c&&b.check_();)c++;return O&&(a.dirtyCheckCycleCount=c),c>0}function p(a){for(var b in a)return!1;return!0}function q(a){return p(a.added)&&p(a.removed)&&p(a.changed)}function r(a,b){var c={},d={},e={};for(var f in b){var g=a[f];(void 0===g||g!==b[f])&&(f in a?g!==b[f]&&(e[f]=g):d[f]=void 0)}for(var f in a)f in b||(c[f]=a[f]);return Array.isArray(a)&&a.length!==b.length&&(e.length=a.length),{added:c,removed:d,changed:e}}function s(){if(!ab.length)return!1;for(var a=0;a<ab.length;a++)ab[a]();return ab.length=0,!0}function t(){function a(a){b&&b.state_===fb&&!d&&b.check_(a)}var b,c,d=!1,e=!0;return{open:function(c){if(b)throw Error("ObservedObject in use");e||Object.deliverChangeRecords(a),b=c,e=!1},observe:function(b,d){c=b,d?Array.observe(c,a):Object.observe(c,a)},deliver:function(b){d=b,Object.deliverChangeRecords(a),d=!1},close:function(){b=void 0,Object.unobserve(c,a),cb.push(this)}}}function u(a,b,c){var d=cb.pop()||t();return d.open(a),d.observe(b,c),d}function v(){function a(b,f){b&&(b===d&&(e[f]=!0),h.indexOf(b)<0&&(h.push(b),Object.observe(b,c)),a(Object.getPrototypeOf(b),f))}function b(a){for(var b=0;b<a.length;b++){var c=a[b];if(c.object!==d||e[c.name]||"setPrototype"===c.type)return!1}return!0}function c(c){if(!b(c)){for(var d,e=0;e<g.length;e++)d=g[e],d.state_==fb&&d.iterateObjects_(a);for(var e=0;e<g.length;e++)d=g[e],d.state_==fb&&d.check_()}}var d,e,f=0,g=[],h=[],i={objects:h,get rootObject(){return d},set rootObject(a){d=a,e={}},open:function(b){g.push(b),f++,b.iterateObjects_(a)},close:function(){if(f--,!(f>0)){for(var a=0;a<h.length;a++)Object.unobserve(h[a],c),x.unobservedCount++;g.length=0,h.length=0,d=void 0,e=void 0,db.push(this),$===this&&($=null)}}};return i}function w(a,b){return $&&$.rootObject===b||($=db.pop()||v(),$.rootObject=b),$.open(a,b),$}function x(){this.state_=eb,this.callback_=void 0,this.target_=void 0,this.directObserver_=void 0,this.value_=void 0,this.id_=ib++}function y(a){x._allObserversCount++,kb&&jb.push(a)}function z(){x._allObserversCount--}function A(a){x.call(this),this.value_=a,this.oldObject_=void 0}function B(a){if(!Array.isArray(a))throw Error("Provided object is not an Array");A.call(this,a)}function C(a,b){x.call(this),this.object_=a,this.path_=m(b),this.directObserver_=void 0}function D(a){x.call(this),this.reportChangesOnOpen_=a,this.value_=[],this.directObserver_=void 0,this.observed_=[]}function E(a){return a}function F(a,b,c,d){this.callback_=void 0,this.target_=void 0,this.value_=void 0,this.observable_=a,this.getValueFn_=b||E,this.setValueFn_=c||E,this.dontPassThroughSet_=d}function G(a,b,c){for(var d={},e={},f=0;f<b.length;f++){var g=b[f];nb[g.type]?(g.name in c||(c[g.name]=g.oldValue),"update"!=g.type&&("add"!=g.type?g.name in d?(delete d[g.name],delete c[g.name]):e[g.name]=!0:g.name in e?delete e[g.name]:d[g.name]=!0)):(console.error("Unknown changeRecord type: "+g.type),console.error(g))}for(var h in d)d[h]=a[h];for(var h in e)e[h]=void 0;var i={};for(var h in c)if(!(h in d||h in e)){var j=a[h];c[h]!==j&&(i[h]=j)}return{added:d,removed:e,changed:i}}function H(a,b,c){return{index:a,removed:b,addedCount:c}}function I(){}function J(a,b,c,d,e,f){return sb.calcSplices(a,b,c,d,e,f)}function K(a,b,c,d){return c>b||a>d?-1:b==c||d==a?0:c>a?d>b?b-c:d-c:b>d?d-a:b-a}function L(a,b,c,d){for(var e=H(b,c,d),f=!1,g=0,h=0;h<a.length;h++){var i=a[h];if(i.index+=g,!f){var j=K(e.index,e.index+e.removed.length,i.index,i.index+i.addedCount);if(j>=0){a.splice(h,1),h--,g-=i.addedCount-i.removed.length,e.addedCount+=i.addedCount-j;var k=e.removed.length+i.removed.length-j;if(e.addedCount||k){var c=i.removed;if(e.index<i.index){var l=e.removed.slice(0,i.index-e.index);Array.prototype.push.apply(l,c),c=l}if(e.index+e.removed.length>i.index+i.addedCount){var m=e.removed.slice(i.index+i.addedCount-e.index);Array.prototype.push.apply(c,m)}e.removed=c,i.index<e.index&&(e.index=i.index)}else f=!0}else if(e.index<i.index){f=!0,a.splice(h,0,e),h++;var n=e.addedCount-e.removed.length;i.index+=n,g+=n}}}f||a.push(e)}function M(a,b){for(var c=[],f=0;f<b.length;f++){var g=b[f];switch(g.type){case"splice":L(c,g.index,g.removed.slice(),g.addedCount);break;case"add":case"update":case"delete":if(!d(g.name))continue;var h=e(g.name);if(0>h)continue;L(c,h,[g.oldValue],1);break;default:console.error("Unexpected record type: "+JSON.stringify(g))}}return c}function N(a,b){var c=[];return M(a,b).forEach(function(b){return 1==b.addedCount&&1==b.removed.length?void(b.removed[0]!==a[b.index]&&c.push(b)):void(c=c.concat(J(a,b.index,b.index+b.addedCount,b.removed,0,b.removed.length)))}),c}var O=a.testingExposeCycleCount,P=b(),Q=c(),R=a.Number.isNaN||function(b){return"number"==typeof b&&a.isNaN(b)},S="__proto__"in{}?function(a){return a}:function(a){var b=a.__proto__;if(!b)return a;var c=Object.create(b);return Object.getOwnPropertyNames(a).forEach(function(b){Object.defineProperty(c,b,Object.getOwnPropertyDescriptor(a,b))}),c},T="[$_a-zA-Z]",U="[$_a-zA-Z0-9]",V=new RegExp("^"+T+"+"+U+"*$"),W={beforePath:{ws:["beforePath"],ident:["inIdent","append"],"[":["beforeElement"],eof:["afterPath"]},inPath:{ws:["inPath"],".":["beforeIdent"],"[":["beforeElement"],eof:["afterPath"]},beforeIdent:{ws:["beforeIdent"],ident:["inIdent","append"]},inIdent:{ident:["inIdent","append"],0:["inIdent","append"],number:["inIdent","append"],ws:["inPath","push"],".":["beforeIdent","push"],"[":["beforeElement","push"],eof:["afterPath","push"]},beforeElement:{ws:["beforeElement"],0:["afterZero","append"],number:["inIndex","append"],"'":["inSingleQuote","append",""],'"':["inDoubleQuote","append",""]},afterZero:{ws:["afterElement","push"],"]":["inPath","push"]},inIndex:{0:["inIndex","append"],number:["inIndex","append"],ws:["afterElement"],"]":["inPath","push"]},inSingleQuote:{"'":["afterElement"],eof:["error"],"else":["inSingleQuote","append"]},inDoubleQuote:{'"':["afterElement"],eof:["error"],"else":["inDoubleQuote","append"]},afterElement:{ws:["afterElement"],"]":["inPath","push"]}},X={},Y={};l.get=m,l.prototype=S({__proto__:[],valid:!0,toString:function(){for(var a="",b=0;b<this.length;b++){var c=this[b];a+=k(c)?b?"."+c:c:n(c)}return a},getValueFrom:function(a){for(var b=0;b<this.length;b++){if(null==a)return;a=a[this[b]]}return a},iterateObjects:function(a,b){for(var c=0;c<this.length;c++){if(c&&(a=a[this[c-1]]),!f(a))return;b(a,this[c])}},compiledGetValueFromFn:function(){var a="",b="obj";a+="if (obj != null";for(var c,d=0;d<this.length-1;d++)c=this[d],b+=k(c)?"."+c:n(c),a+=" &&\n     "+b+" != null";a+=")\n";var c=this[d];return b+=k(c)?"."+c:n(c),a+="  return "+b+";\nelse\n  return undefined;",new Function("obj",a)},setValueFrom:function(a,b){if(!this.length)return!1;for(var c=0;c<this.length-1;c++){if(!f(a))return!1;a=a[this[c]]}return f(a)?(a[this[c]]=b,!0):!1}});var Z=new l("",X);Z.valid=!1,Z.getValueFrom=Z.setValueFrom=function(){};var $,_=1e3,ab=[],bb=P?function(){return function(a){return Promise.resolve().then(a)}}():function(){return function(a){ab.push(a)}}(),cb=[],db=[],eb=0,fb=1,gb=2,hb=3,ib=1;x.prototype={open:function(a,b){if(this.state_!=eb)throw Error("Observer has already been opened.");return y(this),this.callback_=a,this.target_=b,this.connect_(),this.state_=fb,this.value_},close:function(){this.state_==fb&&(z(this),this.disconnect_(),this.value_=void 0,this.callback_=void 0,this.target_=void 0,this.state_=gb)},deliver:function(){this.state_==fb&&o(this)},report_:function(a){try{this.callback_.apply(this.target_,a)}catch(b){x._errorThrownDuringCallback=!0,console.error("Exception caught during observer callback: "+(b.stack||b))}},discardChanges:function(){return this.check_(void 0,!0),this.value_}};var jb,kb=!P;x._allObserversCount=0,kb&&(jb=[]);var lb=!1;a.Platform=a.Platform||{},a.Platform.performMicrotaskCheckpoint=function(){if(!lb&&kb){lb=!0;var b,c,d=0;do{d++,c=jb,jb=[],b=!1;for(var e=0;e<c.length;e++){var f=c[e];f.state_==fb&&(f.check_()&&(b=!0),jb.push(f))}s()&&(b=!0)}while(_>d&&b);O&&(a.dirtyCheckCycleCount=d),lb=!1}},kb&&(a.Platform.clearObservers=function(){jb=[]}),A.prototype=S({__proto__:x.prototype,arrayObserve:!1,connect_:function(){P?this.directObserver_=u(this,this.value_,this.arrayObserve):this.oldObject_=this.copyObject(this.value_)},copyObject:function(a){var b=Array.isArray(a)?[]:{};for(var c in a)b[c]=a[c];return Array.isArray(a)&&(b.length=a.length),b},check_:function(a){var b,c;if(P){if(!a)return!1;c={},b=G(this.value_,a,c)}else c=this.oldObject_,b=r(this.value_,this.oldObject_);return q(b)?!1:(P||(this.oldObject_=this.copyObject(this.value_)),this.report_([b.added||{},b.removed||{},b.changed||{},function(a){return c[a]}]),!0)},disconnect_:function(){P?(this.directObserver_.close(),this.directObserver_=void 0):this.oldObject_=void 0},deliver:function(){this.state_==fb&&(P?this.directObserver_.deliver(!1):o(this))},discardChanges:function(){return this.directObserver_?this.directObserver_.deliver(!0):this.oldObject_=this.copyObject(this.value_),this.value_}}),B.prototype=S({__proto__:A.prototype,arrayObserve:!0,copyObject:function(a){return a.slice()},check_:function(a){var b;if(P){if(!a)return!1;b=N(this.value_,a)}else b=J(this.value_,0,this.value_.length,this.oldObject_,0,this.oldObject_.length);return b&&b.length?(P||(this.oldObject_=this.copyObject(this.value_)),this.report_([b]),!0):!1}}),B.applySplices=function(a,b,c){c.forEach(function(c){for(var d=[c.index,c.removed.length],e=c.index;e<c.index+c.addedCount;)d.push(b[e]),e++;Array.prototype.splice.apply(a,d)})},C.prototype=S({__proto__:x.prototype,get path(){return this.path_},connect_:function(){P&&(this.directObserver_=w(this,this.object_)),this.check_(void 0,!0)},disconnect_:function(){this.value_=void 0,this.directObserver_&&(this.directObserver_.close(this),this.directObserver_=void 0)},iterateObjects_:function(a){this.path_.iterateObjects(this.object_,a)},check_:function(a,b){var c=this.value_;return this.value_=this.path_.getValueFrom(this.object_),b||g(this.value_,c)?!1:(this.report_([this.value_,c,this]),!0)},setValue:function(a){this.path_&&this.path_.setValueFrom(this.object_,a)}});var mb={};D.prototype=S({__proto__:x.prototype,connect_:function(){if(P){for(var a,b=!1,c=0;c<this.observed_.length;c+=2)if(a=this.observed_[c],a!==mb){b=!0;break}b&&(this.directObserver_=w(this,a))}this.check_(void 0,!this.reportChangesOnOpen_)},disconnect_:function(){for(var a=0;a<this.observed_.length;a+=2)this.observed_[a]===mb&&this.observed_[a+1].close();this.observed_.length=0,this.value_.length=0,this.directObserver_&&(this.directObserver_.close(this),this.directObserver_=void 0)},addPath:function(a,b){if(this.state_!=eb&&this.state_!=hb)throw Error("Cannot add paths once started.");var b=m(b);if(this.observed_.push(a,b),this.reportChangesOnOpen_){var c=this.observed_.length/2-1;this.value_[c]=b.getValueFrom(a)}},addObserver:function(a){if(this.state_!=eb&&this.state_!=hb)throw Error("Cannot add observers once started.");if(this.observed_.push(mb,a),this.reportChangesOnOpen_){var b=this.observed_.length/2-1;this.value_[b]=a.open(this.deliver,this)}},startReset:function(){if(this.state_!=fb)throw Error("Can only reset while open");this.state_=hb,this.disconnect_()},finishReset:function(){if(this.state_!=hb)throw Error("Can only finishReset after startReset");return this.state_=fb,this.connect_(),this.value_},iterateObjects_:function(a){for(var b,c=0;c<this.observed_.length;c+=2)b=this.observed_[c],b!==mb&&this.observed_[c+1].iterateObjects(b,a)},check_:function(a,b){for(var c,d=0;d<this.observed_.length;d+=2){var e,f=this.observed_[d],h=this.observed_[d+1];if(f===mb){var i=h;e=this.state_===eb?i.open(this.deliver,this):i.discardChanges()}else e=h.getValueFrom(f);b?this.value_[d/2]=e:g(e,this.value_[d/2])||(c=c||[],c[d/2]=this.value_[d/2],this.value_[d/2]=e)}return c?(this.report_([this.value_,c,this.observed_]),!0):!1}}),F.prototype={open:function(a,b){return this.callback_=a,this.target_=b,this.value_=this.getValueFn_(this.observable_.open(this.observedCallback_,this)),this.value_},observedCallback_:function(a){if(a=this.getValueFn_(a),!g(a,this.value_)){var b=this.value_;this.value_=a,this.callback_.call(this.target_,this.value_,b)}},discardChanges:function(){return this.value_=this.getValueFn_(this.observable_.discardChanges()),this.value_},deliver:function(){return this.observable_.deliver()},setValue:function(a){return a=this.setValueFn_(a),!this.dontPassThroughSet_&&this.observable_.setValue?this.observable_.setValue(a):void 0},close:function(){this.observable_&&this.observable_.close(),this.callback_=void 0,this.target_=void 0,this.observable_=void 0,this.value_=void 0,this.getValueFn_=void 0,this.setValueFn_=void 0}};var nb={add:!0,update:!0,"delete":!0},ob=0,pb=1,qb=2,rb=3;I.prototype={calcEditDistances:function(a,b,c,d,e,f){for(var g=f-e+1,h=c-b+1,i=new Array(g),j=0;g>j;j++)i[j]=new Array(h),i[j][0]=j;for(var k=0;h>k;k++)i[0][k]=k;for(var j=1;g>j;j++)for(var k=1;h>k;k++)if(this.equals(a[b+k-1],d[e+j-1]))i[j][k]=i[j-1][k-1];else{var l=i[j-1][k]+1,m=i[j][k-1]+1;i[j][k]=m>l?l:m}return i},spliceOperationsFromEditDistances:function(a){for(var b=a.length-1,c=a[0].length-1,d=a[b][c],e=[];b>0||c>0;)if(0!=b)if(0!=c){var f,g=a[b-1][c-1],h=a[b-1][c],i=a[b][c-1];f=i>h?g>h?h:g:g>i?i:g,f==g?(g==d?e.push(ob):(e.push(pb),d=g),b--,c--):f==h?(e.push(rb),b--,d=h):(e.push(qb),c--,d=i)}else e.push(rb),b--;else e.push(qb),c--;return e.reverse(),e},calcSplices:function(a,b,c,d,e,f){var g=0,h=0,i=Math.min(c-b,f-e);if(0==b&&0==e&&(g=this.sharedPrefix(a,d,i)),c==a.length&&f==d.length&&(h=this.sharedSuffix(a,d,i-g)),b+=g,e+=g,c-=h,f-=h,c-b==0&&f-e==0)return[];if(b==c){for(var j=H(b,[],0);f>e;)j.removed.push(d[e++]);return[j]}if(e==f)return[H(b,[],c-b)];for(var k=this.spliceOperationsFromEditDistances(this.calcEditDistances(a,b,c,d,e,f)),j=void 0,l=[],m=b,n=e,o=0;o<k.length;o++)switch(k[o]){case ob:j&&(l.push(j),j=void 0),m++,n++;break;case pb:j||(j=H(m,[],0)),j.addedCount++,m++,j.removed.push(d[n]),n++;break;case qb:j||(j=H(m,[],0)),j.addedCount++,m++;break;case rb:j||(j=H(m,[],0)),j.removed.push(d[n]),n++}return j&&l.push(j),l},sharedPrefix:function(a,b,c){for(var d=0;c>d;d++)if(!this.equals(a[d],b[d]))return d;return c},sharedSuffix:function(a,b,c){for(var d=a.length,e=b.length,f=0;c>f&&this.equals(a[--d],b[--e]);)f++;return f},calculateSplices:function(a,b){return this.calcSplices(a,0,a.length,b,0,b.length)},equals:function(a,b){return a===b}};var sb=new I,tb=a;"undefined"==typeof exports||exports.nodeType||("undefined"!=typeof module&&module.exports&&(exports=module.exports),tb=exports),tb.Observer=x,tb.Observer.runEOM_=bb,tb.Observer.observerSentinel_=mb,tb.Observer.hasObjectObserve=P,tb.ArrayObserver=B,tb.ArrayObserver.calculateSplices=function(a,b){return sb.calculateSplices(a,b)},tb.ArraySplice=I,tb.ObjectObserver=A,tb.PathObserver=C,tb.CompoundObserver=D,tb.Path=l,tb.ObserverTransform=F}("undefined"!=typeof global&&global&&"undefined"!=typeof module&&module?global:this||window),function(){"use strict";function a(a){for(;a.parentNode;)a=a.parentNode;return"function"==typeof a.getElementById?a:null}function b(a,b,c){var d=a.bindings_;return d||(d=a.bindings_={}),d[b]&&c[b].close(),d[b]=c}function c(a,b,c){return c}function d(a){return null==a?"":a}function e(a,b){a.data=d(b)}function f(a){return function(b){return e(a,b)}}function g(a,b,c,e){return c?void(e?a.setAttribute(b,""):a.removeAttribute(b)):void a.setAttribute(b,d(e))}function h(a,b,c){return function(d){g(a,b,c,d)}}function i(a){switch(a.type){case"checkbox":return u;case"radio":case"select-multiple":case"select-one":return"change";case"range":if(/Trident|MSIE/.test(navigator.userAgent))return"change";default:return"input"}}function j(a,b,c,e){a[b]=(e||d)(c)}function k(a,b,c){return function(d){return j(a,b,d,c)}}function l(){}function m(a,b,c,d){function e(){var e="value"==b&&"number"==a.type;c.setValue(e?a.valueAsNumber:a[b]),c.discardChanges(),(d||l)(a),Platform.performMicrotaskCheckpoint()}var f=i(a);return a.addEventListener(f,e),{close:function(){a.removeEventListener(f,e),c.close()},observable_:c}}function n(a){return Boolean(a)}function o(b){if(b.form)return s(b.form.elements,function(a){return a!=b&&"INPUT"==a.tagName&&"radio"==a.type&&a.name==b.name});var c=a(b);if(!c)return[];var d=c.querySelectorAll('input[type="radio"][name="'+b.name+'"]');return s(d,function(a){return a!=b&&!a.form})}function p(a){"INPUT"===a.tagName&&"radio"===a.type&&o(a).forEach(function(a){var b=a.bindings_.checked;b&&b.observable_.setValue(!1)})}function q(a,b){var c,e,f,g=a.parentNode;g instanceof HTMLSelectElement&&g.bindings_&&g.bindings_.value&&(c=g,e=c.bindings_.value,f=c.value),a.value=d(b),c&&c.value!=f&&(e.observable_.setValue(c.value),e.observable_.discardChanges(),Platform.performMicrotaskCheckpoint())}function r(a){return function(b){q(a,b)}}var s=Array.prototype.filter.call.bind(Array.prototype.filter);Node.prototype.bind=function(a,b){console.error("Unhandled binding to Node: ",this,a,b)},Node.prototype.bindFinished=function(){};var t=c;Object.defineProperty(Platform,"enableBindingsReflection",{get:function(){return t===b},set:function(a){return t=a?b:c,a},configurable:!0}),Text.prototype.bind=function(a,b,c){if("textContent"!==a)return Node.prototype.bind.call(this,a,b,c);if(c)return e(this,b);var d=b;return e(this,d.open(f(this))),t(this,a,d)},Element.prototype.bind=function(a,b,c){var d="?"==a[a.length-1];if(d&&(this.removeAttribute(a),a=a.slice(0,-1)),c)return g(this,a,d,b);var e=b;return g(this,a,d,e.open(h(this,a,d))),t(this,a,e)};var u;!function(){var a=document.createElement("div"),b=a.appendChild(document.createElement("input"));b.setAttribute("type","checkbox");var c,d=0;b.addEventListener("click",function(){d++,c=c||"click"}),b.addEventListener("change",function(){d++,c=c||"change"});var e=document.createEvent("MouseEvent");e.initMouseEvent("click",!0,!0,window,0,0,0,0,0,!1,!1,!1,!1,0,null),b.dispatchEvent(e),u=1==d?"change":c}(),HTMLInputElement.prototype.bind=function(a,c,e){if("value"!==a&&"checked"!==a)return HTMLElement.prototype.bind.call(this,a,c,e);this.removeAttribute(a);var f="checked"==a?n:d,g="checked"==a?p:l;if(e)return j(this,a,c,f);var h=c,i=m(this,a,h,g);return j(this,a,h.open(k(this,a,f)),f),b(this,a,i)},HTMLTextAreaElement.prototype.bind=function(a,b,c){if("value"!==a)return HTMLElement.prototype.bind.call(this,a,b,c);if(this.removeAttribute("value"),c)return j(this,"value",b);var e=b,f=m(this,"value",e);return j(this,"value",e.open(k(this,"value",d))),t(this,a,f)},HTMLOptionElement.prototype.bind=function(a,b,c){if("value"!==a)return HTMLElement.prototype.bind.call(this,a,b,c);if(this.removeAttribute("value"),c)return q(this,b);var d=b,e=m(this,"value",d);
return q(this,d.open(r(this))),t(this,a,e)},HTMLSelectElement.prototype.bind=function(a,c,d){if("selectedindex"===a&&(a="selectedIndex"),"selectedIndex"!==a&&"value"!==a)return HTMLElement.prototype.bind.call(this,a,c,d);if(this.removeAttribute(a),d)return j(this,a,c);var e=c,f=m(this,a,e);return j(this,a,e.open(k(this,a))),b(this,a,f)}}(this),function(a){"use strict";function b(a){if(!a)throw new Error("Assertion failed")}function c(a){for(var b;b=a.parentNode;)a=b;return a}function d(a,b){if(b){for(var d,e="#"+b;!d&&(a=c(a),a.protoContent_?d=a.protoContent_.querySelector(e):a.getElementById&&(d=a.getElementById(b)),!d&&a.templateCreator_);)a=a.templateCreator_;return d}}function e(a){return"template"==a.tagName&&"http://www.w3.org/2000/svg"==a.namespaceURI}function f(a){return"TEMPLATE"==a.tagName&&"http://www.w3.org/1999/xhtml"==a.namespaceURI}function g(a){return Boolean(L[a.tagName]&&a.hasAttribute("template"))}function h(a){return void 0===a.isTemplate_&&(a.isTemplate_="TEMPLATE"==a.tagName||g(a)),a.isTemplate_}function i(a,b){var c=a.querySelectorAll(N);h(a)&&b(a),G(c,b)}function j(a){function b(a){HTMLTemplateElement.decorate(a)||j(a.content)}i(a,b)}function k(a,b){Object.getOwnPropertyNames(b).forEach(function(c){Object.defineProperty(a,c,Object.getOwnPropertyDescriptor(b,c))})}function l(a){var b=a.ownerDocument;if(!b.defaultView)return b;var c=b.templateContentsOwner_;if(!c){for(c=b.implementation.createHTMLDocument("");c.lastChild;)c.removeChild(c.lastChild);b.templateContentsOwner_=c}return c}function m(a){if(!a.stagingDocument_){var b=a.ownerDocument;if(!b.stagingDocument_){b.stagingDocument_=b.implementation.createHTMLDocument(""),b.stagingDocument_.isStagingDocument=!0;var c=b.stagingDocument_.createElement("base");c.href=document.baseURI,b.stagingDocument_.head.appendChild(c),b.stagingDocument_.stagingDocument_=b.stagingDocument_}a.stagingDocument_=b.stagingDocument_}return a.stagingDocument_}function n(a){var b=a.ownerDocument.createElement("template");a.parentNode.insertBefore(b,a);for(var c=a.attributes,d=c.length;d-->0;){var e=c[d];K[e.name]&&("template"!==e.name&&b.setAttribute(e.name,e.value),a.removeAttribute(e.name))}return b}function o(a){var b=a.ownerDocument.createElement("template");a.parentNode.insertBefore(b,a);for(var c=a.attributes,d=c.length;d-->0;){var e=c[d];b.setAttribute(e.name,e.value),a.removeAttribute(e.name)}return a.parentNode.removeChild(a),b}function p(a,b,c){var d=a.content;if(c)return void d.appendChild(b);for(var e;e=b.firstChild;)d.appendChild(e)}function q(a){P?a.__proto__=HTMLTemplateElement.prototype:k(a,HTMLTemplateElement.prototype)}function r(a){a.setModelFn_||(a.setModelFn_=function(){a.setModelFnScheduled_=!1;var b=z(a,a.delegate_&&a.delegate_.prepareBinding);w(a,b,a.model_)}),a.setModelFnScheduled_||(a.setModelFnScheduled_=!0,Observer.runEOM_(a.setModelFn_))}function s(a,b,c,d){if(a&&a.length){for(var e,f=a.length,g=0,h=0,i=0,j=!0;f>h;){var g=a.indexOf("{{",h),k=a.indexOf("[[",h),l=!1,m="}}";if(k>=0&&(0>g||g>k)&&(g=k,l=!0,m="]]"),i=0>g?-1:a.indexOf(m,g+2),0>i){if(!e)return;e.push(a.slice(h));break}e=e||[],e.push(a.slice(h,g));var n=a.slice(g+2,i).trim();e.push(l),j=j&&l;var o=d&&d(n,b,c);e.push(null==o?Path.get(n):null),e.push(o),h=i+2}return h===f&&e.push(""),e.hasOnePath=5===e.length,e.isSimplePath=e.hasOnePath&&""==e[0]&&""==e[4],e.onlyOneTime=j,e.combinator=function(a){for(var b=e[0],c=1;c<e.length;c+=4){var d=e.hasOnePath?a:a[(c-1)/4];void 0!==d&&(b+=d),b+=e[c+3]}return b},e}}function t(a,b,c,d){if(b.hasOnePath){var e=b[3],f=e?e(d,c,!0):b[2].getValueFrom(d);return b.isSimplePath?f:b.combinator(f)}for(var g=[],h=1;h<b.length;h+=4){var e=b[h+2];g[(h-1)/4]=e?e(d,c):b[h+1].getValueFrom(d)}return b.combinator(g)}function u(a,b,c,d){var e=b[3],f=e?e(d,c,!1):new PathObserver(d,b[2]);return b.isSimplePath?f:new ObserverTransform(f,b.combinator)}function v(a,b,c,d){if(b.onlyOneTime)return t(a,b,c,d);if(b.hasOnePath)return u(a,b,c,d);for(var e=new CompoundObserver,f=1;f<b.length;f+=4){var g=b[f],h=b[f+2];if(h){var i=h(d,c,g);g?e.addPath(i):e.addObserver(i)}else{var j=b[f+1];g?e.addPath(j.getValueFrom(d)):e.addPath(d,j)}}return new ObserverTransform(e,b.combinator)}function w(a,b,c,d){for(var e=0;e<b.length;e+=2){var f=b[e],g=b[e+1],h=v(f,g,a,c),i=a.bind(f,h,g.onlyOneTime);i&&d&&d.push(i)}if(a.bindFinished(),b.isTemplate){a.model_=c;var j=a.processBindingDirectives_(b);d&&j&&d.push(j)}}function x(a,b,c){var d=a.getAttribute(b);return s(""==d?"{{}}":d,b,a,c)}function y(a,c){b(a);for(var d=[],e=0;e<a.attributes.length;e++){for(var f=a.attributes[e],g=f.name,i=f.value;"_"===g[0];)g=g.substring(1);if(!h(a)||g!==J&&g!==H&&g!==I){var j=s(i,g,a,c);j&&d.push(g,j)}}return h(a)&&(d.isTemplate=!0,d["if"]=x(a,J,c),d.bind=x(a,H,c),d.repeat=x(a,I,c),!d["if"]||d.bind||d.repeat||(d.bind=s("{{}}",H,a,c))),d}function z(a,b){if(a.nodeType===Node.ELEMENT_NODE)return y(a,b);if(a.nodeType===Node.TEXT_NODE){var c=s(a.data,"textContent",a,b);if(c)return["textContent",c]}return[]}function A(a,b,c,d,e,f,g){for(var h=b.appendChild(c.importNode(a,!1)),i=0,j=a.firstChild;j;j=j.nextSibling)A(j,h,c,d.children[i++],e,f,g);return d.isTemplate&&(HTMLTemplateElement.decorate(h,a),f&&h.setDelegate_(f)),w(h,d,e,g),h}function B(a,b){var c=z(a,b);c.children={};for(var d=0,e=a.firstChild;e;e=e.nextSibling)c.children[d++]=B(e,b);return c}function C(a){var b=a.id_;return b||(b=a.id_=S++),b}function D(a,b){var c=C(a);if(b){var d=b.bindingMaps[c];return d||(d=b.bindingMaps[c]=B(a,b.prepareBinding)||[]),d}var d=a.bindingMap_;return d||(d=a.bindingMap_=B(a,void 0)||[]),d}function E(a){this.closed=!1,this.templateElement_=a,this.instances=[],this.deps=void 0,this.iteratedValue=[],this.presentValue=void 0,this.arrayObserver=void 0}var F,G=Array.prototype.forEach.call.bind(Array.prototype.forEach);a.Map&&"function"==typeof a.Map.prototype.forEach?F=a.Map:(F=function(){this.keys=[],this.values=[]},F.prototype={set:function(a,b){var c=this.keys.indexOf(a);0>c?(this.keys.push(a),this.values.push(b)):this.values[c]=b},get:function(a){var b=this.keys.indexOf(a);if(!(0>b))return this.values[b]},"delete":function(a){var b=this.keys.indexOf(a);return 0>b?!1:(this.keys.splice(b,1),this.values.splice(b,1),!0)},forEach:function(a,b){for(var c=0;c<this.keys.length;c++)a.call(b||this,this.values[c],this.keys[c],this)}});"function"!=typeof document.contains&&(Document.prototype.contains=function(a){return a===this||a.parentNode===this?!0:this.documentElement.contains(a)});var H="bind",I="repeat",J="if",K={template:!0,repeat:!0,bind:!0,ref:!0,"if":!0},L={THEAD:!0,TBODY:!0,TFOOT:!0,TH:!0,TR:!0,TD:!0,COLGROUP:!0,COL:!0,CAPTION:!0,OPTION:!0,OPTGROUP:!0},M="undefined"!=typeof HTMLTemplateElement;M&&!function(){var a=document.createElement("template"),b=a.content.ownerDocument,c=b.appendChild(b.createElement("html")),d=c.appendChild(b.createElement("head")),e=b.createElement("base");e.href=document.baseURI,d.appendChild(e)}();var N="template, "+Object.keys(L).map(function(a){return a.toLowerCase()+"[template]"}).join(", ");document.addEventListener("DOMContentLoaded",function(){j(document),Platform.performMicrotaskCheckpoint()},!1),M||(a.HTMLTemplateElement=function(){throw TypeError("Illegal constructor")});var O,P="__proto__"in{};"function"==typeof MutationObserver&&(O=new MutationObserver(function(a){for(var b=0;b<a.length;b++)a[b].target.refChanged_()})),HTMLTemplateElement.decorate=function(a,c){if(a.templateIsDecorated_)return!1;var d=a;d.templateIsDecorated_=!0;var h=f(d)&&M,i=h,k=!h,m=!1;if(h||(g(d)?(b(!c),d=n(a),d.templateIsDecorated_=!0,h=M,m=!0):e(d)&&(d=o(a),d.templateIsDecorated_=!0,h=M)),!h){q(d);var r=l(d);d.content_=r.createDocumentFragment()}return c?d.instanceRef_=c:k?p(d,a,m):i&&j(d.content),!0},HTMLTemplateElement.bootstrap=j;var Q=a.HTMLUnknownElement||HTMLElement,R={get:function(){return this.content_},enumerable:!0,configurable:!0};M||(HTMLTemplateElement.prototype=Object.create(Q.prototype),Object.defineProperty(HTMLTemplateElement.prototype,"content",R)),k(HTMLTemplateElement.prototype,{bind:function(a,b,c){if("ref"!=a)return Element.prototype.bind.call(this,a,b,c);var d=this,e=c?b:b.open(function(a){d.setAttribute("ref",a),d.refChanged_()});return this.setAttribute("ref",e),this.refChanged_(),c?void 0:(this.bindings_?this.bindings_.ref=b:this.bindings_={ref:b},b)},processBindingDirectives_:function(a){return this.iterator_&&this.iterator_.closeDeps(),a["if"]||a.bind||a.repeat?(this.iterator_||(this.iterator_=new E(this)),this.iterator_.updateDependencies(a,this.model_),O&&O.observe(this,{attributes:!0,attributeFilter:["ref"]}),this.iterator_):void(this.iterator_&&(this.iterator_.close(),this.iterator_=void 0))},createInstance:function(a,b,c){b?c=this.newDelegate_(b):c||(c=this.delegate_),this.refContent_||(this.refContent_=this.ref_.content);var d=this.refContent_;if(null===d.firstChild)return T;var e=D(d,c),f=m(this),g=f.createDocumentFragment();g.templateCreator_=this,g.protoContent_=d,g.bindings_=[],g.terminator_=null;for(var h=g.templateInstance_={firstNode:null,lastNode:null,model:a},i=0,j=!1,k=d.firstChild;k;k=k.nextSibling){null===k.nextSibling&&(j=!0);var l=A(k,g,f,e.children[i++],a,c,g.bindings_);l.templateInstance_=h,j&&(g.terminator_=l)}return h.firstNode=g.firstChild,h.lastNode=g.lastChild,g.templateCreator_=void 0,g.protoContent_=void 0,g},get model(){return this.model_},set model(a){this.model_=a,r(this)},get bindingDelegate(){return this.delegate_&&this.delegate_.raw},refChanged_:function(){this.iterator_&&this.refContent_!==this.ref_.content&&(this.refContent_=void 0,this.iterator_.valueChanged(),this.iterator_.updateIteratedValue(this.iterator_.getUpdatedValue()))},clear:function(){this.model_=void 0,this.delegate_=void 0,this.bindings_&&this.bindings_.ref&&this.bindings_.ref.close(),this.refContent_=void 0,this.iterator_&&(this.iterator_.valueChanged(),this.iterator_.close(),this.iterator_=void 0)},setDelegate_:function(a){this.delegate_=a,this.bindingMap_=void 0,this.iterator_&&(this.iterator_.instancePositionChangedFn_=void 0,this.iterator_.instanceModelFn_=void 0)},newDelegate_:function(a){function b(b){var c=a&&a[b];if("function"==typeof c)return function(){return c.apply(a,arguments)}}if(a)return{bindingMaps:{},raw:a,prepareBinding:b("prepareBinding"),prepareInstanceModel:b("prepareInstanceModel"),prepareInstancePositionChanged:b("prepareInstancePositionChanged")}},set bindingDelegate(a){if(this.delegate_)throw Error("Template must be cleared before a new bindingDelegate can be assigned");this.setDelegate_(this.newDelegate_(a))},get ref_(){var a=d(this,this.getAttribute("ref"));if(a||(a=this.instanceRef_),!a)return this;var b=a.ref_;return b?b:a}});var S=1;Object.defineProperty(Node.prototype,"templateInstance",{get:function(){var a=this.templateInstance_;return a?a:this.parentNode?this.parentNode.templateInstance:void 0}});var T=document.createDocumentFragment();T.bindings_=[],T.terminator_=null,E.prototype={closeDeps:function(){var a=this.deps;a&&(a.ifOneTime===!1&&a.ifValue.close(),a.oneTime===!1&&a.value.close())},updateDependencies:function(a,b){this.closeDeps();var c=this.deps={},d=this.templateElement_,e=!0;if(a["if"]){if(c.hasIf=!0,c.ifOneTime=a["if"].onlyOneTime,c.ifValue=v(J,a["if"],d,b),e=c.ifValue,c.ifOneTime&&!e)return void this.valueChanged();c.ifOneTime||(e=e.open(this.updateIfValue,this))}a.repeat?(c.repeat=!0,c.oneTime=a.repeat.onlyOneTime,c.value=v(I,a.repeat,d,b)):(c.repeat=!1,c.oneTime=a.bind.onlyOneTime,c.value=v(H,a.bind,d,b));var f=c.value;return c.oneTime||(f=f.open(this.updateIteratedValue,this)),e?void this.updateValue(f):void this.valueChanged()},getUpdatedValue:function(){var a=this.deps.value;return this.deps.oneTime||(a=a.discardChanges()),a},updateIfValue:function(a){return a?void this.updateValue(this.getUpdatedValue()):void this.valueChanged()},updateIteratedValue:function(a){if(this.deps.hasIf){var b=this.deps.ifValue;if(this.deps.ifOneTime||(b=b.discardChanges()),!b)return void this.valueChanged()}this.updateValue(a)},updateValue:function(a){this.deps.repeat||(a=[a]);var b=this.deps.repeat&&!this.deps.oneTime&&Array.isArray(a);this.valueChanged(a,b)},valueChanged:function(a,b){Array.isArray(a)||(a=[]),a!==this.iteratedValue&&(this.unobserve(),this.presentValue=a,b&&(this.arrayObserver=new ArrayObserver(this.presentValue),this.arrayObserver.open(this.handleSplices,this)),this.handleSplices(ArrayObserver.calculateSplices(this.presentValue,this.iteratedValue)))},getLastInstanceNode:function(a){if(-1==a)return this.templateElement_;var b=this.instances[a],c=b.terminator_;if(!c)return this.getLastInstanceNode(a-1);if(c.nodeType!==Node.ELEMENT_NODE||this.templateElement_===c)return c;var d=c.iterator_;return d?d.getLastTemplateNode():c},getLastTemplateNode:function(){return this.getLastInstanceNode(this.instances.length-1)},insertInstanceAt:function(a,b){var c=this.getLastInstanceNode(a-1),d=this.templateElement_.parentNode;this.instances.splice(a,0,b),d.insertBefore(b,c.nextSibling)},extractInstanceAt:function(a){for(var b=this.getLastInstanceNode(a-1),c=this.getLastInstanceNode(a),d=this.templateElement_.parentNode,e=this.instances.splice(a,1)[0];c!==b;){var f=b.nextSibling;f==c&&(c=b),e.appendChild(d.removeChild(f))}return e},getDelegateFn:function(a){return a=a&&a(this.templateElement_),"function"==typeof a?a:null},handleSplices:function(a){if(!this.closed&&a.length){var b=this.templateElement_;if(!b.parentNode)return void this.close();ArrayObserver.applySplices(this.iteratedValue,this.presentValue,a);var c=b.delegate_;void 0===this.instanceModelFn_&&(this.instanceModelFn_=this.getDelegateFn(c&&c.prepareInstanceModel)),void 0===this.instancePositionChangedFn_&&(this.instancePositionChangedFn_=this.getDelegateFn(c&&c.prepareInstancePositionChanged));for(var d=new F,e=0,f=0;f<a.length;f++){for(var g=a[f],h=g.removed,i=0;i<h.length;i++){var j=h[i],k=this.extractInstanceAt(g.index+e);k!==T&&d.set(j,k)}e-=g.addedCount}for(var f=0;f<a.length;f++)for(var g=a[f],l=g.index;l<g.index+g.addedCount;l++){var j=this.iteratedValue[l],k=d.get(j);k?d["delete"](j):(this.instanceModelFn_&&(j=this.instanceModelFn_(j)),k=void 0===j?T:b.createInstance(j,void 0,c)),this.insertInstanceAt(l,k)}d.forEach(function(a){this.closeInstanceBindings(a)},this),this.instancePositionChangedFn_&&this.reportInstancesMoved(a)}},reportInstanceMoved:function(a){var b=this.instances[a];b!==T&&this.instancePositionChangedFn_(b.templateInstance_,a)},reportInstancesMoved:function(a){for(var b=0,c=0,d=0;d<a.length;d++){var e=a[d];if(0!=c)for(;b<e.index;)this.reportInstanceMoved(b),b++;else b=e.index;for(;b<e.index+e.addedCount;)this.reportInstanceMoved(b),b++;c+=e.addedCount-e.removed.length}if(0!=c)for(var f=this.instances.length;f>b;)this.reportInstanceMoved(b),b++},closeInstanceBindings:function(a){for(var b=a.bindings_,c=0;c<b.length;c++)b[c].close()},unobserve:function(){this.arrayObserver&&(this.arrayObserver.close(),this.arrayObserver=void 0)},close:function(){if(!this.closed){this.unobserve();for(var a=0;a<this.instances.length;a++)this.closeInstanceBindings(this.instances[a]);this.instances.length=0,this.closeDeps(),this.templateElement_.iterator_=void 0,this.closed=!0}}},HTMLTemplateElement.forAllTemplatesFrom_=i}(this),function(a){"use strict";function b(a){return void 0!==m[a]}function c(){h.call(this),this._isInvalid=!0}function d(a){return""==a&&c.call(this),a.toLowerCase()}function e(a){var b=a.charCodeAt(0);return b>32&&127>b&&-1==[34,35,60,62,63,96].indexOf(b)?a:encodeURIComponent(a)}function f(a){var b=a.charCodeAt(0);return b>32&&127>b&&-1==[34,35,60,62,96].indexOf(b)?a:encodeURIComponent(a)}function g(a,g,h){function i(a){t.push(a)}var j=g||"scheme start",k=0,l="",r=!1,s=!1,t=[];a:for(;(a[k-1]!=o||0==k)&&!this._isInvalid;){var u=a[k];switch(j){case"scheme start":if(!u||!p.test(u)){if(g){i("Invalid scheme.");break a}l="",j="no scheme";continue}l+=u.toLowerCase(),j="scheme";break;case"scheme":if(u&&q.test(u))l+=u.toLowerCase();else{if(":"!=u){if(g){if(o==u)break a;i("Code point not allowed in scheme: "+u);break a}l="",k=0,j="no scheme";continue}if(this._scheme=l,l="",g)break a;b(this._scheme)&&(this._isRelative=!0),j="file"==this._scheme?"relative":this._isRelative&&h&&h._scheme==this._scheme?"relative or authority":this._isRelative?"authority first slash":"scheme data"}break;case"scheme data":"?"==u?(query="?",j="query"):"#"==u?(this._fragment="#",j="fragment"):o!=u&&"	"!=u&&"\n"!=u&&"\r"!=u&&(this._schemeData+=e(u));break;case"no scheme":if(h&&b(h._scheme)){j="relative";continue}i("Missing scheme."),c.call(this);break;case"relative or authority":if("/"!=u||"/"!=a[k+1]){i("Expected /, got: "+u),j="relative";continue}j="authority ignore slashes";break;case"relative":if(this._isRelative=!0,"file"!=this._scheme&&(this._scheme=h._scheme),o==u){this._host=h._host,this._port=h._port,this._path=h._path.slice(),this._query=h._query;break a}if("/"==u||"\\"==u)"\\"==u&&i("\\ is an invalid code point."),j="relative slash";else if("?"==u)this._host=h._host,this._port=h._port,this._path=h._path.slice(),this._query="?",j="query";else{if("#"!=u){var v=a[k+1],w=a[k+2];("file"!=this._scheme||!p.test(u)||":"!=v&&"|"!=v||o!=w&&"/"!=w&&"\\"!=w&&"?"!=w&&"#"!=w)&&(this._host=h._host,this._port=h._port,this._path=h._path.slice(),this._path.pop()),j="relative path";continue}this._host=h._host,this._port=h._port,this._path=h._path.slice(),this._query=h._query,this._fragment="#",j="fragment"}break;case"relative slash":if("/"!=u&&"\\"!=u){"file"!=this._scheme&&(this._host=h._host,this._port=h._port),j="relative path";continue}"\\"==u&&i("\\ is an invalid code point."),j="file"==this._scheme?"file host":"authority ignore slashes";break;case"authority first slash":if("/"!=u){i("Expected '/', got: "+u),j="authority ignore slashes";continue}j="authority second slash";break;case"authority second slash":if(j="authority ignore slashes","/"!=u){i("Expected '/', got: "+u);continue}break;case"authority ignore slashes":if("/"!=u&&"\\"!=u){j="authority";continue}i("Expected authority, got: "+u);break;case"authority":if("@"==u){r&&(i("@ already seen."),l+="%40"),r=!0;for(var x=0;x<l.length;x++){var y=l[x];if("	"!=y&&"\n"!=y&&"\r"!=y)if(":"!=y||null!==this._password){var z=e(y);null!==this._password?this._password+=z:this._username+=z}else this._password="";else i("Invalid whitespace in authority.")}l=""}else{if(o==u||"/"==u||"\\"==u||"?"==u||"#"==u){k-=l.length,l="",j="host";continue}l+=u}break;case"file host":if(o==u||"/"==u||"\\"==u||"?"==u||"#"==u){2!=l.length||!p.test(l[0])||":"!=l[1]&&"|"!=l[1]?0==l.length?j="relative path start":(this._host=d.call(this,l),l="",j="relative path start"):j="relative path";continue}"	"==u||"\n"==u||"\r"==u?i("Invalid whitespace in file host."):l+=u;break;case"host":case"hostname":if(":"!=u||s){if(o==u||"/"==u||"\\"==u||"?"==u||"#"==u){if(this._host=d.call(this,l),l="",j="relative path start",g)break a;continue}"	"!=u&&"\n"!=u&&"\r"!=u?("["==u?s=!0:"]"==u&&(s=!1),l+=u):i("Invalid code point in host/hostname: "+u)}else if(this._host=d.call(this,l),l="",j="port","hostname"==g)break a;break;case"port":if(/[0-9]/.test(u))l+=u;else{if(o==u||"/"==u||"\\"==u||"?"==u||"#"==u||g){if(""!=l){var A=parseInt(l,10);A!=m[this._scheme]&&(this._port=A+""),l=""}if(g)break a;j="relative path start";continue}"	"==u||"\n"==u||"\r"==u?i("Invalid code point in port: "+u):c.call(this)}break;case"relative path start":if("\\"==u&&i("'\\' not allowed in path."),j="relative path","/"!=u&&"\\"!=u)continue;break;case"relative path":if(o!=u&&"/"!=u&&"\\"!=u&&(g||"?"!=u&&"#"!=u))"	"!=u&&"\n"!=u&&"\r"!=u&&(l+=e(u));else{"\\"==u&&i("\\ not allowed in relative path.");var B;(B=n[l.toLowerCase()])&&(l=B),".."==l?(this._path.pop(),"/"!=u&&"\\"!=u&&this._path.push("")):"."==l&&"/"!=u&&"\\"!=u?this._path.push(""):"."!=l&&("file"==this._scheme&&0==this._path.length&&2==l.length&&p.test(l[0])&&"|"==l[1]&&(l=l[0]+":"),this._path.push(l)),l="","?"==u?(this._query="?",j="query"):"#"==u&&(this._fragment="#",j="fragment")}break;case"query":g||"#"!=u?o!=u&&"	"!=u&&"\n"!=u&&"\r"!=u&&(this._query+=f(u)):(this._fragment="#",j="fragment");break;case"fragment":o!=u&&"	"!=u&&"\n"!=u&&"\r"!=u&&(this._fragment+=u)}k++}}function h(){this._scheme="",this._schemeData="",this._username="",this._password=null,this._host="",this._port="",this._path=[],this._query="",this._fragment="",this._isInvalid=!1,this._isRelative=!1}function i(a,b){void 0===b||b instanceof i||(b=new i(String(b))),this._url=a,h.call(this);var c=a.replace(/^[ \t\r\n\f]+|[ \t\r\n\f]+$/g,"");g.call(this,c,null,b)}var j=!1;if(!a.forceJURL)try{var k=new URL("b","http://a");k.pathname="c%20d",j="http://a/c%20d"===k.href}catch(l){}if(!j){var m=Object.create(null);m.ftp=21,m.file=0,m.gopher=70,m.http=80,m.https=443,m.ws=80,m.wss=443;var n=Object.create(null);n["%2e"]=".",n[".%2e"]="..",n["%2e."]="..",n["%2e%2e"]="..";var o=void 0,p=/[a-zA-Z]/,q=/[a-zA-Z0-9\+\-\.]/;i.prototype={get href(){if(this._isInvalid)return this._url;var a="";return(""!=this._username||null!=this._password)&&(a=this._username+(null!=this._password?":"+this._password:"")+"@"),this.protocol+(this._isRelative?"//"+a+this.host:"")+this.pathname+this._query+this._fragment},set href(a){h.call(this),g.call(this,a)},get protocol(){return this._scheme+":"},set protocol(a){this._isInvalid||g.call(this,a+":","scheme start")},get host(){return this._isInvalid?"":this._port?this._host+":"+this._port:this._host},set host(a){!this._isInvalid&&this._isRelative&&g.call(this,a,"host")},get hostname(){return this._host},set hostname(a){!this._isInvalid&&this._isRelative&&g.call(this,a,"hostname")},get port(){return this._port},set port(a){!this._isInvalid&&this._isRelative&&g.call(this,a,"port")},get pathname(){return this._isInvalid?"":this._isRelative?"/"+this._path.join("/"):this._schemeData},set pathname(a){!this._isInvalid&&this._isRelative&&(this._path=[],g.call(this,a,"relative path start"))},get search(){return this._isInvalid||!this._query||"?"==this._query?"":this._query},set search(a){!this._isInvalid&&this._isRelative&&(this._query="?","?"==a[0]&&(a=a.slice(1)),g.call(this,a,"query"))},get hash(){return this._isInvalid||!this._fragment||"#"==this._fragment?"":this._fragment},set hash(a){this._isInvalid||(this._fragment="#","#"==a[0]&&(a=a.slice(1)),g.call(this,a,"fragment"))},get origin(){var a;if(this._isInvalid||!this._scheme)return"";switch(this._scheme){case"data":case"file":case"javascript":case"mailto":return"null"}return a=this.host,a?this._scheme+"://"+a:""}};var r=a.URL;r&&(i.createObjectURL=function(){return r.createObjectURL.apply(r,arguments)},i.revokeObjectURL=function(a){r.revokeObjectURL(a)}),a.URL=i}}(this),function(a){function b(a){f.textContent=d++,e.push(a)}function c(){for(;e.length;)e.shift()()}var d=0,e=[],f=document.createTextNode("");new(window.MutationObserver||JsMutationObserver)(c).observe(f,{characterData:!0}),a.endOfMicrotask=b,Platform.endOfMicrotask=b}(Polymer),function(a){function b(){g||(g=!0,c(function(){g=!1,d.data&&console.group("flush"),Platform.performMicrotaskCheckpoint(),d.data&&console.groupEnd()}))}var c=a.endOfMicrotask,d=window.WebComponents?WebComponents.flags.log:{},e=document.createElement("style");e.textContent="template {display: none !important;} /* injected by platform.js */";var f=document.querySelector("head");f.insertBefore(e,f.firstChild);var g;if(Observer.hasObjectObserve)b=function(){};else{var h=125;window.addEventListener("WebComponentsReady",function(){b();var c=function(){"hidden"===document.visibilityState?a.flushPoll&&clearInterval(a.flushPoll):a.flushPoll=setInterval(b,h)};"string"==typeof document.visibilityState&&document.addEventListener("visibilitychange",c),c()})}if(window.CustomElements&&!CustomElements.useNative){var i=Document.prototype.importNode;Document.prototype.importNode=function(a,b){var c=i.call(this,a,b);return CustomElements.upgradeAll(c),c}}a.flush=b,Platform.flush=b}(window.Polymer),function(a){function b(a){var b=new URL(a.ownerDocument.baseURI);return b.search="",b.hash="",b}function c(a,b,c,e){return a.replace(e,function(a,e,f,g){var h=f.replace(/["']/g,"");return h=d(b,h,c),e+"'"+h+"'"+g})}function d(a,b,c){if(b&&"/"===b[0])return b;if(b&&"#"===b[0])return b;var d=new URL(b,a);return c?d.href:e(d.href)}function e(a){var c=b(document.documentElement),d=new URL(a,c);return d.host===c.host&&d.port===c.port&&d.protocol===c.protocol?f(c,d):a}function f(a,b){for(var c=a.pathname,d=b.pathname,e=c.split("/"),f=d.split("/");e.length&&e[0]===f[0];)e.shift(),f.shift();for(var g=0,h=e.length-1;h>g;g++)f.unshift("..");var i=b.href.slice(-1)===m?m:b.hash;return f.join("/")+b.search+i}var g={resolveDom:function(a,c){c=c||b(a),this.resolveAttributes(a,c),this.resolveStyles(a,c);var d=a.querySelectorAll("template");if(d)for(var e,f=0,g=d.length;g>f&&(e=d[f]);f++)e.content&&this.resolveDom(e.content,c)},resolveTemplate:function(a){this.resolveDom(a.content,b(a))},resolveStyles:function(a,b){var c=a.querySelectorAll("style");if(c)for(var d,e=0,f=c.length;f>e&&(d=c[e]);e++)this.resolveStyle(d,b)},resolveStyle:function(a,c){c=c||b(a),a.textContent=this.resolveCssText(a.textContent,c)},resolveCssText:function(a,b,d){return a=c(a,b,d,h),c(a,b,d,i)},resolveAttributes:function(a,b){a.hasAttributes&&a.hasAttributes()&&this.resolveElementAttributes(a,b);var c=a&&a.querySelectorAll(k);if(c)for(var d,e=0,f=c.length;f>e&&(d=c[e]);e++)this.resolveElementAttributes(d,b)},resolveElementAttributes:function(a,e){e=e||b(a),j.forEach(function(b){var f,g=a.attributes[b],i=g&&g.value;i&&i.search(l)<0&&(f="style"===b?c(i,e,!1,h):d(e,i),g.value=f)})}},h=/(url\()([^)]*)(\))/g,i=/(@import[\s]+(?!url\())([^;]*)(;)/g,j=["href","src","action","style","url"],k="["+j.join("],[")+"]",l="{{.*}}",m="#";a.urlResolver=g}(Polymer),function(a){function b(a){this.cache=Object.create(null),this.map=Object.create(null),this.requests=0,this.regex=a}var c=Polymer.endOfMicrotask;b.prototype={extractUrls:function(a,b){for(var c,d,e=[];c=this.regex.exec(a);)d=new URL(c[1],b),e.push({matched:c[0],url:d.href});return e},process:function(a,b,c){var d=this.extractUrls(a,b),e=c.bind(null,this.map);this.fetch(d,e)},fetch:function(a,b){var c=a.length;if(!c)return b();for(var d,e,f,g=function(){0===--c&&b()},h=0;c>h;h++)d=a[h],f=d.url,e=this.cache[f],e||(e=this.xhr(f),e.match=d,this.cache[f]=e),e.wait(g)},handleXhr:function(a){var b=a.match,c=b.url,d=a.response||a.responseText||"";this.map[c]=d,this.fetch(this.extractUrls(d,c),a.resolve)},xhr:function(a){this.requests++;var b=new XMLHttpRequest;return b.open("GET",a,!0),b.send(),b.onerror=b.onload=this.handleXhr.bind(this,b),b.pending=[],b.resolve=function(){for(var a=b.pending,c=0;c<a.length;c++)a[c]();b.pending=null},b.wait=function(a){b.pending?b.pending.push(a):c(a)},b}},a.Loader=b}(Polymer),function(a){function b(){this.loader=new d(this.regex)}var c=a.urlResolver,d=a.Loader;b.prototype={regex:/@import\s+(?:url)?["'\(]*([^'"\)]*)['"\)]*;/g,resolve:function(a,b,c){var d=function(d){c(this.flatten(a,b,d))}.bind(this);this.loader.process(a,b,d)},resolveNode:function(a,b,c){var d=a.textContent,e=function(b){a.textContent=b,c(a)};this.resolve(d,b,e)},flatten:function(a,b,d){for(var e,f,g,h=this.loader.extractUrls(a,b),i=0;i<h.length;i++)e=h[i],f=e.url,g=c.resolveCssText(d[f],f,!0),g=this.flatten(g,b,d),a=a.replace(e.matched,g);return a},loadStyles:function(a,b,c){function d(){f++,f===g&&c&&c()}for(var e,f=0,g=a.length,h=0;g>h&&(e=a[h]);h++)this.resolveNode(e,b,d)}};var e=new b;a.styleResolver=e}(Polymer),function(a){function b(a,b){return a&&b&&Object.getOwnPropertyNames(b).forEach(function(c){var d=Object.getOwnPropertyDescriptor(b,c);d&&(Object.defineProperty(a,c,d),"function"==typeof d.value&&(d.value.nom=c))}),a}function c(a){for(var b=a||{},c=1;c<arguments.length;c++){var e=arguments[c];try{for(var f in e)d(f,e,b)}catch(g){}}return b}function d(a,b,c){var d=e(b,a);Object.defineProperty(c,a,d)}function e(a,b){if(a){var c=Object.getOwnPropertyDescriptor(a,b);return c||e(Object.getPrototypeOf(a),b)}}a.extend=b,a.mixin=c,Platform.mixin=c}(Polymer),function(a){function b(a,b,d){return a?a.stop():a=new c(this),a.go(b,d),a}var c=function(a){this.context=a,this.boundComplete=this.complete.bind(this)};c.prototype={go:function(a,b){this.callback=a;var c;b?(c=setTimeout(this.boundComplete,b),this.handle=function(){clearTimeout(c)}):(c=requestAnimationFrame(this.boundComplete),this.handle=function(){cancelAnimationFrame(c)})},stop:function(){this.handle&&(this.handle(),this.handle=null)},complete:function(){this.handle&&(this.stop(),this.callback.call(this.context))}},a.job=b}(Polymer),function(a){function b(a,b,c){var d="string"==typeof a?document.createElement(a):a.cloneNode(!0);if(d.innerHTML=b,c)for(var e in c)d.setAttribute(e,c[e]);return d}var c={};HTMLElement.register=function(a,b){c[a]=b},HTMLElement.getPrototypeForTag=function(a){var b=a?c[a]:HTMLElement.prototype;return b||Object.getPrototypeOf(document.createElement(a))};var d=Event.prototype.stopPropagation;Event.prototype.stopPropagation=function(){this.cancelBubble=!0,d.apply(this,arguments)};var e=DOMTokenList.prototype.add,f=DOMTokenList.prototype.remove;DOMTokenList.prototype.add=function(){for(var a=0;a<arguments.length;a++)e.call(this,arguments[a])},DOMTokenList.prototype.remove=function(){for(var a=0;a<arguments.length;a++)f.call(this,arguments[a])},DOMTokenList.prototype.toggle=function(a,b){1==arguments.length&&(b=!this.contains(a)),b?this.add(a):this.remove(a)},DOMTokenList.prototype["switch"]=function(a,b){a&&this.remove(a),b&&this.add(b)};var g=function(){return Array.prototype.slice.call(this)},h=window.NamedNodeMap||window.MozNamedAttrMap||{};NodeList.prototype.array=g,h.prototype.array=g,HTMLCollection.prototype.array=g,a.createDOM=b}(Polymer),function(a){function b(a){var e=b.caller,g=e.nom,h=e._super;h||(g||(g=e.nom=c.call(this,e)),g||console.warn("called super() on a method not installed declaratively (has no .nom property)"),h=d(e,g,f(this)));var i=h[g];return i?(i._super||d(i,g,h),i.apply(this,a||[])):void 0}function c(a){for(var b=this.__proto__;b&&b!==HTMLElement.prototype;){for(var c,d=Object.getOwnPropertyNames(b),e=0,f=d.length;f>e&&(c=d[e]);e++){var g=Object.getOwnPropertyDescriptor(b,c);if("function"==typeof g.value&&g.value===a)return c}b=b.__proto__}}function d(a,b,c){var d=e(c,b,a);return d[b]&&(d[b].nom=b),a._super=d}function e(a,b,c){for(;a;){if(a[b]!==c&&a[b])return a;a=f(a)}return Object}function f(a){return a.__proto__}a["super"]=b}(Polymer),function(a){function b(a){return a}function c(a,b){var c=typeof b;return b instanceof Date&&(c="date"),d[c](a,b)}var d={string:b,undefined:b,date:function(a){return new Date(Date.parse(a)||Date.now())},"boolean":function(a){return""===a?!0:"false"===a?!1:!!a},number:function(a){var b=parseFloat(a);return 0===b&&(b=parseInt(a)),isNaN(b)?a:b},object:function(a,b){if(null===b)return a;try{return JSON.parse(a.replace(/'/g,'"'))}catch(c){return a}},"function":function(a,b){return b}};a.deserializeValue=c}(Polymer),function(a){var b=a.extend,c={};c.declaration={},c.instance={},c.publish=function(a,c){for(var d in a)b(c,a[d])},a.api=c}(Polymer),function(a){var b={async:function(a,b,c){Polymer.flush(),b=b&&b.length?b:[b];var d=function(){(this[a]||a).apply(this,b)}.bind(this),e=c?setTimeout(d,c):requestAnimationFrame(d);return c?e:~e},cancelAsync:function(a){0>a?cancelAnimationFrame(~a):clearTimeout(a)},fire:function(a,b,c,d,e){var f=c||this,b=null===b||void 0===b?{}:b,g=new CustomEvent(a,{bubbles:void 0!==d?d:!0,cancelable:void 0!==e?e:!0,detail:b});return f.dispatchEvent(g),g},asyncFire:function(){this.async("fire",arguments)},classFollows:function(a,b,c){b&&b.classList.remove(c),a&&a.classList.add(c)},injectBoundHTML:function(a,b){var c=document.createElement("template");c.innerHTML=a;var d=this.instanceTemplate(c);return b&&(b.textContent="",b.appendChild(d)),d}},c=function(){},d={};b.asyncMethod=b.async,a.api.instance.utils=b,a.nop=c,a.nob=d}(Polymer),function(a){var b=window.WebComponents?WebComponents.flags.log:{},c="on-",d={EVENT_PREFIX:c,addHostListeners:function(){var a=this.eventDelegates;
b.events&&Object.keys(a).length>0&&console.log("[%s] addHostListeners:",this.localName,a);for(var c in a){var d=a[c];PolymerGestures.addEventListener(this,c,this.element.getEventHandler(this,this,d))}},dispatchMethod:function(a,c,d){if(a){b.events&&console.group("[%s] dispatch [%s]",a.localName,c);var e="function"==typeof c?c:a[c];e&&e[d?"apply":"call"](a,d),b.events&&console.groupEnd(),Polymer.flush()}}};a.api.instance.events=d,a.addEventListener=function(a,b,c,d){PolymerGestures.addEventListener(wrap(a),b,c,d)},a.removeEventListener=function(a,b,c,d){PolymerGestures.removeEventListener(wrap(a),b,c,d)}}(Polymer),function(a){var b={copyInstanceAttributes:function(){var a=this._instanceAttributes;for(var b in a)this.hasAttribute(b)||this.setAttribute(b,a[b])},takeAttributes:function(){if(this._publishLC)for(var a,b=0,c=this.attributes,d=c.length;(a=c[b])&&d>b;b++)this.attributeToProperty(a.name,a.value)},attributeToProperty:function(b,c){var b=this.propertyForAttribute(b);if(b){if(c&&c.search(a.bindPattern)>=0)return;var d=this[b],c=this.deserializeValue(c,d);c!==d&&(this[b]=c)}},propertyForAttribute:function(a){var b=this._publishLC&&this._publishLC[a];return b},deserializeValue:function(b,c){return a.deserializeValue(b,c)},serializeValue:function(a,b){return"boolean"===b?a?"":void 0:"object"!==b&&"function"!==b&&void 0!==a?a:void 0},reflectPropertyToAttribute:function(a){var b=typeof this[a],c=this.serializeValue(this[a],b);void 0!==c?this.setAttribute(a,c):"boolean"===b&&this.removeAttribute(a)}};a.api.instance.attributes=b}(Polymer),function(a){function b(a,b){return a===b?0!==a||1/a===1/b:f(a)&&f(b)?!0:a!==a&&b!==b}function c(a,b){return void 0===b&&null===a?b:null===b||void 0===b?a:b}var d=window.WebComponents?WebComponents.flags.log:{},e={object:void 0,type:"update",name:void 0,oldValue:void 0},f=Number.isNaN||function(a){return"number"==typeof a&&isNaN(a)},g={createPropertyObserver:function(){var a=this._observeNames;if(a&&a.length){var b=this._propertyObserver=new CompoundObserver(!0);this.registerObserver(b);for(var c,d=0,e=a.length;e>d&&(c=a[d]);d++)b.addPath(this,c),this.observeArrayValue(c,this[c],null)}},openPropertyObserver:function(){this._propertyObserver&&this._propertyObserver.open(this.notifyPropertyChanges,this)},notifyPropertyChanges:function(a,b,c){var d,e,f={};for(var g in b)if(d=c[2*g+1],e=this.observe[d]){var h=b[g],i=a[g];this.observeArrayValue(d,i,h),f[e]||(void 0!==h&&null!==h||void 0!==i&&null!==i)&&(f[e]=!0,this.invokeMethod(e,[h,i,arguments]))}},invokeMethod:function(a,b){var c=this[a]||a;"function"==typeof c&&c.apply(this,b)},deliverChanges:function(){this._propertyObserver&&this._propertyObserver.deliver()},observeArrayValue:function(a,b,c){var e=this.observe[a];if(e&&(Array.isArray(c)&&(d.observe&&console.log("[%s] observeArrayValue: unregister observer [%s]",this.localName,a),this.closeNamedObserver(a+"__array")),Array.isArray(b))){d.observe&&console.log("[%s] observeArrayValue: register observer [%s]",this.localName,a,b);var f=new ArrayObserver(b);f.open(function(a){this.invokeMethod(e,[a])},this),this.registerNamedObserver(a+"__array",f)}},emitPropertyChangeRecord:function(a,c,d){if(!b(c,d)&&(this._propertyChanged(a,c,d),Observer.hasObjectObserve)){var f=this._objectNotifier;f||(f=this._objectNotifier=Object.getNotifier(this)),e.object=this,e.name=a,e.oldValue=d,f.notify(e)}},_propertyChanged:function(a){this.reflect[a]&&this.reflectPropertyToAttribute(a)},bindProperty:function(a,b,d){if(d)return void(this[a]=b);var e=this.element.prototype.computed;if(e&&e[a]){var f=a+"ComputedBoundObservable_";return void(this[f]=b)}return this.bindToAccessor(a,b,c)},bindToAccessor:function(a,c,d){function e(b,c){j[f]=b;var d=j[h];d&&"function"==typeof d.setValue&&d.setValue(b),j.emitPropertyChangeRecord(a,b,c)}var f=a+"_",g=a+"Observable_",h=a+"ComputedBoundObservable_";this[g]=c;var i=this[f],j=this,k=c.open(e);if(d&&!b(i,k)){var l=d(i,k);b(k,l)||(k=l,c.setValue&&c.setValue(k))}e(k,i);var m={close:function(){c.close(),j[g]=void 0,j[h]=void 0}};return this.registerObserver(m),m},createComputedProperties:function(){if(this._computedNames)for(var a=0;a<this._computedNames.length;a++){var b=this._computedNames[a],c=this.computed[b];try{var d=PolymerExpressions.getExpression(c),e=d.getBinding(this,this.element.syntax);this.bindToAccessor(b,e)}catch(f){console.error("Failed to create computed property",f)}}},registerObserver:function(a){return this._observers?void this._observers.push(a):void(this._observers=[a])},closeObservers:function(){if(this._observers){for(var a=this._observers,b=0;b<a.length;b++){var c=a[b];c&&"function"==typeof c.close&&c.close()}this._observers=[]}},registerNamedObserver:function(a,b){var c=this._namedObservers||(this._namedObservers={});c[a]=b},closeNamedObserver:function(a){var b=this._namedObservers;return b&&b[a]?(b[a].close(),b[a]=null,!0):void 0},closeNamedObservers:function(){if(this._namedObservers){for(var a in this._namedObservers)this.closeNamedObserver(a);this._namedObservers={}}}};a.api.instance.properties=g}(Polymer),function(a){var b=window.WebComponents?WebComponents.flags.log:{},c={instanceTemplate:function(a){HTMLTemplateElement.decorate(a);for(var b=this.syntax||!a.bindingDelegate&&this.element.syntax,c=a.createInstance(this,b),d=c.bindings_,e=0;e<d.length;e++)this.registerObserver(d[e]);return c},bind:function(a,b,c){var d=this.propertyForAttribute(a);if(d){var e=this.bindProperty(d,b,c);return Platform.enableBindingsReflection&&e&&(e.path=b.path_,this._recordBinding(d,e)),this.reflect[d]&&this.reflectPropertyToAttribute(d),e}return this.mixinSuper(arguments)},_recordBinding:function(a,b){this.bindings_=this.bindings_||{},this.bindings_[a]=b},bindFinished:function(){this.makeElementReady()},asyncUnbindAll:function(){this._unbound||(b.unbind&&console.log("[%s] asyncUnbindAll",this.localName),this._unbindAllJob=this.job(this._unbindAllJob,this.unbindAll,0))},unbindAll:function(){this._unbound||(this.closeObservers(),this.closeNamedObservers(),this._unbound=!0)},cancelUnbindAll:function(){return this._unbound?void(b.unbind&&console.warn("[%s] already unbound, cannot cancel unbindAll",this.localName)):(b.unbind&&console.log("[%s] cancelUnbindAll",this.localName),void(this._unbindAllJob&&(this._unbindAllJob=this._unbindAllJob.stop())))}},d=/\{\{([^{}]*)}}/;a.bindPattern=d,a.api.instance.mdv=c}(Polymer),function(a){function b(a){return a.hasOwnProperty("PolymerBase")}function c(){}var d={PolymerBase:!0,job:function(a,b,c){if("string"!=typeof a)return Polymer.job.call(this,a,b,c);var d="___"+a;this[d]=Polymer.job.call(this,this[d],b,c)},"super":Polymer["super"],created:function(){},ready:function(){},createdCallback:function(){this.templateInstance&&this.templateInstance.model&&console.warn("Attributes on "+this.localName+" were data bound prior to Polymer upgrading the element. This may result in incorrect binding types."),this.created(),this.prepareElement(),this.ownerDocument.isStagingDocument||this.makeElementReady()},prepareElement:function(){return this._elementPrepared?void console.warn("Element already prepared",this.localName):(this._elementPrepared=!0,this.shadowRoots={},this.createPropertyObserver(),this.openPropertyObserver(),this.copyInstanceAttributes(),this.takeAttributes(),void this.addHostListeners())},makeElementReady:function(){this._readied||(this._readied=!0,this.createComputedProperties(),this.parseDeclarations(this.__proto__),this.removeAttribute("unresolved"),this.ready())},attributeChangedCallback:function(a){"class"!==a&&"style"!==a&&this.attributeToProperty(a,this.getAttribute(a)),this.attributeChanged&&this.attributeChanged.apply(this,arguments)},attachedCallback:function(){this.cancelUnbindAll(),this.attached&&this.attached(),this.hasBeenAttached||(this.hasBeenAttached=!0,this.domReady&&this.async("domReady"))},detachedCallback:function(){this.preventDispose||this.asyncUnbindAll(),this.detached&&this.detached(),this.leftView&&this.leftView()},parseDeclarations:function(a){a&&a.element&&(this.parseDeclarations(a.__proto__),a.parseDeclaration.call(this,a.element))},parseDeclaration:function(a){var b=this.fetchTemplate(a);if(b){var c=this.shadowFromTemplate(b);this.shadowRoots[a.name]=c}},fetchTemplate:function(a){return a.querySelector("template")},shadowFromTemplate:function(a){if(a){var b=this.createShadowRoot(),c=this.instanceTemplate(a);return b.appendChild(c),this.shadowRootReady(b,a),b}},lightFromTemplate:function(a,b){if(a){this.eventController=this;var c=this.instanceTemplate(a);return b?this.insertBefore(c,b):this.appendChild(c),this.shadowRootReady(this),c}},shadowRootReady:function(a){this.marshalNodeReferences(a)},marshalNodeReferences:function(a){var b=this.$=this.$||{};if(a)for(var c,d=a.querySelectorAll("[id]"),e=0,f=d.length;f>e&&(c=d[e]);e++)b[c.id]=c},onMutation:function(a,b){var c=new MutationObserver(function(a){b.call(this,c,a),c.disconnect()}.bind(this));c.observe(a,{childList:!0,subtree:!0})}};c.prototype=d,d.constructor=c,a.Base=c,a.isBase=b,a.api.instance.base=d}(Polymer),function(a){function b(a){return a.__proto__}function c(a,b){var c="",d=!1;b&&(c=b.localName,d=b.hasAttribute("is"));var e=WebComponents.ShadowCSS.makeScopeSelector(c,d);return WebComponents.ShadowCSS.shimCssText(a,e)}var d=(window.WebComponents?WebComponents.flags.log:{},window.ShadowDOMPolyfill),e="element",f="controller",g={STYLE_SCOPE_ATTRIBUTE:e,installControllerStyles:function(){var a=this.findStyleScope();if(a&&!this.scopeHasNamedStyle(a,this.localName)){for(var c=b(this),d="";c&&c.element;)d+=c.element.cssTextForScope(f),c=b(c);d&&this.installScopeCssText(d,a)}},installScopeStyle:function(a,b,c){var c=c||this.findStyleScope(),b=b||"";if(c&&!this.scopeHasNamedStyle(c,this.localName+b)){var d="";if(a instanceof Array)for(var e,f=0,g=a.length;g>f&&(e=a[f]);f++)d+=e.textContent+"\n\n";else d=a.textContent;this.installScopeCssText(d,c,b)}},installScopeCssText:function(a,b,e){if(b=b||this.findStyleScope(),e=e||"",b){d&&(a=c(a,b.host));var g=this.element.cssTextToScopeStyle(a,f);Polymer.applyStyleToScope(g,b),this.styleCacheForScope(b)[this.localName+e]=!0}},findStyleScope:function(a){for(var b=a||this;b.parentNode;)b=b.parentNode;return b},scopeHasNamedStyle:function(a,b){var c=this.styleCacheForScope(a);return c[b]},styleCacheForScope:function(a){if(d){var b=a.host?a.host.localName:a.localName;return h[b]||(h[b]={})}return a._scopeStyles=a._scopeStyles||{}}},h={};a.api.instance.styles=g}(Polymer),function(a){function b(a,b){if("string"!=typeof a){var c=b||document._currentScript;if(b=a,a=c&&c.parentNode&&c.parentNode.getAttribute?c.parentNode.getAttribute("name"):"",!a)throw"Element name could not be inferred."}if(f(a))throw"Already registered (Polymer) prototype for element "+a;e(a,b),d(a)}function c(a,b){i[a]=b}function d(a){i[a]&&(i[a].registerWhenReady(),delete i[a])}function e(a,b){return j[a]=b||{}}function f(a){return j[a]}function g(a,b){if("string"!=typeof b)return!1;var c=HTMLElement.getPrototypeForTag(b),d=c&&c.constructor;return d?CustomElements["instanceof"]?CustomElements["instanceof"](a,d):a instanceof d:!1}var h=a.extend,i=(a.api,{}),j={};a.getRegisteredPrototype=f,a.waitingForPrototype=c,a.instanceOfType=g,window.Polymer=b,h(Polymer,a),WebComponents.consumeDeclarations&&WebComponents.consumeDeclarations(function(a){if(a)for(var c,d=0,e=a.length;e>d&&(c=a[d]);d++)b.apply(null,c)})}(Polymer),function(a){var b={resolveElementPaths:function(a){Polymer.urlResolver.resolveDom(a)},addResolvePathApi:function(){var a=this.getAttribute("assetpath")||"",b=new URL(a,this.ownerDocument.baseURI);this.prototype.resolvePath=function(a,c){var d=new URL(a,c||b);return d.href}}};a.api.declaration.path=b}(Polymer),function(a){function b(a,b){var c=new URL(a.getAttribute("href"),b).href;return"@import '"+c+"';"}function c(a,b){if(a){b===document&&(b=document.head),i&&(b=document.head);var c=d(a.textContent),e=a.getAttribute(h);e&&c.setAttribute(h,e);var f=b.firstElementChild;if(b===document.head){var g="style["+h+"]",j=document.head.querySelectorAll(g);j.length&&(f=j[j.length-1].nextElementSibling)}b.insertBefore(c,f)}}function d(a,b){b=b||document,b=b.createElement?b:b.ownerDocument;var c=b.createElement("style");return c.textContent=a,c}function e(a){return a&&a.__resource||""}function f(a,b){return q?q.call(a,b):void 0}var g=(window.WebComponents?WebComponents.flags.log:{},a.api.instance.styles),h=g.STYLE_SCOPE_ATTRIBUTE,i=window.ShadowDOMPolyfill,j="style",k="@import",l="link[rel=stylesheet]",m="global",n="polymer-scope",o={loadStyles:function(a){var b=this.fetchTemplate(),c=b&&this.templateContent();if(c){this.convertSheetsToStyles(c);var d=this.findLoadableStyles(c);if(d.length){var e=b.ownerDocument.baseURI;return Polymer.styleResolver.loadStyles(d,e,a)}}a&&a()},convertSheetsToStyles:function(a){for(var c,e,f=a.querySelectorAll(l),g=0,h=f.length;h>g&&(c=f[g]);g++)e=d(b(c,this.ownerDocument.baseURI),this.ownerDocument),this.copySheetAttributes(e,c),c.parentNode.replaceChild(e,c)},copySheetAttributes:function(a,b){for(var c,d=0,e=b.attributes,f=e.length;(c=e[d])&&f>d;d++)"rel"!==c.name&&"href"!==c.name&&a.setAttribute(c.name,c.value)},findLoadableStyles:function(a){var b=[];if(a)for(var c,d=a.querySelectorAll(j),e=0,f=d.length;f>e&&(c=d[e]);e++)c.textContent.match(k)&&b.push(c);return b},installSheets:function(){this.cacheSheets(),this.cacheStyles(),this.installLocalSheets(),this.installGlobalStyles()},cacheSheets:function(){this.sheets=this.findNodes(l),this.sheets.forEach(function(a){a.parentNode&&a.parentNode.removeChild(a)})},cacheStyles:function(){this.styles=this.findNodes(j+"["+n+"]"),this.styles.forEach(function(a){a.parentNode&&a.parentNode.removeChild(a)})},installLocalSheets:function(){var a=this.sheets.filter(function(a){return!a.hasAttribute(n)}),b=this.templateContent();if(b){var c="";if(a.forEach(function(a){c+=e(a)+"\n"}),c){var f=d(c,this.ownerDocument);b.insertBefore(f,b.firstChild)}}},findNodes:function(a,b){var c=this.querySelectorAll(a).array(),d=this.templateContent();if(d){var e=d.querySelectorAll(a).array();c=c.concat(e)}return b?c.filter(b):c},installGlobalStyles:function(){var a=this.styleForScope(m);c(a,document.head)},cssTextForScope:function(a){var b="",c="["+n+"="+a+"]",d=function(a){return f(a,c)},g=this.sheets.filter(d);g.forEach(function(a){b+=e(a)+"\n\n"});var h=this.styles.filter(d);return h.forEach(function(a){b+=a.textContent+"\n\n"}),b},styleForScope:function(a){var b=this.cssTextForScope(a);return this.cssTextToScopeStyle(b,a)},cssTextToScopeStyle:function(a,b){if(a){var c=d(a);return c.setAttribute(h,this.getAttribute("name")+"-"+b),c}}},p=HTMLElement.prototype,q=p.matches||p.matchesSelector||p.webkitMatchesSelector||p.mozMatchesSelector;a.api.declaration.styles=o,a.applyStyleToScope=c}(Polymer),function(a){var b=(window.WebComponents?WebComponents.flags.log:{},a.api.instance.events),c=b.EVENT_PREFIX,d={};["webkitAnimationStart","webkitAnimationEnd","webkitTransitionEnd","DOMFocusOut","DOMFocusIn","DOMMouseScroll"].forEach(function(a){d[a.toLowerCase()]=a});var e={parseHostEvents:function(){var a=this.prototype.eventDelegates;this.addAttributeDelegates(a)},addAttributeDelegates:function(a){for(var b,c=0;b=this.attributes[c];c++)this.hasEventPrefix(b.name)&&(a[this.removeEventPrefix(b.name)]=b.value.replace("{{","").replace("}}","").trim())},hasEventPrefix:function(a){return a&&"o"===a[0]&&"n"===a[1]&&"-"===a[2]},removeEventPrefix:function(a){return a.slice(f)},findController:function(a){for(;a.parentNode;){if(a.eventController)return a.eventController;a=a.parentNode}return a.host},getEventHandler:function(a,b,c){var d=this;return function(e){a&&a.PolymerBase||(a=d.findController(b));var f=[e,e.detail,e.currentTarget];a.dispatchMethod(a,c,f)}},prepareEventBinding:function(a,b){if(this.hasEventPrefix(b)){var c=this.removeEventPrefix(b);c=d[c]||c;var e=this;return function(b,d,f){function g(){return"{{ "+a+" }}"}var h=e.getEventHandler(void 0,d,a);return PolymerGestures.addEventListener(d,c,h),f?void 0:{open:g,discardChanges:g,close:function(){PolymerGestures.removeEventListener(d,c,h)}}}}}},f=c.length;a.api.declaration.events=e}(Polymer),function(a){var b=["attribute"],c={inferObservers:function(a){var b,c=a.observe;for(var d in a)"Changed"===d.slice(-7)&&(b=d.slice(0,-7),this.canObserveProperty(b)&&(c||(c=a.observe={}),c[b]=c[b]||d))},canObserveProperty:function(a){return b.indexOf(a)<0},explodeObservers:function(a){var b=a.observe;if(b){var c={};for(var d in b)for(var e,f=d.split(" "),g=0;e=f[g];g++)c[e]=b[d];a.observe=c}},optimizePropertyMaps:function(a){if(a.observe){var b=a._observeNames=[];for(var c in a.observe)for(var d,e=c.split(" "),f=0;d=e[f];f++)b.push(d)}if(a.publish){var b=a._publishNames=[];for(var c in a.publish)b.push(c)}if(a.computed){var b=a._computedNames=[];for(var c in a.computed)b.push(c)}},publishProperties:function(a,b){var c=a.publish;c&&(this.requireProperties(c,a,b),this.filterInvalidAccessorNames(c),a._publishLC=this.lowerCaseMap(c));var d=a.computed;d&&this.filterInvalidAccessorNames(d)},filterInvalidAccessorNames:function(a){for(var b in a)this.propertyNameBlacklist[b]&&(console.warn('Cannot define property "'+b+'" for element "'+this.name+'" because it has the same name as an HTMLElement property, and not all browsers support overriding that. Consider giving it a different name.'),delete a[b])},requireProperties:function(a,b){b.reflect=b.reflect||{};for(var c in a){var d=a[c];d&&void 0!==d.reflect&&(b.reflect[c]=Boolean(d.reflect),d=d.value),void 0!==d&&(b[c]=d)}},lowerCaseMap:function(a){var b={};for(var c in a)b[c.toLowerCase()]=c;return b},createPropertyAccessor:function(a,b){var c=this.prototype,d=a+"_",e=a+"Observable_";c[d]=c[a],Object.defineProperty(c,a,{get:function(){var a=this[e];return a&&a.deliver(),this[d]},set:function(c){if(b)return this[d];var f=this[e];if(f)return void f.setValue(c);var g=this[d];return this[d]=c,this.emitPropertyChangeRecord(a,c,g),c},configurable:!0})},createPropertyAccessors:function(a){var b=a._computedNames;if(b&&b.length)for(var c,d=0,e=b.length;e>d&&(c=b[d]);d++)this.createPropertyAccessor(c,!0);var b=a._publishNames;if(b&&b.length)for(var c,d=0,e=b.length;e>d&&(c=b[d]);d++)a.computed&&a.computed[c]||this.createPropertyAccessor(c)},propertyNameBlacklist:{children:1,"class":1,id:1,hidden:1,style:1,title:1}};a.api.declaration.properties=c}(Polymer),function(a){var b="attributes",c=/\s|,/,d={inheritAttributesObjects:function(a){this.inheritObject(a,"publishLC"),this.inheritObject(a,"_instanceAttributes")},publishAttributes:function(a){var d=this.getAttribute(b);if(d)for(var e,f=a.publish||(a.publish={}),g=d.split(c),h=0,i=g.length;i>h;h++)e=g[h].trim(),e&&void 0===f[e]&&(f[e]=void 0)},accumulateInstanceAttributes:function(){for(var a,b=this.prototype._instanceAttributes,c=this.attributes,d=0,e=c.length;e>d&&(a=c[d]);d++)this.isInstanceAttribute(a.name)&&(b[a.name]=a.value)},isInstanceAttribute:function(a){return!this.blackList[a]&&"on-"!==a.slice(0,3)},blackList:{name:1,"extends":1,constructor:1,noscript:1,assetpath:1,"cache-csstext":1}};d.blackList[b]=1,a.api.declaration.attributes=d}(Polymer),function(a){var b=a.api.declaration.events,c=new PolymerExpressions,d=c.prepareBinding;c.prepareBinding=function(a,e,f){return b.prepareEventBinding(a,e,f)||d.call(c,a,e,f)};var e={syntax:c,fetchTemplate:function(){return this.querySelector("template")},templateContent:function(){var a=this.fetchTemplate();return a&&a.content},installBindingDelegate:function(a){a&&(a.bindingDelegate=this.syntax)}};a.api.declaration.mdv=e}(Polymer),function(a){function b(a){if(!Object.__proto__){var b=Object.getPrototypeOf(a);a.__proto__=b,d(b)&&(b.__proto__=Object.getPrototypeOf(b))}}var c=a.api,d=a.isBase,e=a.extend,f=window.ShadowDOMPolyfill,g={register:function(a,b){this.buildPrototype(a,b),this.registerPrototype(a,b),this.publishConstructor()},buildPrototype:function(b,c){var d=a.getRegisteredPrototype(b),e=this.generateBasePrototype(c);this.desugarBeforeChaining(d,e),this.prototype=this.chainPrototypes(d,e),this.desugarAfterChaining(b,c)},desugarBeforeChaining:function(a,b){a.element=this,this.publishAttributes(a,b),this.publishProperties(a,b),this.inferObservers(a),this.explodeObservers(a)},chainPrototypes:function(a,c){this.inheritMetaData(a,c);var d=this.chainObject(a,c);return b(d),d},inheritMetaData:function(a,b){this.inheritObject("observe",a,b),this.inheritObject("publish",a,b),this.inheritObject("reflect",a,b),this.inheritObject("_publishLC",a,b),this.inheritObject("_instanceAttributes",a,b),this.inheritObject("eventDelegates",a,b)},desugarAfterChaining:function(a,b){this.optimizePropertyMaps(this.prototype),this.createPropertyAccessors(this.prototype),this.installBindingDelegate(this.fetchTemplate()),this.installSheets(),this.resolveElementPaths(this),this.accumulateInstanceAttributes(),this.parseHostEvents(),this.addResolvePathApi(),f&&WebComponents.ShadowCSS.shimStyling(this.templateContent(),a,b),this.prototype.registerCallback&&this.prototype.registerCallback(this)},publishConstructor:function(){var a=this.getAttribute("constructor");a&&(window[a]=this.ctor)},generateBasePrototype:function(a){var b=this.findBasePrototype(a);if(!b){var b=HTMLElement.getPrototypeForTag(a);b=this.ensureBaseApi(b),h[a]=b}return b},findBasePrototype:function(a){return h[a]},ensureBaseApi:function(a){if(a.PolymerBase)return a;var b=Object.create(a);return c.publish(c.instance,b),this.mixinMethod(b,a,c.instance.mdv,"bind"),b},mixinMethod:function(a,b,c,d){var e=function(a){return b[d].apply(this,a)};a[d]=function(){return this.mixinSuper=e,c[d].apply(this,arguments)}},inheritObject:function(a,b,c){var d=b[a]||{};b[a]=this.chainObject(d,c[a])},registerPrototype:function(a,b){var c={prototype:this.prototype},d=this.findTypeExtension(b);d&&(c["extends"]=d),HTMLElement.register(a,this.prototype),this.ctor=document.registerElement(a,c)},findTypeExtension:function(a){if(a&&a.indexOf("-")<0)return a;var b=this.findBasePrototype(a);return b.element?this.findTypeExtension(b.element["extends"]):void 0}},h={};g.chainObject=Object.__proto__?function(a,b){return a&&b&&a!==b&&(a.__proto__=b),a}:function(a,b){if(a&&b&&a!==b){var c=Object.create(b);a=e(c,a)}return a},c.declaration.prototype=g}(Polymer),function(a){function b(a){return document.contains(a)?j:i}function c(){return i.length?i[0]:j[0]}function d(a){f.waitToReady=!0,Polymer.endOfMicrotask(function(){HTMLImports.whenReady(function(){f.addReadyCallback(a),f.waitToReady=!1,f.check()})})}function e(a){if(void 0===a)return void f.ready();var b=setTimeout(function(){f.ready()},a);Polymer.whenReady(function(){clearTimeout(b)})}var f={wait:function(a){a.__queue||(a.__queue={},g.push(a))},enqueue:function(a,c,d){var e=a.__queue&&!a.__queue.check;return e&&(b(a).push(a),a.__queue.check=c,a.__queue.go=d),0!==this.indexOf(a)},indexOf:function(a){var c=b(a).indexOf(a);return c>=0&&document.contains(a)&&(c+=HTMLImports.useNative||HTMLImports.ready?i.length:1e9),c},go:function(a){var b=this.remove(a);b&&(a.__queue.flushable=!0,this.addToFlushQueue(b),this.check())},remove:function(a){var c=this.indexOf(a);if(0===c)return b(a).shift()},check:function(){var a=this.nextElement();return a&&a.__queue.check.call(a),this.canReady()?(this.ready(),!0):void 0},nextElement:function(){return c()},canReady:function(){return!this.waitToReady&&this.isEmpty()},isEmpty:function(){for(var a,b=0,c=g.length;c>b&&(a=g[b]);b++)if(a.__queue&&!a.__queue.flushable)return;return!0},addToFlushQueue:function(a){h.push(a)},flush:function(){if(!this.flushing){this.flushing=!0;for(var a;h.length;)a=h.shift(),a.__queue.go.call(a),a.__queue=null;this.flushing=!1}},ready:function(){var a=CustomElements.ready;CustomElements.ready=!1,this.flush(),CustomElements.useNative||CustomElements.upgradeDocumentTree(document),CustomElements.ready=a,Polymer.flush(),requestAnimationFrame(this.flushReadyCallbacks)},addReadyCallback:function(a){a&&k.push(a)},flushReadyCallbacks:function(){if(k)for(var a;k.length;)(a=k.shift())()},waitingFor:function(){for(var a,b=[],c=0,d=g.length;d>c&&(a=g[c]);c++)a.__queue&&!a.__queue.flushable&&b.push(a);return b},waitToReady:!0},g=[],h=[],i=[],j=[],k=[];a.elements=g,a.waitingFor=f.waitingFor.bind(f),a.forceReady=e,a.queue=f,a.whenReady=a.whenPolymerReady=d}(Polymer),function(a){function b(a){return Boolean(HTMLElement.getPrototypeForTag(a))}function c(a){return a&&a.indexOf("-")>=0}var d=a.extend,e=a.api,f=a.queue,g=a.whenReady,h=a.getRegisteredPrototype,i=a.waitingForPrototype,j=d(Object.create(HTMLElement.prototype),{createdCallback:function(){this.getAttribute("name")&&this.init()},init:function(){this.name=this.getAttribute("name"),this["extends"]=this.getAttribute("extends"),f.wait(this),this.loadResources(),this.registerWhenReady()},registerWhenReady:function(){this.registered||this.waitingForPrototype(this.name)||this.waitingForQueue()||this.waitingForResources()||f.go(this)},_register:function(){c(this["extends"])&&!b(this["extends"])&&console.warn("%s is attempting to extend %s, an unregistered element or one that was not registered with Polymer.",this.name,this["extends"]),this.register(this.name,this["extends"]),this.registered=!0},waitingForPrototype:function(a){return h(a)?void 0:(i(a,this),this.handleNoScript(a),!0)},handleNoScript:function(a){this.hasAttribute("noscript")&&!this.noscript&&(this.noscript=!0,Polymer(a))},waitingForResources:function(){return this._needsResources},waitingForQueue:function(){return f.enqueue(this,this.registerWhenReady,this._register)},loadResources:function(){this._needsResources=!0,this.loadStyles(function(){this._needsResources=!1,this.registerWhenReady()}.bind(this))}});e.publish(e.declaration,j),g(function(){document.body.removeAttribute("unresolved"),document.dispatchEvent(new CustomEvent("polymer-ready",{bubbles:!0}))}),document.registerElement("polymer-element",{prototype:j})}(Polymer),function(a){function b(a,b){a?(document.head.appendChild(a),d(b)):b&&b()}function c(a,c){if(a&&a.length){for(var d,e,f=document.createDocumentFragment(),g=0,h=a.length;h>g&&(d=a[g]);g++)e=document.createElement("link"),e.rel="import",e.href=d,f.appendChild(e);b(f,c)}else c&&c()}var d=a.whenReady;a["import"]=c,a.importElements=b}(Polymer),function(){var a=document.createElement("polymer-element");a.setAttribute("name","auto-binding"),a.setAttribute("extends","template"),a.init(),Polymer("auto-binding",{createdCallback:function(){this.syntax=this.bindingDelegate=this.makeSyntax(),Polymer.whenPolymerReady(function(){this.model=this,this.setAttribute("bind",""),this.async(function(){this.marshalNodeReferences(this.parentNode),this.fire("template-bound")})}.bind(this))},makeSyntax:function(){var a=Object.create(Polymer.api.declaration.events),b=this;a.findController=function(){return b.model};var c=new PolymerExpressions,d=c.prepareBinding;return c.prepareBinding=function(b,e,f){return a.prepareEventBinding(b,e,f)||d.call(c,b,e,f)},c}})}();
window._TV_IS_COMPILED = true;
var global=this;
this.tv=function(){function e(){if(!b){var a=document.createElement("div");a.style.backgroundColor="white";a.style.border="3px solid red";a.style.boxSizing="border-box";a.style.color="black";a.style.display="-webkit-flex";a.style.height="100%";a.style.left=0;a.style.padding="8px";a.style.position="fixed";a.style.top=0;a.style.webkitFlexDirection="column";a.style.width="100%";b=document.createElement("div");b.style.webkitFlex="1 1 auto";b.style.overflow="auto";a.appendChild(b);document.body?document.body.appendChild(a):
setTimeout(function(){document.body.appendChild(a)},150)}}function c(f,d){d instanceof Error&&(d=d.stack);e();var c=document.createElement("div");c.innerHTML='<h2 id="message"></h2><pre id="details"></pre>';c.querySelector("#message").textContent=f;c.querySelector("#details").textContent=d;b.appendChild(c);a.push({title:f,details:d})}if(window.tv)return console.warn("Base was multiply initialized. First init wins."),window.tv;var b=void 0,a=[];return{initialize:function(){if(!window._TRACE_VIEWER_IS_COMPILED){var a=
parseInt(window.navigator.appVersion.match(/Chrome\/(\d+)\./)[1],10),d=window.navigator.appVersion.match("77.34.5");36>a&&!d&&c("Invalid Chrome version","A Chrome version of 36 or higher is required for trace-viewer development. Please upgrade your version of Chrome and try again.")}tv.doc=document;tv.isMac=/Mac/.test(navigator.platform);tv.isWindows=/Win/.test(navigator.platform);tv.isChromeOS=/CrOS/.test(navigator.userAgent);tv.isLinux=/Linux/.test(navigator.userAgent)},exportTo:function(a,d){var b;
b=a.split(".");for(var c=global,e;b.length&&(e=b.shift());)c=e in c?c[e]:c[e]={};b=c;var c=d(),l;for(l in c)(e=Object.getOwnPropertyDescriptor(c,l))&&Object.defineProperty(b,l,e)},isDefined:function(a,d){for(var b=a.split("."),c=d||global,e=0;e<b.length;e++)if(c=c[b[e]],void 0===c)return!1;return!0},showPanic:c,hasPanic:function(){return 0!==a.length},getPanicText:function(){return a.map(function(a){return a.title}).join(", ")}}}();tv.initialize();"use strict";
tv.exportTo("tv.b.ui",function(){return{decorate:function(e,c){var b;b="string"==typeof e?tv.doc.querySelectorAll(e):[e];for(var a=0,f;f=b[a];a++)f instanceof c||c.decorate(f)},define:function(e,c,b){function a(){if(c&&a.prototype.__proto__!=c.prototype)throw Error(e+" prototye's __proto__ field is messed up. It MUST be the prototype of "+c.tagName);var b;b=void 0===d?tv.doc.createElement(f):tv.doc.createElementNS(d,f);a.decorate.call(this,b,arguments);return b}if("function"==typeof e)throw Error("Passing functions as className is deprecated. Please use (className, opt_parentConstructor) to subclass");
e=e.toLowerCase();if(c&&!c.tagName)throw Error("opt_parentConstructor was not created by tv.b.ui.define");var f=e,d=void 0;if(c){if(b)throw Error("Must not specify tagNS if parentConstructor is given");for(b=c;b&&b.tagName;)f=b.tagName,d=b.tagNS,b=b.parentConstructor}else d=b;a.decorate=function(d,b){d.__proto__=a.prototype;d.decorate.apply(d,b);d.constructor=a};a.className=e;a.tagName=f;a.tagNS=d;a.parentConstructor=c?c:void 0;a.toString=function(){return!a.parentConstructor?a.tagName:a.parentConstructor.toString()+
"::"+a.className};return a},elementIsChildOf:function(e,c){if(e==c)return!1;for(var b=e;b.parentNode;){if(b==c)return!0;b=b.parentNode}return!1}}});"use strict";
tv.exportTo("tv.b",function(){function e(a,b){if(a instanceof Object)if(a instanceof Array)for(var d=0;d<a.length;d++)b(a,d,a[d]),e(a[d],b);else for(d in a){var c=a[d];b(a,d,c);e(c,b)}}function c(a){return a}function b(a,b,d){b=b||c;for(var h=0;h<a.length;h++)if(b.call(d,a[h],h))return h;return-1}return{asArray:function(a){for(var b=[],d=0;d<a.length;d++)b.push(a[d]);return b},concatenateArrays:function(){for(var a=[],b=0;b<arguments.length;b++){if(!(arguments[b]instanceof Array))throw Error("Arguments "+
b+"is not an array");a.push.apply(a,arguments[b])}return a},concatenateObjects:function(){for(var a={},b=0;b<arguments.length;b++){var d=arguments[b],c;for(c in d)a[c]=d[c]}return a},compareArrays:function(a,b,d){for(var c=Math.min(a.length,b.length),e=0;e<c;e++){var k=d(a[e],b[e]);if(k)return k}return a.length==b.length?0:void 0===a[e]?-1:1},comparePossiblyUndefinedValues:function(a,b,d){return void 0!==a&&void 0!==b?d(a,b):void 0!==a?-1:void 0!==b?1:0},dictionaryLength:function(a){var b=0,d;for(d in a)b++;
return b},dictionaryKeys:function(a){var b=[],d;for(d in a)b.push(d);return b},dictionaryValues:function(a){var b=[],d;for(d in a)b.push(a[d]);return b},iterItems:function(a,b,d){d=d||this;for(var c in a)b.call(d,c,a[c])},iterObjectFieldsRecursively:e,findFirstIndexInArray:b,findFirstInArray:function(a,f,d){f=b(a,f,f);return-1===f?void 0:a[f]}}});
(function(){var e;"undefined"==typeof exports?"function"==typeof define&&"object"==typeof define.amd&&define.amd?(e={},define(function(){return e})):e=window:e=exports;(function(c){if(!b)var b=1E-6;if(!a)var a="undefined"!=typeof Float32Array?Float32Array:Array;var f={setMatrixArrayType:function(d){a=d}};"undefined"!=typeof c&&(c.glMatrix=f);var d={create:function(){var d=new a(2);return d[0]=0,d[1]=0,d},clone:function(d){var b=new a(2);return b[0]=d[0],b[1]=d[1],b},fromValues:function(d,b){var f=
new a(2);return f[0]=d,f[1]=b,f},copy:function(a,d){return a[0]=d[0],a[1]=d[1],a},set:function(a,d,b){return a[0]=d,a[1]=b,a},add:function(a,d,b){return a[0]=d[0]+b[0],a[1]=d[1]+b[1],a},subtract:function(a,d,b){return a[0]=d[0]-b[0],a[1]=d[1]-b[1],a}};d.sub=d.subtract;d.multiply=function(a,d,b){return a[0]=d[0]*b[0],a[1]=d[1]*b[1],a};d.mul=d.multiply;d.divide=function(a,d,b){return a[0]=d[0]/b[0],a[1]=d[1]/b[1],a};d.div=d.divide;d.min=function(a,d,b){return a[0]=Math.min(d[0],b[0]),a[1]=Math.min(d[1],
b[1]),a};d.max=function(a,d,b){return a[0]=Math.max(d[0],b[0]),a[1]=Math.max(d[1],b[1]),a};d.scale=function(a,d,b){return a[0]=d[0]*b,a[1]=d[1]*b,a};d.distance=function(a,d){var b=d[0]-a[0],f=d[1]-a[1];return Math.sqrt(b*b+f*f)};d.dist=d.distance;d.squaredDistance=function(a,d){var b=d[0]-a[0],f=d[1]-a[1];return b*b+f*f};d.sqrDist=d.squaredDistance;d.length=function(a){var d=a[0];a=a[1];return Math.sqrt(d*d+a*a)};d.len=d.length;d.squaredLength=function(a){var d=a[0];a=a[1];return d*d+a*a};d.sqrLen=
d.squaredLength;d.negate=function(a,d){return a[0]=-d[0],a[1]=-d[1],a};d.normalize=function(a,d){var b=d[0],f=d[1],b=b*b+f*f;return 0<b&&(b=1/Math.sqrt(b),a[0]=d[0]*b,a[1]=d[1]*b),a};d.dot=function(a,d){return a[0]*d[0]+a[1]*d[1]};d.cross=function(a,d,b){d=d[0]*b[1]-d[1]*b[0];return a[0]=a[1]=0,a[2]=d,a};d.lerp=function(a,d,b,f){var c=d[0];d=d[1];return a[0]=c+f*(b[0]-c),a[1]=d+f*(b[1]-d),a};d.transformMat2=function(a,d,b){var f=d[0];d=d[1];return a[0]=b[0]*f+b[2]*d,a[1]=b[1]*f+b[3]*d,a};d.transformMat2d=
function(a,d,b){var f=d[0];d=d[1];return a[0]=b[0]*f+b[2]*d+b[4],a[1]=b[1]*f+b[3]*d+b[5],a};d.transformMat3=function(a,d,b){var f=d[0];d=d[1];return a[0]=b[0]*f+b[3]*d+b[6],a[1]=b[1]*f+b[4]*d+b[7],a};d.transformMat4=function(a,d,b){var f=d[0];d=d[1];return a[0]=b[0]*f+b[4]*d+b[12],a[1]=b[1]*f+b[5]*d+b[13],a};d.forEach=function(){var a=d.create();return function(d,b,f,c,h,e){var g;b||(b=2);f||(f=0);for(c?g=Math.min(c*b+f,d.length):g=d.length;f<g;f+=b)a[0]=d[f],a[1]=d[f+1],h(a,a,e),d[f]=a[0],d[f+1]=
a[1];return d}}();d.str=function(a){return"vec2("+a[0]+", "+a[1]+")"};"undefined"!=typeof c&&(c.vec2=d);var h={create:function(){var d=new a(3);return d[0]=0,d[1]=0,d[2]=0,d},clone:function(d){var b=new a(3);return b[0]=d[0],b[1]=d[1],b[2]=d[2],b},fromValues:function(d,b,f){var c=new a(3);return c[0]=d,c[1]=b,c[2]=f,c},copy:function(a,d){return a[0]=d[0],a[1]=d[1],a[2]=d[2],a},set:function(a,d,b,f){return a[0]=d,a[1]=b,a[2]=f,a},add:function(a,d,b){return a[0]=d[0]+b[0],a[1]=d[1]+b[1],a[2]=d[2]+b[2],
a},subtract:function(a,d,b){return a[0]=d[0]-b[0],a[1]=d[1]-b[1],a[2]=d[2]-b[2],a}};h.sub=h.subtract;h.multiply=function(a,d,b){return a[0]=d[0]*b[0],a[1]=d[1]*b[1],a[2]=d[2]*b[2],a};h.mul=h.multiply;h.divide=function(a,d,b){return a[0]=d[0]/b[0],a[1]=d[1]/b[1],a[2]=d[2]/b[2],a};h.div=h.divide;h.min=function(a,d,b){return a[0]=Math.min(d[0],b[0]),a[1]=Math.min(d[1],b[1]),a[2]=Math.min(d[2],b[2]),a};h.max=function(a,d,b){return a[0]=Math.max(d[0],b[0]),a[1]=Math.max(d[1],b[1]),a[2]=Math.max(d[2],b[2]),
a};h.scale=function(a,d,b){return a[0]=d[0]*b,a[1]=d[1]*b,a[2]=d[2]*b,a};h.distance=function(a,d){var b=d[0]-a[0],f=d[1]-a[1],c=d[2]-a[2];return Math.sqrt(b*b+f*f+c*c)};h.dist=h.distance;h.squaredDistance=function(a,d){var b=d[0]-a[0],f=d[1]-a[1],c=d[2]-a[2];return b*b+f*f+c*c};h.sqrDist=h.squaredDistance;h.length=function(a){var d=a[0],b=a[1];a=a[2];return Math.sqrt(d*d+b*b+a*a)};h.len=h.length;h.squaredLength=function(a){var d=a[0],b=a[1];a=a[2];return d*d+b*b+a*a};h.sqrLen=h.squaredLength;h.negate=
function(a,d){return a[0]=-d[0],a[1]=-d[1],a[2]=-d[2],a};h.normalize=function(a,d){var b=d[0],f=d[1],c=d[2],b=b*b+f*f+c*c;return 0<b&&(b=1/Math.sqrt(b),a[0]=d[0]*b,a[1]=d[1]*b,a[2]=d[2]*b),a};h.dot=function(a,d){return a[0]*d[0]+a[1]*d[1]+a[2]*d[2]};h.cross=function(a,d,b){var f=d[0],c=d[1];d=d[2];var h=b[0],e=b[1];b=b[2];return a[0]=c*b-d*e,a[1]=d*h-f*b,a[2]=f*e-c*h,a};h.lerp=function(a,d,b,f){var c=d[0],h=d[1];d=d[2];return a[0]=c+f*(b[0]-c),a[1]=h+f*(b[1]-h),a[2]=d+f*(b[2]-d),a};h.transformMat4=
function(a,d,b){var f=d[0],c=d[1];d=d[2];return a[0]=b[0]*f+b[4]*c+b[8]*d+b[12],a[1]=b[1]*f+b[5]*c+b[9]*d+b[13],a[2]=b[2]*f+b[6]*c+b[10]*d+b[14],a};h.transformQuat=function(a,d,b){var f=d[0],c=d[1],h=d[2];d=b[0];var e=b[1],g=b[2];b=b[3];var k=b*f+e*h-g*c,v=b*c+g*f-d*h,y=b*h+d*c-e*f,f=-d*f-e*c-g*h;return a[0]=k*b+f*-d+v*-g-y*-e,a[1]=v*b+f*-e+y*-d-k*-g,a[2]=y*b+f*-g+k*-e-v*-d,a};h.forEach=function(){var a=h.create();return function(d,b,f,c,h,e){var g;b||(b=3);f||(f=0);for(c?g=Math.min(c*b+f,d.length):
g=d.length;f<g;f+=b)a[0]=d[f],a[1]=d[f+1],a[2]=d[f+2],h(a,a,e),d[f]=a[0],d[f+1]=a[1],d[f+2]=a[2];return d}}();h.str=function(a){return"vec3("+a[0]+", "+a[1]+", "+a[2]+")"};"undefined"!=typeof c&&(c.vec3=h);var e={create:function(){var d=new a(4);return d[0]=0,d[1]=0,d[2]=0,d[3]=0,d},clone:function(d){var b=new a(4);return b[0]=d[0],b[1]=d[1],b[2]=d[2],b[3]=d[3],b},fromValues:function(d,b,f,c){var h=new a(4);return h[0]=d,h[1]=b,h[2]=f,h[3]=c,h},copy:function(a,d){return a[0]=d[0],a[1]=d[1],a[2]=d[2],
a[3]=d[3],a},set:function(a,d,b,f,c){return a[0]=d,a[1]=b,a[2]=f,a[3]=c,a},add:function(a,d,b){return a[0]=d[0]+b[0],a[1]=d[1]+b[1],a[2]=d[2]+b[2],a[3]=d[3]+b[3],a},subtract:function(a,d,b){return a[0]=d[0]-b[0],a[1]=d[1]-b[1],a[2]=d[2]-b[2],a[3]=d[3]-b[3],a}};e.sub=e.subtract;e.multiply=function(a,d,b){return a[0]=d[0]*b[0],a[1]=d[1]*b[1],a[2]=d[2]*b[2],a[3]=d[3]*b[3],a};e.mul=e.multiply;e.divide=function(a,d,b){return a[0]=d[0]/b[0],a[1]=d[1]/b[1],a[2]=d[2]/b[2],a[3]=d[3]/b[3],a};e.div=e.divide;
e.min=function(a,d,b){return a[0]=Math.min(d[0],b[0]),a[1]=Math.min(d[1],b[1]),a[2]=Math.min(d[2],b[2]),a[3]=Math.min(d[3],b[3]),a};e.max=function(a,d,b){return a[0]=Math.max(d[0],b[0]),a[1]=Math.max(d[1],b[1]),a[2]=Math.max(d[2],b[2]),a[3]=Math.max(d[3],b[3]),a};e.scale=function(a,d,b){return a[0]=d[0]*b,a[1]=d[1]*b,a[2]=d[2]*b,a[3]=d[3]*b,a};e.distance=function(a,d){var b=d[0]-a[0],f=d[1]-a[1],c=d[2]-a[2],h=d[3]-a[3];return Math.sqrt(b*b+f*f+c*c+h*h)};e.dist=e.distance;e.squaredDistance=function(a,
d){var b=d[0]-a[0],f=d[1]-a[1],c=d[2]-a[2],h=d[3]-a[3];return b*b+f*f+c*c+h*h};e.sqrDist=e.squaredDistance;e.length=function(a){var d=a[0],b=a[1],f=a[2];a=a[3];return Math.sqrt(d*d+b*b+f*f+a*a)};e.len=e.length;e.squaredLength=function(a){var d=a[0],b=a[1],f=a[2];a=a[3];return d*d+b*b+f*f+a*a};e.sqrLen=e.squaredLength;e.negate=function(a,d){return a[0]=-d[0],a[1]=-d[1],a[2]=-d[2],a[3]=-d[3],a};e.normalize=function(a,d){var b=d[0],f=d[1],c=d[2],h=d[3],b=b*b+f*f+c*c+h*h;return 0<b&&(b=1/Math.sqrt(b),
a[0]=d[0]*b,a[1]=d[1]*b,a[2]=d[2]*b,a[3]=d[3]*b),a};e.dot=function(a,d){return a[0]*d[0]+a[1]*d[1]+a[2]*d[2]+a[3]*d[3]};e.lerp=function(a,d,b,f){var c=d[0],h=d[1],e=d[2];d=d[3];return a[0]=c+f*(b[0]-c),a[1]=h+f*(b[1]-h),a[2]=e+f*(b[2]-e),a[3]=d+f*(b[3]-d),a};e.transformMat4=function(a,d,b){var f=d[0],c=d[1],h=d[2];d=d[3];return a[0]=b[0]*f+b[4]*c+b[8]*h+b[12]*d,a[1]=b[1]*f+b[5]*c+b[9]*h+b[13]*d,a[2]=b[2]*f+b[6]*c+b[10]*h+b[14]*d,a[3]=b[3]*f+b[7]*c+b[11]*h+b[15]*d,a};e.transformQuat=function(a,d,b){var f=
d[0],c=d[1],h=d[2];d=b[0];var e=b[1],g=b[2];b=b[3];var k=b*f+e*h-g*c,v=b*c+g*f-d*h,y=b*h+d*c-e*f,f=-d*f-e*c-g*h;return a[0]=k*b+f*-d+v*-g-y*-e,a[1]=v*b+f*-e+y*-d-k*-g,a[2]=y*b+f*-g+k*-e-v*-d,a};e.forEach=function(){var a=e.create();return function(d,b,f,c,h,e){var g;b||(b=4);f||(f=0);for(c?g=Math.min(c*b+f,d.length):g=d.length;f<g;f+=b)a[0]=d[f],a[1]=d[f+1],a[2]=d[f+2],a[3]=d[f+3],h(a,a,e),d[f]=a[0],d[f+1]=a[1],d[f+2]=a[2],d[f+3]=a[3];return d}}();e.str=function(a){return"vec4("+a[0]+", "+a[1]+", "+
a[2]+", "+a[3]+")"};"undefined"!=typeof c&&(c.vec4=e);f={create:function(){var d=new a(4);return d[0]=1,d[1]=0,d[2]=0,d[3]=1,d},clone:function(d){var b=new a(4);return b[0]=d[0],b[1]=d[1],b[2]=d[2],b[3]=d[3],b},copy:function(a,d){return a[0]=d[0],a[1]=d[1],a[2]=d[2],a[3]=d[3],a},identity:function(a){return a[0]=1,a[1]=0,a[2]=0,a[3]=1,a},transpose:function(a,d){if(a===d){var b=d[1];a[1]=d[2];a[2]=b}else a[0]=d[0],a[1]=d[2],a[2]=d[1],a[3]=d[3];return a},invert:function(a,d){var b=d[0],f=d[1],c=d[2],
h=d[3],e=b*h-c*f;return e?(e=1/e,a[0]=h*e,a[1]=-f*e,a[2]=-c*e,a[3]=b*e,a):null},adjoint:function(a,d){var b=d[0];return a[0]=d[3],a[1]=-d[1],a[2]=-d[2],a[3]=b,a},determinant:function(a){return a[0]*a[3]-a[2]*a[1]},multiply:function(a,d,b){var f=d[0],c=d[1],h=d[2];d=d[3];var e=b[0],g=b[1],k=b[2];b=b[3];return a[0]=f*e+c*k,a[1]=f*g+c*b,a[2]=h*e+d*k,a[3]=h*g+d*b,a}};f.mul=f.multiply;f.rotate=function(a,d,b){var f=d[0],c=d[1],h=d[2];d=d[3];var e=Math.sin(b);b=Math.cos(b);return a[0]=f*b+c*e,a[1]=f*-e+
c*b,a[2]=h*b+d*e,a[3]=h*-e+d*b,a};f.scale=function(a,d,b){var f=d[1],c=d[2],h=d[3],e=b[0];b=b[1];return a[0]=d[0]*e,a[1]=f*b,a[2]=c*e,a[3]=h*b,a};f.str=function(a){return"mat2("+a[0]+", "+a[1]+", "+a[2]+", "+a[3]+")"};"undefined"!=typeof c&&(c.mat2=f);f={create:function(){var d=new a(6);return d[0]=1,d[1]=0,d[2]=0,d[3]=1,d[4]=0,d[5]=0,d},clone:function(d){var b=new a(6);return b[0]=d[0],b[1]=d[1],b[2]=d[2],b[3]=d[3],b[4]=d[4],b[5]=d[5],b},copy:function(a,d){return a[0]=d[0],a[1]=d[1],a[2]=d[2],a[3]=
d[3],a[4]=d[4],a[5]=d[5],a},identity:function(a){return a[0]=1,a[1]=0,a[2]=0,a[3]=1,a[4]=0,a[5]=0,a},invert:function(a,d){var b=d[0],f=d[1],c=d[2],h=d[3],e=d[4],g=d[5],k=b*h-f*c;return k?(k=1/k,a[0]=h*k,a[1]=-f*k,a[2]=-c*k,a[3]=b*k,a[4]=(c*g-h*e)*k,a[5]=(f*e-b*g)*k,a):null},determinant:function(a){return a[0]*a[3]-a[1]*a[2]},multiply:function(a,d,b){var f=d[0],c=d[1],h=d[2],e=d[3],g=d[4];d=d[5];var k=b[0],v=b[1],y=b[2],B=b[3],H=b[4];b=b[5];return a[0]=f*k+c*y,a[1]=f*v+c*B,a[2]=h*k+e*y,a[3]=h*v+e*
B,a[4]=k*g+y*d+H,a[5]=v*g+B*d+b,a}};f.mul=f.multiply;f.rotate=function(a,d,b){var f=d[0],c=d[1],h=d[2],e=d[3],g=d[4];d=d[5];var k=Math.sin(b);b=Math.cos(b);return a[0]=f*b+c*k,a[1]=-f*k+c*b,a[2]=h*b+e*k,a[3]=-h*k+b*e,a[4]=b*g+k*d,a[5]=b*d-k*g,a};f.scale=function(a,d,b){var f=b[0];b=b[1];return a[0]=d[0]*f,a[1]=d[1]*b,a[2]=d[2]*f,a[3]=d[3]*b,a[4]=d[4]*f,a[5]=d[5]*b,a};f.translate=function(a,d,b){return a[0]=d[0],a[1]=d[1],a[2]=d[2],a[3]=d[3],a[4]=d[4]+b[0],a[5]=d[5]+b[1],a};f.str=function(a){return"mat2d("+
a[0]+", "+a[1]+", "+a[2]+", "+a[3]+", "+a[4]+", "+a[5]+")"};"undefined"!=typeof c&&(c.mat2d=f);f={create:function(){var d=new a(9);return d[0]=1,d[1]=0,d[2]=0,d[3]=0,d[4]=1,d[5]=0,d[6]=0,d[7]=0,d[8]=1,d},fromMat4:function(a,d){return a[0]=d[0],a[1]=d[1],a[2]=d[2],a[3]=d[4],a[4]=d[5],a[5]=d[6],a[6]=d[8],a[7]=d[9],a[8]=d[10],a},clone:function(d){var b=new a(9);return b[0]=d[0],b[1]=d[1],b[2]=d[2],b[3]=d[3],b[4]=d[4],b[5]=d[5],b[6]=d[6],b[7]=d[7],b[8]=d[8],b},copy:function(a,d){return a[0]=d[0],a[1]=
d[1],a[2]=d[2],a[3]=d[3],a[4]=d[4],a[5]=d[5],a[6]=d[6],a[7]=d[7],a[8]=d[8],a},identity:function(a){return a[0]=1,a[1]=0,a[2]=0,a[3]=0,a[4]=1,a[5]=0,a[6]=0,a[7]=0,a[8]=1,a},transpose:function(a,d){if(a===d){var b=d[1],f=d[2],c=d[5];a[1]=d[3];a[2]=d[6];a[3]=b;a[5]=d[7];a[6]=f;a[7]=c}else a[0]=d[0],a[1]=d[3],a[2]=d[6],a[3]=d[1],a[4]=d[4],a[5]=d[7],a[6]=d[2],a[7]=d[5],a[8]=d[8];return a},invert:function(a,d){var b=d[0],f=d[1],c=d[2],h=d[3],e=d[4],g=d[5],k=d[6],v=d[7],y=d[8],B=y*e-g*v,H=-y*h+g*k,z=v*h-
e*k,x=b*B+f*H+c*z;return x?(x=1/x,a[0]=B*x,a[1]=(-y*f+c*v)*x,a[2]=(g*f-c*e)*x,a[3]=H*x,a[4]=(y*b-c*k)*x,a[5]=(-g*b+c*h)*x,a[6]=z*x,a[7]=(-v*b+f*k)*x,a[8]=(e*b-f*h)*x,a):null},adjoint:function(a,d){var b=d[0],f=d[1],c=d[2],h=d[3],e=d[4],g=d[5],k=d[6],v=d[7],y=d[8];return a[0]=e*y-g*v,a[1]=c*v-f*y,a[2]=f*g-c*e,a[3]=g*k-h*y,a[4]=b*y-c*k,a[5]=c*h-b*g,a[6]=h*v-e*k,a[7]=f*k-b*v,a[8]=b*e-f*h,a},determinant:function(a){var d=a[3],b=a[4],f=a[5],c=a[6],h=a[7],e=a[8];return a[0]*(e*b-f*h)+a[1]*(-e*d+f*c)+a[2]*
(h*d-b*c)},multiply:function(a,d,b){var f=d[0],c=d[1],h=d[2],e=d[3],g=d[4],k=d[5],v=d[6],y=d[7];d=d[8];var B=b[0],H=b[1],z=b[2],x=b[3],G=b[4],E=b[5],K=b[6],Q=b[7];b=b[8];return a[0]=B*f+H*e+z*v,a[1]=B*c+H*g+z*y,a[2]=B*h+H*k+z*d,a[3]=x*f+G*e+E*v,a[4]=x*c+G*g+E*y,a[5]=x*h+G*k+E*d,a[6]=K*f+Q*e+b*v,a[7]=K*c+Q*g+b*y,a[8]=K*h+Q*k+b*d,a}};f.mul=f.multiply;f.translate=function(a,d,b){var f=d[0],c=d[1],h=d[2],e=d[3],g=d[4],k=d[5],v=d[6],y=d[7];d=d[8];var B=b[0];b=b[1];return a[0]=f,a[1]=c,a[2]=h,a[3]=e,a[4]=
g,a[5]=k,a[6]=B*f+b*e+v,a[7]=B*c+b*g+y,a[8]=B*h+b*k+d,a};f.rotate=function(a,d,b){var f=d[0],c=d[1],h=d[2],e=d[3],g=d[4],k=d[5],v=d[6],y=d[7];d=d[8];var B=Math.sin(b);b=Math.cos(b);return a[0]=b*f+B*e,a[1]=b*c+B*g,a[2]=b*h+B*k,a[3]=b*e-B*f,a[4]=b*g-B*c,a[5]=b*k-B*h,a[6]=v,a[7]=y,a[8]=d,a};f.scale=function(a,d,b){var f=b[0];b=b[2];return a[0]=f*d[0],a[1]=f*d[1],a[2]=f*d[2],a[3]=b*d[3],a[4]=b*d[4],a[5]=b*d[5],a[6]=d[6],a[7]=d[7],a[8]=d[8],a};f.fromMat2d=function(a,d){return a[0]=d[0],a[1]=d[1],a[2]=
0,a[3]=d[2],a[4]=d[3],a[5]=0,a[6]=d[4],a[7]=d[5],a[8]=1,a};f.fromQuat=function(a,d){var b=d[0],f=d[1],c=d[2],h=d[3],e=b+b,g=f+f,k=c+c,v=b*e,y=b*g,b=b*k,B=f*g,f=f*k,c=c*k,e=h*e,g=h*g,h=h*k;return a[0]=1-(B+c),a[1]=y+h,a[2]=b-g,a[3]=y-h,a[4]=1-(v+c),a[5]=f+e,a[6]=b+g,a[7]=f-e,a[8]=1-(v+B),a};f.str=function(a){return"mat3("+a[0]+", "+a[1]+", "+a[2]+", "+a[3]+", "+a[4]+", "+a[5]+", "+a[6]+", "+a[7]+", "+a[8]+")"};"undefined"!=typeof c&&(c.mat3=f);var k={create:function(){var d=new a(16);return d[0]=1,
d[1]=0,d[2]=0,d[3]=0,d[4]=0,d[5]=1,d[6]=0,d[7]=0,d[8]=0,d[9]=0,d[10]=1,d[11]=0,d[12]=0,d[13]=0,d[14]=0,d[15]=1,d},clone:function(d){var b=new a(16);return b[0]=d[0],b[1]=d[1],b[2]=d[2],b[3]=d[3],b[4]=d[4],b[5]=d[5],b[6]=d[6],b[7]=d[7],b[8]=d[8],b[9]=d[9],b[10]=d[10],b[11]=d[11],b[12]=d[12],b[13]=d[13],b[14]=d[14],b[15]=d[15],b},copy:function(a,d){return a[0]=d[0],a[1]=d[1],a[2]=d[2],a[3]=d[3],a[4]=d[4],a[5]=d[5],a[6]=d[6],a[7]=d[7],a[8]=d[8],a[9]=d[9],a[10]=d[10],a[11]=d[11],a[12]=d[12],a[13]=d[13],
a[14]=d[14],a[15]=d[15],a},identity:function(a){return a[0]=1,a[1]=0,a[2]=0,a[3]=0,a[4]=0,a[5]=1,a[6]=0,a[7]=0,a[8]=0,a[9]=0,a[10]=1,a[11]=0,a[12]=0,a[13]=0,a[14]=0,a[15]=1,a},transpose:function(a,d){if(a===d){var b=d[1],f=d[2],c=d[3],h=d[6],e=d[7],g=d[11];a[1]=d[4];a[2]=d[8];a[3]=d[12];a[4]=b;a[6]=d[9];a[7]=d[13];a[8]=f;a[9]=h;a[11]=d[14];a[12]=c;a[13]=e;a[14]=g}else a[0]=d[0],a[1]=d[4],a[2]=d[8],a[3]=d[12],a[4]=d[1],a[5]=d[5],a[6]=d[9],a[7]=d[13],a[8]=d[2],a[9]=d[6],a[10]=d[10],a[11]=d[14],a[12]=
d[3],a[13]=d[7],a[14]=d[11],a[15]=d[15];return a},invert:function(a,d){var b=d[0],f=d[1],c=d[2],h=d[3],e=d[4],g=d[5],k=d[6],v=d[7],y=d[8],B=d[9],H=d[10],z=d[11],x=d[12],G=d[13],E=d[14],K=d[15],Q=b*g-f*e,O=b*k-c*e,T=b*v-h*e,U=f*k-c*g,ja=f*v-h*g,u=c*v-h*k,t=y*G-B*x,oa=y*E-H*x,V=y*K-z*x,M=B*E-H*G,ea=B*K-z*G,S=H*K-z*E,I=Q*S-O*ea+T*M+U*V-ja*oa+u*t;return I?(I=1/I,a[0]=(g*S-k*ea+v*M)*I,a[1]=(c*ea-f*S-h*M)*I,a[2]=(G*u-E*ja+K*U)*I,a[3]=(H*ja-B*u-z*U)*I,a[4]=(k*V-e*S-v*oa)*I,a[5]=(b*S-c*V+h*oa)*I,a[6]=(E*
T-x*u-K*O)*I,a[7]=(y*u-H*T+z*O)*I,a[8]=(e*ea-g*V+v*t)*I,a[9]=(f*V-b*ea-h*t)*I,a[10]=(x*ja-G*T+K*Q)*I,a[11]=(B*T-y*ja-z*Q)*I,a[12]=(g*oa-e*M-k*t)*I,a[13]=(b*M-f*oa+c*t)*I,a[14]=(G*O-x*U-E*Q)*I,a[15]=(y*U-B*O+H*Q)*I,a):null},adjoint:function(a,d){var b=d[0],f=d[1],c=d[2],h=d[3],e=d[4],g=d[5],k=d[6],v=d[7],y=d[8],B=d[9],H=d[10],z=d[11],x=d[12],G=d[13],E=d[14],K=d[15];return a[0]=g*(H*K-z*E)-B*(k*K-v*E)+G*(k*z-v*H),a[1]=-(f*(H*K-z*E)-B*(c*K-h*E)+G*(c*z-h*H)),a[2]=f*(k*K-v*E)-g*(c*K-h*E)+G*(c*v-h*k),a[3]=
-(f*(k*z-v*H)-g*(c*z-h*H)+B*(c*v-h*k)),a[4]=-(e*(H*K-z*E)-y*(k*K-v*E)+x*(k*z-v*H)),a[5]=b*(H*K-z*E)-y*(c*K-h*E)+x*(c*z-h*H),a[6]=-(b*(k*K-v*E)-e*(c*K-h*E)+x*(c*v-h*k)),a[7]=b*(k*z-v*H)-e*(c*z-h*H)+y*(c*v-h*k),a[8]=e*(B*K-z*G)-y*(g*K-v*G)+x*(g*z-v*B),a[9]=-(b*(B*K-z*G)-y*(f*K-h*G)+x*(f*z-h*B)),a[10]=b*(g*K-v*G)-e*(f*K-h*G)+x*(f*v-h*g),a[11]=-(b*(g*z-v*B)-e*(f*z-h*B)+y*(f*v-h*g)),a[12]=-(e*(B*E-H*G)-y*(g*E-k*G)+x*(g*H-k*B)),a[13]=b*(B*E-H*G)-y*(f*E-c*G)+x*(f*H-c*B),a[14]=-(b*(g*E-k*G)-e*(f*E-c*G)+x*
(f*k-c*g)),a[15]=b*(g*H-k*B)-e*(f*H-c*B)+y*(f*k-c*g),a},determinant:function(a){var d=a[0],b=a[1],f=a[2],c=a[3],h=a[4],e=a[5],g=a[6],k=a[7],v=a[8],y=a[9],B=a[10],H=a[11],z=a[12],x=a[13],G=a[14];a=a[15];return(d*e-b*h)*(B*a-H*G)-(d*g-f*h)*(y*a-H*x)+(d*k-c*h)*(y*G-B*x)+(b*g-f*e)*(v*a-H*z)-(b*k-c*e)*(v*G-B*z)+(f*k-c*g)*(v*x-y*z)},multiply:function(a,d,b){var f=d[0],c=d[1],h=d[2],e=d[3],g=d[4],k=d[5],v=d[6],y=d[7],B=d[8],H=d[9],z=d[10],x=d[11],G=d[12],E=d[13],K=d[14];d=d[15];var Q=b[0],O=b[1],T=b[2],
U=b[3];return a[0]=Q*f+O*g+T*B+U*G,a[1]=Q*c+O*k+T*H+U*E,a[2]=Q*h+O*v+T*z+U*K,a[3]=Q*e+O*y+T*x+U*d,Q=b[4],O=b[5],T=b[6],U=b[7],a[4]=Q*f+O*g+T*B+U*G,a[5]=Q*c+O*k+T*H+U*E,a[6]=Q*h+O*v+T*z+U*K,a[7]=Q*e+O*y+T*x+U*d,Q=b[8],O=b[9],T=b[10],U=b[11],a[8]=Q*f+O*g+T*B+U*G,a[9]=Q*c+O*k+T*H+U*E,a[10]=Q*h+O*v+T*z+U*K,a[11]=Q*e+O*y+T*x+U*d,Q=b[12],O=b[13],T=b[14],U=b[15],a[12]=Q*f+O*g+T*B+U*G,a[13]=Q*c+O*k+T*H+U*E,a[14]=Q*h+O*v+T*z+U*K,a[15]=Q*e+O*y+T*x+U*d,a}};k.mul=k.multiply;k.translate=function(a,d,b){var f=
b[0],c=b[1];b=b[2];var h,e,g,k,v,y,B,H,z,x,G,E;return d===a?(a[12]=d[0]*f+d[4]*c+d[8]*b+d[12],a[13]=d[1]*f+d[5]*c+d[9]*b+d[13],a[14]=d[2]*f+d[6]*c+d[10]*b+d[14],a[15]=d[3]*f+d[7]*c+d[11]*b+d[15]):(h=d[0],e=d[1],g=d[2],k=d[3],v=d[4],y=d[5],B=d[6],H=d[7],z=d[8],x=d[9],G=d[10],E=d[11],a[0]=h,a[1]=e,a[2]=g,a[3]=k,a[4]=v,a[5]=y,a[6]=B,a[7]=H,a[8]=z,a[9]=x,a[10]=G,a[11]=E,a[12]=h*f+v*c+z*b+d[12],a[13]=e*f+y*c+x*b+d[13],a[14]=g*f+B*c+G*b+d[14],a[15]=k*f+H*c+E*b+d[15]),a};k.scale=function(a,d,b){var f=b[0],
c=b[1];b=b[2];return a[0]=d[0]*f,a[1]=d[1]*f,a[2]=d[2]*f,a[3]=d[3]*f,a[4]=d[4]*c,a[5]=d[5]*c,a[6]=d[6]*c,a[7]=d[7]*c,a[8]=d[8]*b,a[9]=d[9]*b,a[10]=d[10]*b,a[11]=d[11]*b,a[12]=d[12],a[13]=d[13],a[14]=d[14],a[15]=d[15],a};k.rotate=function(a,d,f,c){var h=c[0],e=c[1];c=c[2];var g=Math.sqrt(h*h+e*e+c*c),k,C,v,y,B,H,z,x,G,E,K,Q,O,T,U,ja,u,t,oa,V,M,ea,S,I;return Math.abs(g)<b?null:(g=1/g,h*=g,e*=g,c*=g,k=Math.sin(f),C=Math.cos(f),v=1-C,y=d[0],B=d[1],H=d[2],z=d[3],x=d[4],G=d[5],E=d[6],K=d[7],Q=d[8],O=d[9],
T=d[10],U=d[11],ja=h*h*v+C,u=e*h*v+c*k,t=c*h*v-e*k,oa=h*e*v-c*k,V=e*e*v+C,M=c*e*v+h*k,ea=h*c*v+e*k,S=e*c*v-h*k,I=c*c*v+C,a[0]=y*ja+x*u+Q*t,a[1]=B*ja+G*u+O*t,a[2]=H*ja+E*u+T*t,a[3]=z*ja+K*u+U*t,a[4]=y*oa+x*V+Q*M,a[5]=B*oa+G*V+O*M,a[6]=H*oa+E*V+T*M,a[7]=z*oa+K*V+U*M,a[8]=y*ea+x*S+Q*I,a[9]=B*ea+G*S+O*I,a[10]=H*ea+E*S+T*I,a[11]=z*ea+K*S+U*I,d!==a&&(a[12]=d[12],a[13]=d[13],a[14]=d[14],a[15]=d[15]),a)};k.rotateX=function(a,d,b){var f=Math.sin(b);b=Math.cos(b);var c=d[4],h=d[5],e=d[6],g=d[7],k=d[8],v=d[9],
y=d[10],B=d[11];return d!==a&&(a[0]=d[0],a[1]=d[1],a[2]=d[2],a[3]=d[3],a[12]=d[12],a[13]=d[13],a[14]=d[14],a[15]=d[15]),a[4]=c*b+k*f,a[5]=h*b+v*f,a[6]=e*b+y*f,a[7]=g*b+B*f,a[8]=k*b-c*f,a[9]=v*b-h*f,a[10]=y*b-e*f,a[11]=B*b-g*f,a};k.rotateY=function(a,d,b){var f=Math.sin(b);b=Math.cos(b);var c=d[0],h=d[1],e=d[2],g=d[3],k=d[8],v=d[9],y=d[10],B=d[11];return d!==a&&(a[4]=d[4],a[5]=d[5],a[6]=d[6],a[7]=d[7],a[12]=d[12],a[13]=d[13],a[14]=d[14],a[15]=d[15]),a[0]=c*b-k*f,a[1]=h*b-v*f,a[2]=e*b-y*f,a[3]=g*b-
B*f,a[8]=c*f+k*b,a[9]=h*f+v*b,a[10]=e*f+y*b,a[11]=g*f+B*b,a};k.rotateZ=function(a,d,b){var f=Math.sin(b);b=Math.cos(b);var c=d[0],h=d[1],e=d[2],g=d[3],k=d[4],v=d[5],y=d[6],B=d[7];return d!==a&&(a[8]=d[8],a[9]=d[9],a[10]=d[10],a[11]=d[11],a[12]=d[12],a[13]=d[13],a[14]=d[14],a[15]=d[15]),a[0]=c*b+k*f,a[1]=h*b+v*f,a[2]=e*b+y*f,a[3]=g*b+B*f,a[4]=k*b-c*f,a[5]=v*b-h*f,a[6]=y*b-e*f,a[7]=B*b-g*f,a};k.fromRotationTranslation=function(a,d,b){var f=d[0],c=d[1],h=d[2],e=d[3],g=f+f,k=c+c,v=h+h;d=f*g;var y=f*k,
f=f*v,B=c*k,c=c*v,h=h*v,g=e*g,k=e*k,e=e*v;return a[0]=1-(B+h),a[1]=y+e,a[2]=f-k,a[3]=0,a[4]=y-e,a[5]=1-(d+h),a[6]=c+g,a[7]=0,a[8]=f+k,a[9]=c-g,a[10]=1-(d+B),a[11]=0,a[12]=b[0],a[13]=b[1],a[14]=b[2],a[15]=1,a};k.fromQuat=function(a,d){var b=d[0],f=d[1],c=d[2],h=d[3],e=b+b,g=f+f,k=c+c,v=b*e,y=b*g,b=b*k,B=f*g,f=f*k,c=c*k,e=h*e,g=h*g,h=h*k;return a[0]=1-(B+c),a[1]=y+h,a[2]=b-g,a[3]=0,a[4]=y-h,a[5]=1-(v+c),a[6]=f+e,a[7]=0,a[8]=b+g,a[9]=f-e,a[10]=1-(v+B),a[11]=0,a[12]=0,a[13]=0,a[14]=0,a[15]=1,a};k.frustum=
function(a,d,b,f,c,h,e){var g=1/(b-d),k=1/(c-f),v=1/(h-e);return a[0]=2*h*g,a[1]=0,a[2]=0,a[3]=0,a[4]=0,a[5]=2*h*k,a[6]=0,a[7]=0,a[8]=(b+d)*g,a[9]=(c+f)*k,a[10]=(e+h)*v,a[11]=-1,a[12]=0,a[13]=0,a[14]=2*(e*h)*v,a[15]=0,a};k.perspective=function(a,d,b,f,c){d=1/Math.tan(d/2);var h=1/(f-c);return a[0]=d/b,a[1]=0,a[2]=0,a[3]=0,a[4]=0,a[5]=d,a[6]=0,a[7]=0,a[8]=0,a[9]=0,a[10]=(c+f)*h,a[11]=-1,a[12]=0,a[13]=0,a[14]=2*c*f*h,a[15]=0,a};k.ortho=function(a,d,b,f,c,h,e){var g=1/(d-b),k=1/(f-c),v=1/(h-e);return a[0]=
-2*g,a[1]=0,a[2]=0,a[3]=0,a[4]=0,a[5]=-2*k,a[6]=0,a[7]=0,a[8]=0,a[9]=0,a[10]=2*v,a[11]=0,a[12]=(d+b)*g,a[13]=(c+f)*k,a[14]=(e+h)*v,a[15]=1,a};k.lookAt=function(a,d,f,c){var h,e,g,F,C,v,y,B,H,z,x=d[0],G=d[1];d=d[2];var E=c[0],K=c[1];c=c[2];var Q=f[0],O=f[1];f=f[2];return Math.abs(x-Q)<b&&Math.abs(G-O)<b&&Math.abs(d-f)<b?k.identity(a):(y=x-Q,B=G-O,H=d-f,z=1/Math.sqrt(y*y+B*B+H*H),y*=z,B*=z,H*=z,h=K*H-c*B,e=c*y-E*H,g=E*B-K*y,z=Math.sqrt(h*h+e*e+g*g),z?(z=1/z,h*=z,e*=z,g*=z):(h=0,e=0,g=0),F=B*g-H*e,C=
H*h-y*g,v=y*e-B*h,z=Math.sqrt(F*F+C*C+v*v),z?(z=1/z,F*=z,C*=z,v*=z):(F=0,C=0,v=0),a[0]=h,a[1]=F,a[2]=y,a[3]=0,a[4]=e,a[5]=C,a[6]=B,a[7]=0,a[8]=g,a[9]=v,a[10]=H,a[11]=0,a[12]=-(h*x+e*G+g*d),a[13]=-(F*x+C*G+v*d),a[14]=-(y*x+B*G+H*d),a[15]=1,a)};k.str=function(a){return"mat4("+a[0]+", "+a[1]+", "+a[2]+", "+a[3]+", "+a[4]+", "+a[5]+", "+a[6]+", "+a[7]+", "+a[8]+", "+a[9]+", "+a[10]+", "+a[11]+", "+a[12]+", "+a[13]+", "+a[14]+", "+a[15]+")"};"undefined"!=typeof c&&(c.mat4=k);f={create:function(){var d=
new a(4);return d[0]=0,d[1]=0,d[2]=0,d[3]=1,d}};f.clone=e.clone;f.fromValues=e.fromValues;f.copy=e.copy;f.set=e.set;f.identity=function(a){return a[0]=0,a[1]=0,a[2]=0,a[3]=1,a};f.setAxisAngle=function(a,d,b){b*=0.5;var f=Math.sin(b);return a[0]=f*d[0],a[1]=f*d[1],a[2]=f*d[2],a[3]=Math.cos(b),a};f.add=e.add;f.multiply=function(a,d,b){var f=d[0],c=d[1],h=d[2];d=d[3];var e=b[0],g=b[1],k=b[2];b=b[3];return a[0]=f*b+d*e+c*k-h*g,a[1]=c*b+d*g+h*e-f*k,a[2]=h*b+d*k+f*g-c*e,a[3]=d*b-f*e-c*g-h*k,a};f.mul=f.multiply;
f.scale=e.scale;f.rotateX=function(a,d,b){b*=0.5;var f=d[0],c=d[1],h=d[2];d=d[3];var e=Math.sin(b);b=Math.cos(b);return a[0]=f*b+d*e,a[1]=c*b+h*e,a[2]=h*b-c*e,a[3]=d*b-f*e,a};f.rotateY=function(a,d,b){b*=0.5;var f=d[0],c=d[1],h=d[2];d=d[3];var e=Math.sin(b);b=Math.cos(b);return a[0]=f*b-h*e,a[1]=c*b+d*e,a[2]=h*b+f*e,a[3]=d*b-c*e,a};f.rotateZ=function(a,d,b){b*=0.5;var f=d[0],c=d[1],h=d[2];d=d[3];var e=Math.sin(b);b=Math.cos(b);return a[0]=f*b+c*e,a[1]=c*b-f*e,a[2]=h*b+d*e,a[3]=d*b-h*e,a};f.calculateW=
function(a,d){var b=d[0],f=d[1],c=d[2];return a[0]=b,a[1]=f,a[2]=c,a[3]=-Math.sqrt(Math.abs(1-b*b-f*f-c*c)),a};f.dot=e.dot;f.lerp=e.lerp;f.slerp=function(a,d,b,f){var c=d[0],h=d[1],e=d[2],g=d[3],k=b[0],v=b[1],y=b[2];b=b[3];var B=c*k+h*v+e*y+g*b,H,z,x,G;return 1<=Math.abs(B)?(a!==d&&(a[0]=c,a[1]=h,a[2]=e,a[3]=g),a):(H=Math.acos(B),z=Math.sqrt(1-B*B),0.001>Math.abs(z)?(a[0]=0.5*c+0.5*k,a[1]=0.5*h+0.5*v,a[2]=0.5*e+0.5*y,a[3]=0.5*g+0.5*b,a):(x=Math.sin((1-f)*H)/z,G=Math.sin(f*H)/z,a[0]=c*x+k*G,a[1]=h*
x+v*G,a[2]=e*x+y*G,a[3]=g*x+b*G,a))};f.invert=function(a,d){var b=d[0],f=d[1],c=d[2],h=d[3],e=b*b+f*f+c*c+h*h,e=e?1/e:0;return a[0]=-b*e,a[1]=-f*e,a[2]=-c*e,a[3]=h*e,a};f.conjugate=function(a,d){return a[0]=-d[0],a[1]=-d[1],a[2]=-d[2],a[3]=d[3],a};f.length=e.length;f.len=f.length;f.squaredLength=e.squaredLength;f.sqrLen=f.squaredLength;f.normalize=e.normalize;f.fromMat3=function(){var a=[1,2,0];return function(d,b){var f=b[0]+b[4]+b[8];if(0<f)f=Math.sqrt(f+1),d[3]=0.5*f,f=0.5/f,d[0]=(b[7]-b[5])*f,
d[1]=(b[2]-b[6])*f,d[2]=(b[3]-b[1])*f;else{var c=0;b[4]>b[0]&&(c=1);b[8]>b[3*c+c]&&(c=2);var h=a[c],e=a[h],f=Math.sqrt(b[3*c+c]-b[3*h+h]-b[3*e+e]+1);d[c]=0.5*f;f=0.5/f;d[3]=(b[3*e+h]-b[3*h+e])*f;d[h]=(b[3*h+c]+b[3*c+h])*f;d[e]=(b[3*e+c]+b[3*c+e])*f}return d}}();f.str=function(a){return"quat("+a[0]+", "+a[1]+", "+a[2]+", "+a[3]+")"};"undefined"!=typeof c&&(c.quat=f)})(e)})();"use strict";
tv.exportTo("tv.b",function(){var e=vec2.create(),c=vec2.create(),b=vec4.create();mat2d.create();vec2.createFromArray=function(a){if(2!=a.length)throw Error("Should be length 2");var b=vec2.create();vec2.set(b,a[0],a[1]);return b};vec2.createXY=function(a,b){var d=vec2.create();vec2.set(d,a,b);return d};vec2.toString=function(a){return"["+a[0]+", "+a[1]+"]"};vec2.addTwoScaledUnitVectors=function(a,b,d,h,g){vec2.scale(e,b,d);vec2.scale(c,h,g);vec2.add(a,e,c)};vec3.createXYZ=function(a,b,d){var c=vec3.create();
vec3.set(c,a,b,d);return c};vec3.toString=function(a){return"vec3("+a[0]+", "+a[1]+", "+a[2]+")"};mat2d.translateXY=function(a,b,d){vec2.set(e,b,d);mat2d.translate(a,a,e)};mat2d.scaleXY=function(a,b,d){vec2.set(e,b,d);mat2d.scale(a,a,e)};vec4.unitize=function(a,b){a[0]=b[0]/b[3];a[1]=b[1]/b[3];a[2]=b[2]/b[3];a[3]=1;return a};vec2.copyFromVec4=function(a,f){vec4.unitize(b,f);vec2.copy(a,b)};return{}});"use strict";
tv.exportTo("tv.b",function(){function e(){this.height=this.width=this.y=this.x=0}e.fromXYWH=function(c,b,a,f){var d=new e;d.x=c;d.y=b;d.width=a;d.height=f;return d};e.fromArray=function(c){if(4!=c.length)throw Error("ary.length must be 4");var b=new e;b.x=c[0];b.y=c[1];b.width=c[2];b.height=c[3];return b};e.prototype={__proto__:Object.prototype,get left(){return this.x},get top(){return this.y},get right(){return this.x+this.width},get bottom(){return this.y+this.height},toString:function(){return"Rect("+
this.x+", "+this.y+", "+this.width+", "+this.height+")"},toArray:function(){return[this.x,this.y,this.width,this.height]},clone:function(){var c=new e;c.x=this.x;c.y=this.y;c.width=this.width;c.height=this.height;return c},enlarge:function(c){var b=new e;this.enlargeFast(b,c);return b},enlargeFast:function(c,b){c.x=this.x-b;c.y=this.y-b;c.width=this.width+2*b;c.height=this.height+2*b;return c},size:function(){return{width:this.width,height:this.height}},scale:function(c){var b=new e;this.scaleFast(b,
c);return b},scaleSize:function(c){return e.fromXYWH(this.x,this.y,this.width*c,this.height*c)},scaleFast:function(c,b){c.x=this.x*b;c.y=this.y*b;c.width=this.width*b;c.height=this.height*b;return c},translate:function(c){var b=new e;this.translateFast(b,c);return b},translateFast:function(c,b){c.x=this.x+b[0];c.y=this.x+b[1];c.width=this.width;c.height=this.height;return c},asUVRectInside:function(c){var b=new e;b.x=(this.x-c.x)/c.width;b.y=(this.y-c.y)/c.height;b.width=this.width/c.width;b.height=
this.height/c.height;return b},intersects:function(c){var b;b=1&this.x<c.right;b&=this.right>c.x;b&=this.y<c.bottom;return b&=this.bottom>c.y},equalTo:function(c){return c&&this.x===c.x&&this.y===c.y&&this.width===c.width&&this.height===c.height}};return{Rect:e}});"use strict";
tv.exportTo("tv.b",function(){return{addSingletonGetter:function(e){e.getInstance=function(){return e.instance_||(e.instance_=new e)}},tracedFunction:function(e,c,b){return function(){console.time(c);try{e.apply(b,arguments)}finally{console.timeEnd(c)}}},normalizeException:function(e){return"string"==typeof e?{message:e,stack:["<unknown>"]}:{message:e.message,stack:e.stack?e.stack:["<unknown>"]}},instantiateTemplate:function(e,c){c=c||document;var b=c.querySelector(e);if(!b)throw Error("Element not found");
return b.createInstance()},stackTrace:function(){var e=Error().stack+"",e=e.split("\n");return e.slice(2)},windowRectForElement:function(e){var c=[e.offsetLeft,e.offsetTop],b=[e.offsetWidth,e.offsetHeight];for(e=e.offsetParent;e;)c[0]+=e.offsetLeft,c[1]+=e.offsetTop,e=e.offsetParent;return tv.b.Rect.fromXYWH(c[0],c[1],b[0],b[1])},scrollIntoViewIfNeeded:function(e){var c=e.parentElement.getBoundingClientRect(),b=e.getBoundingClientRect();b.top<c.top?e.scrollIntoView(!0):b.bottom>c.bottom&&e.scrollIntoView(!1)},
clamp:function(e,c,b){return Math.min(Math.max(e,c),b)},lerp:function(e,c,b){return c+e*(b-c)},deg2rad:function(e){return Math.PI*e/180},getUsingPath:function(e,c){for(var b=e.split("."),a=c,f;b.length&&(f=b.shift());)if(b.length)if(f in a)a=a[f];else break;else return a[f]}}});"use strict";
tv.exportTo("tv.b",function(){function e(){return e}function c(){return c}function b(a,b){a.storage_=b;a.get=function(d,b,f){d=a.namespace_(d,f);var c=a.storage_.getItem(d);if(null===c||void 0===c)return b;try{return JSON.parse(c).value}catch(e){return a.storage_.removeItem(a.namespace_(d,f)),b}};a.set=function(d,b,f){if(void 0===b)throw Error("Settings.set: value must not be undefined");b=JSON.stringify({value:b});a.storage_.setItem(a.namespace_(d,f),b)};a.keys=function(d){var b=[];d=d||"";for(var f=
0;f<a.storage_.length;f++){var c=a.storage_.key(f);a.isnamespaced_(c,d)&&b.push(a.unnamespace_(c,d))}return b};a.isnamespaced_=function(d,b){return 0==d.indexOf(a.normalize_(b))};a.namespace_=function(d,b){return a.normalize_(b)+d};a.unnamespace_=function(d,b){return d.replace(a.normalize_(b),"")};a.normalize_=function(d){return a.NAMESPACE+(d?d+".":"")};a.setAlternativeStorageInstance=function(d){a.storage_=d};a.getAlternativeStorageInstance=function(){return a.storage_===localStorage?void 0:a.storage_};
a.NAMESPACE="trace-viewer"}document.head.addEventListener("tv-unittest-will-run",function(){e.setAlternativeStorageInstance(global.sessionStorage)});b(e,localStorage);b(c,sessionStorage);return{Settings:e,SessionSettings:c}});"use strict";
tv.exportTo("tv.b.ui",function(){function e(a){var d=document.createElement("span");a&&(a.className&&(d.className=a.className),a.textContent&&(d.textContent=a.textContent),a.parent&&a.parent.appendChild(d),a.bold&&(d.style.fontWeight="bold"));return d}function c(a,d){return a instanceof Array&&d instanceof Array?a.length===d.length&&JSON.stringify(a)===JSON.stringify(d):a===d}function b(a,d){var b=e({className:"edit-categories"});b.textContent="Edit categories";b.classList.add("labeled-option");b.addEventListener("click",
function(){d.onClickEditCategories()});return b}var a=1;return{createSpan:e,createDiv:function(a){var d=document.createElement("div");a&&(a.className&&(d.className=a.className),a.parent&&a.parent.appendChild(d));return d},createScopedStyle:function(a){var d=document.createElement("style");d.scoped=!0;d.innerHTML=a;return d},createSelector:function(a,d,b,e,k,l){function m(c){c=s.selectedOptions[0].targetPropertyValue;tv.b.Settings.set(b,c,l);a[d]=c}for(var n,q=0;q<k.length;q++){var w=k[q];if(c(w.value,
e)){n=q;break}}if(void 0===n)throw Error("defaultValue must be in the items list");var s=document.createElement("select");s.addEventListener("change",m);for(q=0;q<k.length;q++){var w=k[q],D=document.createElement("option");D.textContent=w.label;D.targetPropertyValue=w.value;s.appendChild(D)}a.__lookupSetter__("selectedIndex");s.__defineGetter__("selectedValue",function(a){return s.children[s.selectedIndex].targetPropertyValue});s.__defineSetter__("selectedValue",function(a){for(var d=0;d<s.children.length;d++)if(c(s.children[d].targetPropertyValue,
a)){s.selectedIndex!=d&&(s.selectedIndex=d,m());return}throw Error("Not a valid value");});k=tv.b.Settings.get(b,e,l);w=!1;for(q=0;q<s.children.length;q++)if(c(s.children[q].targetPropertyValue,k)){w=!0;a[d]=k;s.selectedIndex=q;break}w||(s.selectedIndex=n,a[d]=e);return s},createOptionGroup:function(a,d,h,g,k){function l(){var b=[];this.value.length&&(b=this.value.split(","));tv.b.Settings.set(h,b);a[d]=b}var m=e({className:"labeled-option-group"});g=tv.b.Settings.get(h,g);for(var n=0;n<k.length;++n){var q=
k[n],w="category-preset-"+q.label.replace(/ /g,"-"),s=document.createElement("input");s.type="radio";s.setAttribute("id",w);s.setAttribute("name","category-presets-group");s.setAttribute("value",q.value);s.addEventListener("change",l.bind(s,a,d,h));c(g,q.value)&&(s.checked=!0);var D=document.createElement("label");D.textContent=q.label;D.setAttribute("for",w);q=e({className:"labeled-option"});q.appendChild(s);q.appendChild(D);q.__defineSetter__("checked",function(a){s.checked!==!!a&&(s.checked=!!a,
l())});q.__defineGetter__("checked",function(){return s.checked});m.appendChild(q)}m.appendChild(b(m,a));g.length||m.classList.add("categories-expanded");a[d]=g;return m},createCheckBox:function(b,d,c,g,k){function l(){tv.b.Settings.set(c,m.checked);b&&(b[d]=m.checked)}var m=document.createElement("input");m.type="checkbox";g=tv.b.Settings.get(c,g);m.checked=!!g;b&&(b[d]=g);m.addEventListener("change",l);g="#checkbox-"+a++;var n=e({className:"labeled-checkbox"});m.setAttribute("id",g);var q=document.createElement("label");
q.textContent=k;q.setAttribute("for",g);n.appendChild(m);n.appendChild(q);n.__defineSetter__("checked",function(a){m.checked!==!!a&&(m.checked=!!a,l())});n.__defineGetter__("checked",function(){return m.checked});return n},isElementAttachedToDocument:function(a){for(var d=a;d.parentNode;)d=d.parentNode;return d===a.ownerDocument||"#document-fragment"===d.nodeName}}});"use strict";
tv.exportTo("tv.b",function(){function e(){}e.decorate=function(b){for(var a in e.prototype)if("decorate"!=a){var f=e.prototype[a];"function"===typeof f&&(b[a]=f)}};e.prototype={addEventListener:function(b,a){this.listeners_||(this.listeners_=Object.create(null));if(b in this.listeners_){var f=this.listeners_[b];0>f.indexOf(a)&&f.push(a)}else this.listeners_[b]=[a]},removeEventListener:function(b,a){if(this.listeners_&&b in this.listeners_){var f=this.listeners_[b],d=f.indexOf(a);0<=d&&(1==f.length?
delete this.listeners_[b]:f.splice(d,1))}},dispatchEvent:function(b){if(!this.listeners_)return!0;var a=this;b.__defineGetter__("target",function(){return a});var f=b.preventDefault;b.preventDefault=function(){f.call(this);this.rawReturnValue=!1};var d=b.type,c=0;if(d in this.listeners_)for(var d=this.listeners_[d].concat(),e=0,k;k=d[e];e++)c=k.handleEvent?c|!1===k.handleEvent.call(k,b):c|!1===k.call(this,b);return!c&&b.rawReturnValue},hasEventListener:function(b){return void 0!==this.listeners_[b]}};
var c={decorate:function(b){for(var a in c)if("decorate"!=a){var f=c[a];"function"===typeof f&&(b[a]=f)}b.listenerCounts_={}},addEventListener:function(b,a,f){this.__proto__.addEventListener.call(this,b,a,f);void 0===this.listenerCounts_[b]&&(this.listenerCounts_[b]=0);this.listenerCounts_[b]++},removeEventListener:function(b,a,f){this.__proto__.removeEventListener.call(this,b,a,f);this.listenerCounts_[b]--},hasEventListener:function(b){return 0<this.listenerCounts_[b]}};return{EventTarget:e,EventTargetHelper:c}});
"use strict";tv.exportTo("tv.b",function(){function e(c,b,a){var f=tv.doc.createEvent("Event");f.initEvent(c,!!b,!!a);f.__proto__=global.Event.prototype;return f}e.prototype={__proto__:global.Event.prototype};return{Event:e,dispatchSimpleEvent:function(c,b,a,f){b=new e(b,a,f);return c.dispatchEvent(b)}}});"use strict";
tv.exportTo("tv.b",function(){function e(a,b,f,c,e,m){e=new tv.b.Event(b+"Change",e,m);e.propertyName=b;e.newValue=f;e.oldValue=c;var n;e.throwError=function(a){n=a};a.dispatchEvent(e);if(n)throw n;}function c(a){return a.replace(/([A-Z])/g,"-$1").toLowerCase()}function b(a,b){switch(b){case f.JS:var e=a+"_tv_";return function(){return this[e]};case f.ATTR:var k=c(a);return function(){return this.getAttribute(k)};case f.BOOL_ATTR:return k=c(a),function(){return this.hasAttribute(k)}}}function a(a,
b,g,k,l){switch(b){case f.JS:var m=a+"_tv_";return function(b){var f=this[m];b!==f&&(this[m]=b,g&&g.call(this,b,f),e(this,a,b,f,k,l))};case f.ATTR:var n=c(a);return function(b){var f=this.getAttribute(n);b!==f&&(void 0==b?this.removeAttribute(n):this.setAttribute(n,b),g&&g.call(this,b,f),e(this,a,b,f,k,l))};case f.BOOL_ATTR:return n=c(a),function(b){var f=this.getAttribute(n)===a;b!==f&&(b?this.setAttribute(n,a):this.removeAttribute(n),g&&g.call(this,b,f),e(this,a,b,f,k,l))}}}var f={JS:"js",ATTR:"attr",
BOOL_ATTR:"boolAttr"};return{PropertyKind:f,defineProperty:function(d,c,e,k,l,m){console.error("Don't use tv.b.defineProperty");"function"==typeof d&&(d=d.prototype);e=e||f.JS;d.__lookupGetter__(c)||d.__defineGetter__(c,b(c,e));d.__lookupSetter__(c)||d.__defineSetter__(c,a(c,e,k,l,m))},dispatchPropertyChange:e,setPropertyAndDispatchChange:function(a,b,f){var c=a[b];a[b+"_"]=f;c!==f&&tv.b.dispatchPropertyChange(a,b,f,c,!0,!1)}}});"use strict";
tv.exportTo("tv.b.ui",function(){var e=document.currentScript.ownerDocument,c=tv.b.ui.define("overlay");c.prototype={__proto__:HTMLDivElement.prototype,decorate:function(){this.classList.add("overlay");this.parentEl_=this.ownerDocument.body;this.visible_=!1;this.userCanClose_=!0;this.onKeyDown_=this.onKeyDown_.bind(this);this.onClick_=this.onClick_.bind(this);this.onFocusIn_=this.onFocusIn_.bind(this);this.onDocumentClick_=this.onDocumentClick_.bind(this);this.onClose_=this.onClose_.bind(this);this.addEventListener("visibleChange",
tv.b.ui.Overlay.prototype.onVisibleChange_.bind(this),!0);this.shadow_=(this.createShadowRoot||this.webkitCreateShadowRoot).call(this);this.shadow_.appendChild(tv.b.instantiateTemplate("#overlay-template",e));this.closeBtn_=this.shadow_.querySelector("close-button");this.closeBtn_.addEventListener("click",this.onClose_);this.shadow_.querySelector("overlay-frame").addEventListener("click",this.onClick_);this.observer_=new WebKitMutationObserver(this.didButtonBarMutate_.bind(this));this.observer_.observe(this.shadow_.querySelector("button-bar"),
{childList:!0});Object.defineProperty(this,"title",{get:function(){return this.shadow_.querySelector("title").textContent},set:function(b){this.shadow_.querySelector("title").textContent=b}})},set userCanClose(b){this.userCanClose_=b;this.closeBtn_.style.display=b?"block":"none"},get buttons(){return this.shadow_.querySelector("button-bar")},get visible(){return this.visible_},set visible(b){this.visible_!==b&&tv.b.setPropertyAndDispatchChange(this,"visible",b)},onVisibleChange_:function(){this.visible_?
this.show_():this.hide_()},show_:function(){this.parentEl_.appendChild(this);this.userCanClose_&&(this.addEventListener("keydown",this.onKeyDown_.bind(this)),this.addEventListener("click",this.onDocumentClick_.bind(this)));this.parentEl_.addEventListener("focusin",this.onFocusIn_);this.tabIndex=0;var b=void 0,a=this.querySelectorAll("button, input, list, select, a");0<a.length&&(a[0]===this.closeBtn_?1<a.length&&(b=a[1]):b=a[0]);void 0===b&&(b=this);b.focus()},hide_:function(){this.parentEl_.removeChild(this);
this.parentEl_.removeEventListener("focusin",this.onFocusIn_);this.closeBtn_&&this.closeBtn_.removeEventListener(this.onClose_);document.removeEventListener("keydown",this.onKeyDown_);document.removeEventListener("click",this.onDocumentClick_)},onClose_:function(b){this.visible=!1;("keydown"!=b.type||"keydown"===b.type&&27===b.keyCode)&&b.stopPropagation();b.preventDefault();tv.b.dispatchSimpleEvent(this,"closeclick")},onFocusIn_:function(b){b.target!==this&&(window.setTimeout(function(){this.focus()},
0),b.preventDefault(),b.stopPropagation())},didButtonBarMutate_:function(b){0<this.buttons.children.length?this.shadow_.querySelector("button-bar").style.display=void 0:this.shadow_.querySelector("button-bar").style.display="none"},onKeyDown_:function(b){if(9===b.keyCode&&b.shiftKey&&b.target===this)b.preventDefault();else if(27===b.keyCode)this.onClose_(b)},onClick_:function(b){b.stopPropagation()},onDocumentClick_:function(b){if(this.userCanClose_)this.onClose_(b)}};c.showError=function(b,a){var f=
new c;f.title="Error";f.textContent=b;if(a){var d=tv.b.normalizeException(a),h=document.createElement("pre");h.textContent=d.stack;h.style.paddingLeft="8px";h.style.margin=0;f.appendChild(h)}d=document.createElement("button");d.textContent="OK";d.addEventListener("click",function(){f.visible=!1});f.buttons.appendChild(d);f.visible=!0;return f};return{Overlay:c}});"use strict";
tv.exportTo("tv.b.ui",function(){var e=tv.b.ui.define("x-drag-handle");e.prototype={__proto__:HTMLDivElement.prototype,decorate:function(){this.lastMousePos_=0;this.onMouseMove_=this.onMouseMove_.bind(this);this.onMouseUp_=this.onMouseUp_.bind(this);this.addEventListener("mousedown",this.onMouseDown_);this.target_=void 0;this.horizontal=!0;this.observer_=new WebKitMutationObserver(this.didTargetMutate_.bind(this));this.targetSizesByModeKey_={}},get modeKey_(){return""==this.target_.className?".":
this.target_.className},get target(){return this.target_},set target(c){this.observer_.disconnect();(this.target_=c)&&this.observer_.observe(this.target_,{attributes:!0,attributeFilter:["class"]})},get horizontal(){return this.horizontal_},set horizontal(c){this.className=(this.horizontal_=c)?"horizontal-drag-handle":"vertical-drag-handle"},get vertical(){return!this.horizontal_},set vertical(c){this.horizontal=!c},forceMutationObserverFlush_:function(){var c=this.observer_.takeRecords();c.length&&
this.didTargetMutate_(c)},didTargetMutate_:function(c){c=this.targetSizesByModeKey_[this.modeKey_];void 0!==c?this.setTargetSize_(c):this.target_.style[this.targetStyleKey_]=""},get targetStyleKey_(){return this.horizontal_?"height":"width"},getTargetSize_:function(){var c=this.targetStyleKey_;this.target_.style[c]||(this.target_.style[c]=window.getComputedStyle(this.target_)[c]);c=parseInt(this.target_.style[c]);return this.targetSizesByModeKey_[this.modeKey_]=c},setTargetSize_:function(c){this.target_.style[this.targetStyleKey_]=
c+"px";this.targetSizesByModeKey_[this.modeKey_]=c},applyDelta_:function(c){var b=this.getTargetSize_();this.setTargetSize_(this.target_===this.nextElementSibling?b+c:b-c)},onMouseMove_:function(c){var b=this.horizontal_?c.clientY:c.clientX;this.applyDelta_(this.lastMousePos_-b);this.lastMousePos_=b;c.preventDefault();return!0},onMouseDown_:function(c){if(this.target_)return this.forceMutationObserverFlush_(),this.lastMousePos_=this.horizontal_?c.clientY:c.clientX,document.addEventListener("mousemove",
this.onMouseMove_),document.addEventListener("mouseup",this.onMouseUp_),c.preventDefault(),!0},onMouseUp_:function(c){document.removeEventListener("mousemove",this.onMouseMove_);document.removeEventListener("mouseup",this.onMouseUp_);c.preventDefault()}};return{DragHandle:e}});"use strict";
tv.exportTo("tv.b",function(){function e(){void 0!==f&&void 0!==a||(a={},f={},Polymer.elements.forEach(function(d){if(a[d.name])throw Error("Something is strange: dupe polymer element names");a[d.name]=d;d.extends&&(void 0===f[d.extends]&&(f[d.extends]=[]),f[d.extends].push(d.name))}))}function c(d){e();return a[d]}function b(a){if(Polymer.waitingFor().length)throw Error("There are unresolved polymer elements. Wait until Polymer.whenReady");e();var g=c(a);if(!g)throw Error(a+" is not a polymer element");
void 0===d&&(d={});if(void 0===d[a]){var g=f[g.name],k=[];void 0!==g&&g.length&&g.forEach(function(a){k.push(a);k.push.apply(k,b(a))});d[a]=k}return d[a]}Object.observe(Polymer.elements,function(){a={};f=void 0;d={}});var a=void 0,f=void 0,d=void 0;return{getPolymerElementNamed:c,getPolymerElementsThatSubclass:b,getPolymerSubclassingDepthFrom:function(a,d){if(Polymer.waitingFor().length)throw Error("There are unresolved polymer elements. Wait until Polymer.whenReady");if(!Polymer.elements[d])throw Error(d+
" is not a polymer element");if(!Polymer.elements[a])throw Error(a+" is not a polymer element");for(var b=0,f=a;f!=d;)if(b+=1,f=Polymer.elements[f].extends,!f)throw Error(a+" does not subclass "+d);return b}}});"use strict";
Polymer("tracing-analysis-tab-view",{get selectedTab(){if(this.selectedTab_)return this.selectedTab_.content},set selectedTab(e){this.childrenUpdated_(this.childrenObserver_.takeRecords(),this.childrenObserver_);if(void 0===e||null===e)this.changeSelectedTabById_(void 0);else{for(var c=void 0,b=0;b<this.tabs_.length;b++)if(this.tabs_[b].content===e){c=this.tabs_[b].id;break}void 0===c?console.warn("Tab not in tabs list. Ignoring changed selection."):this.changeSelectedTabById_(c)}},get tabsHidden(){return this.shadowRoot.querySelector("tab-strip").hasAttribute("tabs-hidden")},
set tabsHidden(e){e=!!e;var c=this.shadowRoot.querySelector("tab-strip");e?c.setAttribute("tabs-hidden",!0):c.removeAttribute("tabs-hidden")},ready:function(){this.tabs_=[];this.selectedTab_=void 0;for(var e=0;e<this.children.length;e++)this.processAddedChild_(this.children[e]);this.childrenObserver_=new MutationObserver(this.childrenUpdated_.bind(this));this.childrenObserver_.observe(this,{childList:"true"})},processAddedChild_:function(e){var c=new MutationObserver(this.childAttributesChanged_.bind(this)),
b=new MutationObserver(this.childAttributesChanged_.bind(this)),a={id:this.tabs_.length,content:e,label:e.getAttribute("tab-label"),observers:{forAttributeSelected:c,forAttributeTabLabel:b},savedScrollTop:0,savedScrollLeft:0};this.tabs_.push(a);e.hasAttribute("selected")&&(this.selectedTab_?e.removeAttribute("selected"):this.setSelectedTabById_(a.id));var f=e.selected,d=this;Object.defineProperty(e,"selected",{configurable:!0,set:function(b){b?d.changeSelectedTabById_(a.id):d.selectedTab_===a&&d.changeSelectedTabById_(void 0)},
get:function(){return this.hasAttribute("selected")}});f&&(e.selected=f);c.observe(e,{attributeFilter:["selected"]});b.observe(e,{attributeFilter:["tab-label"]})},processRemovedChild_:function(e){for(var c=0;c<this.tabs_.length;c++)this.tabs_[c].id=c,this.tabs_[c].content===e&&(this.tabs_[c].observers.forAttributeSelected.disconnect(),this.tabs_[c].observers.forAttributeTabLabel.disconnect(),this.tabs_[c]===this.selectedTab_&&this.clearSelectedTab_(),e.removeAttribute("selected"),delete e.selected,
this.tabs_.splice(c,1),c--)},childAttributesChanged_:function(e,c){for(var b=void 0,a=0;a<this.tabs_.length;a++){var f=this.tabs_[a].observers;if(f.forAttributeSelected===c||f.forAttributeTabLabel===c){b=this.tabs_[a];break}}if(b)for(a=0;a<e.length;a++)f=b.content,"tab-label"===e[a].attributeName&&(b.label=f.getAttribute("tab-label")),"selected"===e[a].attributeName&&(f.hasAttribute("selected")?this.changeSelectedTabById_(b.id):this.changeSelectedTabById_(void 0))},childrenUpdated_:function(e,c){e.forEach(function(b){for(var a=
0;a<b.removedNodes.length;a++)this.processRemovedChild_(b.removedNodes[a]);for(a=0;a<b.addedNodes.length;a++)this.processAddedChild_(b.addedNodes[a])},this)},tabButtonSelectHandler_:function(e,c,b){this.changeSelectedTabById_(b.getAttribute("button-id"))},changeSelectedTabById_:function(e){var c=this.selectedTab_!==(void 0!==e?this.tabs_[e]:void 0);this.saveCurrentTabScrollPosition_();this.clearSelectedTab_();void 0!==e&&(this.setSelectedTabById_(e),this.restoreCurrentTabScrollPosition_());c&&this.fire("selected-tab-change")},
setSelectedTabById_:function(e){this.selectedTab_=this.tabs_[e];this.selectedTab_.observers.forAttributeSelected.disconnect();this.selectedTab_.content.setAttribute("selected","selected");this.selectedTab_.observers.forAttributeSelected.observe(this.selectedTab_.content,{attributeFilter:["selected"]})},saveCurrentTabScrollPosition_:function(){this.selectedTab_&&(this.selectedTab_.savedScrollTop=this.$["content-container"].scrollTop,this.selectedTab_.savedScrollLeft=this.$["content-container"].scrollLeft)},
restoreCurrentTabScrollPosition_:function(){this.selectedTab_&&(this.$["content-container"].scrollTop=this.selectedTab_.savedScrollTop,this.$["content-container"].scrollLeft=this.selectedTab_.savedScrollLeft)},clearSelectedTab_:function(){this.selectedTab_&&(this.selectedTab_.observers.forAttributeSelected.disconnect(),this.selectedTab_.content.removeAttribute("selected"),this.selectedTab_.observers.forAttributeSelected.observe(this.selectedTab_.content,{attributeFilter:["selected"]}),this.selectedTab_=
void 0)}});"use strict";Polymer("tracing-analysis-sub-view",{set tabLabel(e){return this.setAttribute("tab-label",e)},get tabLabel(){return this.getAttribute("tab-label")},get requiresTallView(){return!1},set selection(e){throw Error("Not implemented!");},get selection(){throw Error("Not implemented!");}});"use strict";tv.exportTo("tv.c.analysis",function(){function e(c){return Math.round(1E3*c)/1E3}return{tsString:function(c){return Number(parseFloat(e(c)).toFixed(3)).toLocaleString()+" ms"},tsRound:e}});
"use strict";tv.exportTo("tv.c.analysis",function(){return{createTimeSpan:function(e){if(void 0===e)return"";var c=document.createElement("tv-c-a-time-span");c.duration=e;return c}}});"use strict";
Polymer("tv-c-a-time-span",{ready:function(){this.duration_=this.warning_=void 0},get duration(){return this.duration_},set duration(e){this.duration_=e;this.$.content.textContent=tv.c.analysis.tsString(e)},get warning(){return this.warning_},set warning(e){this.warning_=e;var c=this.$.warning;this.warning_?(c.title=e,c.style.display=""):(c.title="",c.style.display="none")}});"use strict";
tv.exportTo("tv.c.analysis",function(){return{createTimeStamp:function(e){if(void 0===e)return"";var c=document.createElement("tv-c-a-time-stamp");c.timestamp=e;return c}}});"use strict";Polymer("tv-c-a-time-stamp",{ready:function(){this.timestamp_=void 0},get timestamp(){return this.timestamp_},set timestamp(e){this.timestamp_=e;this.shadowRoot.textContent=tv.c.analysis.tsString(e)}});"use strict";tv.exportTo("tv.b",function(){var e=1;return{GUID:{allocate:function(){return e++}}}});"use strict";
tv.exportTo("tv.b",function(){function e(){this.isEmpty_=!0;this.max_=this.min_=void 0}e.prototype={__proto__:Object.prototype,reset:function(){this.isEmpty_=!0;this.max_=this.min_=void 0},get isEmpty(){return this.isEmpty_},addRange:function(c){c.isEmpty||(this.addValue(c.min),this.addValue(c.max))},addValue:function(c){this.isEmpty_?(this.min_=this.max_=c,this.isEmpty_=!1):(this.max_=Math.max(this.max_,c),this.min_=Math.min(this.min_,c))},set min(c){this.isEmpty_=!1;this.min_=c},get min(){return this.isEmpty_?
void 0:this.min_},get max(){return this.isEmpty_?void 0:this.max_},set max(c){this.isEmpty_=!1;this.max_=c},get range(){return this.isEmpty_?void 0:this.max_-this.min_},get center(){return 0.5*(this.min_+this.max_)},equals:function(c){return this.isEmpty&&c.isEmpty?!0:this.isEmpty!=c.isEmpty?!1:this.min===c.min&&this.max===c.max},containsRange:function(c){return this.isEmpty||c.isEmpty?!1:this.min<=c.min&&this.max>=c.max},containsExplicitRange:function(c,b){return this.isEmpty?!1:this.min<=c&&this.max>=
b},intersectsRange:function(c){return this.isEmpty||c.isEmpty?!1:!(c.max<this.min||c.min>this.max)},intersectsExplicitRange:function(c,b){return this.isEmpty?!1:!(b<this.min||c>this.max)}};e.compareByMinTimes=function(c,b){return!c.isEmpty&&!b.isEmpty?c.min_-b.min_:c.isEmpty&&!b.isEmpty?-1:!c.isEmpty&&b.isEmpty?1:0};return{Range:e}});"use strict";
tv.exportTo("tv.b",function(){function e(a,d){return void 0===a?d:void 0===d?a:Math.max(a,d)}function c(a,d){this.beginPositionCb_=a;this.endPositionCb_=d;this.root_=void 0;this.size_=0}function b(b,d,c){this.lowValue_=d;this.data_=[{datum:b,high:c,low:d}];this.colour_=a.RED;this.maxHighRight_=this.maxHighLeft_=this.rightNode_=this.leftNode_=this.parentNode_=void 0}c.prototype={insert:function(f){var d=this.beginPositionCb_(f),c=this.endPositionCb_(f),d=new b(f,d,c);this.size_++;this.root_=this.insertNode_(this.root_,
d);this.root_.colour=a.BLACK;return f},insertNode_:function(a,d){if(void 0===a)return d;a.leftNode&&(a.leftNode.isRed&&a.rightNode&&a.rightNode.isRed)&&this.flipNodeColour_(a);d.key<a.key?a.leftNode=this.insertNode_(a.leftNode,d):d.key===a.key?a.merge(d):a.rightNode=this.insertNode_(a.rightNode,d);if(a.rightNode&&a.rightNode.isRed&&(void 0===a.leftNode||!a.leftNode.isRed))a=this.rotateLeft_(a);a.leftNode&&(a.leftNode.isRed&&a.leftNode.leftNode&&a.leftNode.leftNode.isRed)&&(a=this.rotateRight_(a));
return a},rotateRight_:function(b){var d=b.leftNode;b.leftNode=d.rightNode;d.rightNode=b;d.colour=b.colour;b.colour=a.RED;return d},rotateLeft_:function(b){var d=b.rightNode;b.rightNode=d.leftNode;d.leftNode=b;d.colour=b.colour;b.colour=a.RED;return d},flipNodeColour_:function(a){a.colour=this.flipColour_(a.colour);a.leftNode.colour=this.flipColour_(a.leftNode.colour);a.rightNode.colour=this.flipColour_(a.rightNode.colour)},flipColour_:function(b){return b===a.RED?a.BLACK:a.RED},updateHighValues:function(){this.updateHighValues_(this.root_)},
updateHighValues_:function(a){if(void 0!==a)return a.maxHighLeft=this.updateHighValues_(a.leftNode),a.maxHighRight=this.updateHighValues_(a.rightNode),e(e(a.maxHighLeft,a.highValue),a.maxHighRight)},validateFindArguments_:function(a,d){if(void 0===a||void 0===d)throw Error("queryLow and queryHigh must be defined");if("number"!==typeof a||"number"!==typeof d)throw Error("queryLow and queryHigh must be numbers");},findIntersection:function(a,d){this.validateFindArguments_(a,d);if(void 0===this.root_)return[];
var b=[];this.root_.appendIntersectionsInto_(b,a,d);return b},get size(){return this.size_},get root(){return this.root_},dump_:function(){return void 0===this.root_?[]:this.root_.dump()}};var a={RED:"red",BLACK:"black"};b.prototype={appendIntersectionsInto_:function(a,d,b){if(this.lowValue_>=b)return!this.leftNode_?void 0:this.leftNode_.appendIntersectionsInto_(a,d,b);this.maxHighLeft_>d&&this.leftNode_.appendIntersectionsInto_(a,d,b);if(this.highValue>d)for(var c=this.data.length-1;0<=c&&!(this.data[c].high<
d);--c)a.push(this.data[c].datum);this.rightNode_&&this.rightNode_.appendIntersectionsInto_(a,d,b)},get colour(){return this.colour_},set colour(a){this.colour_=a},get key(){return this.lowValue_},get lowValue(){return this.lowValue_},get highValue(){return this.data_[this.data_.length-1].high},set leftNode(a){this.leftNode_=a},get leftNode(){return this.leftNode_},get hasLeftNode(){return void 0!==this.leftNode_},set rightNode(a){this.rightNode_=a},get rightNode(){return this.rightNode_},get hasRightNode(){return void 0!==
this.rightNode_},set parentNode(a){this.parentNode_=a},get parentNode(){return this.parentNode_},get isRootNode(){return void 0===this.parentNode_},set maxHighLeft(a){this.maxHighLeft_=a},get maxHighLeft(){return this.maxHighLeft_},set maxHighRight(a){this.maxHighRight_=a},get maxHighRight(){return this.maxHighRight_},get data(){return this.data_},get isRed(){return this.colour_===a.RED},merge:function(a){for(var d=0;d<a.data.length;d++)this.data_.push(a.data[d]);this.data_.sort(function(a,d){return a.high-
d.high})},dump:function(){var a={};this.leftNode_&&(a.left=this.leftNode_.dump());a.data=this.data_.map(function(a){return[a.low,a.high]});this.rightNode_&&(a.right=this.rightNode_.dump());return a}};return{IntervalTree:c}});"use strict";
tv.exportTo("tv.b",function(){function e(){if(!m)if(m=!0,window.requestAnimationFrame)window.requestAnimationFrame(b);else{var a=Date.now()-window.performance.now();window.webkitRequestAnimationFrame(function(d){b(d-a)})}}function c(a,d){try{a.callback.call(a.context,d)}catch(b){tv.b.onAnimationFrameError(b,a.stack)}}function b(a){var d=a+10;m=!1;var b=h;l=g;h=[];g=[];for(var f=b.length||l.length,D=0;D<b.length;D++)c(b[D],a);for(;0<l.length;)c(l.shift(),a);l=void 0;if(!f)for(;0<k.length&&!(c(k.shift()),
window.performance.now()>=d););0<k.length&&e()}function a(){if(!d)return"";var a=tv.b.stackTrace();a.shift();return a.join("\n")}function f(d,b){g.push({callback:d,context:b||window,stack:a()});e()}var d=!1,h=[],g=[],k=[],l=void 0,m=!1;return{onAnimationFrameError:function(a,d){d&&console.log(d);a.message?console.error(a.message,a.stack):console.error(a)},requestPreAnimationFrame:function(d,b){h.push({callback:d,context:b||window,stack:a()});e()},requestAnimationFrame:f,requestAnimationFrameInThisFrameIfPossible:function(d,
b){l?l.push({callback:d,context:b||window,stack:a()}):f(d,b)},requestIdleCallback:function(d,b){k.push({callback:d,context:b||window,stack:a()});e()},forcePendingRAFTasksToRun:function(a){m&&b(a)}}});"use strict";
tv.exportTo("tv.b",function(){function e(c,b){if(void 0!==c&&void 0===b)throw Error("Almost certainly, you meant to pass a thisArg.");this.runCb_=c;this.thisArg_=b;this.afterTask_=void 0;this.subTasks_=[]}e.prototype={subTask:function(c,b){c instanceof e?this.subTasks_.push(c):this.subTasks_.push(new e(c,b));return this.subTasks_[this.subTasks_.length-1]},run:function(){void 0!==this.runCb_&&this.runCb_.call(this.thisArg_,this);var c=this.subTasks_;this.subTasks_=void 0;if(!c.length)return this.afterTask_;
for(var b=1;b<c.length;b++)c[b-1].afterTask_=c[b];c[c.length-1].afterTask_=this.afterTask_;return c[0]},after:function(c,b){if(this.afterTask_)throw Error("Has an after task already");return this.afterTask_=c instanceof e?c:new e(c,b)}};e.RunSynchronously=function(c){for(;c;)c=c.run()};e.RunWhenIdle=function(c){return new Promise(function(b,a){function f(){try{d=d.run()}catch(c){a(c);console.error(c.stack);return}d?tv.b.requestIdleCallback(f):b()}var d=c;tv.b.requestIdleCallback(f)})};return{Task:e}});
"use strict";
tv.exportTo("tv.c",function(){function e(){}function c(a){this.text_=a.toLowerCase();if(!a.length)throw Error("Filter text is empty.");}function b(a){this.text_=a;if(!a.length)throw Error("Filter text is empty.");}e.prototype={__proto__:Object.prototype,matchCounter:function(a){return!0},matchCpu:function(a){return!0},matchProcess:function(a){return!0},matchSlice:function(a){return!0},matchThread:function(a){return!0}};c.prototype={__proto__:e.prototype,matchSlice:function(a){return void 0===a.title&&
void 0===a.category?!1:-1!==a.title.toLowerCase().indexOf(this.text_)||-1!==a.category.toLowerCase().indexOf(this.text_)}};b.prototype={__proto__:e.prototype,matchSlice:function(a){return a.title===this.text_}};return{Filter:e,TitleOrCategoryFilter:c,ExactTitleFilter:b}});"use strict";
tv.exportTo("tv.b",function(){function e(a,b){this.constructor=a;this.metadata=b}function c(a){if(void 0===a)throw Error("Mode is required");if(!b[a])throw Error("Not a mode.");this.mode_=a;this.defaultMetadata_={};this.defaultTypeInfo_=this.mandatoryBaseClass_=this.defaultConstructor_=void 0;this.frozen_=!1}var b={BASIC_REGISTRY_MODE:!0,TYPE_BASED_REGISTRY_MODE:!0};c.prototype={freeze:function(){if(this.frozen_)throw Error("Frozen");this.frozen_=!0},get mode(){return this.mode_},get defaultMetadata(){return this.defaultMetadata_},
set defaultMetadata(a){if(this.frozen_)throw Error("Frozen");this.defaultMetadata_=a;this.defaultTypeInfo_=void 0},get defaultConstructor(){return this.defaultConstructor_},set defaultConstructor(a){if(this.frozen_)throw Error("Frozen");this.defaultConstructor_=a;this.defaultTypeInfo_=void 0},get defaultTypeInfo(){void 0===this.defaultTypeInfo_&&this.defaultConstructor_&&(this.defaultTypeInfo_=new e(this.defaultConstructor,this.defaultMetadata));return this.defaultTypeInfo_},validateConstructor:function(a){if(this.mandatoryBaseClass){for(var b=
a.prototype.__proto__,d=!1;b;){if(b===this.mandatoryBaseClass.prototype){d=!0;break}b=b.__proto__}if(!d)throw Error(a+"must be subclass of "+registry);}}};return{BASIC_REGISTRY_MODE:"BASIC_REGISTRY_MODE",TYPE_BASED_REGISTRY_MODE:"TYPE_BASED_REGISTRY_MODE",ExtensionRegistryOptions:c,RegisteredTypeInfo:e}});"use strict";
tv.exportTo("tv.b",function(){var e=tv.b.RegisteredTypeInfo;return{_decorateBasicExtensionRegistry:function(c,b){var a=[];c.registeredTypeInfos_=[];c.register=function(a,d){if(void 0!==c.findIndexOfRegisteredConstructor(a))throw Error("Handler already registered for "+a);b.validateConstructor(a);var h={},g;for(g in b.defaultMetadata)h[g]=b.defaultMetadata[g];if(d)for(g in d)h[g]=d[g];h=new e(a,h);g=new Event("will-register");g.typeInfo=h;c.dispatchEvent(g);c.registeredTypeInfos_.push(h);g=new Event("registry-changed");
c.dispatchEvent(g)};c.pushCleanStateBeforeTest=function(){a.push(c.registeredTypeInfos_);c.registeredTypeInfos_=[];var b=new Event("registry-changed");c.dispatchEvent(b)};c.popCleanStateAfterTest=function(){c.registeredTypeInfos_=a[0];a.splice(0,1);var b=new Event("registry-changed");c.dispatchEvent(b)};c.findIndexOfRegisteredConstructor=function(a){for(var d=0;d<c.registeredTypeInfos_.length;d++)if(c.registeredTypeInfos_[d].constructor==a)return d};c.unregister=function(a){var d=c.findIndexOfRegisteredConstructor(a);
if(void 0===d)throw Error(a+" not registered");c.registeredTypeInfos_.splice(d,1);a=new Event("registry-changed");c.dispatchEvent(a)};c.getAllRegisteredTypeInfos=function(){return c.registeredTypeInfos_};c.findTypeInfo=function(a){a=this.findIndexOfRegisteredConstructor(a);if(void 0!==a)return this.registeredTypeInfos_[a]};c.findTypeInfoMatching=function(a,d){d=d?d:void 0;for(var h=0;h<c.registeredTypeInfos_.length;++h){var e=c.registeredTypeInfos_[h];if(a.call(d,e))return e}return b.defaultTypeInfo}}}});
"use strict";tv.exportTo("tv.b",function(){var e={};return{getCategoryParts:function(c){var b=e[c];if(void 0!==b)return b;b=c.split(",");return e[c]=b}}});"use strict";
tv.exportTo("tv.b",function(){var e=tv.b.getCategoryParts,c=tv.b.RegisteredTypeInfo;return{_decorateTypeBasedExtensionRegistry:function(b,a){var f=[];b.registeredTypeInfos_=[];b.categoryPartToTypeInfoMap_={};b.typeNameToTypeInfoMap_={};b.register=function(d,f){a.validateConstructor(d);var e=new c(d,f||a.defaultMetadata);e.typeNames=[];e.categoryParts=[];f&&f.typeName&&e.typeNames.push(f.typeName);f&&f.typeNames&&e.typeNames.push.apply(e.typeNames,f.typeNames);f&&f.categoryParts&&e.categoryParts.push.apply(e.categoryParts,
f.categoryParts);if(0===e.typeNames.length&&0===e.categoryParts.length)throw Error("typeName or typeNames must be provided");e.typeNames.forEach(function(a){if(b.typeNameToTypeInfoMap_[a])throw Error("typeName "+a+" already registered");});e.categoryParts.forEach(function(a){if(b.categoryPartToTypeInfoMap_[a])throw Error("categoryPart "+a+" already registered");});var k=new Event("will-register");k.typeInfo=e;b.dispatchEvent(k);e.typeNames.forEach(function(a){b.typeNameToTypeInfoMap_[a]=e});e.categoryParts.forEach(function(a){b.categoryPartToTypeInfoMap_[a]=
e});b.registeredTypeInfos_.push(e);k=new Event("registry-changed");b.dispatchEvent(k)};b.pushCleanStateBeforeTest=function(){f.push({registeredTypeInfos:b.registeredTypeInfos_,typeNameToTypeInfoMap:b.typeNameToTypeInfoMap_,categoryPartToTypeInfoMap:b.categoryPartToTypeInfoMap_});b.registeredTypeInfos_=[];b.typeNameToTypeInfoMap_={};b.categoryPartToTypeInfoMap_={};var a=new Event("registry-changed");b.dispatchEvent(a)};b.popCleanStateAfterTest=function(){var a=f[0];f.splice(0,1);b.registeredTypeInfos_=
a.registeredTypeInfos;b.typeNameToTypeInfoMap_=a.typeNameToTypeInfoMap;b.categoryPartToTypeInfoMap_=a.categoryPartToTypeInfoMap;a=new Event("registry-changed");b.dispatchEvent(a)};b.unregister=function(a){for(var f=-1,c=0;c<b.registeredTypeInfos_.length;c++)if(b.registeredTypeInfos_[c].constructor==a){f=c;break}if(-1===f)throw Error(a+" not registered");a=b.registeredTypeInfos_[f];b.registeredTypeInfos_.splice(f,1);a.typeNames.forEach(function(a){delete b.typeNameToTypeInfoMap_[a]});a.categoryParts.forEach(function(a){delete b.categoryPartToTypeInfoMap_[a]});
f=new Event("registry-changed");b.dispatchEvent(f)};b.getTypeInfo=function(d,f){if(d)for(var c=e(d),k=0;k<c.length;k++){var l=c[k];if(b.categoryPartToTypeInfoMap_[l])return b.categoryPartToTypeInfoMap_[l]}return b.typeNameToTypeInfoMap_[f]?b.typeNameToTypeInfoMap_[f]:a.defaultTypeInfo};b.getConstructor=function(a,f){var c=b.getTypeInfo(a,f);if(c)return c.constructor}}}});"use strict";
tv.exportTo("tv.b",function(){return{decorateExtensionRegistry:function(e,c){if(e.register)throw Error("Already has registry");c.freeze();if(c.mode==tv.b.BASIC_REGISTRY_MODE)tv.b._decorateBasicExtensionRegistry(e,c);else if(c.mode==tv.b.TYPE_BASED_REGISTRY_MODE)tv.b._decorateTypeBasedExtensionRegistry(e,c);else throw Error("Unrecognized mode");void 0===e.addEventListener&&tv.b.EventTarget.decorate(e)}}});"use strict";
tv.exportTo("tv.c",function(){function e(b){}e.prototype={__proto__:Object.prototype,runAnnotate:function(){},runAudit:function(){}};var c=new tv.b.ExtensionRegistryOptions(tv.b.BASIC_REGISTRY_MODE);c.defaultMetadata={};c.mandatoryBaseClass=e;tv.b.decorateExtensionRegistry(e,c);return{Auditor:e}});"use strict";
tv.exportTo("tv.c.importer",function(){function e(){}e.prototype={__proto__:Object.prototype,isTraceDataContainer:function(){return!1},extractSubtraces:function(){return[]},importEvents:function(){},importSampleData:function(){},finalizeImport:function(){},joinRefs:function(){}};var c=new tv.b.ExtensionRegistryOptions(tv.b.BASIC_REGISTRY_MODE);c.defaultMetadata={};c.mandatoryBaseClass=e;tv.b.decorateExtensionRegistry(e,c);e.findImporterFor=function(b){var a=e.findTypeInfoMatching(function(a){return a.constructor.canImport(b)});
if(a)return a.constructor};return{Importer:e}});"use strict";tv.exportTo("tv.c.importer",function(){function e(b){this.importPriority=0}var c=tv.c.importer.Importer;e.canImport=function(b){return b instanceof Array&&0==b.length?!0:"string"===typeof b||b instanceof String?0==b.length:!1};e.prototype={__proto__:c.prototype};c.register(e);return{EmptyImporter:e}});"use strict";
tv.exportTo("tv.c.trace_model",function(){function e(){this.guid_=tv.b.GUID.allocate();this.selectionState=a.NONE}function c(){}function b(a){a=a.replace(/[A-Z]/g," $&");return a=a.charAt(0).toUpperCase()+a.slice(1)}var a={NONE:0,SELECTED:1,HIGHLIGHTED:2,DIMMED:3};e.prototype={get guid(){return this.guid_},get selected(){return this.selectionState===a.SELECTED}};var f=new tv.b.ExtensionRegistryOptions(tv.b.BASIC_REGISTRY_MODE);f.mandatoryBaseType=e;tv.b.decorateExtensionRegistry(c,f);c.addEventListener("will-register",
function(a){var d=a.typeInfo.metadata;if(void 0===d.name)throw Error("Registered events must provide name metadata");if(void 0!==tv.b.findFirstInArray(c.getAllRegisteredTypeInfos(),function(a){return a.metadata.name===d.name}))throw Error("Event type with that name already registered");if(void 0===d.pluralName)throw Error("Registered events must provide pluralName metadata");if(void 0===d.singleViewElementName)throw Error("Registered events must provide singleViewElementName metadata");if(void 0===
d.multiViewElementName)throw Error("Registered events must provide multiViewElementName metadata");});var d=void 0;c.getEventTypeInfoByTypeName=function(a){void 0===d&&(d={},c.getAllRegisteredTypeInfos().forEach(function(a){d[a.metadata.name]=a}));return d[a]};c.addEventListener("registry-changed",function(){d=void 0});c.getUserFriendlySingularName=function(a){a=c.getEventTypeInfoByTypeName(a).metadata.name;return b(a)};c.getUserFriendlyPluralName=function(a){a=c.getEventTypeInfoByTypeName(a).metadata.pluralName;
return b(a)};return{Event:e,EventRegistry:c,SelectionState:a}});"use strict";
tv.exportTo("tv.b",function(){function e(b,a,f){if(0==b.length)return 1;for(var d=0,c=b.length-1,e,k,l=-1;d<=c;)e=Math.floor((d+c)/2),k=a(b[e])-f,0>k?d=e+1:(0<k||(l=e),c=e-1);return-1!=l?l:d}function c(b,a,f,d,c,g){if(0!=b.length&&!(d>c)){var k=e(b,a,d);if(-1!=k&&(0<k&&a(b[k-1])+f(b[k-1],k-1)>=d&&g(b[k-1]),k!=b.length))for(f=b.length;k<f&&!(a(b[k])>=c);k++)g(b[k])}}return{findLowIndexInSortedArray:e,findLowIndexInSortedIntervals:function(b,a,f,d){var c=e(b,a,d);return 0==c?d>=a(b[0])&&d<a(b[0])+f(b[0],
0)?0:-1:c<b.length?d>=a(b[c])&&d<a(b[c])+f(b[c],c)?c:d>=a(b[c-1])&&d<a(b[c-1])+f(b[c-1],c-1)?c-1:b.length:c==b.length?d>=a(b[c-1])&&d<a(b[c-1])+f(b[c-1],c-1)?c-1:b.length:b.length},iterateOverIntersectingIntervals:c,getIntersectingIntervals:function(b,a,f,d,h){var e=[];c(b,a,f,d,h,function(a){e.push(a)});return e},findClosestElementInSortedArray:function(b,a,f,d){if(0===b.length)return null;var c=e(b,a,f),g=0<c?c-1:0;c===b.length&&(c-=1);var k=Math.abs(f-a(b[g]));a=Math.abs(f-a(b[c]));return k>d&&
a>d?null:b[k<a?g:c]},findClosestIntervalInSortedIntervals:function(b,a,f,d,c){if(0===b.length)return null;var g=e(b,a,d);0<g&&(g-=1);var k=b[g],l=k;d>f(k)&&g+1<b.length&&(l=b[g+1]);b=Math.abs(d-a(l));f=Math.abs(d-f(k));return b>c&&f>c?null:b<f?l:k}}});"use strict";
tv.exportTo("tv.c.trace_model",function(){function e(c,b,a){tv.c.trace_model.Event.call(this);this.series_=c;this.timestamp_=b;this.value_=a}e.groupByTimestamp=function(c){for(var b={},a=0;a<c.length;a++){var f=c[a],d=f.timestamp;b[d]||(b[d]=[]);b[d].push(f)}c=tv.b.dictionaryKeys(b);c.sort();f=[];for(a=0;a<c.length;a++)d=c[a],d=b[d],d.sort(function(a,d){return a.series.seriesIndex-d.series.seriesIndex}),f.push(d);return f};e.prototype={__proto__:tv.c.trace_model.Event.prototype,get series(){return this.series_},
get timestamp(){return this.timestamp_},get value(){return this.value_},set timestamp(c){this.timestamp_=c},addBoundsToRange:function(c){c.addValue(this.timestamp)},getSampleIndex:function(){return tv.b.findLowIndexInSortedArray(this.series.timestamps,function(c){return c},this.timestamp_)},get userFriendlyName(){return"Counter sample from "+this.series_.title+" at "+tv.c.analysis.tsString(this.timestamp)}};tv.c.trace_model.EventRegistry.register(e,{name:"counterSample",pluralName:"counterSamples",
singleViewElementName:"tv-c-counter-sample-sub-view",multiViewElementName:"tv-c-counter-sample-sub-view"});return{CounterSample:e}});"use strict";
tv.exportTo("tv.c.trace_model",function(){function e(b,a){this.guid_=tv.b.GUID.allocate();this.name_=b;this.color_=a;this.timestamps_=[];this.samples_=[];this.seriesIndex=this.counter=void 0}var c=tv.c.trace_model.CounterSample;e.prototype={__proto__:Object.prototype,get length(){return this.timestamps_.length},get name(){return this.name_},get color(){return this.color_},get samples(){return this.samples_},get timestamps(){return this.timestamps_},getSample:function(b){return this.samples_[b]},getTimestamp:function(b){return this.timestamps_[b]},
addCounterSample:function(b,a){this.timestamps_.push(b);var f=new c(this,b,a);this.samples_.push(f);return f},getStatistics:function(b){for(var a=0,f=Number.MAX_VALUE,d=-Number.MAX_VALUE,c=0;c<b.length;++c)var e=this.getSample(b[c]).value,a=a+e,f=Math.min(e,f),d=Math.max(e,d);return{min:f,max:d,avg:a/b.length,start:this.getSample(b[0]).value,end:this.getSample(b.length-1).value}},shiftTimestampsForward:function(b){for(var a=0;a<this.timestamps_.length;++a)this.timestamps_[a]+=b,this.samples_[a].timestamp=
this.timestamps_[a]},iterateAllEvents:function(b,a){this.samples_.forEach(b,a)}};return{CounterSeries:e}});"use strict";
tv.exportTo("tv.c.trace_model",function(){function e(c,b,a,f){this.guid_=tv.b.GUID.allocate();this.parent=c;this.id=b;this.category=a||"";this.name=f;this.series_=[];this.totals=[];this.bounds=new tv.b.Range}e.prototype={__proto__:Object.prototype,get guid(){return this.guid_},set timestamps(c){throw Error("Bad counter API. No cookie.");},set seriesNames(c){throw Error("Bad counter API. No cookie.");},set seriesColors(c){throw Error("Bad counter API. No cookie.");},set samples(c){throw Error("Bad counter API. No cookie.");
},addSeries:function(c){c.counter=this;c.seriesIndex=this.series_.length;this.series_.push(c);return c},getSeries:function(c){return this.series_[c]},get series(){return this.series_},get numSeries(){return this.series_.length},get numSamples(){return 0===this.series_.length?0:this.series_[0].length},get timestamps(){return 0===this.series_.length?[]:this.series_[0].timestamps},getSampleStatistics:function(c){c.sort();var b=[];this.series_.forEach(function(a){b.push(a.getStatistics(c))});return b},
shiftTimestampsForward:function(c){for(var b=0;b<this.series_.length;++b)this.series_[b].shiftTimestampsForward(c)},updateBounds:function(){this.totals=[];this.maxTotal=0;this.bounds.reset();if(0!==this.series_.length){var c=this.series_[0],b=this.series_[this.series_.length-1];this.bounds.addValue(c.getTimestamp(0));this.bounds.addValue(b.getTimestamp(b.length-1));this.maxTotal=-Infinity;for(var a=0;a<c.length;++a){var f=0;this.series_.forEach(function(d){f+=d.getSample(a).value;this.totals.push(f)}.bind(this));
this.maxTotal=Math.max(f,this.maxTotal)}}},iterateAllEvents:function(c,b){for(var a=0;a<this.series_.length;a++)this.series_[a].iterateAllEvents(c,b)}};e.compare=function(c,b){var a=c.parent.compareTo(b);if(0!=a)return a;a=c.name.localeCompare(b.name);return 0==a?c.tid-b.tid:a};return{Counter:e}});"use strict";
tv.exportTo("tv.c.trace_model",function(){function e(c){tv.c.trace_model.Event.call(this);this.start=c;this.duration=0;this.cpuDuration=this.cpuStart=void 0}e.prototype={__proto__:tv.c.trace_model.Event.prototype,get end(){return this.start+this.duration},addBoundsToRange:function(c){c.addValue(this.start);c.addValue(this.end)},bounds:function(c){var b=Math.round(1E3*this.end),a=Math.round(1E3*c.end);return this.start<=c.start&&b>=a}};return{TimedEvent:e}});"use strict";
tv.exportTo("tv.c.trace_model",function(){function e(c,b,a,f,d,h,e,k){tv.c.trace_model.TimedEvent.call(this,f);this.category=c||"";this.title=b;this.colorId=a;this.args=d;this.endStackFrame=this.startStackFrame=void 0;this.didNotFinish=!1;this.inFlowEvents=[];this.outFlowEvents=[];this.subSlices=[];this.cpuSelfTime=this.selfTime=void 0;this.important=!1;void 0!==h&&(this.duration=h);void 0!==e&&(this.cpuStart=e);void 0!==k&&(this.cpuDuration=k)}e.prototype={__proto__:tv.c.trace_model.TimedEvent.prototype,
get analysisTypeName(){return this.title},get userFriendlyName(){return"Slice "+this.title+" at "+tv.c.analysis.tsString(this.start)},findDescendentSlice:function(c){if(this.subSlices)for(var b=0;b<this.subSlices.length;b++){if(this.subSlices[b].title==c)return this.subSlices[b];var a=this.subSlices[b].findDescendentSlice(c);if(a)return a}}};tv.c.trace_model.EventRegistry.register(e,{name:"slice",pluralName:"slices",singleViewElementName:"tv-c-single-slice-sub-view",multiViewElementName:"tv-c-multi-slice-sub-view"});
return{Slice:e}});"use strict";
tv.exportTo("tv.c.trace_model",function(){function e(b,a,f,d,h,e,k){c.call(this,a,f,d,h,e,k);this.thread=b;this.cpuOnWhichThreadWasRunning=void 0}var c=tv.c.trace_model.Slice;e.prototype={__proto__:c.prototype,get analysisTypeName(){return"tv.c.analysis.ThreadTimeSlice"},getAssociatedCpuSlice:function(){if(this.cpuOnWhichThreadWasRunning)for(var b=this.cpuOnWhichThreadWasRunning.slices,a=0;a<b.length;a++){var f=b[a];if(f.start===this.start&&f.duration===this.duration)return f}},getCpuSliceThatTookCpu:function(){if(!this.cpuOnWhichThreadWasRunning){for(var b=
this.thread.indexOfTimeSlice(this),a;0<=b;){var f=this.thread.timeSlices[b];if(f.cpuOnWhichThreadWasRunning){a=f.getAssociatedCpuSlice();break}else b--}if(a&&(b=a.cpu,f=b.indexOf(a),(b=b.slices[f+1])&&1E-5>Math.abs(b.start-a.end)))return b}}};tv.c.trace_model.EventRegistry.register(e,{name:"threadTimeSlice",pluralName:"threadTimeSlices",singleViewElementName:"tv-c-single-thread-time-slice-sub-view",multiViewElementName:"tv-c-multi-slice-sub-view"});return{ThreadTimeSlice:e}});"use strict";
tv.exportTo("tv.c.trace_model",function(){function e(b,a,f,d,h,e){c.apply(this,arguments);this.cpu=this.threadThatWasRunning=void 0}var c=tv.c.trace_model.Slice;e.prototype={__proto__:c.prototype,get analysisTypeName(){return"tv.c.analysis.CpuSlice"},getAssociatedTimeslice:function(){if(this.threadThatWasRunning)for(var b=this.threadThatWasRunning.timeSlices,a=0;a<b.length;a++){var f=b[a];if(f.start===this.start&&f.duration===this.duration)return f}}};tv.c.trace_model.EventRegistry.register(e,{name:"cpuSlice",
pluralName:"cpuSlices",singleViewElementName:"tv-c-single-cpu-slice-sub-view",multiViewElementName:"tv-c-multi-slice-sub-view"});return{CpuSlice:e}});"use strict";
tv.exportTo("tv.c.trace_model",function(){function e(b,a){if(void 0===b||void 0===a)throw Error("Missing arguments");this.kernel=b;this.cpuNumber=a;this.slices=[];this.counters={};this.bounds=new tv.b.Range;this.lastActiveArgs_=this.lastActiveName_=this.lastActiveThread_=this.lastActiveTimestamp_=this.samples_=void 0}var c=tv.c.trace_model.Counter;e.prototype={getOrCreateCounter:function(b,a){var f;f=b.length?b+"."+a:a;this.counters[f]||(this.counters[f]=new c(this,f,b,a));return this.counters[f]},
shiftTimestampsForward:function(b){for(var a=0;a<this.slices.length;a++)this.slices[a].start+=b;for(var f in this.counters)this.counters[f].shiftTimestampsForward(b)},updateBounds:function(){this.bounds.reset();this.slices.length&&(this.bounds.addValue(this.slices[0].start),this.bounds.addValue(this.slices[this.slices.length-1].end));for(var b in this.counters)this.counters[b].updateBounds(),this.bounds.addRange(this.counters[b].bounds);this.samples_&&this.samples_.length&&(this.bounds.addValue(this.samples_[0].start),
this.bounds.addValue(this.samples_[this.samples_.length-1].end))},createSubSlices:function(){this.samples_=this.kernel.model.samples.filter(function(b){return b.cpu==this},this)},addCategoriesToDict:function(b){for(var a=0;a<this.slices.length;a++)b[this.slices[a].category]=!0;for(var f in this.counters)b[this.counters[f].category]=!0;for(a=0;a<this.samples_.length;a++)b[this.samples_[a].category]=!0},get userFriendlyName(){return"CPU "+this.cpuNumber},indexOf:function(b){var a=tv.b.findLowIndexInSortedArray(this.slices,
function(a){return a.start},b.start);return this.slices[a]!==b?void 0:a},iterateAllEvents:function(b,a){this.slices.forEach(b,a);for(var f in this.counters)this.counters[f].iterateAllEvents(b,a)},closeActiveThread:function(b,a){if(!(void 0==this.lastActiveThread_||0==this.lastActiveThread_)){if(b<this.lastActiveTimestamp_)throw Error("The end timestamp of a thread running on CPU "+this.cpuNumber+" is before its start timestamp.");for(var f in a)this.lastActiveArgs_[f]=a[f];f=b-this.lastActiveTimestamp_;
f=new tv.c.trace_model.CpuSlice("",this.lastActiveName_,tv.b.ui.getColorIdForGeneralPurposeString(this.lastActiveName_),this.lastActiveTimestamp_,this.lastActiveArgs_,f);f.cpu=this;this.slices.push(f);this.lastActiveArgs_=this.lastActiveName_=this.lastActiveThread_=this.lastActiveTimestamp_=void 0}},switchActiveThread:function(b,a,f,d,c){this.closeActiveThread(b,a);this.lastActiveTimestamp_=b;this.lastActiveThread_=f;this.lastActiveName_=d;this.lastActiveArgs_=c},get samples(){return this.samples_}};
e.compare=function(b,a){return b.cpuNumber-a.cpuNumber};return{Cpu:e}});"use strict";
tv.exportTo("tv.c.trace_model",function(){function e(b,a,f){tv.c.trace_model.Event.call(this);this.objectInstance=b;this.ts=a;this.args=f}e.prototype={__proto__:tv.c.trace_model.Event.prototype,preInitialize:function(){},initialize:function(){},addBoundsToRange:function(b){b.addValue(this.ts)},get userFriendlyName(){return"Snapshot of "+this.objectInstance.typeName+" "+this.objectInstance.id+" @ "+tv.c.analysis.tsString(this.ts)}};tv.c.trace_model.EventRegistry.register(e,{name:"objectSnapshot",pluralName:"objectSnapshots",
singleViewElementName:"tv-c-single-object-snapshot-sub-view",multiViewElementName:"tv-c-multi-object-sub-view"});var c=new tv.b.ExtensionRegistryOptions(tv.b.TYPE_BASED_REGISTRY_MODE);c.mandatoryBaseClass=e;c.defaultConstructor=e;tv.b.decorateExtensionRegistry(e,c);return{ObjectSnapshot:e}});"use strict";
tv.exportTo("tv.c.trace_model",function(){function e(b,a,f,d,c,e){tv.c.trace_model.Event.call(this);this.parent=b;this.id=a;this.category=f;this.baseTypeName=e?e:d;this.name=d;this.creationTs=c;this.creationTsWasExplicit=!1;this.deletionTs=Number.MAX_VALUE;this.deletionTsWasExplicit=!1;this.colorId=0;this.bounds=new tv.b.Range;this.snapshots=[];this.hasImplicitSnapshots=!1}e.prototype={__proto__:tv.c.trace_model.Event.prototype,get typeName(){return this.name},addBoundsToRange:function(b){b.addRange(this.bounds)},
addSnapshot:function(b,a,f,d){if(b<this.creationTs)throw Error("Snapshots must be >= instance.creationTs");if(b>=this.deletionTs)throw Error("Snapshots cannot be added after an objects deletion timestamp.");var c;if(0<this.snapshots.length){c=this.snapshots[this.snapshots.length-1];if(c.ts==b)throw Error("Snapshots already exists at this time!");if(b<c.ts)throw Error("Snapshots must be added in increasing timestamp order");}if(f&&this.name!=f){if(!d)throw Error("Must provide base type name for name update");
if(this.baseTypeName!=d)throw Error("Cannot update type name: base types dont match");this.name=f}b=new (tv.c.trace_model.ObjectSnapshot.getConstructor(this.category,this.name))(this,b,a);this.snapshots.push(b);return b},wasDeleted:function(b){var a;if(0<this.snapshots.length&&(a=this.snapshots[this.snapshots.length-1],a.ts>b))throw Error("Instance cannot be deleted at ts="+b+". A snapshot exists that is older.");this.deletionTs=b;this.deletionTsWasExplicit=!0},preInitialize:function(){for(var b=
0;b<this.snapshots.length;b++)this.snapshots[b].preInitialize()},initialize:function(){for(var b=0;b<this.snapshots.length;b++)this.snapshots[b].initialize()},getSnapshotAt:function(b){if(b<this.creationTs){if(this.creationTsWasExplicit)throw Error("ts must be within lifetime of this instance");return this.snapshots[0]}if(b>this.deletionTs)throw Error("ts must be within lifetime of this instance");var a=this.snapshots;b=tv.b.findLowIndexInSortedIntervals(a,function(a){return a.ts},function(b,d){return d==
a.length-1?a[d].objectInstance.deletionTs:a[d+1].ts-a[d].ts},b);return 0>b?this.snapshots[0]:b>=this.snapshots.length?this.snapshots[this.snapshots.length-1]:this.snapshots[b]},updateBounds:function(){this.bounds.reset();this.bounds.addValue(this.creationTs);this.deletionTs!=Number.MAX_VALUE?this.bounds.addValue(this.deletionTs):0<this.snapshots.length&&this.bounds.addValue(this.snapshots[this.snapshots.length-1].ts)},shiftTimestampsForward:function(b){this.creationTs+=b;this.deletionTs!=Number.MAX_VALUE&&
(this.deletionTs+=b);this.snapshots.forEach(function(a){a.ts+=b})},get userFriendlyName(){return this.typeName+" object "+this.id}};tv.c.trace_model.EventRegistry.register(e,{name:"objectInstance",pluralName:"objectInstances",singleViewElementName:"tv-c-single-object-instance-sub-view",multiViewElementName:"tv-c-multi-object-sub-view"});var c=new tv.b.ExtensionRegistryOptions(tv.b.TYPE_BASED_REGISTRY_MODE);c.mandatoryBaseClass=e;c.defaultConstructor=e;tv.b.decorateExtensionRegistry(e,c);return{ObjectInstance:e}});
"use strict";
tv.exportTo("tv.c.trace_model",function(){function e(c,b,a){this.createObjectInstanceFunction_=c;this.parent=b;this.id=a;this.instances=[]}e.prototype={idWasCreated:function(c,b,a){if(0==this.instances.length)return this.instances.push(this.createObjectInstanceFunction_(this.parent,this.id,c,b,a)),this.instances[0].creationTsWasExplicit=!0,this.instances[0];var f=this.instances[this.instances.length-1];if(a<f.deletionTs)throw Error("Mutation of the TimeToObjectInstanceMap must be done in ascending timestamp order.");f=
this.createObjectInstanceFunction_(this.parent,this.id,c,b,a);f.creationTsWasExplicit=!0;this.instances.push(f);return f},addSnapshot:function(c,b,a,f,d){0==this.instances.length&&this.instances.push(this.createObjectInstanceFunction_(this.parent,this.id,c,b,a,d));var h=tv.b.findLowIndexInSortedIntervals(this.instances,function(a){return a.creationTs},function(a){return a.deletionTs-a.creationTs},a);if(0>h){h=this.instances[0];if(a>h.deletionTs||h.creationTsWasExplicit)throw Error("At the provided timestamp, no instance was still alive");
if(0!=h.snapshots.length)throw Error("Cannot shift creationTs forward, snapshots have been added. First snap was at ts="+h.snapshots[0].ts+" and creationTs was "+h.creationTs);h.creationTs=a}else if(h>=this.instances.length)if(h=this.instances[this.instances.length-1],a>=h.deletionTs)h=this.createObjectInstanceFunction_(this.parent,this.id,c,b,a,d),this.instances.push(h);else{for(var e,h=this.instances.length-1;0<=h;h--){c=this.instances[h];if(a>=c.deletionTs)break;!1==c.creationTsWasExplicit&&0==
c.snapshots.length&&(e=h)}if(void 0===e)throw Error("Cannot add snapshot. No instance was alive that was mutable.");h=this.instances[e];h.creationTs=a}else h=this.instances[h];return h.addSnapshot(a,f,b,d)},get lastInstance(){return 0==this.instances.length?void 0:this.instances[this.instances.length-1]},idWasDeleted:function(c,b,a){0==this.instances.length&&this.instances.push(this.createObjectInstanceFunction_(this.parent,this.id,c,b,a));var f=this.instances[this.instances.length-1];if(a<f.creationTs)throw Error("Cannot delete a id before it was crated");
if(f.deletionTs==Number.MAX_VALUE)return f.wasDeleted(a),f;if(a<f.deletionTs)throw Error("id was already deleted earlier.");f=this.createObjectInstanceFunction_(this.parent,this.id,c,b,a);this.instances.push(f);f.wasDeleted(a);return f},getInstanceAt:function(c){c=tv.b.findLowIndexInSortedIntervals(this.instances,function(b){return b.creationTs},function(b){return b.deletionTs-b.creationTs},c);return 0>c?this.instances[0].creationTsWasExplicit?void 0:this.instances[0]:c>=this.instances.length?void 0:
this.instances[c]},logToConsole:function(){for(var c=0;c<this.instances.length;c++){var b=this.instances[c],a="",f="";b.creationTsWasExplicit&&(a="(explicitC)");b.deletionTsWasExplicit&&(f="(explicit)");console.log(b.creationTs,a,b.deletionTs,f,b.category,b.name,b.snapshots.length+" snapshots")}}};return{TimeToObjectInstanceMap:e}});"use strict";
tv.exportTo("tv.c.trace_model",function(){function e(c){this.parent=c;this.bounds=new tv.b.Range;this.instanceMapsById_={};this.instancesByTypeName_={};this.createObjectInstance_=this.createObjectInstance_.bind(this)}e.prototype={__proto__:Object.prototype,createObjectInstance_:function(c,b,a,f,d,h){c=new (tv.c.trace_model.ObjectInstance.getConstructor(a,f))(c,b,a,f,d,h);b=c.typeName;a=this.instancesByTypeName_[b];a||(a=[],this.instancesByTypeName_[b]=a);a.push(c);return c},getOrCreateInstanceMap_:function(c){var b=
this.instanceMapsById_[c];if(b)return b;b=new tv.c.trace_model.TimeToObjectInstanceMap(this.createObjectInstance_,this.parent,c);return this.instanceMapsById_[c]=b},idWasCreated:function(c,b,a,f){return this.getOrCreateInstanceMap_(c).idWasCreated(b,a,f)},addSnapshot:function(c,b,a,f,d,h){c=this.getOrCreateInstanceMap_(c).addSnapshot(b,a,f,d,h);if(c.objectInstance.category!=b)throw Error("Added snapshot name="+a+" with cat="+b+" impossible. It instance was created/snapshotted with cat="+c.objectInstance.category+
" name="+c.objectInstance.name);if(h&&c.objectInstance.baseTypeName!=h)throw Error("Could not add snapshot with baseTypeName="+h+". It was previously created with name="+c.objectInstance.baseTypeName);if(c.objectInstance.name!=a)throw Error("Could not add snapshot with name="+a+". It was previously created with name="+c.objectInstance.name);return c},idWasDeleted:function(c,b,a,f){if(c=this.getOrCreateInstanceMap_(c).idWasDeleted(b,a,f)){if(c.category!=b)throw Error("Deleting object "+c.name+" with a different category than when it was created. It previous had cat="+
c.category+" but the delete command had cat="+b);if(c.baseTypeName!=a)throw Error("Deletion requested for name="+a+" could not proceed: An existing object with baseTypeName="+c.baseTypeName+" existed.");}},autoDeleteObjects:function(c){tv.b.iterItems(this.instanceMapsById_,function(b,a){var f=a.lastInstance;f.deletionTs==Number.MAX_VALUE&&(a.idWasDeleted(f.category,f.name,c),f.deletionTsWasExplicit=!1)})},getObjectInstanceAt:function(c,b){var a=this.instanceMapsById_[c];return!a?void 0:a.getInstanceAt(b)},
getSnapshotAt:function(c,b){var a=this.getObjectInstanceAt(c,b);return!a?void 0:a.getSnapshotAt(b)},iterObjectInstances:function(c,b){b=b||this;tv.b.iterItems(this.instanceMapsById_,function(a,f){f.instances.forEach(c,b)})},getAllObjectInstances:function(){var c=[];this.iterObjectInstances(function(b){c.push(b)});return c},getAllInstancesNamed:function(c){return this.instancesByTypeName_[c]},getAllInstancesByTypeName:function(){return this.instancesByTypeName_},preInitializeAllObjects:function(){this.iterObjectInstances(function(c){c.preInitialize()})},
initializeAllObjects:function(){this.iterObjectInstances(function(c){c.initialize()})},initializeInstances:function(){this.iterObjectInstances(function(c){c.initialize()})},updateBounds:function(){this.bounds.reset();this.iterObjectInstances(function(c){c.updateBounds();this.bounds.addRange(c.bounds)},this)},shiftTimestampsForward:function(c){this.iterObjectInstances(function(b){b.shiftTimestampsForward(c)})},addCategoriesToDict:function(c){this.iterObjectInstances(function(b){c[b.category]=!0})},
iterateAllEvents:function(c,b){this.iterObjectInstances(function(a){c.call(this,a);a.snapshots.forEach(c)},b)}};return{ObjectCollection:e}});"use strict";tv.exportTo("tv.c.trace_model",function(){function e(){}e.prototype={get stableId(){throw Error("Not implemented");}};return{EventContainer:e}});"use strict";tv.exportTo("tv.c.trace_model",function(){function e(b,a,f,d,h,e,k,l){c.call(this,b,a,f,d,h,e,k,l);this.subSlices=[]}var c=tv.c.trace_model.Slice;e.prototype={__proto__:c.prototype};return{ThreadSlice:e}});
"use strict";tv.exportTo("tv.b.ui",function(){return{brightenColor:function(e){var c;c=240<=e.r&&240<=e.g&&240<=e.b?-0.2:0.45;return{r:Math.min(255,e.r+Math.floor(e.r*c)),g:Math.min(255,e.g+Math.floor(e.g*c)),b:Math.min(255,e.b+Math.floor(e.b*c))}},colorToRGBString:function(e){return"rgb("+e.r+","+e.g+","+e.b+")"},colorToRGBAString:function(e,c){return"rgba("+e.r+","+e.g+","+e.b+","+c+")"}}});"use strict";
tv.exportTo("tv.b.ui",function(){function e(a){for(var d=0,b=0;b<a.length;++b)d=(d+37*d+11*a.charCodeAt(b))%4294967295;return d}var c=tv.b.ui.colorToRGBString,b=[{r:138,g:113,b:152},{r:175,g:112,b:133},{r:127,g:135,b:225},{r:93,g:81,b:137},{r:116,g:143,b:119},{r:178,g:214,b:122},{r:87,g:109,b:147},{r:119,g:155,b:95},{r:114,g:180,b:160},{r:132,g:85,b:103},{r:157,g:210,b:150},{r:148,g:94,b:86},{r:164,g:108,b:138},{r:139,g:191,b:150},{r:110,g:99,b:145},{r:80,g:129,b:109},{r:125,g:140,b:149},{r:93,g:124,
b:132},{r:140,g:85,b:140},{r:104,g:163,b:162},{r:132,g:141,b:178},{r:131,g:105,b:147},{r:135,g:183,b:98},{r:152,g:134,b:177},{r:141,g:188,b:141},{r:133,g:160,b:210},{r:126,g:186,b:148},{r:112,g:198,b:205},{r:180,g:122,b:195},{r:203,g:144,b:152}],a={thread_state_iowait:{r:182,g:125,b:143},thread_state_running:{r:126,g:200,b:148},thread_state_runnable:{r:133,g:160,b:210},thread_state_sleeping:{r:240,g:240,b:240},thread_state_unknown:{r:199,g:155,b:125},memory_dump:{r:0,g:0,b:180},generic_work:{r:125,
g:125,b:125}},f=b.length;tv.b.dictionaryLength(a);var d=function(){var d=[];d.push.apply(d,b);d.push.apply(d,tv.b.dictionaryValues(a));return d.concat(d.map(tv.b.ui.brightenColor))}(),h=d.map(c),g=h.length/2,k=function(){var d={},f=b.length;tv.b.iterItems(a,function(a,b){d[a]=f++});return d}(),l={};return{getRawColorPalette:function(){return d},getColorPalette:function(){return h},paletteProperties:{numGeneralPurposeColorIds:f,highlightIdBoost:g},getColorPaletteHighlightIdBoost:function(){return g},
getColorIdForReservedName:function(a){var d=k[a];if(void 0===d)throw Error("Unrecognized color ")+a;return d},getStringHash:e,getColorIdForGeneralPurposeString:function(a){if(void 0===l[a]){var d=e(a);l[a]=d%f}return l[a]}}});"use strict";
tv.exportTo("tv.c.trace_model",function(){function e(b,a,f){this.guid_=tv.b.GUID.allocate();this.parentThread_=b;this.sliceConstructor=a||c;this.openPartialSlices_=[];this.slices=[];this.bounds=new tv.b.Range;this.topLevelSlices=[];this.haveTopLevelSlicesBeenBuilt=!1;this.name_=f}var c=tv.c.trace_model.Slice;e.prototype={__proto__:tv.c.trace_model.EventContainer.prototype,get guid(){return this.guid_},get parentThread(){return this.parentThread_},get model(){return this.parentThread_.parent.model},
get stableId(){return this.parentThread_.stableId+".SliceGroup"},getSettingsKey:function(){if(this.name_){var b=this.parentThread_.getSettingsKey();return!b?void 0:b+"."+this.name}},get length(){return this.slices.length},pushSlice:function(b){this.haveTopLevelSlicesBeenBuilt=!1;this.slices.push(b);return b},pushSlices:function(b){this.haveTopLevelSlicesBeenBuilt=!1;this.slices.push.apply(this.slices,b)},beginSlice:function(b,a,f,d,c){if(this.openPartialSlices_.length&&f<this.openPartialSlices_[this.openPartialSlices_.length-
1].start)throw Error("Slices must be added in increasing timestamp order");var e=tv.b.ui.getColorIdForGeneralPurposeString(a);b=new this.sliceConstructor(b,a,e,f,d?d:{},null,c);this.openPartialSlices_.push(b);b.didNotFinish=!0;this.pushSlice(b);return b},isTimestampValidForBeginOrEnd:function(b){return!this.openPartialSlices_.length?!0:b>=this.openPartialSlices_[this.openPartialSlices_.length-1].start},get openSliceCount(){return this.openPartialSlices_.length},get mostRecentlyOpenedPartialSlice(){return!this.openPartialSlices_.length?
void 0:this.openPartialSlices_[this.openPartialSlices_.length-1]},endSlice:function(b,a){if(!this.openSliceCount)throw Error("endSlice called without an open slice");var f=this.openPartialSlices_[this.openSliceCount-1];this.openPartialSlices_.splice(this.openSliceCount-1,1);if(b<f.start)throw Error("Slice "+f.title+" end time is before its start.");f.duration=b-f.start;f.didNotFinish=!1;a&&void 0!==f.cpuStart&&(f.cpuDuration=a-f.cpuStart);return f},pushCompleteSlice:function(b,a,f,d,c,e,k){var l=
tv.b.ui.getColorIdForGeneralPurposeString(a);b=new this.sliceConstructor(b,a,l,f,k?k:{},d,c,e);void 0===d&&(b.didNotFinish=!0);this.pushSlice(b);return b},autoCloseOpenSlices:function(b){b||(this.updateBounds(),b=this.bounds.max);for(var a=0;a<this.slices.length;a++){var f=this.slices[a];f.didNotFinish&&(f.duration=b-f.start)}this.openPartialSlices_=[]},shiftTimestampsForward:function(b){for(var a=0;a<this.slices.length;a++){var f=this.slices[a];f.start+=b}},updateBounds:function(){this.bounds.reset();
for(var b=0;b<this.slices.length;b++)this.bounds.addValue(this.slices[b].start),this.bounds.addValue(this.slices[b].end)},copySlice:function(b){var a=new this.sliceConstructor(b.category,b.title,b.colorId,b.start,b.args,b.duration,b.cpuStart,b.cpuDuration);a.didNotFinish=b.didNotFinish;return a},iterateAllEvents:function(b,a){this.slices.forEach(b,a)},iterateAllEventContainers:function(b){b(this)},getSlicesOfName:function(b){for(var a=[],f=0;f<this.slices.length;f++)this.slices[f].title==b&&a.push(this.slices[f]);
return a},createSubSlices:function(){this.haveTopLevelSlicesBeenBuilt=!0;this.createSubSlicesImpl_();this.slices.forEach(function(b){for(var a=b.duration,f=0;f<b.subSlices.length;f++)a-=b.subSlices[f].duration;b.selfTime=a;if(void 0!==b.cpuDuration){a=b.cpuDuration;for(f=0;f<b.subSlices.length;f++)void 0!==b.subSlices[f].cpuDuration&&(a-=b.subSlices[f].cpuDuration);b.cpuSelfTime=a}})},createSubSlicesImpl_:function(){function b(a,d){if(a.bounds(d)){if(a.subSlices&&0<a.subSlices.length&&b(a.subSlices[a.subSlices.length-
1],d))return!0;d.parentSlice=a;void 0===a.subSlices&&(a.subSlices=[]);a.subSlices.push(d);return!0}return!1}if(this.slices.length){for(var a=[],f=0;f<this.slices.length;f++)this.slices[f].subSlices&&this.slices[f].subSlices.splice(0,this.slices[f].subSlices.length),a.push(f);var d=this.slices;a.sort(function(a,b){var f=d[a],c=d[b];return f.start!=c.start?f.start-c.start:a-b});var c=this.slices[a[0]];this.topLevelSlices=[];this.topLevelSlices.push(c);for(f=1;f<a.length;f++){var e=this.slices[a[f]];
b(c,e)||(c=e,this.topLevelSlices.push(c))}}}};e.merge=function(b,a){if(0<b.openPartialSlices_.length)throw Error("groupA has open partial slices");if(0<a.openPartialSlices_.length)throw Error("groupB has open partial slices");if(b.parentThread!=a.parentThread)throw Error("Different parent threads. Cannot merge");for(var f=new e(b.parentThread),d=b.slices,c=a.slices,g=0,k=0,l=[],m=[],n=function(a){for(var d=0;d<m.length;d++){var b=m[d],c=b.end;if(a<b.start||c<a)throw Error("slice should not be split");
var h=f.copySlice(b);h.start=a;h.duration=c-a;-1==h.title.indexOf(" (cont.)")&&(h.title+=" (cont.)");b.duration=a-b.start;m[d]=h;f.pushSlice(h)}},q=function(a){for(;0<l.length||0<m.length;){var d=l[l.length-1],b=m[m.length-1],d=d&&d.end,b=b&&b.end;if((void 0===d||d>a)&&(void 0===b||b>a))break;void 0===b||d<b?(n(d),l.pop()):m.pop()}};g<d.length||k<c.length;){var w=d[g],s=c[k];void 0===w||void 0!==s&&w.start>s.start?(w=f.copySlice(s),s=!0,k++):(w=f.copySlice(w),s=!1,g++);q(w.start);f.pushSlice(w);s?
m.push(w):(n(w.start),l.push(w))}q();return f};return{SliceGroup:e}});"use strict";
tv.exportTo("tv.c.trace_model",function(){function e(b,a,f,d,c,e,k){tv.c.trace_model.Slice.call(this,b,a,f,d,c,e);this.subSlices=void 0;this.isTopLevel=!0===k}e.prototype={__proto__:tv.c.trace_model.Slice.prototype,id:void 0,startThread:void 0,endThread:void 0,subSlices:void 0,get viewSubGroupTitle(){return this.title},get userFriendlyName(){return"Async slice "+this.title+" at "+tv.c.analysis.tsString(this.start)}};tv.c.trace_model.EventRegistry.register(e,{name:"asyncSlice",pluralName:"asyncSlices",
singleViewElementName:"tv-c-single-slice-sub-view",multiViewElementName:"tv-c-multi-slice-sub-view"});var c=new tv.b.ExtensionRegistryOptions(tv.b.TYPE_BASED_REGISTRY_MODE);c.mandatoryBaseClass=e;c.defaultConstructor=e;tv.b.decorateExtensionRegistry(e,c);return{AsyncSlice:e}});"use strict";
tv.exportTo("tv.c.trace_model",function(){function e(c,b){this.parentThread_=c;this.guid_=tv.b.GUID.allocate();this.slices=[];this.bounds=new tv.b.Range;this.name_=b;this.viewSubGroups_=void 0}e.prototype={__proto__:tv.c.trace_model.EventContainer.prototype,get guid(){return this.guid_},get parentThread(){return this.parentThread_},get model(){return this.parentThread_.parent.model},get stableId(){return this.parentThread_.stableId+".AsyncSliceGroup"},getSettingsKey:function(){if(this.name_){var c=
this.parentThread_.getSettingsKey();return!c?void 0:c+"."+this.name_}},push:function(c){this.slices.push(c)},get length(){return this.slices.length},shiftTimestampsForward:function(c){for(var b=0;b<this.slices.length;b++){var a=this.slices[b];a.start+=c;var f=function(a){if(!(void 0===a||0===a.length))for(var b=0;b<a.length;b++)a[b].start+=c,f(a[b].subSlices)};f(a.subSlices)}},updateBounds:function(){this.bounds.reset();for(var c=0;c<this.slices.length;c++)this.bounds.addValue(this.slices[c].start),
this.bounds.addValue(this.slices[c].end)},get viewSubGroups(){if(void 0===this.viewSubGroups_){for(var c="",c=void 0!==this.name?this.name+".":"",b={},a=0;a<this.slices.length;++a){var f=this.slices[a],d=f.viewSubGroupTitle;b[d]||(b[d]=new e(this.parentThread_,c+d));b[d].slices.push(f)}this.viewSubGroups_=tv.b.dictionaryValues(b)}return this.viewSubGroups_},iterateAllEvents:function(c,b){for(var a=0;a<this.slices.length;a++){var f=this.slices[a];c.call(b,f);f.subSlices&&f.subSlices.forEach(c,b)}},
iterateAllEventContainers:function(c){c(this)}};return{AsyncSliceGroup:e}});"use strict";
tv.exportTo("tv.c.trace_model",function(){function e(a,f,c,e,l,m,n,q){b.call(this,a,f,c,e,l,m,n,q);this.subSlices=[]}function c(d,b){function c(a,d,b,f,h,g,D,F){e.call(this,a,d,b,f,h,g,D,F);this.parentThread=k}this.guid_=tv.b.GUID.allocate();if(!d)throw Error("Parent must be provided.");this.parent=d;this.sortIndex=0;this.tid=b;this.samples_=this.name=void 0;var k=this;c.prototype={__proto__:e.prototype};this.sliceGroup=new a(this,c,"slices");this.timeSlices=void 0;this.kernelSliceGroup=new a(this,
void 0,"kernel-slices");this.asyncSliceGroup=new f(this,"async-slices");this.bounds=new tv.b.Range}var b=tv.c.trace_model.Slice,a=tv.c.trace_model.SliceGroup,f=tv.c.trace_model.AsyncSliceGroup,e=tv.c.trace_model.ThreadSlice;e.prototype={__proto__:b.prototype};c.prototype={__proto__:tv.c.trace_model.EventContainer.prototype,get guid(){return this.guid_},get stableId(){return this.parent.stableId+"."+this.tid},compareTo:function(a){return c.compare(this,a)},shiftTimestampsForward:function(a){this.sliceGroup.shiftTimestampsForward(a);
if(this.timeSlices)for(var b=0;b<this.timeSlices.length;b++)this.timeSlices[b].start+=a;this.kernelSliceGroup.shiftTimestampsForward(a);this.asyncSliceGroup.shiftTimestampsForward(a)},get isEmpty(){return this.sliceGroup.length||this.sliceGroup.openSliceCount||this.timeSlices&&this.timeSlices.length||this.kernelSliceGroup.length||this.asyncSliceGroup.length||this.samples_.length?!1:!0},updateBounds:function(){this.bounds.reset();this.sliceGroup.updateBounds();this.bounds.addRange(this.sliceGroup.bounds);
this.kernelSliceGroup.updateBounds();this.bounds.addRange(this.kernelSliceGroup.bounds);this.asyncSliceGroup.updateBounds();this.bounds.addRange(this.asyncSliceGroup.bounds);this.timeSlices&&this.timeSlices.length&&(this.bounds.addValue(this.timeSlices[0].start),this.bounds.addValue(this.timeSlices[this.timeSlices.length-1].end));this.samples_&&this.samples_.length&&(this.bounds.addValue(this.samples_[0].start),this.bounds.addValue(this.samples_[this.samples_.length-1].end))},addCategoriesToDict:function(a){for(var b=
0;b<this.sliceGroup.length;b++)a[this.sliceGroup.slices[b].category]=!0;for(b=0;b<this.kernelSliceGroup.length;b++)a[this.kernelSliceGroup.slices[b].category]=!0;for(b=0;b<this.asyncSliceGroup.length;b++)a[this.asyncSliceGroup.slices[b].category]=!0;if(this.samples_)for(b=0;b<this.samples_.length;b++)a[this.samples_[b].category]=!0},autoCloseOpenSlices:function(a){this.sliceGroup.autoCloseOpenSlices(a);this.kernelSliceGroup.autoCloseOpenSlices(a)},mergeKernelWithUserland:function(){if(0<this.kernelSliceGroup.length){var d=
a.merge(this.sliceGroup,this.kernelSliceGroup);this.sliceGroup.slices=d.slices;this.kernelSliceGroup=new a(this);this.updateBounds()}},createSubSlices:function(){this.sliceGroup.createSubSlices();this.samples_=this.parent.model.samples.filter(function(a){return a.thread==this},this)},get userFriendlyName(){return this.name||this.tid},get userFriendlyDetails(){return"tid: "+this.tid+(this.name?", name: "+this.name:"")},getSettingsKey:function(){if(this.name){var a=this.parent.getSettingsKey();return!a?
void 0:a+"."+this.name}},indexOfTimeSlice:function(a){var b=tv.b.findLowIndexInSortedArray(this.timeSlices,function(a){return a.start},a.start);return this.timeSlices[b]!==a?void 0:b},iterateAllEvents:function(a,b){this.sliceGroup.iterateAllEvents(a,b);this.kernelSliceGroup.iterateAllEvents(a,b);this.asyncSliceGroup.iterateAllEvents(a,b);this.timeSlices&&this.timeSlices.length&&this.timeSlices.forEach(a,b)},iterateAllPersistableObjects:function(a){a(this);this.sliceGroup.length&&a(this.sliceGroup);
this.asyncSliceGroup.viewSubGroups.forEach(a)},iterateAllEventContainers:function(a){a(this);this.sliceGroup.length&&this.sliceGroup.iterateAllEventContainers(a);this.kernelSliceGroup.length&&this.kernelSliceGroup.iterateAllEventContainers(a);this.asyncSliceGroup.length&&this.asyncSliceGroup.iterateAllEventContainers(a)},get samples(){return this.samples_}};c.compare=function(a,b){var f=a.parent.compareTo(b.parent);return f||(f=a.sortIndex-b.sortIndex)?f:(f=tv.b.comparePossiblyUndefinedValues(a.name,
b.name,function(a,d){return a.localeCompare(d)}))?f:a.tid-b.tid};return{Thread:c}});"use strict";
tv.exportTo("tv.c",function(){function e(b){this.model=b;this.objectsByKey_=[];this.nonuniqueKeys_=[];this.buildObjectsByKeyMap_();this.removeNonuniqueKeysFromSettings_();this.ephemeralSettingsByGUID_={}}var c=tv.b.Settings;e.prototype={buildObjectsByKeyMap_:function(){var b=[];this.model.iterateAllPersistableObjects(function(a){b.push(a)});for(var a={},f=0;f<b.length;f++){var d=b[f],c=d.getSettingsKey();c&&(a[c]=void 0===a[c]?d:"nonuniqueKey")}var e={};tv.b.dictionaryKeys(a).forEach(function(d){"nonuniqueKey"===
a[d]&&(delete a[d],e[d]=!0)});this.nonuniqueKeys=e;this.objectsByKey_=a},removeNonuniqueKeysFromSettings_:function(){var b=c.get("trace_model_settings",{}),a=!1;tv.b.dictionaryKeys(b).forEach(function(f){this.nonuniqueKeys[f]&&(a=!0,delete b[f])},this);a&&c.set("trace_model_settings",b)},hasUniqueSettingKey:function(b){b=b.getSettingsKey();return!b?!1:void 0!==this.objectsByKey_[b]},getSettingFor:function(b,a,f){var d=b.getSettingsKey();if(!d||!this.objectsByKey_[d])return b=this.getEphemeralSettingsFor_(b),
a=b[a],void 0!==a?a:f;b=c.get("trace_model_settings",{});b[d]||(b[d]={});a=b[d][a];return void 0!==a?a:f},setSettingFor:function(b,a,f){var d=b.getSettingsKey();!d||!this.objectsByKey_[d]?this.getEphemeralSettingsFor_(b)[a]=f:(b=c.get("trace_model_settings",{}),b[d]||(b[d]={}),b[d][a]!==f&&(b[d][a]=f,c.set("trace_model_settings",b)))},getEphemeralSettingsFor_:function(b){if(void 0===b.guid)throw Error("Only objects with GUIDs can be persisted");void 0===this.ephemeralSettingsByGUID_[b.guid]&&(this.ephemeralSettingsByGUID_[b.guid]=
{});return this.ephemeralSettingsByGUID_[b.guid]}};return{TraceModelSettings:e}});"use strict";
tv.exportTo("tv.c.trace_model",function(){function e(a){if(!a)throw Error("Must provide a model");this.guid_=tv.b.GUID.allocate();this.model=a;this.threads={};this.counters={};this.objects=new tv.c.trace_model.ObjectCollection(this);this.bounds=new tv.b.Range;this.sortIndex=0}var c=tv.c.trace_model.Thread,b=tv.c.trace_model.Counter;e.compare=function(a,b){return a.sortIndex-b.sortIndex};e.prototype={__proto__:tv.c.trace_model.EventContainer.prototype,get guid(){return this.guid_},get stableId(){throw Error("Not implemented");
},get numThreads(){var a=0,b;for(b in this.threads)a++;return a},shiftTimestampsForward:function(a){for(var b in this.threads)this.threads[b].shiftTimestampsForward(a);for(var d in this.counters)this.counters[d].shiftTimestampsForward(a);this.objects.shiftTimestampsForward(a)},autoCloseOpenSlices:function(a){for(var b in this.threads)this.threads[b].autoCloseOpenSlices(a)},autoDeleteObjects:function(a){this.objects.autoDeleteObjects(a)},preInitializeObjects:function(){this.objects.preInitializeAllObjects()},
initializeObjects:function(){this.objects.initializeAllObjects()},mergeKernelWithUserland:function(){for(var a in this.threads)this.threads[a].mergeKernelWithUserland()},updateBounds:function(){this.bounds.reset();for(var a in this.threads)this.threads[a].updateBounds(),this.bounds.addRange(this.threads[a].bounds);for(var b in this.counters)this.counters[b].updateBounds(),this.bounds.addRange(this.counters[b].bounds);this.objects.updateBounds();this.bounds.addRange(this.objects.bounds)},addCategoriesToDict:function(a){for(var b in this.threads)this.threads[b].addCategoriesToDict(a);
for(var d in this.counters)a[this.counters[d].category]=!0;this.objects.addCategoriesToDict(a)},findAllThreadsNamed:function(a){var b=[],d;for(d in this.threads){var c=this.threads[d];c.name==a&&b.push(c)}return b},pruneEmptyContainers:function(){var a={},b;for(b in this.threads){var d=this.threads[b];d.isEmpty||(a[b]=d)}this.threads=a},getThread:function(a){return this.threads[a]},getOrCreateThread:function(a){this.threads[a]||(this.threads[a]=new c(this,a));return this.threads[a]},getOrCreateCounter:function(a,
f){var d=a+"."+f;this.counters[d]||(this.counters[d]=new b(this,d,a,f));return this.counters[d]},getSettingsKey:function(){throw Error("Not implemented");},createSubSlices:function(){for(var a in this.threads)this.threads[a].createSubSlices()},iterateAllEvents:function(a,b){for(var d in this.threads)this.threads[d].iterateAllEvents(a,b);for(var c in this.counters)this.counters[c].iterateAllEvents(a,b);this.objects.iterateAllEvents(a,b)},iterateAllPersistableObjects:function(a){a(this);for(var b in this.threads)this.threads[b].iterateAllPersistableObjects(a)}};
return{ProcessBase:e}});"use strict";
tv.exportTo("tv.c.trace_model",function(){function e(a){if(void 0===a)throw Error("model must be provided");b.call(this,a);this.cpus={};this.softwareMeasuredCpuCount_=void 0}var c=tv.c.trace_model.Cpu,b=tv.c.trace_model.ProcessBase;e.compare=function(a,b){return 0};e.prototype={__proto__:b.prototype,compareTo:function(a){return e.compare(this,a)},get userFriendlyName(){return"Kernel"},get userFriendlyDetails(){return"Kernel"},get stableId(){return"Kernel"},getOrCreateCpu:function(a){this.cpus[a]||(this.cpus[a]=
new c(this,a));return this.cpus[a]},get softwareMeasuredCpuCount(){return this.softwareMeasuredCpuCount_},set softwareMeasuredCpuCount(a){if(void 0!==this.softwareMeasuredCpuCount_&&this.softwareMeasuredCpuCount_!==a)throw Error("Cannot change the softwareMeasuredCpuCount once it is set");this.softwareMeasuredCpuCount_=a},get bestGuessAtCpuCount(){var a=tv.b.dictionaryLength(this.cpus);return 0!==a?a:this.softwareMeasuredCpuCount},shiftTimestampsForward:function(a){b.prototype.shiftTimestampsForward.call(this,
a);for(var f in this.cpus)this.cpus[f].shiftTimestampsForward(a)},updateBounds:function(){b.prototype.updateBounds.call(this);for(var a in this.cpus){var f=this.cpus[a];f.updateBounds();this.bounds.addRange(f.bounds)}},createSubSlices:function(){b.prototype.createSubSlices.call(this);for(var a in this.cpus)this.cpus[a].createSubSlices()},addCategoriesToDict:function(a){b.prototype.addCategoriesToDict.call(this,a);for(var f in this.cpus)this.cpus[f].addCategoriesToDict(a)},getSettingsKey:function(){return"kernel"},
iterateAllEvents:function(a,f){for(var d in this.cpus)this.cpus[d].iterateAllEvents(a,f);b.prototype.iterateAllEvents.call(this,a,f)},iterateAllEventContainers:function(a){a(this)}};return{Kernel:e}});"use strict";
tv.exportTo("tv.c.trace_model",function(){function e(b,a){if(void 0===b)throw Error("model must be provided");if(void 0===a)throw Error("pid must be provided");tv.c.trace_model.ProcessBase.call(this,b);this.pid=a;this.name=void 0;this.labels=[];this.instantEvents=[];this.memoryDumps=[];this.frames=[]}var c=tv.c.trace_model.ProcessBase;e.compare=function(b,a){var f=tv.c.trace_model.ProcessBase.compare(b,a);return f||(f=tv.b.comparePossiblyUndefinedValues(b.name,a.name,function(a,b){return a.localeCompare(b)}))?
f:(f=tv.b.compareArrays(b.labels,a.labels,function(a,b){return a.localeCompare(b)}))?f:b.pid-a.pid};e.prototype={__proto__:tv.c.trace_model.ProcessBase.prototype,get stableId(){return this.pid},compareTo:function(b){return e.compare(this,b)},pushInstantEvent:function(b){this.instantEvents.push(b)},addLabelIfNeeded:function(b){for(var a=0;a<this.labels.length;a++)if(this.labels[a]===b)return;this.labels.push(b)},get userFriendlyName(){var b;b=this.name?this.name+" (pid "+this.pid+")":"Process "+this.pid;
this.labels.length&&(b+=": "+this.labels.join(", "));return b},get userFriendlyDetails(){return this.name?this.name+" (pid "+this.pid+")":"pid: "+this.pid},getSettingsKey:function(){return!this.name?void 0:!this.labels.length?"processes."+this.name:"processes."+this.name+"."+this.labels.join(".")},shiftTimestampsForward:function(b){for(var a in this.instantEvents)this.instantEvents[a].start+=b;for(a=0;a<this.frames.length;a++)this.frames[a].shiftTimestampsForward(b);for(a=0;a<this.memoryDumps.length;a++)this.memoryDumps[a].shiftTimestampsForward(b);
tv.c.trace_model.ProcessBase.prototype.shiftTimestampsForward.apply(this,arguments)},updateBounds:function(){tv.c.trace_model.ProcessBase.prototype.updateBounds.apply(this);for(var b=0;b<this.frames.length;b++)this.frames[b].addBoundsToRange(this.bounds);for(b=0;b<this.memoryDumps.length;b++)this.memoryDumps[b].addBoundsToRange(this.bounds)},iterateAllEvents:function(b,a){this.instantEvents.forEach(b,a);this.frames.forEach(b,a);this.memoryDumps.forEach(b,a);c.prototype.iterateAllEvents.call(this,
b,a)},iterateAllEventContainers:function(b){b(this);for(var a in this.threads)this.threads[a].iterateAllEventContainers(b)},sortMemoryDumps:function(){this.memoryDumps.sort(function(b,a){return b.start-a.start})}};return{Process:e}});"use strict";
tv.exportTo("tv.c.trace_model",function(){function e(c,b,a,f,d,e,g){tv.c.trace_model.TimedEvent.call(this,f);this.title=a;this.cpu=c;this.thread=b;this.leafStackFrame=d;this.weight=e;this.args=g||{}}e.prototype={__proto__:tv.c.trace_model.TimedEvent.prototype,get colorId(){return this.leafStackFrame.colorId},get stackTrace(){return this.leafStackFrame.stackTrace},getUserFriendlyStackTrace:function(){return this.leafStackFrame.getUserFriendlyStackTrace()},get userFriendlyName(){return"Sample  at "+
tv.c.analysis.tsString(this.start)}};tv.c.trace_model.EventRegistry.register(e,{name:"sample",pluralName:"samples",singleViewElementName:"tv-c-single-sample-sub-view",multiViewElementName:"tv-c-multi-sample-sub-view"});return{Sample:e}});"use strict";
tv.exportTo("tv.c.trace_model",function(){function e(c,b,a,f,d){if(void 0===b)throw Error("id must be given");this.parentFrame_=c;this.id=b;this.category=a||"";this.title=f;this.colorId=d;this.children=[];this.parentFrame_&&this.parentFrame_.addChild(this)}e.prototype={get parentFrame(){return this.parentFrame_},set parentFrame(c){this.parentFrame_&&this.parentFrame_.removeChild(this);(this.parentFrame_=c)&&this.parentFrame_.addChild(this)},addChild:function(c){this.children.push(c)},removeChild:function(c){c=
this.children.indexOf(c.id);if(-1==c)throw Error("omg");this.children.splice(c,1)},removeAllChildren:function(){for(var c=0;c<this.children.length;c++)this.children[c].parentFrame_=void 0;this.children.splice(0,this.children.length)},get stackTrace(){for(var c=[],b=this;b;)c.push(b),b=b.parentFrame;c.reverse();return c},getUserFriendlyStackTrace:function(){return this.stackTrace.map(function(c){return c.category+": "+c.title})}};return{StackFrame:e}});"use strict";
tv.exportTo("tv.c.trace_model",function(){function e(a,d,b,c,e){tv.c.trace_model.TimedEvent.call(this);this.category=a||"";this.title=d;this.colorId=b;this.start=c;this.args=e;this.type=void 0}function c(b,d,c,g,k){e.apply(this,arguments);this.type=a.GLOBAL}function b(b,d,c,g,k){e.apply(this,arguments);this.type=a.PROCESS}var a={GLOBAL:1,PROCESS:2};e.prototype={__proto__:tv.c.trace_model.TimedEvent.prototype};c.prototype={__proto__:e.prototype,get userFriendlyName(){return"Global instant event "+
this.title+" @ "+this.tsString(start)}};b.prototype={__proto__:e.prototype,get userFriendlyName(){return"Process-level instant event "+this.title+" @ "+this.tsString(start)}};tv.c.trace_model.EventRegistry.register(e,{name:"instantEvent",pluralName:"instantEvents",singleViewElementName:"tv-c-single-instant-event-sub-view",multiViewElementName:"tv-c-multi-instant-event-sub-view"});return{GlobalInstantEvent:c,ProcessInstantEvent:b,InstantEventType:a,InstantEvent:e}});"use strict";
tv.exportTo("tv.c.trace_model",function(){function e(c,b,a,f,d,e,g){tv.c.trace_model.TimedEvent.call(this,d);this.category=c||"";this.title=a;this.colorId=f;this.start=d;this.args=e;this.id=b;this.endSlice=this.startSlice=void 0;void 0!==g&&(this.duration=g)}e.prototype={__proto__:tv.c.trace_model.TimedEvent.prototype,get userFriendlyName(){return"Flow event named "+this.title+" at "+tv.c.analysis.tsString(this.timestamp)}};tv.c.trace_model.EventRegistry.register(e,{name:"flowEvent",pluralName:"flowEvents",
singleViewElementName:"tv-c-single-flow-event-sub-view",multiViewElementName:"tv-c-multi-flow-event-sub-view"});return{FlowEvent:e}});"use strict";
tv.exportTo("tv.c.trace_model",function(){function e(c,b,a){tv.c.trace_model.TimedEvent.call(this,b);this.model=c;this.processMemoryDumps={};this.args=a}e.prototype={__proto__:tv.c.trace_model.TimedEvent.prototype,shiftTimestampsForward:function(c){this.start+=c},get userFriendlyName(){return"Global memory dump  at "+tv.c.analysis.tsString(this.start)}};tv.c.trace_model.EventRegistry.register(e,{name:"globalMemoryDump",pluralName:"globalMemoryDumps",singleViewElementName:"tv-c-single-global-memory-dump-sub-view",
multiViewElementName:"tv-c-multi-global-memory-dump-sub-view"});return{GlobalMemoryDump:e}});"use strict";
tv.exportTo("tv.c.trace_model",function(){function e(a,d,b){tv.c.trace_model.TimedEvent.call(this,b);this.process=d;this.globalMemoryDump=a;this.vmRegions=this.totalResidentBytes=void 0;this.memoryAllocatorDumps=[];this.memoryAllocatorDumpsByFullName={}}function c(a,d,b,c,e){this.fullName=a;this.parent=e;this.children=[];this.physicalSizeInBytes=d;this.allocatedObjectsCount=b;this.allocatedObjectsSizeInBytes=c}function b(a,d,b,c,e){this.startAddress=a;this.sizeInBytes=d;this.protectionFlags=b;this.mappedFile=
c;this.byteStats=e}function a(a,d,b){this.privateResident=a;this.sharedResident=d;this.proportionalResident=b}e.prototype={__proto__:tv.c.trace_model.TimedEvent.prototype,shiftTimestampsForward:function(a){this.start+=a},get userFriendlyName(){return"Process memory dump  at "+tv.c.analysis.tsString(this.start)}};c.prototype={get name(){return this.fullName.substring(this.fullName.lastIndexOf("/")+1)}};b.PROTECTION_FLAG_READ=4;b.PROTECTION_FLAG_WRITE=2;b.PROTECTION_FLAG_EXECUTE=1;b.prototype={get protectionFlagsToString(){return(this.protectionFlags&
b.PROTECTION_FLAG_READ?"r":"-")+(this.protectionFlags&b.PROTECTION_FLAG_WRITE?"w":"-")+(this.protectionFlags&b.PROTECTION_FLAG_EXECUTE?"x":"-")}};a.prototype={get totalResident(){return this.privateResident+this.sharedResident}};tv.c.trace_model.EventRegistry.register(e,{name:"processMemoryDump",pluralName:"processMemoryDumps",singleViewElementName:"tv-c-single-process-memory-dump-sub-view",multiViewElementName:"tv-c-multi-process-memory-dump-sub-view"});return{ProcessMemoryDump:e,MemoryAllocatorDump:c,
VMRegion:b,VMRegionByteStats:a}});"use strict";tv.exportTo("tv.c.trace_model",function(){return{AlertType:function(e,c,b,a){this.title=e;this.description=c;this.severity=b;this.colorId=void 0!==a?a:tv.b.ui.getColorIdForGeneralPurposeString(e)},ALERT_SEVERITY:{CRITICAL:"critical",WARNING:"warning"}}});"use strict";
tv.exportTo("tv.c.trace_model",function(){function e(c,b,a){tv.c.trace_model.TimedEvent.call(this,b);this.type=c;this.args=void 0!==a?a:{};this.duration=0}e.prototype={__proto__:tv.c.trace_model.TimedEvent.prototype,get title(){return this.type.title},get colorId(){return this.type.colorId},get userFriendlyName(){return"Alert "+this.title+" at "+tv.c.analysis.tsString(this.start)}};tv.c.trace_model.EventRegistry.register(e,{name:"alert",pluralName:"alerts",singleViewElementName:"tv-c-single-alert-sub-view",
multiViewElementName:"tv-c-multi-alert-sub-view"});return{Alert:e}});"use strict";
tv.exportTo("tv.c.trace_model",function(){function e(c,b,a,f){tv.c.trace_model.TimedEvent.call(this,a);this.title=c;this.colorId=b;this.duration=f}e.prototype={__proto__:tv.c.trace_model.TimedEvent.prototype,get subSlices(){return[]},get userFriendlyName(){return this.title+" interaction at "+tv.c.analysis.tsString(this.start)}};tv.c.trace_model.EventRegistry.register(e,{name:"interaction",pluralName:"interactions",singleViewElementName:"tv-c-single-interaction-record-sub-view",multiViewElementName:"tv-c-multi-interaction-record-sub-view"});
return{InteractionRecord:e}});"use strict";
tv.exportTo("tv.c",function(){function e(){this.pruneEmptyContainers=this.shiftWorldToZero=!0;this.customizeModelCallback=void 0;this.auditorConstructors=tv.c.Auditor.getAllRegisteredTypeInfos().map(function(a){return a.constructor})}function c(b,d){this.faviconHue="blue";this.kernel=new a(this);this.processes={};this.metadata=[];this.categories=[];this.bounds=new tv.b.Range;this.instantEvents=[];this.flowEvents=[];this.clockSyncRecords=[];this.stackFrames={};this.samples=[];this.alerts=[];this.interaction_records=
[];this.flowIntervalTree=new tv.b.IntervalTree(function(a){return a.start},function(a){return a.end});this.globalMemoryDumps=[];this.annotationsByGuid_={};this.importWarnings_=[];this.reportedImportWarnings_={};var c=e.fromArguments(arguments,1);b&&this.importTraces([b],c)}var b=tv.c.trace_model.Process,a=tv.c.trace_model.Kernel;e.fromArguments=function(a,d){var b=a[d+0];if("object"===typeof b){if(!(b instanceof e))throw Error("Unexpected");return b}b=new e;void 0!==a[d]&&(b.shiftWorldToZero=a[d]);
void 0!==a[d+1]&&(b.pruneEmptyContainers=a[d+1]);a[d+2]&&(b.customizeModelCallback=a[d+2]);return b};c.prototype={__proto__:tv.b.EventTarget.prototype,get numProcesses(){var a=0,d;for(d in this.processes)a++;return a},getProcess:function(a){return this.processes[a]},getOrCreateProcess:function(a){this.processes[a]||(this.processes[a]=new b(this,a));return this.processes[a]},pushInstantEvent:function(a){this.instantEvents.push(a)},addStackFrame:function(a){if(this.stackFrames[a.id])throw Error("Stack frame already exists");
return this.stackFrames[a.id]=a},addInteractionRecord:function(a){this.interaction_records.push(a)},getClockSyncRecordsNamed:function(a){return this.clockSyncRecords.filter(function(d){return d.name===a})},updateCategories_:function(){var a={};this.kernel.addCategoriesToDict(a);for(var d in this.processes)this.processes[d].addCategoriesToDict(a);this.categories=[];for(var b in a)""!=b&&this.categories.push(b)},updateBounds:function(){this.bounds.reset();this.kernel.updateBounds();this.bounds.addRange(this.kernel.bounds);
for(var a in this.processes)this.processes[a].updateBounds(),this.bounds.addRange(this.processes[a].bounds);for(a=0;a<this.globalMemoryDumps.length;a++)this.globalMemoryDumps[a].addBoundsToRange(this.bounds);this.flowEvents.forEach(function(a){this.bounds.addValue(a.start);this.bounds.addValue(a.end)},this);this.alerts.forEach(function(a){this.bounds.addValue(a.start);this.bounds.addValue(a.end)},this);this.interaction_records.forEach(function(a){this.bounds.addValue(a.start);this.bounds.addValue(a.end)},
this)},shiftWorldToZero:function(){if(!this.bounds.isEmpty){var a=this.bounds.min;this.kernel.shiftTimestampsForward(-a);for(var d in this.instantEvents)this.instantEvents[d].start-=a;for(var b in this.processes)this.processes[b].shiftTimestampsForward(-a);for(d=0;d<this.samples.length;d++)this.samples[d].start-=a;this.flowEvents.forEach(function(d){d.start-=a});this.alerts.forEach(function(d){d.start-=a});this.interaction_records.forEach(function(d){d.start-=a});for(d=0;d<this.globalMemoryDumps.length;d++)this.globalMemoryDumps[d].shiftTimestampsForward(-a);
this.updateBounds()}},getAllThreads:function(){var a=[],d;for(d in this.kernel.threads)a.push(c.threads[d]);for(var b in this.processes){var c=this.processes[b];for(d in c.threads)a.push(c.threads[d])}return a},getAllProcesses:function(){var a=[],d;for(d in this.processes)a.push(this.processes[d]);return a},getAllCounters:function(){var a=[];a.push.apply(a,tv.b.dictionaryValues(this.kernel.counters));for(var d in this.processes){var b=this.processes[d],c;for(c in b.counters)a.push(b.counters[c])}return a},
getAnnotationByGUID:function(a){return this.annotationsByGuid_[a]},addAnnotation:function(a){if(!a.guid)throw Error("Annotation with undefined guid given");this.annotationsByGuid_[a.guid]=a;tv.b.dispatchSimpleEvent(this,"annotationChange")},removeAnnotation:function(a){delete this.annotationsByGuid_[a.guid];tv.b.dispatchSimpleEvent(this,"annotationChange")},getAllAnnotations:function(){return tv.b.dictionaryValues(this.annotationsByGuid_)},findAllThreadsNamed:function(a){var d=[];d.push.apply(d,this.kernel.findAllThreadsNamed(a));
for(var b in this.processes)d.push.apply(d,this.processes[b].findAllThreadsNamed(a));return d},createImporter_:function(a){var d=tv.c.importer.Importer.findImporterFor(a);if(!d)throw Error("Could not find an importer for the provided eventData.");return new d(this,a)},importTraces:function(a,d){var b=e.fromArguments(arguments,1),b=this.createImportTracesTask({update:function(a){}},a,b);tv.b.Task.RunSynchronously(b)},importTracesWithProgressDialog:function(a,d){var b=e.fromArguments(arguments,1),c=
tv.b.ui.Overlay();c.title="Importing...";c.userCanClose=!1;c.msgEl=document.createElement("div");c.appendChild(c.msgEl);c.msgEl.style.margin="20px";c.update=function(a){this.msgEl.textContent=a};c.visible=!0;b=this.createImportTracesTask(c,a,b);b=tv.b.Task.RunWhenIdle(b);b.then(function(){c.visible=!1},function(a){c.visible=!1});return b},hasEventDataDecoder_:function(a){if(0===a.length)return!1;for(var d=0;d<a.length;++d)if(!a[d].isTraceDataContainer())return!0;return!1},createImportTracesTask:function(a,
d,b){var c=e.fromArguments(arguments,2);if(this.importing_)throw Error("Already importing.");this.importing_=!0;var k=new tv.b.Task(function(){a.update("I will now import your traces for you...")},this),l,m=[];l=k.after(function(){d=d.slice(0);a.update("Creating importers...");for(var b=0;b<d.length;++b)m.push(this.createImporter_(d[b]));for(b=0;b<m.length;b++)for(var c=m[b].extractSubtraces(),e=0;e<c.length;e++)try{d.push(c[e]),m.push(this.createImporter_(c[e]))}catch(h){console.warn(h.name+": "+
h.message)}if(d.length&&!this.hasEventDataDecoder_(m))throw Error("Could not find an importer for the provided eventData.");m.sort(function(a,d){return a.importPriority-d.importPriority})},this);l=l.after(function(d){m.forEach(function(b,c){d.subTask(function(){a.update("Importing "+(c+1)+" of "+m.length);b.importEvents()},this)},this)},this);c.customizeModelCallback&&(l=l.after(function(a){c.customizeModelCallback(this)},this));l=l.after(function(d){m.forEach(function(d,b){a.update("Importing sample data "+
(b+1)+"/"+m.length);d.importSampleData()},this)},this);l=l.after(function(){a.update("Autoclosing open slices...");this.samples.sort(function(a,d){return a.start-d.start});this.updateBounds();this.kernel.autoCloseOpenSlices(this.bounds.max);for(var d in this.processes)this.processes[d].autoCloseOpenSlices(this.bounds.max);this.kernel.createSubSlices();for(d in this.processes)this.processes[d].createSubSlices()},this);l=l.after(function(d){m.forEach(function(d,b){a.update("Finalizing import "+(b+1)+
"/"+m.length);d.finalizeImport()},this)},this);l=l.after(function(){a.update("Initializing objects (step 1/2)...");for(var d in this.processes)this.processes[d].preInitializeObjects()},this);c.pruneEmptyContainers&&(l=l.after(function(){a.update("Pruning empty containers...");this.kernel.pruneEmptyContainers();for(var d in this.processes)this.processes[d].pruneEmptyContainers()},this));l=l.after(function(){a.update("Merging kernel with userland...");for(var d in this.processes)this.processes[d].mergeKernelWithUserland()},
this);var n=[];l=l.after(function(){a.update("Adding arbitrary data to model...");n=c.auditorConstructors.map(function(a){return new a(this)},this);n.forEach(function(a){a.runAnnotate()})},this);l=l.after(function(){a.update("Computing final world bounds...");this.updateBounds();this.updateCategories_();c.shiftWorldToZero&&this.shiftWorldToZero()},this);l=l.after(function(){a.update("Building flow event map...");for(var d=0;d<this.flowEvents.length;++d)this.flowIntervalTree.insert(this.flowEvents[d]);
this.flowIntervalTree.updateHighValues()},this);l=l.after(function(){a.update("Joining object refs...");for(var d=0;d<m.length;d++)m[d].joinRefs()},this);l=l.after(function(){a.update("Cleaning up undeleted objects...");for(var d in this.processes)this.processes[d].autoDeleteObjects(this.bounds.max)},this);l=l.after(function(){a.update("Sorting memory dumps...");this.globalMemoryDumps.sort(function(a,d){return a.start-d.start});for(var d in this.processes)this.processes[d].sortMemoryDumps()},this);
l=l.after(function(){a.update("Initializing objects (step 2/2)...");for(var d in this.processes)this.processes[d].initializeObjects()},this);l=l.after(function(){a.update("Running auditors...");n.forEach(function(a){a.runAudit()});this.interaction_records.sort(function(a,d){return a.start-d.start});this.alerts.sort(function(a,d){return a.start-d.start});this.updateBounds()},this);l.after(function(){this.importing_=!1},this);return k},importWarning:function(a){this.importWarnings_.push(a);!0!==this.reportedImportWarnings_[a.type]&&
(console.warn(a.message),this.reportedImportWarnings_[a.type]=!0)},get hasImportWarnings(){return 0<this.importWarnings_.length},get importWarnings(){return this.importWarnings_},iterateAllEvents:function(a,d){this.instantEvents.forEach(a,d);this.kernel.iterateAllEvents(a,d);for(var b in this.processes)this.processes[b].iterateAllEvents(a,d);this.samples.forEach(a,d);this.globalMemoryDumps.forEach(a,d)},iterateAllPersistableObjects:function(a){this.kernel.iterateAllPersistableObjects(a);for(var d in this.processes)this.processes[d].iterateAllPersistableObjects(a)},
iterateAllEventContainers:function(a){this.kernel.iterateAllEventContainers(a);for(var d in this.processes)this.processes[d].iterateAllEventContainers(a)}};return{ImportOptions:e,ClockSyncRecord:function(a,d,b){this.name=a;this.ts=d;this.args=b},TraceModel:c}});"use strict";
tv.exportTo("tv.c",function(){function e(a){this.sunburst_zoom_level=void 0;this.bounds_dirty_=!0;this.bounds_=new tv.b.Range;this.length_=0;this.guid_=tv.b.GUID.allocate();this.pushed_guids_={};if(a)if(a instanceof Array)for(var b=0;b<a.length;b++)this.push(a[b]);else this.push(a)}var c=tv.c.trace_model.EventRegistry,b=tv.b.Event.bind(void 0,"requestSelectionChange",!0,!1);e.prototype={__proto__:Object.prototype,get bounds(){if(this.bounds_dirty_){this.bounds_.reset();for(var a=0;a<this.length_;a++)this[a].addBoundsToRange(this.bounds_);
this.bounds_dirty_=!1}return this.bounds_},get duration(){return this.bounds_.isEmpty?0:this.bounds_.max-this.bounds_.min},get length(){return this.length_},get guid(){return this.guid_},clear:function(){for(var a=0;a<this.length_;++a)delete this[a];this.length_=0;this.bounds_dirty_=!0},push:function(a){if(void 0==a.guid)throw Error("Event must have a GUID");if(this.contains(a))return a;this.pushed_guids_[a.guid]=!0;this[this.length_++]=a;this.bounds_dirty_=!0;return a},contains:function(a){return this.pushed_guids_[a.guid]},
addSelection:function(a){for(var b=0;b<a.length;b++)this.push(a[b])},subSelection:function(a,b){b=b||1;var d=new e;d.bounds_dirty_=!0;if(0>a||a+b>this.length_)throw Error("Index out of bounds");for(var c=a;c<a+b;c++)d.push(this[c]);return d},getEventsOrganizedByBaseType:function(a){var b={},d=c.getAllRegisteredTypeInfos();d.forEach(function(a){b[a.metadata.name]=new e;void 0!==this.sunburst_zoom_level&&(b[a.metadata.name].sunburst_zoom_level=this.sunburst_zoom_level)},this);this.forEach(function(a,
c){var e=-1,h=void 0;d.forEach(function(d,b){a instanceof d.constructor&&b>e&&(e=b,h=d)});if(-1==e)throw Error("Unrecgonized event type");b[h.metadata.name].push(a)});if(a){a={};for(var h in b)0<b[h].length&&(a[h]=b[h]);return a}return b},getEventsOrganizedByTitle:function(){for(var a={},b=0;b<this.length;b++){var d=this[b];if(void 0===d.title)throw Error("An event didn't have a title!");void 0==a[d.title]&&(a[d.title]=[]);a[d.title].push(d)}return a},enumEventsOfType:function(a,b){for(var d=0;d<
this.length_;d++)this[d]instanceof a&&b(this[d])},get userFriendlyName(){if(0===this.length)throw Error("Empty selection");var a=this.getEventsOrganizedByBaseType(!0),b=tv.b.dictionaryKeys(a)[0];if(1===this.length)return a=c.getUserFriendlySingularName(b),this[0].userFriendlyName;if(1!==tv.b.dictionaryLength(a))return this.length+" events of various types";a=c.getUserFriendlyPluralName(b);return this.length+" "+a},getShiftedSelection:function(a,b){for(var d=new e,c=0;c<this.length_;c++){var g=this[c];
if(g instanceof tv.c.trace_model.FlowEvent)if(0<b&&g.nextFlowEvent){d.push(g.nextFlowEvent);continue}else if(0>b&&g.previousFlowEvent){d.push(g.previousFlowEvent);continue}a.trackForEvent(g).addItemNearToProvidedEventToSelection(g,b,d)}return 0==d.length?void 0:d},forEach:function(a,b){for(var d=0;d<this.length;d++)a.call(b,this[d],d)},map:function(a,b){for(var d=[],c=0;c<this.length;c++)d.push(a.call(b,this[c],c));return d},every:function(a,b){for(var d=0;d<this.length;d++)if(!a.call(b,this[d],d))return!1;
return!0},some:function(a,b){for(var d=0;d<this.length;d++)if(a.call(b,this[d],d))return!0;return!1}};return{Selection:e,RequestSelectionChangeEvent:b}});"use strict";
Polymer("tv-c-analysis-link",{ready:function(){this.addEventListener("click",this.onClicked_.bind(this));this.selection_=void 0},get selection(){return this.selection_},set selection(e){this.selection_=e;this.textContent=e.userFriendlyName},setSelectionAndContent:function(e,c){this.selection_=e;c&&(this.textContent=c)},onClicked_:function(){if(this.selection_){var e=new tv.c.RequestSelectionChangeEvent;e.selection="function"===typeof this.selection_?this.selection_():this.selection_;this.dispatchEvent(e)}}});
"use strict";
Polymer("tv-c-analysis-generic-object-view",{ready:function(){this.object_=void 0},get object(){return this.object_},set object(e){this.object_=e;this.updateContents_()},updateContents_:function(){this.shadowRoot.textContent="";this.appendElementsForType_("",this.object_,0,0,5,"")},appendElementsForType_:function(e,c,b,a,f,d){if(a>f)this.appendSimpleText_(e,b,"<recursion limit reached>",d);else if(void 0===c)this.appendSimpleText_(e,b,"undefined",d);else if(null===c)this.appendSimpleText_(e,b,"null",
d);else{if(!(c instanceof Object))if("string"==typeof c){var h=!1;if("{"==c[0]&&"}"==c[c.length-1]||"["==c[0]&&"]"==c[c.length-1])try{c=JSON.parse(c),h=!0}catch(g){}if(!h)return this.appendSimpleText_(e,b,'"'+c+'"',d)}else return this.appendSimpleText_(e,b,c,d);c instanceof tv.c.trace_model.ObjectSnapshot?(a=document.createElement("tv-c-analysis-link"),a.selection=new tv.c.Selection(c),this.appendElementWithLabel_(e,b,a,d)):c instanceof tv.c.trace_model.ObjectInstance?(a=document.createElement("tv-c-analysis-link"),
a.selection=new tv.c.Selection(c),this.appendElementWithLabel_(e,b,a,d)):c instanceof tv.b.Rect?this.appendSimpleText_(e,b,c.toString(),d):c instanceof Array?this.appendElementsForArray_(e,c,b,a,f,d):this.appendElementsForObject_(e,c,b,a,f,d)}},appendElementsForArray_:function(e,c,b,a,f,d){if(0==c.length)this.appendSimpleText_(e,b,"[]",d);else{this.appendElementsForType_(e+"[",c[0],b,a+1,f,1<c.length?",":"]"+d);for(var h=1;h<c.length;h++)this.appendElementsForType_("",c[h],b+e.length+1,a+1,f,h<c.length-
1?",":"]"+d)}},appendElementsForObject_:function(e,c,b,a,f,d){var h=tv.b.dictionaryKeys(c);if(0==h.length)this.appendSimpleText_(e,b,"{}",d);else{this.appendElementsForType_(e+"{"+h[0]+": ",c[h[0]],b,a,f,1<h.length?",":"}"+d);for(var g=1;g<h.length;g++)this.appendElementsForType_(h[g]+": ",c[h[g]],b+e.length+1,a+1,f,g<h.length-1?",":"}"+d)}},appendElementWithLabel_:function(e,c,b,a){var f=document.createElement("div"),d=document.createElement("span");d.style.whiteSpace="pre";for(var h=0;h<c;h++)d.textContent+=
" ";f.appendChild(d);c=document.createElement("span");c.textContent=e;f.appendChild(c);f.appendChild(b);e=document.createElement("span");e.textContent=a;f.appendChild(e);f.dataElement=b;this.shadowRoot.appendChild(f)},appendSimpleText_:function(e,c,b,a){var f=this.ownerDocument.createElement("span");f.textContent=b;this.appendElementWithLabel_(e,c,f,a);return f}});"use strict";
Polymer("tv-c-analysis-generic-object-view-with-label",{ready:function(){this.labelEl_=document.createElement("div");this.genericObjectView_=document.createElement("tv-c-analysis-generic-object-view");this.shadowRoot.appendChild(this.labelEl_);this.shadowRoot.appendChild(this.genericObjectView_)},get label(){return this.labelEl_.textContent},set label(e){this.labelEl_.textContent=e},get object(){return this.genericObjectView_.object},set object(e){this.genericObjectView_.object=e}});"use strict";
Polymer("tv-c-a-stack-frame",{ready:function(){this.stackFrame_=void 0},get stackFrame(){return this.stackFrame_},set stackFrame(e){this.stackFrame_=e;this.$.ov.object=e.getUserFriendlyStackTrace()}});"use strict";
Polymer("tracing-analysis-toggle-container",{publish:{visible:{value:!1,reflect:!0}},created:function(){this.toggleListeners_=[]},toggleVisible:function(){this.visible=!this.visible},setToggleListener:function(e,c){var b=this.toggleVisible.bind(this);e.addEventListener(c,b,!1);this.toggleListeners_.push({target:e,eventType:c,listenerFunction:b})},clearToggleListener:function(e,c){for(var b=0;b<this.toggleListeners_.length;b++){var a=this.toggleListeners_[b];if(a.target===e&&a.eventType===c){e.removeEventListener(a.eventType,
a.listenerFunction,!1);this.toggleListeners_.splice(b,1);break}}}});"use strict";
(function(){var e=String.fromCharCode(9654),c=String.fromCharCode(9663),b=String.fromCharCode(9662),a=String.fromCharCode(9652);Polymer("tracing-analysis-nested-table",{created:function(){this.tableColumns_=[];this.tableRows_=[];this.tableRowsInfo_=[];this.tableFooterRows_=[];this.sortColumnIndex_=void 0;this.sortDescending_=!1;this.columnsWithExpandButtons_=[];this.headerCells_=[];this.showHeader_=!0},clear:function(){this.textContent="";this.tableColumns_=[];this.tableRows_=[];this.tableRowsInfo_=
[];this.tableFooterRows_=[];this.sortColumnIndex_=void 0;this.sortDescending_=!1;this.columnsWithExpandButtons_=[];this.headerCells_=[];this.rowClickCallback_=void 0},get showHeader(){return this.showHeader_},set showHeader(a){this.showHeader_=a;this.scheduleRebuildHeaders_()},set tableColumns(a){for(var d=[],b=0;b<a.length;b++)a[b].showExpandButtons&&d.push(b);0===d.length&&(d=[0]);for(b=0;b<a.length;b++){var c=a[b];if(void 0!==c.width){var e=-1!==d.indexOf(b);if((c=c.width)&&!/\d+px/.test(c))if(/\d+%/.test(c)){if(e)throw Error("Columns cannot be %-sized and host  an expand button");
}else throw Error("Unrecognized width string");}}this.tableColumns_=a;this.columnsWithExpandButtons_=d;this.sortColumnIndex=void 0;this.scheduleRebuildHeaders_()},get tableColumns(){return this.tableColumns_},set tableRows(a){this.tableRows_=a;this.tableRowsInfo_=[];this.createTableRowsInfo_(a,this.tableRowsInfo_);void 0!==this.sortColumnIndex_&&this.sortTable_();this.scheduleRebuildBody_()},get tableRows(){return this.tableRows_},set footerRows(a){this.tableFooterRows_=a;this.tableFooterRowsInfo_=
[];this.createTableRowsInfo_(a,this.tableFooterRowsInfo_);this.scheduleRebuildFooter_()},get footerRows(){return this.tableFooterRows_},set sortColumnIndex(a){if(void 0===a)this.sortColumnIndex_=void 0,this.updateHeaderArrows_();else{if(this.tableColumns_.length<=a)throw Error("Column number "+a+" is out of bounds.");if(!this.tableColumns_[a].cmp)throw Error("Column "+a+" does not have a comparator.");this.sortColumnIndex_=a;this.updateHeaderArrows_();this.sortTable_()}},get sortColumnIndex(){return this.sortColumnIndex_},
set sortDescending(a){a=!!a;a!==this.sortDescending_&&(this.sortDescending_=a,this.updateHeaderArrows_(),void 0!==this.sortColumnIndex_&&this.sortTable_())},get sortDescending(){return this.sortDescending_},set rowClickCallback(a){this.rowClickCallback_=a},get rowClickCallback(){return this.rowClickCallback_},updateHeaderArrows_:function(){for(var f=0;f<this.headerCells_.length;f++)this.headerCells_[f].sideContent=this.tableColumns_[f].cmp?f!==this.sortColumnIndex_?c:this.sortDescending_?a:b:""},
sortTable_:function(){this.sortRows_(this.tableRowsInfo_);this.scheduleRebuildBody_()},sortRows_:function(a){a.sort(function(a,d){return this.sortDescending_?this.tableColumns_[this.sortColumnIndex_].cmp(d.userRow,a.userRow):this.tableColumns_[this.sortColumnIndex_].cmp(a.userRow,d.userRow)}.bind(this));for(var d=0;d<a.length;d++)a[d].isExpanded&&this.sortRows_(a[d].subRows)},generateHeaderColumns_:function(){this.headerCells_=[];this.$.head.textContent="";if(this.showHeader_)for(var f=this.appendNewElementAfter_(this.$.head,
"tr"),d=0;d<this.tableColumns_.length;d++){var e=this.appendNewElementAfter_(f,"td"),g=new TracingAnalysisHeaderCell;g.cellTitle=this.showHeader?this.tableColumns_[d].title:"";this.tableColumns_[d].cmp&&(e.classList.add("sensitive"),g.tapCallback=this.createSortCallback_(d),g.sideContent=this.sortColumnIndex_===d?this.sortDescending_?a:b:c);e.appendChild(g);this.headerCells_.push(g)}},applySizes_:function(){var a,d;this.showHeader?(d=this.$.head.children[0],a=this.$.body.children[0]):(d=this.$.body.children[0],
a=this.$.head.children[0]);for(var b=0;b<this.tableColumns_.length;b++){if(a&&a.children[b]){var c=a.children[b];c.style.minWidth="";c.style.width=""}var e=d.children[b];c=-1!==this.columnsWithExpandButtons_.indexOf(b)?e.style.paddingLeft="8px":void 0;var l=this.tableColumns_[b].width;if(l)if(/\d+px/.test(l))e=e.style,c=c?"calc("+l+" - "+c+")":l,e.minWidth=c;else if(/\d+%/.test(l))e.style.width=l;else throw Error("Unrecognized width string: "+l);}},createSortCallback_:function(a){return function(){var d=
this.sortColumnIndex;this.sortColumnIndex=a;this.sortDescending=d!==a?!1:!this.sortDescending}.bind(this)},generateTableRowNodes_:function(a,d,b,c){for(var e=0;e<d.length;e++){var l=d[e];this.generateRowNode_(a,l,b);this.appendElementAfter_(a,l.htmlNode,c);c=l.isExpanded?this.generateTableRowNodes_(a,l.subRows,b+1,l.htmlNode):l.htmlNode}return c},generateRowNode_:function(a,d,b){if(d.htmlNode)return d.htmlNode;var c=16*b,k=16*b+8,l=this.ownerDocument.createElement("tr");d.htmlNode=l;d.indentation=
b;for(b=0;b<this.tableColumns_.length;){var m=this.appendNewElementAfter_(l,"td"),n=this.tableColumns_[b],q=n.value(d.userRow),n=n.colSpan?n.colSpan:1;m.style.colSpan=n;if(-1!=this.columnsWithExpandButtons_.indexOf(b))if(0<d.subRows.length){m.style.paddingLeft=c+"px";var w=this.appendNewElementAfter_(m,"expand-button");w.textContent=e;d.isExpanded&&w.classList.add("button-expanded");this.addToggleListenerForRowToButton_(a,d,w)}else m.style.paddingLeft=k+"px";q instanceof HTMLElement?m.appendChild(q):
m.appendChild(this.ownerDocument.createTextNode(q));b+=n}var s=this;l.addEventListener("click",function(a){s.rowClickCallback_&&s.rowClickCallback_(a)})},addToggleListenerForRowToButton_:function(a,d,b){b.parentElement.addEventListener("click",function(){d.isExpanded=!d.isExpanded;d.isExpanded?(b.classList.add("button-expanded"),void 0!==this.sortColumnIndex_&&this.sortRows_(d.subRows),this.generateTableRowNodes_(a,d.subRows,d.indentation+1,d.htmlNode)):(b.classList.remove("button-expanded"),this.removeSubNodes_(a,
d))}.bind(this))},removeSubNodes_:function(a,d){for(var b=0;b<d.subRows.length;b++){var c=d.subRows[b].htmlNode;c&&c.parentNode===a&&(a.removeChild(d.subRows[b].htmlNode),this.removeSubNodes_(a,d.subRows[b]))}},scheduleRebuildHeaders_:function(){this.headerDirty_=!0;this.scheduleRebuild_()},scheduleRebuildBody_:function(){this.bodyDirty_=!0;this.scheduleRebuild_()},scheduleRebuildFooter_:function(){this.footerDirty_=!0;this.scheduleRebuild_()},scheduleRebuild_:function(){this.rebuildPending_||(this.rebuildPending_=
!0,setTimeout(function(){this.rebuildPending_=!1;this.rebuild()}.bind(this),0))},rebuild:function(){var a=this.headerDirty_||this.bodyDirty_;this.headerDirty_&&(this.generateHeaderColumns_(),this.headerDirty_=!1);this.bodyDirty_&&(this.generateTableRowNodes_(this.$.body,this.tableRowsInfo_,0),this.bodyDirty_=!1);a&&this.applySizes_();this.footerDirty_&&(this.generateTableRowNodes_(this.$.foot,this.tableFooterRowsInfo_,0),this.tableFooterRowsInfo_.length?this.$.body.classList.add("has-footer"):this.$.body.classList.remove("has-footer"),
this.footerDirty_=!1)},createTableRowsInfo_:function(a,d){for(var b=0;b<a.length;b++){var c=[];a[b].subRows&&this.createTableRowsInfo_(a[b].subRows,c);d.push({userRow:a[b],htmlNode:void 0,subRows:c,isExpanded:a[b].isExpanded||!1})}},appendElementAfter_:function(a,d,b){var c=void 0;b&&(c=b.nextSibling);a.insertBefore(d,c)},appendNewElementAfter_:function(a,b,c){b=a.ownerDocument.createElement(b);this.appendElementAfter_(a,b,c);return b}})})();"use strict";
Polymer("tracing-analysis-header-cell",{created:function(){this.tapCallback_=void 0;this.cellTitle_=""},set cellTitle(e){this.cellTitle_=e},get cellTitle(){return this.cellTitle_},clearSideContent:function(){this.$.side.textContent=""},set sideContent(e){this.$.side.textContent=e},get sideContent(){return this.$.side.textContent},set tapCallback(e){this.style.cursor="pointer";this.tapCallback_=e},get tapCallback(){return this.tapCallback_},onTap_:function(){this.tapCallback_&&this.tapCallback_()}});
"use strict";
tv.exportTo("tv.b.ui",function(){function e(a,d){return b(a,d)}function c(a,d){return b(d,a)}function b(a,b){var c=parseFloat(a),e=parseFloat(b);return isNaN(c)&&isNaN(e)?a.toString().localeCompare(b.toString()):isNaN(c)?-1:isNaN(e)?1:c-e}var a=tv.b.ui.define("sortable-table");a.prototype={__proto__:HTMLTableElement.prototype,decorate:function(){this.classList.add("sortable-table");if(this.tHead){for(var a=this.tHead.rows[0],b=window.history.state,c=0;c<a.cells.length;c++)a.cells[c].addEventListener("click",this.onItemClicked_,
!0),a.cells[c].innerHTML+="&nbsp;&#x25BF";b&&b.tableSorting&&(a=this.sortingHashCode_(),b.tableSorting[a]&&this.sort(b.tableSorting[a].col,b.tableSorting[a].sortDirection))}},onItemClicked_:function(a){var b=this.parentNode;a=b.parentNode.parentNode;var b=Array.prototype.slice.call(b.cells).indexOf(this),c=a.sort(b),e=history.state;e.tableSorting||(e.tableSorting={});e.tableSorting[a.sortingHashCode_()]={col:b,sortDirection:c};window.history.pushState(e,"")},sort:function(a,b){var h=this.tHead.rows[0],
g=h.cells[a];if(g.hasAttribute("sort")){var k=h,h=g.getAttribute("sort");if(b!=h){h="upward"==h?"downward":"upward";g.setAttribute("sort",h);k=g.innerHTML;g.innerHTML=k.substr(0,k.length-2)+("downward"==h?"&#x25BE":"&#x25B4");for(var k=g.parentNode,g=k.parentNode.parentNode.tBodies[0],k=[],l=0;l<g.rows.length;l++)k[k.length]=g.rows[l];for(l=k.length-1;0<=l;l--)g.appendChild(k[l])}return h}k=b||"downward";for(l=0;l<h.cells.length;l++)if(h.cells[l].getAttribute("sort")){h.cells[l].removeAttribute("sort");
var m=h.cells[l].innerHTML;h.cells[l].innerHTML=m.substr(0,m.length-2)+"&#x25BF"}m=h.cells[a].innerHTML;g.innerHTML=m.substr(0,m.length-2)+("downward"==k?"&#x25BE":"&#x25B4");g.setAttribute("sort",k);m=h.parentNode.parentNode.tBodies[0].rows;g=[];for(l=0;l<m.length;l++)g.push([m[l].cells[a].innerText,m[l]]);g.sort("downward"==k?e:c);for(l=0;l<g.length;l++)h.parentNode.parentNode.tBodies[0].appendChild(g[l][1]);return k},sortingHashCode_:function(){if(this.sortingHashValue_)return this.sortingHashValue_;
for(var a=this.tHead.rows[0].innerText,b=0,c=0;c<a.length;c++)127>a.charCodeAt(c)&&(b+=a.charCodeAt(c));return this.sortingHashValue_=Array.prototype.slice.call(document.getElementsByClassName("sortable-table")).indexOf(this)+""+b}};return{SortableTable:a}});"use strict";
Polymer("tv-c-single-slice-sub-view",{ready:function(){this.currentSelection_=void 0;this.$.table.tableColumns=[{title:"Label",value:function(e){return e.name},width:"150px"},{title:"Value",width:"100%",value:function(e){return e.value}}];this.$.table.showHeader=!1},set selection(e){if(1!==e.length)throw Error("Only supports single slices");if(!(e[0]instanceof tv.c.trace_model.Slice))throw Error("Only supports slices");this.setSelectionWithoutErrorChecks(e)},get selection(){return this.currentSelection_},
setSelectionWithoutErrorChecks:function(e){function c(a){var b=document.createElement("tv-c-a-stack-frame");b.stackFrame=a;return b}this.currentSelection_=e;if(void 0===this.currentSelection_)this.$.table.rows=[];else{e=this.currentSelection_[0];var b=[];e.error&&b.push({name:"Error",value:e.error});e.title&&b.push({name:"Title",value:e.title});e.category&&b.push({name:"Category",value:e.category});var a=document.createElement("tv-c-a-time-stamp");a.timestamp=e.start;b.push({name:"Start",value:a});
a=document.createElement("tv-c-a-time-span");a.duration=e.duration;b.push({name:"Wall Duration",value:a});e.cpuDuration&&(a=document.createElement("tv-c-a-time-span"),a.duration=e.cpuDuration,b.push({name:"CPU Duration",value:a}));void 0!==e.subSlices&&0!==e.subSlices.length&&(e.selfTime&&(a=document.createElement("tv-c-a-time-span"),a.duration=e.selfTime,b.push({name:"Self Time",value:a})),e.cpuSelfTime&&(a=document.createElement("tv-c-a-time-span"),a.duration=e.cpuSelfTime,e.cpuSelfTime>e.selfTime&&
(a.warning=" Note that CPU Self Time is larger than Self Time. This is a known limitation of this system, which occurs due to several subslices, rounding issues, and imprecise time at which we get cpu- and real-time."),b.push({name:"CPU Self Time",value:a})));e.durationInUserTime&&(a=document.createElement("tv-c-a-time-span"),a.duration=e.durationInUserTime,b.push({name:"Duration (U)",value:a}));e.startStackFrame&&e.endStackFrame?e.startStackFrame===e.endStackFrame?b.push({name:"Start+End Stack Trace",
value:c(e.startStackFrame)}):(b.push({name:"Start Stack Trace",value:c(e.startStackFrame)}),b.push({name:"End Stack Trace",value:c(e.endStackFrame)})):e.startStackFrame?b.push({name:"Start Stack Trace",value:c(e.startStackFrame)}):e.endStackFrame&&b.push({name:"End Stack Trace",value:c(e.endStackFrame)});var a=0,f;for(f in e.args)a+=1;if(0<a){a=[];for(f in e.args){var d=document.createElement("tv-c-analysis-generic-object-view");d.object=e.args[f];a.push({name:f,value:d})}b.push({name:"Args",value:"",
isExpanded:!0,subRows:a})}this.$.table.tableRows=b}this.$.table.rebuild()}});"use strict";
tv.exportTo("tv.c.analysis",function(){var e=tv.b.ui.define("div");e.prototype={__proto__:HTMLDivElement.prototype,decorate:function(){this.className="analysis-results"},get requiresTallView(){return!0},clear:function(){this.textContent=""},createSelectionChangingLink:function(c,b,a){function f(){return b()}var d=this.ownerDocument.createElement("tv-c-analysis-link");f.userFriendlyName=c;d.selection=f;a&&(d.title=a);return d},appendElement_:function(c,b,a){b=c.ownerDocument.createElement(b);c.appendChild(b);
void 0!=a&&(b.textContent=a);return b},appendText_:function(c,b){c.ownerDocument.createTextNode(b);c.appendChild(textNode);return textNode},appendTableCell_:function(c,b,a,f,d){b=this.appendElement_(b,"td",f);b.className=c.className+"-col-"+a;d&&(c=document.createElement("span"),c.textContent=" "+String.fromCharCode(9888),c.title=d,b.appendChild(c));return b},appendTableCell:function(c,b,a){return this.appendTableCell_(c,b,b.children.length,a)},appendTableCellWithTooltip_:function(c,b,a,f,d){return d?
(b=this.appendElement_(b,"td"),b.className=c.className+"-col-"+a,c=this.appendElement_(b,"span",f),c.className="tooltip",c.title=d,b):this.appendTableCell_(c,b,a,f)},appendHeader:function(c){c=this.appendElement_(this,"span",c);c.className="analysis-header";return c},appendInfo:function(c,b){var a=this.appendElement_(this,"div");a.label=this.appendElement_(a,"b",c);a.value=this.appendElement_(a,"span",b);return a},appendTable:function(c,b){var a=this.appendElement_(this,"table");a.className=c+" analysis-table";
a.numColumns=b;return a},appendHeadRow:function(c){if(c.headerRow)throw Error("Only one header row allowed.");if(c.tbody||c.tfoot)throw Error("Cannot add a header row after data rows have been added.");c.headerRow=this.appendElement_(this.appendElement_(c,"thead"),"tr");c.headerRow.className="analysis-table-header";return c.headerRow},appendBodyRow:function(c){if(c.tfoot)throw Error("Cannot add a tbody row after footer rows have been added.");c.tbody||(c.tbody=this.appendElement_(c,"tbody"));var b=
this.appendElement_(c.tbody,"tr");b.className=c.headerRow?"analysis-table-row":"analysis-table-row-inverted";return b},appendFootRow:function(c){c.tfoot||(c.tfoot=this.appendElement_(c,"tfoot"),c.tfoot.rowsClassName=((c.headerRow?1:0)+(c.tbody?c.tbody.rows.length:0))%2?"analysis-table-row":"analysis-table-row-inverted");var b=this.appendElement_(c.tfoot,"tr");b.className=c.tfoot.rowsClassName;return b},appendSpacingRow:function(c,b){for(var a=c.tfoot||b?this.appendFootRow(c):this.appendBodyRow(c),
f=0;f<c.numColumns;f++)this.appendTableCell_(c,a,f," ")},appendInfoRow:function(c,b,a,f){f=c.tfoot||f?this.appendFootRow(c):this.appendBodyRow(c);this.appendTableCell_(c,f,0,b);void 0!==a?(b=document.createElement("tv-c-analysis-generic-object-view"),b.object=a,b.classList.add("analysis-table-col-1"),b.style.display="table-cell",f.appendChild(b)):this.appendTableCell_(c,f,1,"");for(a=2;a<c.numColumns;a++)this.appendTableCell_(c,f,a,"")},appendInfoRowTime:function(c,b,a,f,d){f=c.tfoot||f?this.appendFootRow(c):
this.appendBodyRow(c);this.appendTableCell_(c,f,0,b);this.appendTableCell_(c,f,1,tv.c.analysis.tsString(a),d)},appendDetailsRow:function(c,b,a,f,d,e,g,k){if(k)k=this.appendFootRow(c),this.appendTableCell(c,k,"Totals");else if(k=this.appendBodyRow(c),e){var l=this.appendTableCell(c,k,tv.c.analysis.tsString(b));l.textContent="";l.appendChild(this.createSelectionChangingLink(tv.c.analysis.tsString(b),e,""))}else this.appendTableCell(c,k,tv.c.analysis.tsString(b));null!==a&&this.appendTableCell(c,k,tv.c.analysis.tsString(a));
g&&this.appendTableCell(c,k,""!=g?tv.c.analysis.tsString(g):"");null!==f&&this.appendTableCell(c,k,tv.c.analysis.tsString(f));c=this.appendTableCell(c,k,"");b=0;for(var m in d)b+=1;if(0<b)for(m in d)a=d[m],b=document.createElement("tv-c-analysis-generic-object-view"),b.object=a,a=this.appendElement_(this.appendElement_(c,"table"),"tr"),this.appendElement_(a,"td",m+":"),this.appendElement_(a,"td").appendChild(b)},appendDataRow:function(c,b,a,f,d,e,g,k,l,m,n){var q=void 0;l&&(q="Min Duration:\t"+tv.c.analysis.tsString(l.min)+
" ms \rMax Duration:\t"+tv.c.analysis.tsString(l.max)+" ms \rAvg Duration:\t"+tv.c.analysis.tsString(l.avg)+" ms (\u03c3 = "+tv.c.analysis.tsRound(l.avg_stddev)+")",l.start&&(q+="\rStart Time:\t"+tv.c.analysis.tsString(l.start)),l.end&&(q+="\rEnd Time:\t"+tv.c.analysis.tsString(l.end)),l.frequency&&l.frequency_stddev&&(q+="\rFrequency:\t"+tv.c.analysis.tsRound(l.frequency)+" occurrences/s (\u03c3 = "+tv.c.analysis.tsRound(l.frequency_stddev)+")"));l=c.tfoot||n?this.appendFootRow(c):this.appendBodyRow(c);
n=0;if(m){var w=this.appendTableCellWithTooltip_(c,l,n,b,q);w&&(w.textContent="",w.appendChild(this.createSelectionChangingLink(b,m,q)))}else this.appendTableCellWithTooltip_(c,l,n,b,q);n++;null!==a&&(a?a instanceof Array?this.appendTableCellWithTooltip_(c,l,n,"["+a.join(", ")+"]",q):this.appendTableCellWithTooltip_(c,l,n,tv.c.analysis.tsString(a),q):this.appendTableCell_(c,l,n,""),n++);null!==f&&(""!=f?this.appendTableCellWithTooltip_(c,l,n,tv.c.analysis.tsString(f),q):this.appendTableCell_(c,l,
n,""),n++);null!==d&&(d?this.appendTableCellWithTooltip_(c,l,n,tv.c.analysis.tsString(d),q):this.appendTableCell_(c,l,n,""),n++);null!==e&&(e?this.appendTableCellWithTooltip_(c,l,n,tv.c.analysis.tsString(e),q):this.appendTableCell_(c,l,n,""),n++);null!==k&&(k?this.appendTableCellWithTooltip_(c,l,n,k,q):this.appendTableCell_(c,l,n,""),n++);g?this.appendTableCellWithTooltip_(c,l,n,String(g),q):this.appendTableCell_(c,l,n,"")}};return{AnalysisResults:e}});"use strict";
Polymer("tv-c-multi-slice-sub-view",{created:function(){this.currentSelection_=void 0;this.requiresTallView_=!1},set selection(e){if(1>=e.length)throw Error("Only supports multiple items");if(!e.every(function(c){return c instanceof tv.c.trace_model.Slice}))throw Error("Only supports slices");this.setSelectionWithoutErrorChecks(e)},get selection(){return this.currentSelection_},get requiresTallView(){return this.requiresTallView_},setSelectionWithoutErrorChecks:function(e){this.currentSelection_=
e;this.$.content.textContent="";this.requiresTallView_=!1;if(void 0!==window.RasterTaskView&&tv.e.cc.RasterTaskSelection.supports(e)){e=new tv.e.cc.RasterTaskSelection(e);var c=new tv.e.cc.LayerTreeHostImplSnapshotView;c.objectSnapshot=e.containingSnapshot;c.selection=e;c.extraHighlightsByLayerId=e.extraHighlightsByLayerId;this.$.content.appendChild(c);this.style.display="flex";this.requiresTallView_=!0}else this.style.display="",c=new tv.c.analysis.AnalysisResults,this.$.content.appendChild(c),this.analyze_(c,
e)},analyze_:function(e,c){var b=this.buildSliceGroups_(c),a=this.analyzeMultipleSlices_(e,b.sliceGroups,b.hasCpuDuration),f=Object.keys(b.sliceGroups);if(1===f.length){var d=b.sliceGroups[f[0]];e.appendInfo("Title: ",d.slices[0].title);e.appendInfo("Category: ",d.slices[0].category);var h=this.analyzeSingleTypeSlices_(e,d,b.hasCpuDuration);1<b.sliceGroups[f[0]].slices.length&&(e.appendDetailsRow(h.table,void 0,d.duration,d.selfTime,h.args,void 0,b.hasCpuDuration?d.cpuDuration:void 0,!0),tv.b.ui.SortableTable.decorate(a))}else e.appendDataRow(a,
"Totals",b.totals.duration,b.hasCpuDuration?b.totals.cpuDuration:null,b.totals.selfTime,b.hasCpuDuration?b.totals.cpuSelfTime:null,c.length,null,null,null,!0),e.appendSpacingRow(a,!0),tv.b.ui.SortableTable.decorate(a);b=c.bounds.min;f=c.bounds.max;e.appendInfoRowTime(a,"Selection start",b,!0);e.appendInfoRowTime(a,"Selection extent",f-b,!0)},buildSliceGroups_:function(e){for(var c={},b=!1,a={duration:0,cpuDuration:0,cpuSelfTime:0,selfTime:0},f=0;f<e.length;f++){var d=e[f];void 0===c[d.title]&&(c[d.title]=
{slices:[],duration:0,cpuDuration:0,selfTime:0,cpuSelfTime:0,startOfFirstOccurrence:Number.MAX_VALUE,startOfLastOccurrence:-Number.MAX_VALUE,min:Number.MAX_VALUE,max:-Number.MAX_VALUE});d.cpuDuration&&(b=!0);var h=c[d.title];h.duration+=d.duration;a.duration+=d.duration;d.cpuDuration&&(h.cpuDuration+=d.cpuDuration,a.cpuDuration+=d.cpuDuration,h.cpuSelfTime+=d.cpuSelfTime?d.cpuSelfTime:d.cpuDuration,a.cpuSelfTime+=d.cpuSelfTime?d.cpuSelfTime:d.cpuDuration);h.selfTime+=d.selfTime?d.selfTime:d.duration;
a.selfTime+=d.selfTime?d.selfTime:d.duration;h.startOfFirstOccurrence=Math.min(d.start,h.startOfFirstOccurrence);h.startOfLastOccurrence=Math.max(d.start,h.startOfLastOccurrence);h.min=Math.min(d.duration,h.min);h.max=Math.max(d.duration,h.max);h.slices.push(e[f])}return{hasCpuDuration:b,sliceGroups:c,totals:a}},analyzeSingleTypeSlices_:function(e,c,b){var a=e.appendTable("analysis-slice-table",4+b),f=e.appendHeadRow(a);e.appendTableCell(a,f,"Start");e.appendTableCell(a,f,"Wall Duration (ms)");b&&
e.appendTableCell(a,f,"CPU Duration (ms)");e.appendTableCell(a,f,"Self Time (ms)");e.appendTableCell(a,f,"Args");var d={};tv.b.iterItems(c.slices,function(b,c){e.appendDetailsRow(a,c.start,c.duration,c.selfTime?c.selfTime:c.duration,c.args,function(){return new tv.c.Selection([c])},c.cpuDuration,!1);for(var f in c.args){var l=c.args[f];"number"==typeof l&&(null==d[f]&&(d[f]=0),d[f]+=l)}});return{table:a,args:d}},analyzeMultipleSlices_:function(e,c,b){var a=e.appendTable("analysis-slice-table",4+b),
f=e.appendHeadRow(a);e.appendTableCell(a,f,"Name");e.appendTableCell(a,f,"Wall Duration (ms)");b&&e.appendTableCell(a,f,"CPU Duration (ms)");e.appendTableCell(a,f,"Self Time (ms)");b&&e.appendTableCell(a,f,"CPU Self Time (ms)");e.appendTableCell(a,f,"Occurrences");tv.b.iterItems(c,function(d,c){for(var f=c.slices,k={min:c.min,max:c.max,avg:c.duration/f.length,avg_stddev:void 0,frequency:void 0,frequency_stddev:void 0},l=0,m=0;m<f.length;m++)var n=k.avg-f[m].duration,l=l+n*n;k.avg_stddev=Math.sqrt(l/
(f.length-1));l=c.startOfLastOccurrence-c.startOfFirstOccurrence;if(2<f.length&&0<l){var q=f.length-1;k.frequency=1E3*q/l;l=0;for(m=1;m<f.length;m++)n=k.frequency-1E3/(f[m].start-f[m-1].start),l+=n*n;k.frequency_stddev=Math.sqrt(l/(q-1))}e.appendDataRow(a,d,c.duration,b?0<c.cpuDuration?c.cpuDuration:"":null,c.selfTime,b?0<c.cpuSelfTime?c.cpuSelfTime:"":null,f.length,null,k,function(){return new tv.c.Selection(f)})});return a}});"use strict";
Polymer("tv-c-a-selection-summary-table",{created:function(){this.selection_=new tv.b.Range},ready:function(){this.$.table.showHeader=!1;this.$.table.tableColumns=[{title:"Name",value:function(e){return e.title},width:"350px"},{title:"Value",width:"100%",value:function(e){return e.value}}]},get selection(){return this.selection_},set selection(e){this.selection_=e;this.updateContents_()},updateContents_:function(){var e=this.selection_,c=[],b;b=this.selection_&&!e.bounds.isEmpty?!0:!1;c.push({title:"Selection start",
value:b?tv.c.analysis.createTimeStamp(e.bounds.min):"<empty>"});c.push({title:"Selection extent",value:b?tv.c.analysis.createTimeSpan(e.bounds.range):"<empty>"});this.$.table.tableRows=c;this.$.table.rebuild()}});"use strict";
tv.exportTo("tv.b",function(){function e(b){return b}function c(){}c.sum=function(b,a,c){a=a||e;for(var d=0,h=0;h<b.length;h++)d+=a.call(c,b[h],h);return d};c.mean=function(b,a,f){return c.sum(b,a,f)/b.length};c.variance=function(b,a,f){var d=a||e,h=c.mean(b,d,f);return c.sum(b,function(a,b){var c=d.call(this,a,b)-h;return c*c},f)/(b.length-1)};c.stddev=function(b,a,f){return Math.sqrt(c.variance(b,a,f))};c.max=function(b,a,c){a=a||e;for(var d=-Infinity,h=0;h<b.length;h++)d=Math.max(d,a.call(c,b[h],
h));return d};c.min=function(b,a,c){a=a||e;for(var d=Infinity,h=0;h<b.length;h++)d=Math.min(d,a.call(c,b[h],h));return d};c.range=function(b,a,c){a=a||e;for(var d=new tv.b.Range,h=0;h<b.length;h++)d.addValue(a.call(c,b[h],h));return d};c.percentile=function(b,a,c,d){if(!(0<=a&&1>=a))throw Error("percent must be [0,1]");c=c||e;for(var h=Array(b.length),g=0;g<b.length;g++)h[g]=c.call(d,b[g],g);h.sort();return h[Math.floor((b.length-1)*a)]};return{Statistics:c}});"use strict";
tv.exportTo("tv.c.analysis",function(){function e(c,b){this.title=c;this.selfTime_=this.duration_=void 0;this.events_=b;this.cpuTimesComputed_=!1;this.cpuDuration_=this.cpuSelfTime_=void 0;this.untotallableArgs_=[];this.totalledArgs_=void 0}e.prototype={get duration(){void 0===this.duration_&&(this.duration_=tv.b.Statistics.sum(this.events_,function(c){return c.duration}));return this.duration_},get cpuSelfTime(){this.computeCpuTimesIfNeeded_();return this.cpuSelfTime_},get cpuDuration(){this.computeCpuTimesIfNeeded_();
return this.cpuDuration_},computeCpuTimesIfNeeded_:function(){if(!this.cpuTimesComputed_){this.cpuTimesComputed_=!0;for(var c=0,b=0,a=!1,f=0;f<this.events_.length;f++){var d=this.events_[f];void 0!==d.cpuDuration&&(b+=d.cpuDuration,a=!0);void 0!==d.cpuSelfTime&&(c+=d.cpuSelfTime,a=!0)}a&&(this.cpuDuration_=b,this.cpuSelfTime_=c)}},get selfTime(){if(void 0===this.selfTime_)for(var c=this.selfTime_=0;c<this.events_.length;c++)void 0!==this.events_[c].selfTime&&(this.selfTime_+=this.events[c].selfTime);
return this.selfTime_},get events(){return this.events_},get numEvents(){return this.events_.length},get untotallableArgs(){this.updateArgsIfNeeded_();return this.untotallableArgs_},get totalledArgs(){this.updateArgsIfNeeded_();return this.totalledArgs_},updateArgsIfNeeded_:function(){if(void 0===this.totalledArgs_){for(var c={},b={},a=0;a<this.events_.length;a++){var f=this.events_[a],d;for(d in f.args){var e=f.args[d];"number"!==typeof e?(c[d]=!0,delete b[d]):c[d]||(void 0===b[d]&&(b[d]=0),b[d]+=
e)}}this.untotallableArgs_=tv.b.dictionaryKeys(c);this.totalledArgs_=b}}};return{MultiEventSummary:e}});"use strict";
Polymer("tv-c-a-multi-event-summary-table",{ready:function(){this.showTotals_=!1;this.eventsByTitle_=void 0},updateTableColumns_:function(e){var c=!1;e.forEach(function(a){void 0!==a.cpuDuration&&(c=!0);void 0!==a.cpuSelfTime&&(c=!0)});e=c?"20%":"33.3333%";var b=[];b.push({title:"Name",value:function(a){if("Totals"===a.title)return"Totals";var b=document.createElement("tv-c-analysis-link");b.setSelectionAndContent(function(){return new tv.c.Selection(a.events)},a.title);return b},width:"350px",cmp:function(a,
b){return a.title.localeCompare(b.title)}});b.push({title:"Wall Duration (ms)",value:function(a){return tv.c.analysis.createTimeSpan(a.duration)},width:e,cmp:function(a,b){return a.duration-b.duration}});c&&b.push({title:"CPU Duration (ms)",value:function(a){return tv.c.analysis.createTimeSpan(a.cpuDuration)},width:e,cmp:function(a,b){return a.cpuDuration-b.cpuDuration}});b.push({title:"Self time (ms)",value:function(a){return tv.c.analysis.createTimeSpan(a.selfTime)},width:e,cmp:function(a,b){return a.selfTime-
b.selfTime}});c&&b.push({title:"CPU Self Time (ms)",value:function(a){return tv.c.analysis.createTimeSpan(a.cpuSelfTime)},width:e,cmp:function(a,b){return a.cpuSelfTime-b.cpuSelfTime}});b.push({title:"Occurrences",value:function(a){return a.numEvents},width:e,cmp:function(a,b){return a.numEvents-b.numEvents}});this.$.table.tableColumns=b},configure:function(e){this.showTotals_=e.showTotals;this.eventsByTitle_=e.eventsByTitle;this.updateContents_()},get showTotals(){return this.showTotals_},set showTotals(e){this.showTotals_=
e;this.updateContents_()},get eventsByTitle(){return this.eventsByTitle_},set eventsByTitle(e){this.eventsByTitle_=e;this.appendChild(this.updateContents_())},get selectionBounds(){return this.selectionBounds_},set selectionBounds(e){this.selectionBounds_=e;this.updateContents_()},updateContents_:function(){var e=[],c=[];tv.b.iterItems(void 0!==this.eventsByTitle_?this.eventsByTitle_:[],function(a,b){e.push.apply(e,b);var d=new tv.c.analysis.MultiEventSummary(a,b);c.push(d)});this.updateTableColumns_(c);
this.$.table.tableRows=c;var b=[];this.showTotals_&&b.push(new tv.c.analysis.MultiEventSummary("Totals",e));this.$.table.footerRows=b;this.$.table.rebuild()}});"use strict";
Polymer("tv-c-a-multi-event-details-table",{created:function(){this.selection_=void 0},ready:function(){this.initTitleTable_()},get selection(){return this.selection_},set selection(e){this.selection_=e;this.updateTitleTable_();void 0===this.selection_?(this.$.table.tableRows=[],this.$.table.tableFooterRows=[]):(e=new tv.c.analysis.MultiEventSummary("Totals",this.selection_),this.updateColumns_(e),this.updateRows_(e));this.$.table.rebuild()},initTitleTable_:function(){var e=this.$.titletable;e.showHeader=
!1;e.tableColumns=[{title:"Title",value:function(c){return c.title},width:"350px"},{title:"Value",width:"100%",value:function(c){return c.value}}]},updateTitleTable_:function(){this.$.titletable.tableRows=[{title:"Title",value:this.selection_&&this.selection_.length?this.selection_[0].title:"<No selection>"}]},updateColumns_:function(e){var c;void 0!==e.cpuDuration&&(c=!0);void 0!==e.cpuSelfTime&&(c=!0);var b;b=c?"20%":"33.3333%";var a=[];a.push({title:"Start",value:function(a){if(a.__proto__===tv.c.analysis.MultiEventSummary.prototype)return a.title;
var b=document.createElement("tv-c-analysis-link");b.setSelectionAndContent(function(){return new tv.c.Selection(a)});b.appendChild(tv.c.analysis.createTimeStamp(a.start));return b},width:"350px",cmp:function(a,b){return a.title.localeCompare(b.title)}});a.push({title:"Wall Duration (ms)",value:function(a){return tv.c.analysis.createTimeSpan(a.duration)},width:"<upated further down>",cmp:function(a,b){return a.duration-b.duration}});c&&a.push({title:"CPU Duration (ms)",value:function(a){return tv.c.analysis.createTimeSpan(a.cpuDuration)},
width:"<upated further down>",cmp:function(a,b){return a.cpuDuration-b.cpuDuration}});a.push({title:"Self time (ms)",value:function(a){return tv.c.analysis.createTimeSpan(a.selfTime)},width:"<upated further down>",cmp:function(a,b){return a.selfTime-b.selfTime}});c&&a.push({title:"CPU Self Time (ms)",value:function(a){return tv.c.analysis.createTimeSpan(a.cpuSelfTime)},width:"<upated further down>",cmp:function(a,b){return a.cpuSelfTime-b.cpuSelfTime}});b=tv.b.dictionaryKeys(e.totalledArgs);b.sort();
c=e.untotallableArgs.slice(0);c.sort();b.push.apply(b,c);c=b.slice(0,4);var f=b.slice(4);c.forEach(function(b){var c=e.totalledArgs[b],f={title:"Arg: "+b,value:function(a){if(a.__proto__!==tv.c.analysis.MultiEventSummary.prototype){var f=document.createElement("tv-c-analysis-generic-object-view");f.object=a.args[b];return f}return c?a.totalledArgs[b]:""},width:"<upated further down>"};c&&(f.cmp=function(a,c){return a.args[b]-c.args[b]});a.push(f)});f.length&&a.push({title:"Other Args",value:function(a){if(a.__proto__===
tv.c.analysis.MultiEventSummary.prototype)return"";for(var b=document.createElement("tv-c-analysis-generic-object-view"),c={},e=0;e<f.length;e++)c[f[e]]=a.args[f[e]];b.object=c;return b},width:"<upated further down>"});b=(100/(a.length-1)).toFixed(3)+"%";for(c=1;c<a.length;c++)a[c].width=b;this.$.table.tableColumns=a},updateRows_:function(e){this.$.table.sortColumnIndex=0;this.$.table.tableRows=this.selection_.map(function(c){return c});this.$.table.footerRows=[e]}});"use strict";
Polymer("tv-c-a-multi-event-sub-view",{created:function(){this.currentSelection_=void 0;this.requiresTallView_=!1},set selection(e){if(1>=e.length)throw Error("Only supports multiple items");if(!e.every(function(c){return c instanceof tv.c.trace_model.Slice}))throw Error("Only supports slices");this.setSelectionWithoutErrorChecks(e)},get selection(){return this.currentSelection_},get requiresTallView(){return this.requiresTallView_},setSelectionWithoutErrorChecks:function(e){this.currentSelection_=
e;this.requiresTallView_=!1;if(void 0!==window.RasterTaskView&&tv.e.cc.RasterTaskSelection.supports(e)){e=new tv.e.cc.RasterTaskSelection(e);var c=new tv.e.cc.LayerTreeHostImplSnapshotView;c.objectSnapshot=e.containingSnapshot;c.selection=e;c.extraHighlightsByLayerId=e.extraHighlightsByLayerId;this.appendChild(c);this.style.display="flex";this.requiresTallView_=!0}else{this.style.display="";var b=e.getEventsOrganizedByTitle(),c=tv.b.dictionaryLength(b);this.$.content.textContent="";var a=document.createElement("tv-c-a-multi-event-summary-table");
a.configure({showTotals:1<c,eventsByTitle:b});this.$.content.appendChild(a);b=document.createElement("tv-c-a-selection-summary-table");b.selection=this.currentSelection_;this.$.content.appendChild(b);1===c&&(c=document.createElement("tv-c-a-multi-event-details-table"),c.selection=e,this.$.content.appendChild(c))}}});"use strict";
Polymer("tv-c-single-thread-time-slice-sub-view",{created:function(){this.currentSelection_=void 0},get selection(){return this.currentSelection_},set selection(e){if(1!==e.length)throw Error("Only supports single slices");if(!(e[0]instanceof tv.c.trace_model.ThreadTimeSlice))throw Error("Only supports thread time slices");this.currentSelection_=e;e=e[0];var c=e.thread,b=this.shadowRoot;b.querySelector("#state").textContent=e.title;var a=tv.b.ui.getColorPalette()[e.colorId];b.querySelector("#state").style.backgroundColor=
a;b.querySelector("#process-name").textContent=c.parent.userFriendlyName;b.querySelector("#thread-name").textContent=c.userFriendlyName;b.querySelector("#start").textContent=tv.c.analysis.tsString(e.start);b.querySelector("#duration").textContent=tv.c.analysis.tsString(e.duration);var f=b.querySelector("#on-cpu");f.textContent="";c=b.querySelector("#running-instead");e.cpuOnWhichThreadWasRunning?(c.parentElement.removeChild(c),a=document.createElement("tv-c-analysis-link"),a.selection=new tv.c.Selection(e.getAssociatedCpuSlice()),
a.textContent=e.cpuOnWhichThreadWasRunning.userFriendlyName,f.appendChild(a)):(f.parentElement.removeChild(f),(f=e.getCpuSliceThatTookCpu())?(a=document.createElement("tv-c-analysis-link"),a.selection=new tv.c.Selection(f),a.textContent=f.thread?f.thread.userFriendlyName:f.title,c.appendChild(a)):c.parentElement.removeChild(c));b=b.querySelector("#args");0<tv.b.dictionaryKeys(e.args).length?(c=document.createElement("tv-c-analysis-generic-object-view"),c.object=e.args,b.parentElement.style.display=
"",b.textContent="",b.appendChild(c)):b.parentElement.style.display="none"}});"use strict";
Polymer("tv-c-single-cpu-slice-sub-view",{created:function(){this.currentSelection_=void 0},get selection(){return this.currentSelection_},set selection(e){if(1!==e.length)throw Error("Only supports single slices");if(!(e[0]instanceof tv.c.trace_model.CpuSlice))throw Error("Only supports thread time slices");this.currentSelection_=e;e=e[0];var c=e.threadThatWasRunning,b=this.shadowRoot;c?(b.querySelector("#process-name").textContent=c.parent.userFriendlyName,b.querySelector("#thread-name").textContent=
c.userFriendlyName):(b.querySelector("#process-name").parentElement.style.display="none",b.querySelector("#thread-name").textContent=e.title);b.querySelector("#start").textContent=tv.c.analysis.tsString(e.start);b.querySelector("#duration").textContent=tv.c.analysis.tsString(e.duration);c=b.querySelector("#running-thread");(e=e.getAssociatedTimeslice())?(b=document.createElement("tv-c-analysis-link"),b.selection=new tv.c.Selection(e),b.textContent="Click to select",c.parentElement.style.display="",
c.textContent="",c.appendChild(b)):c.parentElement.style.display="none"}});"use strict";Polymer("tv-c-single-instant-event-sub-view",{created:function(){this.currentSelection_=void 0},set selection(e){this.$.content.textContent="";var c=document.createElement("tv-c-single-slice-sub-view");c.setSelectionWithoutErrorChecks(e);this.$.content.appendChild(c);this.currentSelection_=e},get selection(){return this.currentSelection_}});"use strict";
Polymer("tv-c-multi-instant-event-sub-view",{created:function(){this.currentSelection_=void 0},set selection(e){this.$.content.textContent="";var c=document.createElement("tv-c-multi-slice-sub-view");this.$.content.appendChild(c);c.setSelectionWithoutErrorChecks(e);this.currentSelection_=e},get selection(){return this.currentSelection_}});"use strict";
(function(){var e=tv.c.trace_model.CounterSample;Polymer("tv-c-counter-sample-sub-view",{created:function(){this.currentSelection_=void 0},get selection(){return this.currentSelection_},set selection(c){var b=new tv.c.analysis.AnalysisResults;this.appendChild(b);this.analyzeCounterSamples_(b,c)},analyzeCounterSamples_:function(c,b){for(var a={},f=0;f<b.length;f++){var d=b[f].series.counter;a[d.guid]||(a[d.guid]=[]);a[d.guid].push(b[f])}for(var h in a)f=a[h],d=f[0].series.counter,f=e.groupByTimestamp(f),
1==f.length?this.analyzeSingleCounterTimestamp_(c,d,f[0]):this.analyzeMultipleCounterTimestamps_(c,d,f)},analyzeSingleCounterTimestamp_:function(c,b,a){c.appendHeader("Selected counter:");var f=c.appendTable("analysis-counter-table",2);c.appendInfoRow(f,"Title",b.name);c.appendInfoRowTime(f,"Timestamp",a[0].timestamp);for(b=0;b<a.length;b++){var d=a[b];c.appendInfoRow(f,d.series.name,d.value)}},analyzeMultipleCounterTimestamps_:function(c,b,a){c.appendHeader("Counter "+b.name);for(var f=c.appendTable("analysis-counter-table",
2),d=[],e=0;e<a.length;e++)d.push(a[e][0].getSampleIndex());a=b.getSampleStatistics(d);for(e=0;e<a.length;e++){for(var g=[],k=0;k<d.length;++k)g.push(b.getSeries(e).getSample(d[k]).value);c.appendDataRow(f,b.name+": series("+b.getSeries(e).name+")",g,null,null,null,g.length,null,a[e])}}})})();"use strict";
Polymer("tv-c-single-flow-event-sub-view",{created:function(){this.currentSelection_=void 0},set selection(e){this.$.content.textContent="";var c=document.createElement("tv-c-single-slice-sub-view");c.setSelectionWithoutErrorChecks(e);this.$.content.appendChild(c);this.currentSelection_=e},get selection(){return this.currentSelection_}});"use strict";
Polymer("tv-c-multi-flow-event-sub-view",{created:function(){this.currentSelection_=void 0},set selection(e){this.$.content.textContent="";var c=document.createElement("tv-c-multi-slice-sub-view");this.$.content.appendChild(c);c.setSelectionWithoutErrorChecks(e);this.currentSelection_=e},get selection(){return this.currentSelection_}});"use strict";
tv.exportTo("tv.c.analysis",function(){var e=tv.b.ui.define("object-instance-view");e.prototype={__proto__:HTMLUnknownElement.prototype,decorate:function(){this.objectInstance_=void 0},get requiresTallView(){return!0},set modelEvent(b){this.objectInstance=b},get modelEvent(){return this.objectInstance},get objectInstance(){return this.objectInstance_},set objectInstance(b){this.objectInstance_=b;this.updateContents()},updateContents:function(){throw Error("Not implemented");}};var c=new tv.b.ExtensionRegistryOptions(tv.b.TYPE_BASED_REGISTRY_MODE);
c.mandatoryBaseClass=e;c.defaultMetadata={showInTrackView:!0};tv.b.decorateExtensionRegistry(e,c);return{ObjectInstanceView:e}});"use strict";
Polymer("tv-c-single-object-instance-sub-view",{created:function(){this.currentSelection_=void 0},get requiresTallView(){if(0===this.$.content.children.length)return!1;if(this.$.content.children[0]instanceof tv.c.analysis.ObjectInstanceView)return this.$.content.children[0].requiresTallView},get selection(){return this.currentSelection_},set selection(e){if(1!==e.length)throw Error("Only supports single item selections");if(!(e[0]instanceof tv.c.trace_model.ObjectInstance))throw Error("Only supports object instances");
this.$.content.textContent="";this.currentSelection_=e;e=e[0];var c=tv.c.analysis.ObjectInstanceView.getTypeInfo(e.category,e.typeName);c?(c=new c.constructor,this.$.content.appendChild(c),c.modelEvent=e):this.appendGenericAnalysis_(e)},appendGenericAnalysis_:function(e){var c;c=""+('<div class="title">'+e.typeName+" "+e.id+"</div>\n");c+="<table><tr>";c+="<tr><td>creationTs:</td><td>"+e.creationTs+"</td></tr>\n";c=e.deletionTs!=Number.MAX_VALUE?c+("<tr><td>deletionTs:</td><td>"+e.deletionTs+"</td></tr>\n"):
c+"<tr><td>deletionTs:</td><td>not deleted</td></tr>\n";c+='<tr><td>snapshots:</td><td id="snapshots"></td></tr>\n';c+="</table>";this.$.content.innerHTML=c;var b=this.$.content.querySelector("#snapshots");e.snapshots.forEach(function(a){var c=document.createElement("tv-c-analysis-link");c.selection=new tv.c.Selection(a);b.appendChild(c)})}});"use strict";
tv.exportTo("tv.c.analysis",function(){var e=tv.b.ui.define("object-snapshot-view");e.prototype={__proto__:HTMLUnknownElement.prototype,decorate:function(){this.objectSnapshot_=void 0},get requiresTallView(){return!0},set modelEvent(b){this.objectSnapshot=b},get modelEvent(){return this.objectSnapshot},get objectSnapshot(){return this.objectSnapshot_},set objectSnapshot(b){this.objectSnapshot_=b;this.updateContents()},updateContents:function(){throw Error("Not implemented");}};var c=new tv.b.ExtensionRegistryOptions(tv.b.TYPE_BASED_REGISTRY_MODE);
c.mandatoryBaseClass=e;c.defaultMetadata={showInstances:!0,showInTrackView:!0};tv.b.decorateExtensionRegistry(e,c);return{ObjectSnapshotView:e}});"use strict";
Polymer("tv-c-single-object-snapshot-sub-view",{created:function(){this.currentSelection_=void 0},get requiresTallView(){if(0===this.children.length)return!1;if(this.children[0]instanceof tv.c.analysis.ObjectSnapshotView)return this.children[0].requiresTallView},get selection(){return this.currentSelection_},set selection(e){if(1!==e.length)throw Error("Only supports single item selections");if(!(e[0]instanceof tv.c.trace_model.ObjectSnapshot))throw Error("Only supports object instances");this.textContent=
"";this.currentSelection_=e;e=e[0];var c=tv.c.analysis.ObjectSnapshotView.getTypeInfo(e.objectInstance.category,e.objectInstance.typeName);c?(c=new c.constructor,this.appendChild(c),c.modelEvent=e):this.appendGenericAnalysis_(e)},appendGenericAnalysis_:function(e){var c=e.objectInstance,b;b=""+('<div class="title">Snapshot of <a id="instance-link"></a> @ '+tv.c.analysis.tsString(e.ts)+"</div>\n");b+="<table><tr>";b+='<tr><td>args:</td><td id="args"></td></tr>\n';this.innerHTML=b+="</table>";b=document.createElement("tv-c-analysis-link");
b.selection=new tv.c.Selection(c);c=this.querySelector("#instance-link");c.parentElement.replaceChild(b,c);c=this.querySelector("#args");c.textContent="";b=document.createElement("tv-c-analysis-generic-object-view");b.object=e.args;c.appendChild(b)}});"use strict";
Polymer("tv-c-multi-object-sub-view",{created:function(){this.currentSelection_=void 0},get selection(){return this.currentSelection_},set selection(e){this.currentSelection_=e;this.textContent="";var c=new tv.c.analysis.AnalysisResults;this.appendChild(c);this.analyzeObjectEvents_(c,e)},analyzeObjectEvents_:function(e,c){c=tv.b.asArray(c).sort(tv.b.Range.compareByMinTimes);var b=e.appendTable("analysis-object-sample-table",2);c.forEach(function(a){var c=e.appendBodyRow(b),d,h,g;a instanceof tv.c.trace_model.ObjectSnapshot?
(d=tv.c.analysis.tsString(a.ts),h=a.objectInstance.typeName+" "+a.objectInstance.id,g=function(){var b=new tv.c.Selection;b.push(a);return b}):(d=a.deletionTs==Number.MAX_VALUE?"":tv.c.analysis.tsString(a.deletionTs),d=tv.c.analysis.tsString(a.creationTs)+" - "+d,h=a.typeName+" "+a.id,g=function(){var b=new tv.c.Selection;b.push(a);return b});e.appendTableCell(b,c,d);e.appendTableCell(b,c,"").appendChild(e.createSelectionChangingLink(h,g))})}});"use strict";
Polymer("tv-c-single-sample-sub-view",{created:function(){this.currentSelection_=void 0},set selection(e){this.textContent="";this.currentSelection_=e;var c=new tv.c.analysis.AnalysisResults;this.appendChild(c);this.analyzeSingleSampleEvent_(c,e[0],"Sample Event")},get selection(){return this.currentSelection_},analyzeSingleSampleEvent_:function(e,c,b){e.appendHeader("Selected "+b+":");b=e.appendTable("analysis-slice-table",2);e.appendInfoRow(b,"Title",c.title);e.appendInfoRowTime(b,"Sample Time",
c.start);e.appendInfoRow(b,"Stack Trace",c.getUserFriendlyStackTrace())}});"use strict";Polymer("tv-c-multi-sample-sub-view",{created:function(){this.currentSelection_=void 0},get requiresTallView(){return!0},set selection(e){this.$.content.textContent="";this.currentSelection_=e;if(tv.isDefined("tv.e.analysis.SamplingSummaryPanel")){var c=new tv.e.analysis.SamplingSummaryPanel;this.$.content.appendChild(c);c.selection=e}else this.$.content.textContent="SamplingSummaryPanel not installed. :("},get selection(){return this.currentSelection_}});
"use strict";Polymer("tv-c-single-interaction-record-sub-view",{created:function(){this.currentSelection_=void 0},set selection(e){this.textContent="";var c=document.createElement("tv-c-single-slice-sub-view");this.appendChild(c);c.setSelectionWithoutErrorChecks(e);this.currentSelection_=e}});"use strict";
Polymer("tv-c-multi-interaction-record-sub-view",{created:function(){this.currentSelection_=void 0},set selection(e){this.currentSelection_=e;this.textContent="";var c=document.createElement("tv-c-multi-slice-sub-view");this.appendChild(c);c.setSelectionWithoutErrorChecks(e);this.currentSelection_=e},get selection(){return this.currentSelection_}});"use strict";
Polymer("tv-c-single-alert-sub-view",{created:function(){this.currentSelection_=void 0},set selection(e){this.textContent="";var c=document.createElement("tv-c-single-slice-sub-view");this.appendChild(c);c.setSelectionWithoutErrorChecks(e);this.currentSelection_=e}});"use strict";
Polymer("tv-c-multi-alert-sub-view",{created:function(){this.currentSelection_=void 0},set selection(e){this.currentSelection_=e;this.textContent="";var c=document.createElement("tv-c-multi-slice-sub-view");this.appendChild(c);c.setSelectionWithoutErrorChecks(e);this.currentSelection_=e},get selection(){return this.currentSelection_}});"use strict";
Polymer("tv-c-single-global-memory-dump-sub-view",{created:function(){this.currentSelection_=void 0},set selection(e){if(1!==e.length)throw Error("Only supports a single global memory dump");if(!(e[0]instanceof tv.c.trace_model.GlobalMemoryDump))throw Error("Only supports global memory dumps");this.setSelectionWithoutErrorChecks(e)},get selection(){return this.currentSelection_},setSelectionWithoutErrorChecks:function(e){this.currentSelection_=e;this.textContent="";e={};var c=this.currentSelection_[0],
b;for(b in c.processMemoryDumps)e[b]=c.processMemoryDumps[b].args;b=document.createElement("tv-c-analysis-generic-object-view");b.object=e;this.appendChild(b)}});"use strict";
Polymer("tv-c-multi-global-memory-dump-sub-view",{created:function(){this.currentSelection_=void 0},set selection(e){this.currentSelection_=e;this.textContent="";e=tv.b.asArray(e).sort(tv.b.Range.compareByMinTimes);var c=new tv.c.analysis.AnalysisResults;this.appendChild(c);var b=c.appendTable("analysis-global-memory-dump-table",1);e.forEach(function(a){var f=c.appendBodyRow(b),f=c.appendTableCell(b,f,""),d="Dump at "+tv.c.analysis.tsString(a.start);f.appendChild(c.createSelectionChangingLink(d,function(){var b=
new tv.c.Selection;b.push(a);return b}))})},get selection(){return this.currentSelection_}});"use strict";
(function(){var e=tv.c.trace_model.EventRegistry;Polymer("tracing-analysis-view",{ready:function(){this.tabView_=document.createElement("tracing-analysis-tab-view");this.tabView_.style.flex="1 1 auto";this.tabView_.addEventListener("selected-tab-change",this.onSelectedTabChange_.bind(this));this.appendChild(this.tabView_);this.currentSelection_=void 0},set tallMode(c){c?this.classList.add("tall-mode"):this.classList.remove("tall-mode")},get tallMode(){return this.classList.contains("tall-mode")},
get tabView(){return this.tabView_},get selection(){return this.currentSelection_},set selection(c){var b,a;this.tabView_.selectedTab&&(b=this.tabView_.selectedTab.tagName,a=this.tabView_.selectedTab._eventTypeName);this.tallMode=!1;this.tabView_.textContent="";c=c.getEventsOrganizedByBaseType(!0);tv.b.dictionaryLength(c);for(var f in c){var d=c[f],e=this.createSubViewForSelection_(f,d);e._eventTypeName=f;this.tabView_.appendChild(e);e.selection=d}var g;b&&(g=this.tabView_.querySelector(b));!g&&a&&
(g=tv.b.findFirstInArray(this.tabView_.children,function(b){return b._eventTypeName===a}));g||(g=this.tabView_.firstChild);this.tabView_.selectedTab=g},createSubViewForSelection_:function(c,b){var a=e.getEventTypeInfoByTypeName(c),a=1===b.length?a.metadata.singleViewElementName:a.metadata.multiViewElementName;if(!tv.b.getPolymerElementNamed(a))throw Error("Element not registered: "+a);var a=document.createElement(a),f;f=1===b.length?e.getUserFriendlySingularName(c):e.getUserFriendlyPluralName(c);
a.tabLabel=f;return a},onSelectedTabChange_:function(){this.tallMode=this.tabView_.selectedTab?this.tabView_.selectedTab.requiresTallView:!1}})})();"use strict";
tv.exportTo("tv.c",function(){return{FaviconsByHue:{blue:"data:image/vndmicrosofticon;base64,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NP+9ZjT/vGY0/7xmNP+8ZjT/vGY0/7xmNP+8ZjT/u2U0/7FiLY0AAAACk5OTFu/v78X5+fn/+fn5//n5+f/5+vr/+fn5//n5+f/5+fn/+fn5//n5+f/5+/3/99iy//KWI//ylSH/8ZUh//GVIf/xlSH/8ZUh//GVIf/xlSH/8ZUh//GVIf/xlSH/8ZUh//GVIf/xlSH/8ZUh//CUIf/vkyD/5Y0fxY1XExbDw8Mz9PT05fn5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n7/f/32LL/85cj//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/wlCD/7pIg/+6SIP/pjx/lunIZM9XV1VD39/f0+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fv9//fYsv/zlyP/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/75Mg/+uRH//qkB//6pAf/+iPH/TIfBtQ3d3dYfj4+Pn5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+/3/99iy//OXI//zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh/+6TIP/ojx//548f/+ePH//njx//5o4f+c1/HGHh4eFl+Pj4+vn5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n7/f/32LL/85cj//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/tkiD/5Y0f/+SNH//ljR//5Y0f/+WNH//kjB/6zn8cZeDg4Fr4+Pj3+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fv9//fYsv/zlyP/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/65Eg/+KMHv/iix7/4ose/+KLHv/iix7/4ose/+CLHvfLfRta3NzcQvf39+/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+/3/99iy//OXI//zliH/85Yh//OWIf/zliH/85Yh//OWIf/zliH/85Yh/+qRIP/gih7/34oe/9+KHv/fih7/34oe/9+KHv/fih7/3Yge78V6GkLS0tIj9fX12fn5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n7/f/32LH/85Yg//OVHv/zlR7/85Ue//OVHv/zlR7/85Ue//OVIf/pjyH/3ogf/92HH//dhx//3Ycf/92HH//dhx//3Ycf/92HH//ahh7ZunMZI56engjy8vKu+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fr7//jr2f/2ypL/9smP//bJkP/2yZD/9smQ//bJkP/2yZD/5rNI/9OeFP/SnhX/0p4V/9KeFf/SnhX/0Z0V/9GdFf/RnRX/0Z0V/8yWFq6KVBcI////AO3t7Wr5+fn++fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn6//n6/P/5+vz/+fr8//n6/P/5+vz/+fr8//n6/P/h013/0rsA/9O8AP/TvAD/07wA/9O8AP/TvAD/07wA/9O8AP/SvAD+yLMAav/mAADr6+sA4eHhJPb29tv5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5/+LSW//TuwD/1LwA/9S8AP/UvAD/1LwA/9S8AP/UvAD/1LwA/9K6ANu/qgAkyLEAALu7uwAAAAAA8vLygfn5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/4tJb/9O7AP/UvAD/1LwA/9S8AP/UvAD/1LwA/9S8AP/UvAD/zrYAgQAAAACfjQAAAAAAAOzs7ADk5OQe9vb2zPn5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/i0lv/07sA/9S8AP/UvAD/1LwA/9S8AP/UvAD/1LwA/9K6AMzCrAAeybIAAAAAAAAAAAAAsLCwAP///wDv7+9O+Pj47Pn5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5/+LSW//TuwD/1LwA/9S8AP/UvAD/1LwA/9S8AP/TuwDsy7QATu7UAACXhQAAAAAAAAAAAAAAAAAA1tbWALS0tAPy8vJv+Pj49Pn5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/4tJb/9O7AP/UvAD/1LwA/9S8AP/UvAD/07wA9M63AG6ZiQADtqIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4uLiANfX1wbz8/Nz+Pj48Pn5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/i0lv/07sA/9S8AP/UvAD/1LwA/9O8APDPuABzuKMABsGrAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4+PjANjY2ATy8vJZ+Pj42vn5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5/+HSW//TugD/1LsA/9S8AP/TuwDazrcAWbejAATBqwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1NTUAB8fHwDw8PAr9vb2nPj4+O35+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/7uas/+bZdv/j1mvt2cYznMu0ACsUFAAAtaEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOvr6wDj4+MG8vLyOvb29pD4+PjS+fn58vn5+f35+fn/+fn5//n5+f/5+fn/+fn5/fn5+fL4+frS9/j8kPT1/Trs8v8G8PP/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADh4eEA1tbWAu/v7xv09PRJ9vb2dvb29pf39/eo9/f3qPb29pf29vZ29PT0Se/v7xvW1tYC4eHhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/gB///gAH//gAAf/wAAD/4AAAf8AAAD+AAAAfAAAADwAAAA4AAAAGAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAGAAAABwAAAA8AAAAPgAAAH4AAAB/AAAA/4AAAf/gAAf/8AAP//wAP/",green:"data:image/vndmicrosofticon;base64,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a/9sjmr/bI1q/2yNav9sjWr/bI1q/2uNav9rjWr/a41q/16GZI0AAAACk5OTFu/v78X5+fn/+fn5//n5+f/5+fr/+fn5//n5+f/5+fn/+fn5//n5+f/8+vv/wOfV/0vCi/9Kwor/SsKK/0rCiv9Kwor/SsKK/0rCiv9Kwor/SsKK/0rCiv9Kwor/SsKK/0rCiv9Kwor/SsKK/0nAif9Jv4j/RreCxStxUBbDw8Mz9PT05fn5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//z6+/+/59X/TMSM/0rDi/9Kw4v/SsOL/0rDi/9Kw4v/SsOL/0rDi/9Kw4v/SsOL/0rDi/9Kw4v/SsOL/0rDi/9JwYn/SL6I/0i+iP9GuoXlOJVqM9XV1VD39/f0+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn//Pr7/7/n1f9Mw4z/SsOL/0rDi/9Kw4v/SsOL/0rDi/9Kw4v/SsOL/0rDi/9Kw4v/SsOL/0rDi/9Kw4v/ScCJ/0e8hv9HvIb/R7yG/0a6hfQ9oXJQ3d3dYfj4+Pn5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/8+vv/v+fV/0zDjP9Kw4v/SsOL/0rDi/9Kw4v/SsOL/0rDi/9Kw4v/SsOL/0rDi/9Kw4v/SsOL/0i/iP9GuoX/RrqE/0a6hP9GuoT/RrmD+T6ldWHh4eFl+Pj4+vn5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//z6+/+/59X/TMOM/0rDi/9Kw4v/SsOL/0rDi/9Kw4v/SsOL/0rDi/9Kw4v/SsOL/0rDi/9Ivof/RbiD/0W3gv9FuIP/RbiD/0W4g/9Ft4L6PqZ2ZeDg4Fr4+Pj3+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn//Pr7/7/n1f9Mw4z/SsOL/0rDi/9Kw4v/SsOL/0rDi/9Kw4v/SsOL/0rDi/9Kw4v/SL2H/0W2gv9FtYH/RbWB/0W1gf9FtYH/RbWB/0S0gPc+o3Ra3NzcQvf39+/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/8+vv/v+fV/0zDjP9Kw4v/SsOL/0rDi/9Kw4v/SsOL/0rDi/9Kw4v/SsOL/0e8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",
red:"data:image/vndmicrosofticon;base64,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xv9HL8b/Ry/G/0cvxv9HL8b/Ry/G/0cvxv9HL8X/Ry7F/z8tuI0AAAACk5OTFu/v78X5+fn/+fn5//n5+f/6+vn/+fr5//n6+f/5+vn/+fr5//n6+f/9/fn/ub73/zhF8v82Q/L/NkPy/zZD8v82Q/L/NkPy/zZD8v82Q/L/NkPy/zZD8v82Q/L/NkPy/zZD8v82Q/L/NkPy/zVC8f81QvD/Mz/mxR8njhbDw8Mz9PT05fn5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//z8+f+5vff/OEX0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P81QvH/NEHv/zRB7/8zQOrlKTO6M9XV1VD39/f0+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn//Pz5/7m99/84RfT/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NULw/zRA7P80QOv/NEDr/zNA6fQsN8lQ3d3dYfj4+Pn5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/8/Pn/ub33/zhF9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zVB7/8zQOn/Mz/o/zM/6P8zQOj/Mz/n+S04zmHh4eFl+Pj4+vn5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//z8+f+5vff/OEX0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P80Qe7/Mz/m/zM/5f8zP+b/Mz/m/zM/5v8yP+X6LjnPZeDg4Fr4+Pj3+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn//Pz5/7m99/84RfT/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NEHs/zI+4/8yPuP/Mj7j/zI+4/8yPuP/Mj7j/zI+4fctOMxa3NzcQvf39+/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/8/Pn/ub33/zhF9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zZD9P82Q/T/NkP0/zRA6/8xPeH/MT3g/zE94P8xPeD/MT3g/zE94P8xPeD/MT3e7ys2xkLS0tIj9fX12fn5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//z8+f+4vff/NkP0/zNB9P80QfT/NEH0/zRB9P80QfT/NEH0/zZC8/81P+n/Mjze/zI73f8yO93/Mjvd/zI73f8yO93/Mjvd/zI73f8xO9rZKTO7I56engjy8vKu+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+/r5/9ze+P+covf/mqD3/5qg9/+aoPf/mqD3/5qg9/+aoPf/UoLz/x1p5/8eaeb/Hmnm/x5p5v8eaeX/Hmnl/x5p5f8eaOX/Hmjl/yBh3a4jJokI////AO3t7Wr5+fn++fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+vr5//z8+f/8/Pn//Pz5//z8+f/8/Pn//Pz5//z8+f9dvfz/AJf+/wCZ/v8Amf7/AJn+/wCZ/v8Amf7/AJn+/wCZ/v8AmP7+AJLxagC4/wDr6+sA4eHhJPb29tv5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5/1u8/f8Alv//AJj//wCY//8AmP//AJj//wCY//8AmP//AJj//wCW/NsAieckAI/xALu7uwAAAAAA8vLygfn5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/W7z9/wCW//8AmP//AJj//wCY//8AmP//AJj//wCY//8AmP//AJP3gQAAAAAAcr8AAAAAAOzs7ADk5OQe9vb2zPn5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f9bvP3/AJb//wCY//8AmP//AJj//wCY//8AmP//AJj//wCW/MwAi+oeAJDxAAAAAAAAAAAAsLCwAP///wDv7+9O+Pj47Pn5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5/1u8/f8Alv//AJj//wCY//8AmP//AJj//wCY//8Al/7sAJL0TgCr/wAAa7QAAAAAAAAAAAAAAAAA1tbWALS0tAPy8vJv+Pj49Pn5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/W7z9/wCW//8AmP//AJj//wCY//8AmP//AJj+9ACU+G4AbrgDAIPaAAAAAAAAAAAAAAAAAAAAAAAAAAAA4uLiANfX1wbz8/Nz+Pj48Pn5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f9bvP3/AJb//wCY//8AmP//AJj//wCY/vAAlflzAITcBgCK5wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4+PjANjY2ATy8vJZ+Pj42vn5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5/1u7/f8Alf//AJf//wCY//8Al/7aAJT4WQCE3AQAiucAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1NTUAB8fHwDw8PAr9vb2nPj4+O35+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/rNv7/3bG/P9rwfztM6r7nACR9SsAER0AAIPZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOvr6wDj4+MG8vLyOvb29pD4+PjS+fn58vn5+f35+fn/+fn5//n5+f/5+fn/+fn5/fn5+fL6+fjS/Pj2kP338jr/+eIG//fqAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADh4eEA1tbWAu/v7xv09PRJ9vb2dvb29pf39/eo9/f3qPb29pf29vZ29PT0Se/v7xvW1tYC4eHhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/gB///gAH//gAAf/wAAD/4AAAf8AAAD+AAAAfAAAADwAAAA4AAAAGAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAAGAAAABwAAAA8AAAAPgAAAH4AAAB/AAAA/4AAAf/gAAf/8AAP//wAP/",
yellow:"data:image/vndmicrosofticon;base64,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//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8Hv/3/Br36/wa9+v8GuvbsBZnLQNra2mD39/f4+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn//fr5/6Xm+/8Jwf//B8H//wfB//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8Hwf//B778/wa79/8Guvf/Brr3/wa59fgFo9hg4uLidPj4+P35+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/9+vn/peb7/wnB//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8Hwf//B8H//we++/8GufX/Brj0/wa49P8GuPT/Brfz/QWm3XTk5OR6+Pj4/fn5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//36+f+l5vv/CcH//wfB//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8Hvfr/Brfy/wa28f8GtvH/Brbx/wa28f8GtfD9BafdeuXl5W/4+Pj8+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn//fr5/6Xm+/8Jwf//B8H//wfB//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8Hwf//B7z5/wa17/8GtO7/BrTu/wa07v8GtO7/BrTu/waz7fwFpdtv4eHhVvj4+Pb5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/9+vn/peb7/wnB//8Hwf//B8H//wfB//8Hwf//B8H//wfB//8Hwf//B8H//we7+P8Gsu3/BrHr/wax6/8Gsev/BrHr/wax6/8Gsev/BrDq9gWh1Vba2toz9vb25vn5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//36+f+k5fv/BsH//wPA//8DwP//A8D//wPA//8DwP//A8D//wXA//8Guvb/BrDq/wau6P8Gruj/Bq7o/wau6P8Gruj/Bq7o/wau6P8GreXmBZnLM7+/vxH09PTC+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+/r5/83v+v9x2vz/btn9/2/Z/f9v2f3/b9n9/2/Z/f9v2f3/RdL5/yXG7v8mxOz/JsTs/ybE6/8mxOv/JsTr/yXE6/8lw+v/JcPr/yK95cIQirAR////APDw8IH5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+vn5//r5+f/6+fn/+vn5//r5+f/6+fn/+vn5//r5+f+H8Pz/Oer+/zzq/v886v7/POr+/zzq/v886v7/POr+/zzq/v886v3/OuDzgWz//wD09PQA5+fnNPf39+n5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5/4Xw/f846///O+v//zvr//876///O+v//zvr//876///O+v//zvp/ek32+00Ouf6AMrKygCzs7MF8/Pzmvn5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/hfD9/zjr//876///O+v//zvr//876///O+v//zvr//876///OuX5miqptwUwv88AAAAAAPPz8wDp6eku9/f33fn5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f+F8P3/OOv//zvr//876///O+v//zvr//876///O+v//zvp/d033O8uOuX5AAAAAAAAAAAAvr6+AP///wDx8fFl+Pj49fn5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5/4Xw/f846///O+v//zvr//876///O+v//zvr//876v71OeP2ZY7//wAus8IAAAAAAAAAAAAAAAAA4ODgANPT0wj09PSI+fn5+vn5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/hfD9/zjr//876///O+v//zvr//876///O+v/+jrm+Ygyx9gINdPlAAAAAAAAAAAAAAAAAAAAAAAAAAAA6enpAOHh4Q309PSM+fn5+Pn5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5+f/5+fn/+fn5//n5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"}}});
"use strict";
tv.exportTo("tv.c",function(){function e(b,a){this.stableId=b;this.yPercentOffset=a}function c(b,a){this.xWorld_=b;this.yComponents_=a}e.prototype={toDict:function(){return{stableId:this.stableId,yPercentOffset:this.yPercentOffset}}};c.fromViewCoordinates=function(b,a,f){var d=b.currentDisplayTransform.xViewToWorld(a),h=[];for(b=document.elementFromPoint(a+b.modelTrackContainer.canvas.offsetLeft,f+b.modelTrackContainer.canvas.offsetTop);b instanceof tv.c.tracks.Track;)b.eventContainer&&(a=b.getBoundingClientRect(),
h.push(new e(b.eventContainer.stableId,(f-a.top)/a.height))),b=b.parentElement;if(0!=h.length)return new c(d,h)};c.fromStableIdAndTimestamp=function(b,a,f){var d=[];if(b=b.containerToTrackObj.getTrackByStableId(a)){for(a=b.getBoundingClientRect().top;b instanceof tv.c.tracks.Track;){if(b.eventContainer){var h=b.getBoundingClientRect();d.push(new e(b.eventContainer.stableId,(a-h.top)/h.height))}b=b.parentElement}if(0!=d.length)return new c(f,d)}};c.prototype={get xWorld(){return this.xWorld_},getContainingTrack:function(b){b=
b.containerToTrackObj;for(var a in this.yComponents_){var c=b.getTrackByStableId(this.yComponents_[a].stableId);if(void 0!==c)return c}},toViewCoordinates:function(b){var a=b.containerToTrackObj;b=b.currentDisplayTransform.xWorldToView(this.xWorld_);var c=-1,d;for(d in this.yComponents_){var e=this.yComponents_[d],g=a.getTrackByStableId(e.stableId);if(void 0!==g){a=g.getBoundingClientRect();c=e.yPercentOffset*a.height+a.top;break}}return{viewX:b,viewY:c}},toDict:function(){return{xWorld:this.xWorld_,
yComponents:this.yComponents_}}};return{Location:c}});"use strict";
tv.exportTo("tv.c",function(){function e(c,b){this.location_=c;this.scaleX_=b}e.fromUserFriendlyString=function(c,b,a){var f=/^(-?\d+(\.\d+)?)@(\d+)\.(\d+)x(\d+(\.\d+)?)$/g.exec(a);if(f){a=parseFloat(f[1]);var d=f[3],h=f[4],f=parseFloat(f[5]);if(0>=f)throw Error("Invalid ScaleX value in UI State string.");c=c.processes[d];if(!c)throw Error("Invalid PID value in UI State string.");c=c.threads[h];if(!c)throw Error("Invalid TID value in UI State string.");b=tv.c.Location.fromStableIdAndTimestamp(b,c.stableId,
a);return new e(b,f)}};e.prototype={get location(){return this.location_},get scaleX(){return this.scaleX_},toUserFriendlyString:function(c){var b=this.location_.xWorld;c=this.location_.getContainingTrack(c).eventContainer.stableId;return b+"@"+c+"x"+this.scaleX_},toDict:function(){return{location:this.location_.toDict(),scaleX:this.scaleX_}}};return{UIState:e}});"use strict";
tv.exportTo("tv.c",function(){function e(){this.timeline_=void 0;this.filterText_="";this.filterHits_=new tv.c.Selection;this.filterHitsDirty_=!0;this.currentHitIndex_=-1}var c=tv.b.Task;e.prototype={__proto__:Object.prototype,get model(){if(this.timeline_)return this.timeline_.model},get timeline(){return this.timeline_},set timeline(b){this.timeline_=b;this.filterHitsDirty_=!0},get filterText(){return this.filterText_},set filterText(b){b!=this.filterText_&&(this.filterText_=b,this.filterHitsDirty_=
!0)},getFilterPromise_:function(b){if(this.timeline_){var a=Promise.resolve();b=new tv.c.TitleOrCategoryFilter(b);var f=new tv.c.Selection;b=this.timeline.addAllObjectsMatchingFilterToSelectionAsTask(b,f);a=c.RunWhenIdle(b);a.then(function(){this.filterHitsDirty_=!1;this.filterHits_=f;this.timeline.setHighlightAndClearSelection(f)}.bind(this));return a}},clearFindSelections_:function(){this.timeline.setHighlightAndClearSelection(new tv.c.Selection);this.timeline.removeXNavStringMarker()},updateFilterHits:function(){var b=
Promise.resolve();if(!this.filterHitsDirty_)return b;this.filterHits_=new tv.c.Selection;this.currentHitIndex_=-1;var a;try{a=tv.c.UIState.fromUserFriendlyString(this.model,this.timeline.viewport,this.filterText)}catch(c){return a=new tv.b.ui.Overlay,a.textContent=c.message,a.title="UI State Navigation Error",a.visible=!0,b}void 0!==a?this.timeline.navToPosition(a):0===this.filterText.length?this.clearFindSelections_():b=this.getFilterPromise_(this.filterText);return b},get filterHits(){return this.filterHits_},
get currentHitIndex(){return this.currentHitIndex_},find_:function(b){-1===this.currentHitIndex_&&0>b&&(this.currentHitIndex_=0);var a=this.filterHits.length;this.currentHitIndex_=(this.currentHitIndex_+b+a)%a;this.timeline&&(this.timeline.selection=this.filterHits.subSelection(this.currentHitIndex_,1))},findNext:function(){this.find_(1)},findPrevious:function(){this.find_(-1)},reset:function(){this.filterText_="";this.filterHitsDirty_=!0}};return{FindController:e}});"use strict";
tv.exportTo("tv.b",function(){function e(c){this.document_=c||document;if(e.instance)throw Error("KeyEventManager is a singleton.");this.onEvent_=this.onEvent_.bind(this);this.document_.addEventListener("keydown",this.onEvent_);this.document_.addEventListener("keypress",this.onEvent_);this.document_.addEventListener("keyup",this.onEvent_);this.listeners_=[]}e.instance=void 0;document.head.addEventListener("tv-unittest-will-run",function(){e.instance&&(e.instance.destroy(),e.instance=void 0);e.instance=
new e});e.prototype={addListener:function(c,b,a){a.keyEventManagerGuid_||(a.keyEventManagerGuid_=tv.b.GUID.allocate(),a.keyEventManagerRefCount_=0);a.classList.add("key-event-manager-target");a.keyEventManagerRefCount_++;this.listeners_.push({guid:a.keyEventManagerGuid_,type:c,handler:b})},onEvent_:function(c){var b=void 0,a=!1,f=c.preventDefault;c.preventDefault=function(){b=!1;f.call(this)};var d=c.stopPropagation;c.stopPropagation=function(){a=!0;d.call(this)};c.stopImmediatePropagation=function(){throw Error("Not implemented");
};for(var e=this.document_.querySelectorAll(".key-event-manager-target"),g={},k=0;k<e.length;k++)g[e[k].keyEventManagerGuid_]=e[k];for(var e=this.listeners_.concat(),l=c.type,m=0,k=0;k<e.length;k++){var n=e[k];if(n.type===l){var q=g[n.guid];if(q&&(n=n.handler,m=n.handleEvent?m|!1===n.handleEvent.call(n,c):m|!1===n.call(q,c),a))break}}return!m&&b},removeListener:function(c,b,a){if(void 0===a.keyEventManagerGuid_)throw Error("Was not registered with KeyEventManager");if(0===a.keyEventManagerRefCount_)throw Error("No events were registered on the provided thisArg");
for(var f=0;f<this.listeners_.length;f++){var d=this.listeners_[f];if(d.type==c&&d.handler==b&&d.guid==a.keyEventManagerGuid_){a.keyEventManagerRefCount_--;0===a.keyEventManagerRefCount_&&a.classList.remove("key-event-manager-target");this.listeners_.splice(f,1);return}}throw Error("Listener not found");},destroy:function(){this.listeners_.splice(0);this.document_.removeEventListener("keydown",this.onEvent_);this.document_.removeEventListener("keypress",this.onEvent_);this.document_.removeEventListener("keyup",
this.onEvent_)},dispatchFakeEvent:function(c,b){var a=new KeyboardEvent(c,b);return e.instance.onEvent_.call(void 0,a)}};e.instance=new e;return{KeyEventManager:e}});"use strict";
tv.exportTo("tv.b.ui",function(){function e(c){this.onMouseDown_=this.onMouseDown_.bind(this);this.onMouseMove_=this.onMouseMove_.bind(this);this.onMouseUp_=this.onMouseUp_.bind(this);this.targetElement=c}e.prototype={get targetElement(){return this.targetElement_},set targetElement(c){this.targetElement_&&this.targetElement_.removeEventListener("mousedown",this.onMouseDown_);(this.targetElement_=c)&&this.targetElement_.addEventListener("mousedown",this.onMouseDown_)},onMouseDown_:function(c){if(0!==
c.button)return!0;c=this.remakeEvent_(c,"mouse-tracker-start");this.targetElement_.dispatchEvent(c);document.addEventListener("mousemove",this.onMouseMove_);document.addEventListener("mouseup",this.onMouseUp_);this.targetElement_.addEventListener("blur",this.onMouseUp_);this.savePreviousUserSelect_=document.body.style["-webkit-user-select"];document.body.style["-webkit-user-select"]="none";c.preventDefault();return!0},onMouseMove_:function(c){c=this.remakeEvent_(c,"mouse-tracker-move");this.targetElement_.dispatchEvent(c)},
onMouseUp_:function(c){document.removeEventListener("mousemove",this.onMouseMove_);document.removeEventListener("mouseup",this.onMouseUp_);this.targetElement_.removeEventListener("blur",this.onMouseUp_);document.body.style["-webkit-user-select"]=this.savePreviousUserSelect_;c=this.remakeEvent_(c,"mouse-tracker-end");this.targetElement_.dispatchEvent(c)},remakeEvent_:function(c,b){var a=new tv.b.Event(b,!0,!0);a.x=c.x;a.y=c.y;a.offsetX=c.offsetX;a.offsetY=c.offsetY;a.clientX=c.clientX;a.clientY=c.clientY;
return a}};return{MouseTracker:e,trackMouseMovesUntilMouseUp:function(c,b){function a(f){document.removeEventListener("mousemove",c);document.removeEventListener("mouseup",a);b&&b(f)}document.addEventListener("mousemove",c);document.addEventListener("mouseup",a)}}});"use strict";
tv.exportTo("tv.b.ui",function(){var e=document.currentScript.ownerDocument,c={SELECTION:1,PANSCAN:2,ZOOM:4,TIMING:8,ROTATE:16,ALL_MODES:31},b={};b[c.PANSCAN]={title:"pan",className:"pan-scan-mode-button",eventNames:{enter:"enterpan",begin:"beginpan",update:"updatepan",end:"endpan",exit:"exitpan"}};b[c.SELECTION]={title:"selection",className:"selection-mode-button",eventNames:{enter:"enterselection",begin:"beginselection",update:"updateselection",end:"endselection",exit:"exitselection"}};b[c.ZOOM]=
{title:"zoom",className:"zoom-mode-button",eventNames:{enter:"enterzoom",begin:"beginzoom",update:"updatezoom",end:"endzoom",exit:"exitzoom"}};b[c.TIMING]={title:"timing",className:"timing-mode-button",eventNames:{enter:"entertiming",begin:"begintiming",update:"updatetiming",end:"endtiming",exit:"exittiming"}};b[c.ROTATE]={title:"rotate",className:"rotate-mode-button",eventNames:{enter:"enterrotate",begin:"beginrotate",update:"updaterotate",end:"endrotate",exit:"exitrotate"}};var a={SHIFT:1,SPACE:2,
CMD_OR_CTRL:4},f=tv.b.ui.define("div");f.prototype={__proto__:HTMLDivElement.prototype,decorate:function(a){this.classList.add("mouse-mode-selector");var b=tv.b.instantiateTemplate("#mouse-mode-selector-template",e);this.appendChild(b);this.buttonsEl_=this.querySelector(".buttons");this.dragHandleEl_=this.querySelector(".drag-handle");this.supportedModeMask=c.ALL_MODES;this.initialRelativeMouseDownPos_={x:0,y:0};this.defaultMode_=c.PANSCAN;this.settingsKey_=void 0;this.mousePos_={x:0,y:0};this.mouseDownPos_=
{x:0,y:0};this.dragHandleEl_.addEventListener("mousedown",this.onDragHandleMouseDown_.bind(this));this.onMouseDown_=this.onMouseDown_.bind(this);this.onMouseMove_=this.onMouseMove_.bind(this);this.onMouseUp_=this.onMouseUp_.bind(this);this.buttonsEl_.addEventListener("mouseup",this.onButtonMouseUp_);this.buttonsEl_.addEventListener("mousedown",this.onButtonMouseDown_);this.buttonsEl_.addEventListener("click",this.onButtonPress_.bind(this));tv.b.KeyEventManager.instance.addListener("keydown",this.onKeyDown_,
this);tv.b.KeyEventManager.instance.addListener("keyup",this.onKeyUp_,this);this.mode_=this.keyCodeCondition=void 0;this.modeToKeyCodeMap_={};this.modifierToModeMap_={};this.targetElement=a;this.spacePressed_=!1;this.modeBeforeAlternativeModeActivated_=null;this.isClick_=this.isInteracting_=!1},get targetElement(){return this.targetElement_},set targetElement(a){this.targetElement_&&this.targetElement_.removeEventListener("mousedown",this.onMouseDown_);(this.targetElement_=a)&&this.targetElement_.addEventListener("mousedown",
this.onMouseDown_)},get defaultMode(){return this.defaultMode_},set defaultMode(a){this.defaultMode_=a},get settingsKey(){return this.settingsKey_},set settingsKey(a){if(this.settingsKey_=a)if(a=tv.b.Settings.get(this.settingsKey_+".mode",void 0),void 0===b[a]&&(a=void 0),0===(a&this.supportedModeMask_)&&(a=void 0),a||(a=this.defaultMode_),this.mode=a,a=tv.b.Settings.get(this.settingsKey_+".pos",void 0))this.pos=a},get supportedModeMask(){return this.supportedModeMask_},set supportedModeMask(a){function f(a){var d=
document.createElement("div");d.mode=a;d.title=b[a].title;d.classList.add("tool-button");d.classList.add(b[a].className);return d}if(this.mode&&0===(a&this.mode))throw Error("supportedModeMask must include current mode.");this.supportedModeMask_=a;this.buttonsEl_.textContent="";for(var e in c)"ALL_MODES"!=e&&(a=c[e],0!==(this.supportedModeMask_&a)&&this.buttonsEl_.appendChild(f(a)))},get mode(){return this.currentMode_},set mode(a){if(void 0!==a){if("number"!==typeof a)throw Error("Mode must be a number");
if(0===(a&this.supportedModeMask_))throw Error("Cannot switch to this mode, it is not supported");if(void 0===b[a])throw Error("Unrecognized mode");}var c;if(this.currentMode_!==a){if(this.currentMode_){c=b[this.currentMode_];var f=this.buttonsEl_.querySelector("."+c.className);f&&f.classList.remove("active");this.isInteracting_&&(f=this.createEvent_(b[this.mode].eventNames.end),this.dispatchEvent(f));tv.b.dispatchSimpleEvent(this,c.eventNames.exit,!0)}if(this.currentMode_=a)c=b[this.currentMode_],
(f=this.buttonsEl_.querySelector("."+c.className))&&f.classList.add("active"),this.mouseDownPos_.x=this.mousePos_.x,this.mouseDownPos_.y=this.mousePos_.y,this.isInAlternativeMode_||tv.b.dispatchSimpleEvent(this,c.eventNames.enter,!0),this.isInteracting_&&(f=this.createEvent_(b[this.mode].eventNames.begin),this.dispatchEvent(f));this.settingsKey_&&!this.isInAlternativeMode_&&tv.b.Settings.set(this.settingsKey_+".mode",this.mode)}},setKeyCodeForMode:function(a,c){if(0===(a&this.supportedModeMask_))throw Error("Mode not supported");
this.modeToKeyCodeMap_[a]=c;if(this.buttonsEl_){var f=b[a],e=this.buttonsEl_.querySelector("."+f.className);e&&(e.title=f.title+" ("+String.fromCharCode(c)+")")}},setKeyCodeCondition:function(a){this.keyCodeCondition=a},setCurrentMousePosFromEvent_:function(a){this.mousePos_.x=a.clientX;this.mousePos_.y=a.clientY},createEvent_:function(a,b){var c=new tv.b.Event(a,!0);c.clientX=this.mousePos_.x;c.clientY=this.mousePos_.y;c.deltaX=this.mousePos_.x-this.mouseDownPos_.x;c.deltaY=this.mousePos_.y-this.mouseDownPos_.y;
c.mouseDownX=this.mouseDownPos_.x;c.mouseDownY=this.mouseDownPos_.y;c.didPreventDefault=!1;c.preventDefault=function(){c.didPreventDefault=!0;b&&b.preventDefault()};c.stopPropagation=function(){b.stopPropagation()};c.stopImmediatePropagation=function(){throw Error("Not implemented");};return c},onMouseDown_:function(a){0===a.button&&(this.setCurrentMousePosFromEvent_(a),a=this.createEvent_(b[this.mode].eventNames.begin,a),this.dispatchEvent(a),this.isClick_=this.isInteracting_=!0,tv.b.ui.trackMouseMovesUntilMouseUp(this.onMouseMove_,
this.onMouseUp_))},onMouseMove_:function(a){this.setCurrentMousePosFromEvent_(a);var c=this.createEvent_(b[this.mode].eventNames.update,a);this.dispatchEvent(c);this.isInteracting_&&this.checkIsClick_(a)},onMouseUp_:function(a){if(0===a.button){var c=this.createEvent_(b[this.mode].eventNames.end,a);c.isClick=this.isClick_;this.dispatchEvent(c);this.isClick_&&!c.didPreventDefault&&this.dispatchClickEvents_(a);this.isInteracting_=!1;this.updateAlternativeModeState_(a)}},onButtonMouseDown_:function(a){a.preventDefault();
a.stopImmediatePropagation()},onButtonMouseUp_:function(a){a.preventDefault();a.stopImmediatePropagation()},onButtonPress_:function(a){this.modeBeforeAlternativeModeActivated_=void 0;this.mode=a.target.mode;a.preventDefault()},onKeyDown_:function(a){32===a.keyCode&&(this.spacePressed_=!0);this.updateAlternativeModeState_(a)},onKeyUp_:function(a){32===a.keyCode&&(this.spacePressed_=!1);if(void 0==this.keyCodeCondition||this.keyCodeCondition()){var b=!1;tv.b.iterItems(this.modeToKeyCodeMap_,function(c,
f){a.keyCode===f&&(this.modeBeforeAlternativeModeActivated_=void 0,this.mode=parseInt(c),b=!0)},this);b?(a.preventDefault(),a.stopPropagation()):this.updateAlternativeModeState_(a)}},updateAlternativeModeState_:function(b){var c=this.spacePressed_,f=tv.isMac&&b.metaKey||!tv.isMac&&b.ctrlKey,e=this.supportedModeMask_,l=!1;b.shiftKey&&0!==(this.modifierToModeMap_[a.SHIFT]&e)?(b=this.modifierToModeMap_[a.SHIFT],l=!0):c&&0!==(this.modifierToModeMap_[a.SPACE]&e)?(b=this.modifierToModeMap_[a.SPACE],l=!0):
f&&0!==(this.modifierToModeMap_[a.CMD_OR_CTRL]&e)?(b=this.modifierToModeMap_[a.CMD_OR_CTRL],l=!0):this.isInAlternativeMode_?(b=this.modeBeforeAlternativeModeActivated_,l=!1):b=void 0;this.mode===b||void 0===b||(l&&(this.modeBeforeAlternativeModeActivated_=this.mode),this.mode=b)},get isInAlternativeMode_(){return!!this.modeBeforeAlternativeModeActivated_},setModifierForAlternateMode:function(a,b){this.modifierToModeMap_[b]=a},get pos(){return{x:parseInt(this.style.left),y:parseInt(this.style.top)}},
set pos(a){a=this.constrainPositionToBounds_(a);this.style.left=a.x+"px";this.style.top=a.y+"px";this.settingsKey_&&tv.b.Settings.set(this.settingsKey_+".pos",this.pos)},constrainPositionToBounds_:function(a){var b=tv.b.windowRectForElement(this.offsetParent||document.body),c=b.height-this.offsetHeight,b=b.width-this.offsetWidth,f={};f.x=Math.max(a.x,0);f.x=Math.min(f.x,b);f.y=Math.max(a.y,0);f.y=Math.min(f.y,c);return f},onDragHandleMouseDown_:function(a){a.preventDefault();a.stopImmediatePropagation();
var b=a.clientX-this.offsetLeft,c=a.clientY-this.offsetTop;tv.b.ui.trackMouseMovesUntilMouseUp(function(a){var d={};d.x=a.clientX-b;d.y=a.clientY-c;this.pos=d}.bind(this))},checkIsClick_:function(a){if(this.isInteracting_&&this.isClick_){a=this.mousePos_.x-this.mouseDownPos_.x;var b=this.mousePos_.y-this.mouseDownPos_.y;16<a*a+b*b&&(this.isClick_=!1)}},dispatchClickEvents_:function(a){if(this.isClick_){a=b[c.SELECTION].eventNames;var f=this.createEvent_(a.begin);this.dispatchEvent(f);f=this.createEvent_(a.end);
this.dispatchEvent(f)}}};return{MIN_MOUSE_SELECTION_DISTANCE:4,MouseModeSelector:f,MOUSE_SELECTOR_MODE:c,MODIFIER:a}});"use strict";
tv.exportTo("tv.c",function(){var e=tv.b.ui.getRawColorPalette(),c=tv.b.ui.getColorPalette(),b=tv.c.trace_model.SelectionState;return{EventPresenter:{getAlpha_:function(a){return a.selectionState===b.DIMMED?0.3:1},getColorIdOffset_:function(a){return a.selectionState===b.SELECTED?tv.b.ui.paletteProperties.highlightIdBoost:0},getTextColor:function(a){return a.selectionState===b.DIMMED?"rgb(60,60,60)":"rgb(0,0,0)"},getSliceColorId:function(a){return a.colorId+this.getColorIdOffset_(a)},getSliceAlpha:function(a,
b){var d=this.getAlpha_(a);b&&(d*=0.3);return d},getInstantSliceColor:function(a){var b=a.colorId+this.getColorIdOffset_(a);return tv.b.ui.colorToRGBAString(e[b],this.getAlpha_(a))},getObjectInstanceColor:function(a){a=a.colorId+this.getColorIdOffset_(a);return tv.b.ui.colorToRGBAString(e[a],0.25)},getObjectSnapshotColor:function(a){a=a.objectInstance.colorId+this.getColorIdOffset_(a);return c[a]},getCounterSeriesColor:function(a,b,d){b={selectionState:b};return tv.b.ui.colorToRGBAString(e[a+this.getColorIdOffset_(b)],
this.getAlpha_(b)*(void 0!==d?d:1))},getBarSnapshotColor:function(a,b){var d=(a.objectInstance.colorId+b)%tv.b.ui.paletteProperties.numGeneralPurposeColorIds,d=d+this.getColorIdOffset_(a);return tv.b.ui.colorToRGBAString(e[d],this.getAlpha_(a))}}}});"use strict";
tv.exportTo("tv.c",function(){function e(){this.textWidthMap={}}function c(a,b){this.string=a;this.width=b}var b={};new e;e.prototype={get:function(a,f,d,e,g){var k=b[d];k||(k={},b[d]=k);e=k[f];e||(k[f]={},e=k[f]);k=e[g];if(void 0===k){for(k=!1;this.labelWidthWorld(a,d,f)>g&&!(1>0.75*d.length);)d=d.substring(0,0.75*d.length),k=!0;k&&3<d.length&&(d=d.substring(0,d.length-3)+"...");k=new c(d,this.labelWidth(a,d));e[g]=k}return k},quickMeasureText_:function(a,b){var d=this.textWidthMap[b];d||(d=a.measureText(b).width,
this.textWidthMap[b]=d);return d},labelWidth:function(a,b){return this.quickMeasureText_(a,b)+2},labelWidthWorld:function(a,b,d){return this.labelWidth(a,b)*d}};return{ElidedTitleCache:e}});"use strict";
tv.exportTo("tv.c",function(){function e(a,b,c,f,e){a.moveTo(b,c);a.lineTo(f,e)}function c(a,b,c,f,e,m,n){a.beginPath();a.moveTo(b,c);a.lineTo(f,e);a.lineTo(m,n);a.closePath()}var b=new tv.c.ElidedTitleCache,a=tv.b.ui.getColorPalette(),f=tv.c.EventPresenter;return{drawSlices:function(b,c,g,k,l,m,n){var q=window.devicePixelRatio||1,w=c.xViewVectorToWorld(1);l*=q;q*=4;l<q&&(q=0);var s=l-q;b.save();c.applyTransformToCanvas(b);c=new tv.c.FastRectRenderer(b,2*w,2*w,a);c.setYandH(0,l);for(g=tv.b.findLowIndexInSortedArray(m,
function(a){return a.start+a.duration},g);g<m.length;++g){var D=m[g],F=D.start;if(F>k)break;var C=w;0<D.duration&&(C=Math.max(D.duration,0.001),C<w&&(C=w));var v=f.getSliceColorId(D),y=f.getSliceAlpha(D,n),B=0.7*y;D.isTopLevel&&(b.beginPath(),e(b,F,2,C+F,2),b.lineWidth=2,b.stroke(),c.setYandH(3,l-3));if(D.cpuDuration){var D=C*(D.cpuDuration/D.duration),H=C-D;D<1*w&&(D=0,H=C);H<3*w&&(D=C,H=0);0<D&&c.fillRect(F,D,v,y);0<H&&(c.setYandH(0,s),c.fillRect(F+D-w,H+w,v,B),c.setYandH(s,q),c.fillRect(F+D-w,
H+w,v,y),c.setYandH(0,l))}else c.fillRect(F,C,v,y)}c.flush();b.restore()},drawInstantSlicesAsLines:function(a,b,c,e,l,m,n){var q=window.devicePixelRatio||1;l*=q;var w=b.xViewVectorToWorld(1);a.save();a.lineWidth=w*n*q;b.applyTransformToCanvas(a);a.beginPath();for(b=tv.b.findLowIndexInSortedArray(m,function(a){return a.start},c);b<m.length;++b){c=m[b];n=c.start;if(n>e)break;a.strokeStyle=f.getInstantSliceColor(c);a.beginPath();a.moveTo(n,0);a.lineTo(n,l);a.stroke()}a.restore()},drawLabels:function(a,
c,e,k,l,m,n,q){var w=window.devicePixelRatio||1,s=c.xViewVectorToWorld(1);a.save();a.textAlign="center";a.textBaseline="top";a.font=n*w+"px sans-serif";m&&(a.font="italic "+a.font);m=q*w;n=tv.b.findLowIndexInSortedArray(l,function(a){return a.start+a.duration},e);for(e=20*s;n<l.length;++n){w=l[n];if(w.start>k)break;if(!(w.duration<=e)){q=w.title+(w.didNotFinish?" (Did Not Finish)":"");var D=b.labelWidth(a,q);b.labelWidthWorld(a,q,s)>w.duration&&(D=b.get(a,s,q,D,w.duration),q=D.string,D=D.width);D*
s<w.duration&&(a.fillStyle=f.getTextColor(w),w=c.xWorldToView(w.start+0.5*w.duration),a.fillText(q,w,m,D))}}a.restore()},drawLine:e,drawTriangle:c,drawArrow:function(a,b,f,k,l,m,n){var q=k-b,w=l-f,s=Math.sqrt(q*q+w*w),D=(s-m)/s;m=b+D*q;D=f+D*w;w=w/s*n;n*=-(q/s);a.beginPath();e(a,b,f,k,l);a.stroke();c(a,m+w,D+n,k,l,m-w,D-n);a.fill()},elidedTitleCache_:b,THIN_SLICE_HEIGHT:4}});"use strict";
tv.exportTo("tv.c",function(){function e(c){this.viewport_=c;this.range_=new tv.b.Range;this.rightSelected_=this.leftSelected_=!1;this.rightSnapIndicator_=this.leftSnapIndicator_=void 0}e.prototype={get isEmpty(){return this.range_.isEmpty},reset:function(){this.range_.reset();this.rightSelected_=this.leftSelected_=!1;this.rightSnapIndicator_=this.leftSnapIndicator_=void 0;this.viewport_.dispatchChangeEvent()},get min(){return this.range_.min},set min(c){this.range_.min=c;this.viewport_.dispatchChangeEvent()},
get max(){return this.range_.max},set max(c){this.range_.max=c;this.viewport_.dispatchChangeEvent()},set:function(c){this.range_.reset();this.range_.addRange(c);this.viewport_.dispatchChangeEvent()},setMinAndMax:function(c,b){this.range_.min=c;this.range_.max=b;this.viewport_.dispatchChangeEvent()},get range(){return this.range_.range},asRangeObject:function(){var c=new tv.b.Range;c.addRange(this.range_);return c},get leftSelected(){return this.leftSelected_},set leftSelected(c){this.leftSelected_!=
c&&(this.leftSelected_=c,this.viewport_.dispatchChangeEvent())},get rightSelected(){return this.rightSelected_},set rightSelected(c){this.rightSelected_!=c&&(this.rightSelected_=c,this.viewport_.dispatchChangeEvent())},get leftSnapIndicator(){return this.leftSnapIndicator_},set leftSnapIndicator(c){this.leftSnapIndicator_=c;this.viewport_.dispatchChangeEvent()},get rightSnapIndicator(){return this.rightSnapIndicator_},set rightSnapIndicator(c){this.rightSnapIndicator_=c;this.viewport_.dispatchChangeEvent()},
draw:function(c,b,a){if(!this.range_.isEmpty){var f=this.viewport_.currentDisplayTransform,d=this.min,e=this.max,g=Math.round(f.xWorldToView(d)),k=Math.round(f.xWorldToView(e));c.fillStyle="rgba(0, 0, 0, 0.2)";d>b&&c.fillRect(f.xWorldToView(b),0,g,c.canvas.height);e<a&&c.fillRect(k,0,f.xWorldToView(a),c.canvas.height);c.lineWidth=Math.round(window.devicePixelRatio||1);0<this.range_.range?(this.drawLine_(c,b,a,c.canvas.height,this.min,this.leftSelected_),this.drawLine_(c,b,a,c.canvas.height,this.max,
this.rightSelected_)):this.drawLine_(c,b,a,c.canvas.height,this.min,this.leftSelected_||this.rightSelected_);c.lineWidth=1}},drawLine_:function(c,b,a,f,d,e){d<b||d>=a||(b=Math.round(this.viewport_.currentDisplayTransform.xWorldToView(d)),c.save(),c.translate(Math.round(c.lineWidth)%2/2,0),c.beginPath(),tv.c.drawLine(c,b,0,b,f),c.strokeStyle=e?"rgb(255, 0, 0)":"rgb(0, 0, 0)",c.stroke(),c.restore())},drawIndicators:function(c,b,a){this.leftSnapIndicator_&&this.drawIndicator_(c,b,a,this.range_.min,this.leftSnapIndicator_,
this.leftSelected_);this.rightSnapIndicator_&&this.drawIndicator_(c,b,a,this.range_.max,this.rightSnapIndicator_,this.rightSelected_)},drawIndicator_:function(c,b,a,f,d,e){b=Math.round(this.viewport_.currentDisplayTransform.xWorldToView(f));c.save();c.translate(Math.round(c.lineWidth)%2/2,0);a=d.y*devicePixelRatio;d=d.height*devicePixelRatio;f=4*(window.devicePixelRatio||1);c.fillStyle=e?"rgb(255, 0, 0)":"rgb(0, 0, 0)";tv.c.drawTriangle(c,b-0.75*f,a,b+0.75*f,a,b,a+f);c.fill();tv.c.drawTriangle(c,
b-0.75*f,a+d,b+0.75*f,a+d,b,a+d-f);c.fill();c.restore()}};return{SnapIndicator:function(c,b){this.y=c;this.height=b},TimelineInterestRange:e}});"use strict";
tv.exportTo("tv.c",function(){function e(c){c?this.set(c):(this.scaleX=1,this.panY=this.panX=0)}e.prototype={set:function(c){this.scaleX=c.scaleX;this.panX=c.panX;this.panY=c.panY},clone:function(){return new e(this)},equals:function(c){var b;if(void 0===c||null===c)return!1;b=1&this.panX===c.panX;b&=this.panY===c.panY;b&=this.scaleX===c.scaleX;return!!b},almostEquals:function(c){var b;if(void 0===c||null===c)return!1;b=1&0.001>Math.abs(this.panX-c.panX);b&=0.001>Math.abs(this.panY-c.panY);b&=0.001>
Math.abs(this.scaleX-c.scaleX);return!!b},incrementPanXInViewUnits:function(c){this.panX+=this.xViewVectorToWorld(c)},xPanWorldPosToViewPos:function(c,b,a){if("string"==typeof b)if("left"===b)b=0;else if("center"===b)b=a/2;else if("right"===b)b=a-1;else throw Error("viewX must be left|center|right or number.");this.panX=b/this.scaleX-c},xPanWorldBoundsIntoView:function(c,b,a){0>this.xWorldToView(c)?this.xPanWorldPosToViewPos(c,"left",a):this.xWorldToView(b)>a&&this.xPanWorldPosToViewPos(b,"right",
a)},xSetWorldBounds:function(c,b,a){this.setPanAndScale(-c,a/(b-c))},setPanAndScale:function(c,b){this.scaleX=b;this.panX=c},xWorldToView:function(c){return(c+this.panX)*this.scaleX},xWorldVectorToView:function(c){return c*this.scaleX},xViewToWorld:function(c){return c/this.scaleX-this.panX},xViewVectorToWorld:function(c){return c/this.scaleX},applyTransformToCanvas:function(c){c.transform(this.scaleX,0,0,1,this.panX*this.scaleX,0)}};return{TimelineDisplayTransform:e}});"use strict";
tv.exportTo("tv.b.ui",function(){function e(){}e.prototype={canTakeOverFor:function(c){throw Error("Not implemented");},takeOverFor:function(c,b,a){throw Error("Not implemented");},start:function(c,b){throw Error("Not implemented");},didStopEarly:function(c,b,a){},tick:function(c,b){throw Error("Not implemented");}};return{Animation:e}});"use strict";
tv.exportTo("tv.b.ui",function(){function e(){tv.b.EventTarget.call(this);this.activeAnimation_=this.target_=void 0;this.tickScheduled_=!1}e.prototype={__proto__:tv.b.EventTarget.prototype,get target(){return this.target_},set target(c){if(this.activeAnimation_)throw Error("Cannot change target while animation is running.");if(void 0===c.cloneAnimationState||"function"!==typeof c.cloneAnimationState)throw Error("target must have a cloneAnimationState function");this.target_=c},get activeAnimation(){return this.activeAnimation_},
get hasActiveAnimation(){return!!this.activeAnimation_},queueAnimation:function(c,b){if(void 0===this.target_)throw Error("Cannot queue animations without a target");var a;a=void 0!==b?b:window.performance.now();this.activeAnimation_&&this.activeAnimation_.tick(a,this.target_)&&(this.activeAnimation_=void 0);this.activeAnimation_&&(c.canTakeOverFor(this.activeAnimation_)?(this.activeAnimation_.didStopEarly(a,this.target_,!0),c.takeOverFor(this.activeAnimation_,a,this.target_)):this.activeAnimation_.didStopEarly(a,
this.target_,!1));this.activeAnimation_=c;this.activeAnimation_.start(a,this.target_);this.tickScheduled_||(this.tickScheduled_=!0,tv.b.requestAnimationFrame(this.tickActiveAnimation_,this))},cancelActiveAnimation:function(c){this.activeAnimation_&&(c=void 0!==c?c:window.performance.now(),this.activeAnimation_.didStopEarly(c,this.target_,!1),this.activeAnimation_=void 0)},tickActiveAnimation_:function(c){this.tickScheduled_=!1;if(this.activeAnimation_)if(void 0===this.target_)this.activeAnimation_.didStopEarly(c,
this.target_,!1);else{var b=this.target_.cloneAnimationState();this.activeAnimation_.tick(c,this.target_)&&(this.activeAnimation_=void 0);this.activeAnimation_&&(this.tickScheduled_=!0,tv.b.requestAnimationFrame(this.tickActiveAnimation_,this));b&&(c=new Event("didtick"),c.oldTargetState=b,this.dispatchEvent(c,!1,!1))}}};return{AnimationController:e}});"use strict";
tv.exportTo("tv.c",function(){function e(){this.stableIdToTrackMap_={}}function c(c){this.parentEl_=c;this.modelTrackContainer_=void 0;this.currentDisplayTransform_=new b;this.initAnimationController_();this.highDetails_=this.highlightVSync_=this.showFlowEvents_=!1;this.gridTimebase_=0;this.gridStep_=1E3/60;this.hasCalledSetupFunction_=this.gridEnabled_=!1;this.onResize_=this.onResize_.bind(this);this.onModelTrackControllerScroll_=this.onModelTrackControllerScroll_.bind(this);this.checkForAttachInterval_=
setInterval(this.checkForAttach_.bind(this),250);this.majorMarkPositions=[];this.interestRange_=new a(this);this.eventToTrackMap_={};this.containerToTrackObj=new e}var b=tv.c.TimelineDisplayTransform,a=tv.c.TimelineInterestRange;e.prototype={addContainer:function(a,b){if(!b)throw Error("Must provide a track.");this.stableIdToTrackMap_[a.stableId]=b},clearMap:function(){this.stableIdToTrackMap_={}},getTrackByStableId:function(a){return this.stableIdToTrackMap_[a]}};c.prototype={__proto__:tv.b.EventTarget.prototype,
setWhenPossible:function(a){this.pendingSetFunction_=a},get isAttachedToDocumentOrInTestMode(){if(void 0!==this.parentEl_)return tv.b.ui.isElementAttachedToDocument(this.parentEl_)},onResize_:function(){this.dispatchChangeEvent()},checkForAttach_:function(){if(this.isAttachedToDocumentOrInTestMode&&0!=this.clientWidth){this.iframe_||(this.iframe_=document.createElement("iframe"),this.iframe_.style.cssText="position:absolute;width:100%;height:0;border:0;visibility:hidden;",this.parentEl_.appendChild(this.iframe_),
this.iframe_.contentWindow.addEventListener("resize",this.onResize_));var a=this.parentEl_.clientWidth+"x"+this.parentEl_.clientHeight;if(this.pendingSetFunction_){this.lastSize_=a;try{this.pendingSetFunction_()}catch(b){console.log("While running setWhenPossible:",b.message?b.message+"\n"+b.stack:b.stack)}this.pendingSetFunction_=void 0}window.clearInterval(this.checkForAttachInterval_);this.checkForAttachInterval_=void 0}},dispatchChangeEvent:function(){tv.b.dispatchSimpleEvent(this,"change")},
detach:function(){this.checkForAttachInterval_&&(window.clearInterval(this.checkForAttachInterval_),this.checkForAttachInterval_=void 0);this.iframe_&&(this.iframe_.removeEventListener("resize",this.onResize_),this.parentEl_.removeChild(this.iframe_))},initAnimationController_:function(){this.dtAnimationController_=new tv.b.ui.AnimationController;this.dtAnimationController_.addEventListener("didtick",function(a){this.onCurentDisplayTransformChange_(a.oldTargetState)}.bind(this));var a=this;this.dtAnimationController_.target=
{get panX(){return a.currentDisplayTransform_.panX},set panX(b){a.currentDisplayTransform_.panX=b},get panY(){return a.currentDisplayTransform_.panY},set panY(b){a.currentDisplayTransform_.panY=b},get scaleX(){return a.currentDisplayTransform_.scaleX},set scaleX(b){a.currentDisplayTransform_.scaleX=b},cloneAnimationState:function(){return a.currentDisplayTransform_.clone()},xPanWorldPosToViewPos:function(b,c){a.currentDisplayTransform_.xPanWorldPosToViewPos(b,c,a.modelTrackContainer_.canvas.clientWidth)}}},
get currentDisplayTransform(){return this.currentDisplayTransform_},setDisplayTransformImmediately:function(a){this.dtAnimationController_.cancelActiveAnimation();var b=this.dtAnimationController_.target.cloneAnimationState();this.currentDisplayTransform_.set(a);this.onCurentDisplayTransformChange_(b)},queueDisplayTransformAnimation:function(a){if(!(a instanceof tv.b.ui.Animation))throw Error("animation must be instanceof tv.b.ui.Animation");this.dtAnimationController_.queueAnimation(a)},onCurentDisplayTransformChange_:function(a){this.modelTrackContainer_&&
(this.currentDisplayTransform.panY=tv.b.clamp(this.currentDisplayTransform.panY,0,this.modelTrackContainer_.scrollHeight-this.modelTrackContainer_.clientHeight));var b=!this.currentDisplayTransform.equals(a);this.currentDisplayTransform.panY!==a.panY&&(this.modelTrackContainer_.scrollTop=this.currentDisplayTransform.panY);b&&this.dispatchChangeEvent()},onModelTrackControllerScroll_:function(a){this.dtAnimationController_.activeAnimation&&this.dtAnimationController_.activeAnimation.affectsPanY&&this.dtAnimationController_.cancelActiveAnimation();
this.currentDisplayTransform_.panY=this.modelTrackContainer_.scrollTop},get modelTrackContainer(){return this.modelTrackContainer_},set modelTrackContainer(a){this.modelTrackContainer_&&this.modelTrackContainer_.removeEventListener("scroll",this.onModelTrackControllerScroll_);this.modelTrackContainer_=a;this.modelTrackContainer_.addEventListener("scroll",this.onModelTrackControllerScroll_)},get showFlowEvents(){return this.showFlowEvents_},set showFlowEvents(a){this.showFlowEvents_=a;this.dispatchChangeEvent()},
get highlightVSync(){return this.highlightVSync_},set highlightVSync(a){this.highlightVSync_=a;this.dispatchChangeEvent()},get highDetails(){return this.highDetails_},set highDetails(a){this.highDetails_=a;this.dispatchChangeEvent()},get gridEnabled(){return this.gridEnabled_},set gridEnabled(a){this.gridEnabled_!=a&&(this.gridEnabled_=a&&!0,this.dispatchChangeEvent())},get gridTimebase(){return this.gridTimebase_},set gridTimebase(a){this.gridTimebase_!=a&&(this.gridTimebase_=a,this.dispatchChangeEvent())},
get gridStep(){return this.gridStep_},get interestRange(){return this.interestRange_},drawMajorMarkLines:function(a){a.save();a.translate(Math.round(a.lineWidth)%2/2,0);a.beginPath();for(var b in this.majorMarkPositions){var c=Math.floor(this.majorMarkPositions[b]);tv.c.drawLine(a,c,0,c,a.canvas.height)}a.strokeStyle="#ddd";a.stroke();a.restore()},drawGridLines:function(a,b,c){if(this.gridEnabled){var e=this.currentDisplayTransform,k=this.gridTimebase;a.save();a.translate(Math.round(a.lineWidth)%
2/2,0);for(a.beginPath();k<c;){if(k>=b){var l=Math.floor(e.xWorldToView(k));tv.c.drawLine(a,l,0,l,a.canvas.height)}k+=this.gridStep}a.strokeStyle="rgba(255, 0, 0, 0.25)";a.stroke();a.restore()}},rebuildEventToTrackMap:function(){this.eventToTrackMap_=void 0;var a={addEvent:function(a,b){if(!b)throw Error("Must provide a track.");this[a.guid]=b}};this.modelTrackContainer_.addEventsToTrackMap(a);this.eventToTrackMap_=a},rebuildContainerToTrackMap:function(){this.containerToTrackObj.clearMap();this.modelTrackContainer_.addContainersToTrackMap(this.containerToTrackObj)},
trackForEvent:function(a){return this.eventToTrackMap_[a.guid]}};return{ContainerToTrackObj:e,TimelineViewport:c}});"use strict";
tv.exportTo("tv.c",function(){function e(a,c,d){this.deltaX=a;this.deltaY=c;this.durationMs=void 0===d?b:d;this.startTimeMs=this.startPanY=this.startPanX=void 0}function c(a,c,d,e,g){this.goalFocalPointXWorld=a;this.goalFocalPointXView=c;this.goalFocalPointY=d;this.zoomInRatioX=e;this.durationMs=void 0===g?b:g;this.startPanY=this.goalScaleX=this.startScaleX=this.startTimeMs=void 0}var b=100;e.prototype={__proto__:tv.b.ui.Animation.prototype,get affectsPanY(){return 0!==this.deltaY},canTakeOverFor:function(a){return a instanceof
e},takeOverFor:function(a,b,d){var c=a.goalPanX-d.panX;d=a.goalPanY-d.panY;a=b-(a.startTimeMs+a.durationMs);a=Math.max(a,0);this.deltaX+=c;this.deltaY+=d;this.durationMs+=a},start:function(a,b){this.startTimeMs=a;this.startPanX=b.panX;this.startPanY=b.panY},tick:function(a,b){var d=(a-this.startTimeMs)/this.durationMs,d=tv.b.clamp(d,0,1);b.panX=tv.b.lerp(d,this.startPanX,this.goalPanX);this.affectsPanY&&(b.panY=tv.b.lerp(d,this.startPanY,this.goalPanY));return a>=this.startTimeMs+this.durationMs},
get goalPanX(){return this.startPanX+this.deltaX},get goalPanY(){return this.startPanY+this.deltaY}};c.prototype={__proto__:tv.b.ui.Animation.prototype,get affectsPanY(){return this.startPanY!=this.goalFocalPointY},canTakeOverFor:function(a){return!1},takeOverFor:function(a,b,d){this.goalScaleX=d.scaleX*this.zoomInRatioX},start:function(a,b){this.startTimeMs=a;this.startScaleX=b.scaleX;this.goalScaleX=this.zoomInRatioX*b.scaleX;this.startPanY=b.panY},tick:function(a,b){var d=(a-this.startTimeMs)/
this.durationMs,d=tv.b.clamp(d,0,1);b.scaleX=tv.b.lerp(d,this.startScaleX,this.goalScaleX);this.affectsPanY&&(b.panY=tv.b.lerp(d,this.startPanY,this.goalFocalPointY));b.xPanWorldPosToViewPos(this.goalFocalPointXWorld,this.goalFocalPointXView);return a>=this.startTimeMs+this.durationMs}};return{TimelineDisplayTransformPanAnimation:e,TimelineDisplayTransformZoomToAnimation:c}});"use strict";tv.exportTo("tv.c",function(){return{constants:{HEADING_WIDTH:250}}});"use strict";
tv.exportTo("tv.c",function(){function e(c,b){this.viewport_=c;this.onMouseMove_=this.onMouseMove_.bind(this);this.onDblClick_=this.onDblClick_.bind(this);this.targetElement_=b;this.isMovingLeftEdge_=!1}e.prototype={onEnterTiming:function(c){this.targetElement_.addEventListener("mousemove",this.onMouseMove_);this.targetElement_.addEventListener("dblclick",this.onDblClick_)},onBeginTiming:function(c){this.isTouchPointInsideTrackBounds_(c.clientX,c.clientY)&&(c=this.getSnappedToEventPosition_(c),this.mouseDownAt_(c.x,
c.y),this.updateSnapIndicators_(c))},updateSnapIndicators_:function(c){if(c.snapped){var b=this.viewport_.interestRange;b.min===c.x&&(b.leftSnapIndicator=new tv.c.SnapIndicator(c.y,c.height));b.max===c.x&&(b.rightSnapIndicator=new tv.c.SnapIndicator(c.y,c.height))}},onUpdateTiming:function(c){c=this.getSnappedToEventPosition_(c);this.mouseMoveAt_(c.x,c.y,!0);this.updateSnapIndicators_(c)},onEndTiming:function(c){this.mouseUp_()},onExitTiming:function(c){this.targetElement_.removeEventListener("mousemove",
this.onMouseMove_);this.targetElement_.removeEventListener("dblclick",this.onDblClick_)},onMouseMove_:function(c){if(!c.button){var b=this.getWorldXFromEvent_(c);this.mouseMoveAt_(b,c.clientY,!1)}},onDblClick_:function(c){console.error("not implemented")},isTouchPointInsideTrackBounds_:function(c,b){if(!this.viewport_||!this.viewport_.modelTrackContainer||!this.viewport_.modelTrackContainer.canvas)return!1;var a=this.viewport_.modelTrackContainer.canvas.getBoundingClientRect();return c>=a.left&&c<=
a.right&&b>=a.top&&b<=a.bottom?!0:!1},mouseDownAt_:function(c,b){var a=this.viewport_.interestRange,f=this.viewport_.currentDisplayTransform.xViewVectorToWorld(6*(window.devicePixelRatio||1));a.isEmpty?(a.setMinAndMax(c,c),a.rightSelected=!0,this.isMovingLeftEdge_=!1):Math.abs(c-a.min)<f?(a.leftSelected=!0,a.min=c,this.isMovingLeftEdge_=!0):(Math.abs(c-a.max)<f?(a.rightSelected=!0,a.max=c):(a.setMinAndMax(c,c),a.rightSelected=!0),this.isMovingLeftEdge_=!1)},mouseMoveAt_:function(c,b,a){b=this.viewport_.interestRange;
a?this.updateMovingEdge_(c):(b=this.viewport_.interestRange,a=this.viewport_.currentDisplayTransform.xViewVectorToWorld(6*(window.devicePixelRatio||1)),Math.abs(c-b.min)<a?(b.leftSelected=!0,b.rightSelected=!1):Math.abs(c-b.max)<a?(b.leftSelected=!1,b.rightSelected=!0):(b.leftSelected=!1,b.rightSelected=!1))},updateMovingEdge_:function(c){var b=this.viewport_.interestRange,a=b.min,f=b.max;this.isMovingLeftEdge_?a=c:f=c;a<=f?b.setMinAndMax(a,f):b.setMinAndMax(f,a);b.min==c?(this.isMovingLeftEdge_=
!0,b.leftSelected=!0,b.rightSelected=!1):(this.isMovingLeftEdge_=!1,b.leftSelected=!1,b.rightSelected=!0)},mouseUp_:function(){var c=this.viewport_.currentDisplayTransform,b=this.viewport_.interestRange;b.leftSelected=!1;b.rightSelected=!1;c=c.xViewVectorToWorld(2*(window.devicePixelRatio||1));b.range<c&&b.reset()},getWorldXFromEvent_:function(c){var b=window.devicePixelRatio||1,a=this.viewport_.modelTrackContainer.canvas.getBoundingClientRect().left;return this.viewport_.currentDisplayTransform.xViewToWorld((c.clientX-
a)*b)},getSnappedToEventPosition_:function(c){var b=16*(window.devicePixelRatio||1),a=this.viewport_.modelTrackContainer,f=a.getBoundingClientRect(),d=this.viewport_,e=d.currentDisplayTransform,g=e.xViewVectorToWorld(b),b=this.getWorldXFromEvent_(c);c=c.clientY;var k=new tv.c.Selection;a.addClosestEventToSelection(b,g,c,c,k);k.length||a.addClosestEventToSelection(b,g,f.top,f.bottom,k);for(var l=Infinity,e=e.xViewVectorToWorld(1),m={x:b,y:c-f.top,height:0,snapped:!1},n=new tv.b.Range,q=0;q<k.length;q++){var w=
k[q],s=d.trackForEvent(w).getBoundingClientRect();n.reset();w.addBoundsToRange(n);var w=Math.abs(n.min-b)<Math.abs(n.max-b)?n.min:n.max,D=w-b,F=s.top,s=s.height,C=Math.abs(F+s/2-c);if((D<=g||Math.abs(D-g)<e)&&C<l)g=D,l=C,m.x=w,m.y=F+a.scrollTop-f.top,m.height=s,m.snapped=!0}return m}};return{TimingTool:e}});"use strict";
tv.exportTo("tv.c.trace_model",function(){function e(){this.guid_=tv.b.GUID.allocate();this.view_=void 0}e.fromDictIfPossible=function(b){if(void 0===b.typeName)throw Error("Missing typeName argument");var a=e.findTypeInfoMatching(function(a){return a.metadata.typeName===b.typeName});return void 0===a?void 0:a.constructor.fromDict(b)};e.fromDict=function(){throw Error("Not implemented");};e.prototype={get guid(){return this.guid_},toDict:function(){throw Error("Not implemented");},getOrCreateView:function(b){this.view_||
(this.view_=this.createView_(b));return this.view_},createView_:function(){throw Error("Not implemented");}};var c=new tv.b.ExtensionRegistryOptions(tv.b.BASIC_REGISTRY_MODE);c.mandatoryBaseType=e;tv.b.decorateExtensionRegistry(e,c);e.addEventListener("will-register",function(b){if(!b.typeInfo.constructor.hasOwnProperty("fromDict"))throw Error("Must have fromDict method");if(!b.typeInfo.metadata.typeName)throw Error("Registered Annotations must provide typeName");});return{Annotation:e}});"use strict";
tv.exportTo("tv.c.annotations",function(){function e(c,b){}e.prototype={draw:function(c){throw Error("Not implemented");}};return{AnnotationView:e}});"use strict";
tv.exportTo("tv.c.annotations",function(){function e(c,b){this.viewport_=c;this.annotation_=b}e.prototype={__proto__:tv.c.annotations.AnnotationView.prototype,draw:function(c){var b=this.viewport_.currentDisplayTransform.xWorldToView(this.annotation_.timestamp);c.beginPath();tv.c.drawLine(c,b,0,b,c.canvas.height);c.strokeStyle=this.annotation_.strokeStyle;c.stroke()}};return{XMarkerAnnotationView:e}});"use strict";
tv.exportTo("tv.c.trace_model",function(){function e(c){tv.c.trace_model.Annotation.apply(this,arguments);this.timestamp_=c;this.strokeStyle="rgba(0, 0, 255, 0.5)"}e.fromDict=function(c){return new e(c.args.timestamp)};e.prototype={__proto__:tv.c.trace_model.Annotation.prototype,get timestamp(){return this.timestamp_},toDict:function(){return{typeName:"xmarker",args:{timestamp:this.timestamp}}},createView_:function(c){return new tv.c.annotations.XMarkerAnnotationView(c,this)}};tv.c.trace_model.Annotation.register(e,
{typeName:"xmarker"});return{XMarkerAnnotation:e}});"use strict";
tv.exportTo("tv.b.ui",function(){var e=tv.b.ui.define("div");e.prototype={__proto__:HTMLUnknownElement.prototype,decorate:function(){this.observer_=new WebKitMutationObserver(this.didMutate_.bind(this));this.observer_.observe(this,{childList:!0});Object.defineProperty(this,"textContent",{get:void 0,set:this.onSetTextContent_})},appendChild:function(c){HTMLUnknownElement.prototype.appendChild.call(this,c);this.didMutate_(this.observer_.takeRecords())},insertBefore:function(c,b){HTMLUnknownElement.prototype.insertBefore.call(this,
c,b);this.didMutate_(this.observer_.takeRecords())},removeChild:function(c){HTMLUnknownElement.prototype.removeChild.call(this,c);this.didMutate_(this.observer_.takeRecords())},replaceChild:function(c,b){HTMLUnknownElement.prototype.replaceChild.call(this,c,b);this.didMutate_(this.observer_.takeRecords())},onSetTextContent_:function(c){if(""!=c)throw Error("textContent can only be set to ''.");this.clear()},clear:function(){for(;this.lastChild;)HTMLUnknownElement.prototype.removeChild.call(this,this.lastChild);
this.didMutate_(this.observer_.takeRecords())},didMutate_:function(c){this.beginDecorating_();for(var b=0;b<c.length;b++){var a=c[b].addedNodes;if(a)for(var f=0;f<a.length;f++)this.decorateChild_(a[f]);if(a=c[b].removedNodes)for(f=0;f<a.length;f++)this.undecorateChild_(a[f])}this.doneDecoratingForNow_()},decorateChild_:function(c){throw Error("Not implemented");},undecorateChild_:function(c){throw Error("Not implemented");},beginDecorating_:function(){},doneDecoratingForNow_:function(){}};return{ContainerThatDecoratesItsChildren:e}});
"use strict";
tv.exportTo("tv.c.tracks",function(){var e=tv.b.ui.define("track",tv.b.ui.ContainerThatDecoratesItsChildren);e.prototype={__proto__:tv.b.ui.ContainerThatDecoratesItsChildren.prototype,decorate:function(c){tv.b.ui.ContainerThatDecoratesItsChildren.prototype.decorate.call(this);if(void 0===c)throw Error("viewport is required when creating a Track.");this.viewport_=c;this.classList.add("track")},get viewport(){return this.viewport_},get drawingContainer(){for(var c=this;c;){if(c instanceof tv.c.tracks.DrawingContainer)return c;
c=c.parentElement}},get eventContainer(){},invalidateDrawingContainer:function(){var c=this.drawingContainer;c&&c.invalidate()},context:function(){if(this.parentNode){if(!this.parentNode.context)throw Error("Parent container does not support context() method.");return this.parentNode.context()}},decorateChild_:function(c){},undecorateChild_:function(c){c.detach&&c.detach()},updateContents_:function(){},drawTrack:function(c){var b=this.context(),a=window.devicePixelRatio||1,f=this.getBoundingClientRect(),
d=b.canvas.getBoundingClientRect();b.save();b.translate(0,a*(f.top-d.top));var e=this.viewport.currentDisplayTransform,d=e.xViewToWorld(0),a=e.xViewToWorld(f.width*a);this.draw(c,d,a);b.restore()},draw:function(c,b,a){},addEventsToTrackMap:function(c){},addContainersToTrackMap:function(c){},addIntersectingItemsInRangeToSelection:function(c,b,a,f,d){var e=window.devicePixelRatio||1,g=this.viewport.currentDisplayTransform,k=g.xViewVectorToWorld(1);c=g.xViewToWorld(c*e);b=g.xViewToWorld(b*e);e=this.getBoundingClientRect();
a=Math.max(a,e.top);f=Math.min(f,e.bottom);a>f||this.addIntersectingItemsInRangeToSelectionInWorldSpace(c,b,k,d)},addIntersectingItemsInRangeToSelectionInWorldSpace:function(c,b,a,f){},addClosestEventToSelection:function(c,b,a,f,d){},addClosestInstantEventToSelection:function(c,b,a,f){(c=tv.b.findClosestElementInSortedArray(c,function(a){return a.start},b,a))&&f.push(c)}};return{Track:e}});"use strict";
tv.exportTo("tv.c.tracks",function(){var e={SLICE:1,INSTANT_EVENT:2,BACKGROUND:3,GRID:4,FLOW_ARROWS:5,MARKERS:6,HIGHLIGHTS:7,ANNOTATIONS:8},c=tv.b.ui.define("drawing-container",tv.c.tracks.Track);c.prototype={__proto__:tv.c.tracks.Track.prototype,decorate:function(b){tv.c.tracks.Track.prototype.decorate.call(this,b);this.classList.add("drawing-container");this.canvas_=document.createElement("canvas");this.canvas_.className="drawing-container-canvas";this.canvas_.style.left=tv.c.constants.HEADING_WIDTH+
"px";this.appendChild(this.canvas_);this.ctx_=this.canvas_.getContext("2d");this.viewportChange_=this.viewportChange_.bind(this);this.viewport.addEventListener("change",this.viewportChange_)},get canvas(){return this.canvas_},context:function(){return this.ctx_},viewportChange_:function(){this.invalidate()},invalidate:function(){this.rafPending_||(this.rafPending_=!0,tv.b.requestPreAnimationFrame(this.preDraw_,this))},preDraw_:function(){this.rafPending_=!1;this.updateCanvasSizeIfNeeded_();tv.b.requestAnimationFrameInThisFrameIfPossible(this.draw_,
this)},draw_:function(){this.ctx_.clearRect(0,0,this.canvas_.width,this.canvas_.height);var b=[e.BACKGROUND,e.HIGHLIGHTS,e.GRID,e.INSTANT_EVENT,e.SLICE,e.MARKERS,e.ANNOTATIONS];this.viewport.showFlowEvents&&b.push(e.FLOW_ARROWS);for(var a in b)for(var c=0;c<this.children.length;++c)this.children[c]instanceof tv.c.tracks.Track&&this.children[c].drawTrack(b[a]);a=window.devicePixelRatio||1;var c=this.canvas_.getBoundingClientRect(),d=this.viewport.currentDisplayTransform,b=d.xViewToWorld(0);a=d.xViewToWorld(c.width*
a);this.viewport.drawGridLines(this.ctx_,b,a)},updateCanvasSizeIfNeeded_:function(){var b=tv.b.asArray(this.children).filter(this.visibleFilter_);this.getBoundingClientRect();var a=b[0].getBoundingClientRect(),c=b[b.length-1].getBoundingClientRect(),b=a.width-tv.c.constants.HEADING_WIDTH,a=c.bottom-a.top,c=window.devicePixelRatio||1;this.canvas_.width!=b*c&&(this.canvas_.width=b*c,this.canvas_.style.width=b+"px");this.canvas_.height!=a*c&&(this.canvas_.height=a*c,this.canvas_.style.height=a+"px")},
visibleFilter_:function(b){return!(b instanceof tv.c.tracks.Track)?!1:"none"!==window.getComputedStyle(b).display},addClosestEventToSelection:function(b,a,c,d,e){for(var g=0;g<this.children.length;++g)if(this.children[g]instanceof tv.c.tracks.Track){var k=this.children[g].getBoundingClientRect(),l=Math.max(c,k.top),k=Math.min(d,k.bottom);l<=k&&this.children[g].addClosestEventToSelection(b,a,c,d,e)}tv.c.tracks.Track.prototype.addClosestEventToSelection.apply(this,arguments)},addEventsToTrackMap:function(b){for(var a=
0;a<this.children.length;++a)this.children[a]instanceof tv.c.tracks.Track&&this.children[a].addEventsToTrackMap(b)},addContainersToTrackMap:function(b){for(var a=0;a<this.children.length;++a)this.children[a]instanceof tv.c.tracks.Track&&this.children[a].addContainersToTrackMap(b)}};return{DrawingContainer:c,DrawType:e}});"use strict";
tv.exportTo("tv.c.tracks",function(){function e(b){if(void 0===b)throw Error("viewport must be provided");this.viewport_=b}e.prototype={__proto__:Object.prototype,processModel:function(b){throw Error("processModel implementation missing");},drawHighlight:function(b,a,c,d,e){throw Error("drawHighlight implementation missing");}};var c=new tv.b.ExtensionRegistryOptions(tv.b.BASIC_REGISTRY_MODE);c.defaultMetadata={};c.mandatoryBaseClass=e;tv.b.decorateExtensionRegistry(e,c);return{Highlighter:e}});"use strict";
tv.exportTo("tv.c.tracks",function(){var e=tv.b.Task,c=tv.b.ui.define("container-track",tv.c.tracks.Track);c.prototype={__proto__:tv.c.tracks.Track.prototype,decorate:function(b){tv.c.tracks.Track.prototype.decorate.call(this,b)},detach:function(){this.textContent=""},get tracks_(){for(var b=[],a=0;a<this.children.length;a++)this.children[a].classList.contains("track")&&b.push(this.children[a]);return b},drawTrack:function(b){for(var a=0;a<this.children.length;++a)this.children[a]instanceof tv.c.tracks.Track&&
this.children[a].drawTrack(b)},addIntersectingItemsInRangeToSelection:function(b,a,c,d,e){for(var g=0;g<this.tracks_.length;g++){var k=this.tracks_[g].getBoundingClientRect(),l=Math.max(c,k.top),k=Math.min(d,k.bottom);l<=k&&this.tracks_[g].addIntersectingItemsInRangeToSelection(b,a,c,d,e)}tv.c.tracks.Track.prototype.addIntersectingItemsInRangeToSelection.apply(this,arguments)},addEventsToTrackMap:function(b){for(var a=0;a<this.children.length;++a)this.children[a].addEventsToTrackMap(b)},addAllObjectsMatchingFilterToSelection:function(b,
a){for(var c=0;c<this.tracks_.length;c++)this.tracks_[c].addAllObjectsMatchingFilterToSelection(b,a)},addAllObjectsMatchingFilterToSelectionAsTask:function(b,a){for(var c=new e,d=0;d<this.tracks_.length;d++)c.subTask(function(d){return function(){this.tracks_[d].addAllObjectsMatchingFilterToSelection(b,a)}}(d),this);return c},addClosestEventToSelection:function(b,a,c,d,e){for(var g=0;g<this.tracks_.length;g++){var k=this.tracks_[g].getBoundingClientRect(),l=Math.max(c,k.top),k=Math.min(d,k.bottom);
l<=k&&this.tracks_[g].addClosestEventToSelection(b,a,c,d,e)}tv.c.tracks.Track.prototype.addClosestEventToSelection.apply(this,arguments)}};return{ContainerTrack:c}});"use strict";
tv.exportTo("tv.c.tracks",function(){var e=String.fromCharCode(9662),c=String.fromCharCode(9656),b=tv.b.ui.define("heading-track",tv.c.tracks.Track);b.prototype={__proto__:tv.c.tracks.Track.prototype,decorate:function(a){tv.c.tracks.Track.prototype.decorate.call(this,a);this.classList.add("heading-track");this.headingDiv_=document.createElement("heading");this.headingDiv_.style.width=tv.c.constants.HEADING_WIDTH+"px";this.headingDiv_.addEventListener("click",this.onHeadingDivClicked_.bind(this));
this.heading_="";this.selectionGenerator_=this.expanded_=void 0;this.updateContents_()},get heading(){return this.heading_},set heading(a){this.heading_=a;this.updateContents_()},set tooltip(a){this.headingDiv_.title=a},set selectionGenerator(a){this.selectionGenerator_=a;this.updateContents_()},get expanded(){return this.expanded_},set expanded(a){this.expanded_!=a&&(this.expanded_=a,this.expandedStateChanged_())},expandedStateChanged_:function(){this.updateHeadigDiv_()},onHeadingDivClicked_:function(){var a=
new Event("heading-clicked",!0,!1);this.dispatchEvent(a)},updateContents_:function(){this.updateHeadigDiv_()},updateHeadigDiv_:function(){this.headingDiv_.innerHTML="";var a=document.createElement("span");a.classList.add("heading-arrow");a.textContent=!0===this.expanded?e:!1===this.expanded?c:"";this.headingDiv_.appendChild(a);this.selectionGenerator_?(this.headingLink_=document.createElement("tv-c-analysis-link"),this.headingLink_.selection=this.selectionGenerator_,this.headingLink_.textContent=
"",this.headingDiv_.appendChild(this.headingLink_),this.headingLink_.appendChild(document.createTextNode(this.heading_))):(a=document.createElement("span"),a.textContent=this.heading_,this.headingDiv_.appendChild(a));this.appendChild(this.headingDiv_)},draw:function(a,b,d){throw Error("draw implementation missing");}};return{HeadingTrack:b}});"use strict";
tv.exportTo("tv.c.tracks",function(){var e=tv.c.trace_model.SelectionState,c=tv.c.EventPresenter,b=8,a=tv.b.ui.define("chart-track",tv.c.tracks.HeadingTrack);a.prototype={__proto__:tv.c.tracks.HeadingTrack.prototype,decorate:function(a){tv.c.tracks.HeadingTrack.prototype.decorate.call(this,a);this.classList.add("chart-track");this.chart_=null},get chart(){return this.chart_},set chart(a){this.chart_=a;this.invalidateDrawingContainer()},get height(){return window.getComputedStyle(this).height},set height(a){this.style.height=
a;this.invalidateDrawingContainer()},get hasVisibleContent(){return!!this.chart_},getModelEventFromItem:function(a){throw Error("Not implemented.");},draw:function(a,b,c){switch(a){case tv.c.tracks.DrawType.SLICE:this.drawSlices_(b,c)}},drawSlices_:function(a,b){var h=this.viewport.highDetails,g=this.context(),k=window.devicePixelRatio||1,l=this.getBoundingClientRect().height*k,m=l-2*k,n=this.chart_,q=this.viewport.currentDisplayTransform;q.xViewVectorToWorld(1);for(var w=q.xViewVectorToWorld(1),
s=n.numSeries,D=n.numSamples,F=tv.b.findLowIndexInSortedArray(n.timestamps,function(a){return a},a),C=n.timestamps,F=0<F-1?F-1:0,v=m/n.maxTotal,y=n.numSeries-1;0<=y;y--){var B=n.series[y];g.strokeStyle=c.getCounterSeriesColor(B.color,e.NONE);var H=function(e){for(var h=-1,E=F-1,x=0<=E?C[E]-w:-1,G=l,u=!1;;){E++;if(E>=D)break;var t=C[E],K=m-v*n.totals[E*s+y];if(t>b){u&&(x=t=b,g.lineTo(q.xWorldToView(t),G));break}if(E+1<D){var z=C[E+1];if(z-x<=w&&z<b)continue;t<a&&(t=a)}t-x<w&&x<t&&(t=x+w);z=B.samples[E].selectionState;
u&&(g.lineTo(q.xWorldToView(t),G),z!=h&&(e?(g.lineTo(q.xWorldToView(t),l),g.closePath(),g.fill()):(g.lineTo(q.xWorldToView(t),K),g.stroke())));z!=h&&(g.fillStyle=c.getCounterSeriesColor(B.color,z,0.5),g.lineWidth=1*k,g.beginPath(),e?g.moveTo(q.xWorldToView(t),l):g.moveTo(q.xWorldToView(t),u?G:K));g.lineTo(q.xWorldToView(t),K);u=!0;x=t;G=K;h=z}u&&(e?(g.lineTo(q.xWorldToView(x),l),g.closePath(),g.fill()):g.stroke())};H(!0);h&&H(!1);H=tv.b.findLowIndexInSortedArray(n.timestamps,function(a){return a},
b);n.timestamps[H]==b&&H++;var z=F>=n.timestamps.length?a:n.timestamps[F],x=1>H?b:n.timestamps[H-1],H=(0.1-tv.b.clamp((H-F)/(q.scaleX*(z>=x?b-a:x-z)),0.05,0.1))/0.05;g.strokeStyle=c.getCounterSeriesColor(B.color,e.NONE);z=void 0;for(x=F;C[x]<b;x++){var G=C[x],E=m-v*n.totals[x*s+y];if(B.samples[x].selected){var K=c.getCounterSeriesColor(B.color,B.samples[x].selectionState);K!==z&&(g.fillStyle=z=K);g.beginPath();g.arc(q.xWorldToView(G),E,2*k,0,2*Math.PI);g.fill();g.stroke()}else h&&(K=c.getCounterSeriesColor(B.color,
B.samples[x].selectionState,H),K!==z&&(g.fillStyle=z=K),g.fillRect(q.xWorldToView(G)-1.5*k,E-1.5*k,3*k,3*k))}}},addEventsToTrackMap:function(a){for(var b=this.chart_.series,c=0;c<b.length;c++)for(var e=b[c].samples,k=0;k<e.length;k++)a.addEvent(e[k],this)},addIntersectingItemsInRangeToSelectionInWorldSpace:function(a,d,c,e){function k(a,d){if(d===l.timestamps.length-1){var c=this.viewport.currentDisplayTransform.xViewVectorToWorld(1);return b*c}return l.timestamps[d+1]-l.timestamps[d]}var l=this.chart_;
a=tv.b.findLowIndexInSortedIntervals(l.timestamps,function(a){return a},k.bind(this),a);for(d=tv.b.findLowIndexInSortedIntervals(l.timestamps,function(a){return a},k.bind(this),d);a<=d;a++)if(!(0>a)&&!(a>=l.timestamps.length))for(c=0;c<this.chart.numSeries;c++)this.addValueToSelection(this.chart.series[c].samples[a],e)},addItemNearToProvidedEventToSelection:function(a,b,c){b=a.getSampleIndex()+b;if(0>b||b>=a.series.samples.length)return!1;this.addValueToSelection(a.series.samples[b],c);return!0},
addAllObjectsMatchingFilterToSelection:function(a,b){},addClosestEventToSelection:function(a,b,c,e,k){c=this.chart;if(c.numSeries)for(e=0;e<c.numSeries;e++){var l=tv.b.findClosestElementInSortedArray(c.series_[e].samples_,function(a){return a.timestamp},a,b);l&&this.addValueToSelection(l,k)}},addValueToSelection:function(a,b){var c=this.getModelEventFromItem(a);c&&b.push(c)}};return{ChartTrack:a}});"use strict";
tv.exportTo("tv.c.tracks",function(){var e=tv.b.ui.define("counter-track",tv.c.tracks.ChartTrack);e.prototype={__proto__:tv.c.tracks.ChartTrack.prototype,decorate:function(c){tv.c.tracks.ChartTrack.prototype.decorate.call(this,c);this.classList.add("counter-track")},get counter(){return this.chart},set counter(c){this.heading=c.name+": ";this.chart=c},getModelEventFromItem:function(c){return c}};return{CounterTrack:e}});"use strict";
tv.exportTo("tv.c.tracks",function(){var e=tv.c.TraceModelSettings,c=tv.b.ui.define("multi-row-track",tv.c.tracks.ContainerTrack);c.prototype={__proto__:tv.c.tracks.ContainerTrack.prototype,decorate:function(b){tv.c.tracks.ContainerTrack.prototype.decorate.call(this,b);this.heading_=this.tooltip_="";this.itemsToGroup_=this.groupingSource_=void 0;this.defaultToCollapsedWhenSubRowCountMoreThan=1;this.itemsGroupedOnLastUpdateContents_=void 0;this.currentSubRows_=[];this.expanded_=!0},get itemsToGroup(){return this.itemsToGroup_},
setItemsToGroup:function(b,a){this.itemsToGroup_=b;this.groupingSource_=a;this.updateContents_();this.updateExpandedStateFromGroupingSource_()},get heading(){return this.heading_},set heading(b){this.heading_=b;this.updateContents_()},get tooltip(){return this.tooltip_},set tooltip(b){this.tooltip_=b;this.updateContents_()},get subRows(){return this.currentSubRows_},get hasVisibleContent(){return 0<this.children.length},get expanded(){return this.expanded_},set expanded(b){this.expanded_!=b&&(this.expanded_=
b,this.expandedStateChanged_())},onHeadingClicked_:function(b){1>=this.subRows.length||(this.expanded=!this.expanded,this.groupingSource_&&(new e(this.groupingSource_.model)).setSettingFor(this.groupingSource_,"expanded",this.expanded),b.stopPropagation())},updateExpandedStateFromGroupingSource_:function(){if(this.groupingSource_){var b=this.subRows.length,a=new e(this.groupingSource_.model);this.expanded=1<b?a.getSettingFor(this.groupingSource_,"expanded",b>this.defaultToCollapsedWhenSubRowCountMoreThan?
!1:!0):void 0}},expandedStateChanged_:function(){for(var b=Math.max(2,Math.ceil(18/this.children.length)),b=(this.expanded_?18:b)+"px",a=0;a<this.children.length;a++)this.children[a].height=b;0<this.children.length&&(this.children[0].expanded=this.expanded)},updateContents_:function(){tv.c.tracks.ContainerTrack.prototype.updateContents_.call(this);if(this.itemsToGroup_)if(this.areArrayContentsSame_(this.itemsGroupedOnLastUpdateContents_,this.itemsToGroup_))this.updateHeadingAndTooltip_();else if(this.itemsGroupedOnLastUpdateContents_=
this.itemsToGroup_,this.detach(),this.itemsToGroup_.length){var b=this.buildSubRows_(this.itemsToGroup_);this.currentSubRows_=b;for(var a=0;a<b.length;a++){var c=b[a];c.length&&this.addSubTrack_(c).addEventListener("heading-clicked",this.onHeadingClicked_.bind(this))}this.updateHeadingAndTooltip_();this.expandedStateChanged_()}else this.currentSubRows_=[];else this.updateHeadingAndTooltip_(),this.currentSubRows_=[]},updateHeadingAndTooltip_:function(){this.firstChild&&(this.firstChild.heading=this.heading_,
this.firstChild.tooltip=this.tooltip_)},buildSubRows_:function(b){throw Error("Not implemented");},addSubTrack_:function(b){throw Error("Not implemented");},areArrayContentsSame_:function(b,a){if(!b||!a||(!b.length||!a.length)||b.length!=a.length)return!1;for(var c=0;c<b.length;++c)if(b[c]!=a[c])return!1;return!0}};return{MultiRowTrack:c}});"use strict";
tv.exportTo("tv.c.tracks",function(){var e=tv.c.trace_model.SelectionState,c=tv.c.EventPresenter,b=tv.b.ui.define("object-instance-track",tv.c.tracks.HeadingTrack);b.prototype={__proto__:tv.c.tracks.HeadingTrack.prototype,decorate:function(a){tv.c.tracks.HeadingTrack.prototype.decorate.call(this,a);this.classList.add("object-instance-track");this.objectInstances_=[];this.objectSnapshots_=[]},get objectInstances(){return this.objectInstances_},set objectInstances(a){!a||0==a.length?(this.heading="",
this.objectInstances_=[],this.objectSnapshots_=[]):(this.heading=a[0].typeName,this.objectInstances_=a,this.objectSnapshots_=[],this.objectInstances_.forEach(function(a){this.objectSnapshots_.push.apply(this.objectSnapshots_,a.snapshots)},this),this.objectSnapshots_.sort(function(a,b){return a.ts-b.ts}))},get height(){return window.getComputedStyle(this).height},set height(a){this.style.height=a},get snapshotRadiusView(){return 7*(window.devicePixelRatio||1)},draw:function(a,b,c){switch(a){case tv.c.tracks.DrawType.SLICE:this.drawSlices_(b,
c)}},drawSlices_:function(a,b){var h=this.context(),g=window.devicePixelRatio||1,k=this.getBoundingClientRect(),l=k.height*g,m=0.5*l,n=2*Math.PI,q=this.viewport.currentDisplayTransform,w=this.snapshotRadiusView,s=q.xViewVectorToWorld(l),D;h.save();q.applyTransformToCanvas(h);var F=this.objectInstances_;D=tv.b.findLowIndexInSortedArray(F,function(a){return a.deletionTs},a);for(h.strokeStyle="rgb(0,0,0)";D<F.length;++D){var C=F[D],v=C.creationTs;if(v>b)break;var y=C.deletionTs==Number.MAX_VALUE?b:C.deletionTs;
h.fillStyle=c.getObjectInstanceColor(C);h.fillRect(v,g,y-v,l-2*g)}h.restore();C=this.objectSnapshots_;for(D=tv.b.findLowIndexInSortedArray(C,function(a){return a.ts+s},a);D<C.length;++D){y=C[D];v=y.ts;if(v-s>b)break;v=q.xWorldToView(v);h.fillStyle=c.getObjectSnapshotColor(y);h.beginPath();h.arc(v,m,w,0,n);h.fill();y.selected?(h.lineWidth=5,h.strokeStyle="rgb(100,100,0)",h.stroke(),h.beginPath(),h.arc(v,m,w-1,0,n),h.lineWidth=2,h.strokeStyle="rgb(255,255,0)"):(h.lineWidth=1,h.strokeStyle="rgb(0,0,0)");
h.stroke()}h.lineWidth=1;m=e.NONE;F.length&&F[0].selectionState===e.DIMMED&&(m=e.DIMMED);m===e.DIMMED&&(g*=k.width,h.fillStyle="rgba(255,255,255,0.5)",h.fillRect(0,0,g,l),h.restore())},addEventsToTrackMap:function(a){void 0!==this.objectInstance_&&this.objectInstance_.forEach(function(b){a.addEvent(b,this)},this);void 0!==this.objectSnapshots_&&this.objectSnapshots_.forEach(function(b){a.addEvent(b,this)},this)},addIntersectingItemsInRangeToSelectionInWorldSpace:function(a,b,c,e){var k=!1,l=c*this.snapshotRadiusView;
tv.b.iterateOverIntersectingIntervals(this.objectSnapshots_,function(a){return a.ts-l},function(a){return 2*l},a,b,function(a){e.push(a);k=!0});k||tv.b.iterateOverIntersectingIntervals(this.objectInstances_,function(a){return a.creationTs},function(a){return a.deletionTs-a.creationTs},a,b,e.push.bind(e))},addItemNearToProvidedEventToSelection:function(a,b,c){var e;if(a instanceof tv.c.trace_model.ObjectSnapshot)e=this.objectSnapshots_;else if(a instanceof tv.c.trace_model.ObjectInstance)e=this.objectInstances_;
else throw Error("Unrecognized event");a=e.indexOf(a)+b;return 0<=a&&a<e.length?(c.push(e[a]),!0):!1},addAllObjectsMatchingFilterToSelection:function(a,b){},addClosestEventToSelection:function(a,b,c,e,k){(a=tv.b.findClosestElementInSortedArray(this.objectSnapshots_,function(a){return a.ts},a,b))&&k.push(a)}};var a=new tv.b.ExtensionRegistryOptions(tv.b.TYPE_BASED_REGISTRY_MODE);tv.b.decorateExtensionRegistry(b,a);return{ObjectInstanceTrack:b}});"use strict";
tv.exportTo("tv.c.tracks",function(){var e=tv.b.ui.define("object-instance-group-track",tv.c.tracks.MultiRowTrack);e.prototype={__proto__:tv.c.tracks.MultiRowTrack.prototype,decorate:function(c){tv.c.tracks.MultiRowTrack.prototype.decorate.call(this,c);this.classList.add("object-instance-group-track");this.objectInstances_=void 0},get objectInstances(){return this.itemsToGroup},set objectInstances(c){this.setItemsToGroup(c)},addSubTrack_:function(c){var b=new tv.c.tracks.ObjectInstanceTrack(this.viewport);
b.objectInstances=c;this.appendChild(b);return b},buildSubRows_:function(c){c.sort(function(a,b){return a.creationTs-b.creationTs});for(var b=[],a=0;a<c.length;a++){for(var f=c[a],d=!1,e=0;e<b.length;e++){var g=b[e];if(f.creationTs>=g[g.length-1].deletionTs){d=!0;g.push(f);break}}d||(g=[f],b.push(g))}return b},updateHeadingAndTooltip_:function(){}};return{ObjectInstanceGroupTrack:e}});"use strict";
tv.exportTo("tv.c",function(){function e(c,b,a,f){this.ctx_=c;this.minRectSize_=b;this.maxMergeDist_=a;this.pallette_=f}e.prototype={y_:0,h_:0,merging_:!1,mergeStartX_:0,mergeCurRight_:0,mergedColorId_:0,mergedAlpha_:0,setYandH:function(c,b){this.flush();this.y_=c;this.h_=b},fillRect:function(c,b,a,f){var d=c+b;if(b<this.minRectSize_)if(d-this.mergeStartX_>this.maxMergeDist_&&this.flush(),this.merging_){if(this.mergeCurRight_=d,this.mergedAlpha_<f||this.mergedAlpha_===f&&this.mergedColorId_<a)this.mergedAlpha_=
f,this.mergedColorId_=a}else this.merging_=!0,this.mergeStartX_=c,this.mergeCurRight_=d,this.mergedColorId_=a,this.mergedAlpha_=f;else this.merging_&&this.flush(),this.ctx_.fillStyle=this.pallette_[a],this.ctx_.globalAlpha=f,this.ctx_.fillRect(c,this.y_,b,this.h_)},flush:function(){this.merging_&&(this.ctx_.fillStyle=this.pallette_[this.mergedColorId_],this.ctx_.globalAlpha=this.mergedAlpha_,this.ctx_.fillRect(this.mergeStartX_,this.y_,this.mergeCurRight_-this.mergeStartX_,this.h_),this.merging_=
!1)}};return{FastRectRenderer:e}});"use strict";
tv.exportTo("tv.c.tracks",function(){var e=tv.b.ui.define("rect-track",tv.c.tracks.HeadingTrack);e.prototype={__proto__:tv.c.tracks.HeadingTrack.prototype,decorate:function(c){tv.c.tracks.HeadingTrack.prototype.decorate.call(this,c);this.classList.add("rect-track");this.asyncStyle_=!1;this.rects_=null},get asyncStyle(){return this.asyncStyle_},set asyncStyle(c){this.asyncStyle_=!!c},get rects(){return this.rects_},set rects(c){this.rects_=c||[];this.invalidateDrawingContainer()},get height(){return window.getComputedStyle(this).height},
set height(c){this.style.height=c;this.invalidateDrawingContainer()},get hasVisibleContent(){return 0<this.rects_.length},getModelEventFromItem:function(c){throw Error("Not implemented.");},draw:function(c,b,a){switch(c){case tv.c.tracks.DrawType.SLICE:this.drawRects_(b,a)}},drawRects_:function(c,b){var a=this.context();a.save();var f=this.getBoundingClientRect();tv.c.drawSlices(a,this.viewport.currentDisplayTransform,c,b,f.height,this.rects_,this.asyncStyle_);a.restore();if(!(6>=f.height)){var d;
15>f.height?(f=6,d=1):(f=10,d=2.5);tv.c.drawLabels(a,this.viewport.currentDisplayTransform,c,b,this.rects_,this.asyncStyle_,f,d)}},addEventsToTrackMap:function(c){void 0===this.rects_||null===this.rects_||this.rects_.forEach(function(b){(b=this.getModelEventFromItem(b))&&c.addEvent(b,this)},this)},addIntersectingItemsInRangeToSelectionInWorldSpace:function(c,b,a,f){function d(a){(a=this.getModelEventFromItem(a))&&f.push(a)}d=d.bind(this);tv.b.iterateOverIntersectingIntervals(this.rects_,function(a){return a.start},
function(a){return a.duration},c,b,d)},indexOfRect_:function(c){for(var b=tv.b.findLowIndexInSortedArray(this.rects_,function(a){return a.start},c.start);b<this.rects_.length&&c.start==this.rects_[b].start&&c.colorId!=this.rects_[b].colorId;)b++;return b<this.rects_.length?b:void 0},addItemNearToProvidedEventToSelection:function(c,b,a){c=this.indexOfRect_(c);if(void 0===c)return!1;b=c+b;if(0>b||b>=this.rects_.length)return!1;(c=this.rects_[b])&&a.push(c);return!0},addAllObjectsMatchingFilterToSelection:function(c,
b){for(var a=0;a<this.rects_.length;++a)if(c.matchSlice(this.rects_[a])){var f=this.getModelEventFromItem(this.rects_[a]);f&&b.push(f)}},addClosestEventToSelection:function(c,b,a,f,d){if(c=tv.b.findClosestIntervalInSortedIntervals(this.rects_,function(a){return a.start},function(a){return a.end},c,b))(c=this.getModelEventFromItem(c))&&d.push(c)}};return{RectTrack:e}});"use strict";
tv.exportTo("tv.c.tracks",function(){var e=tv.b.ui.define("process-summary-track",tv.c.tracks.RectTrack);e.buildRectsFromProcess=function(c){if(!c)return[];var b=[],a=function(a,d,c){b.push({isStart:a,time:d,slice:c})},f;for(f in c.threads){var d=c.threads[f].sliceGroup;d.topLevelSlices.forEach(function(b){a(!0,b.start,void 0);a(!1,b.end,void 0)});d.slices.forEach(function(b){b.important&&(a(!0,b.start,b),a(!1,b.end,b))})}b.sort(function(a,b){return a.time-b.time});var e=[],g=tv.b.ui.getColorIdForReservedName("generic_work"),
k=function(a,b,d){e.push({start:a,end:b,duration:b-a,colorId:d?d.colorId:g,title:d?d.title:void 0})},l=0,m=void 0,n=void 0;b.forEach(function(a){l+=a.isStart?1:-1;m?!a.isStart&&a.slice==m&&(k(n,a.time,m),n=1<=l?a.time:void 0,m=void 0):a.isStart?1==l?(n=a.time,m=a.slice):a.slice&&(a.time!=n&&(k(n,a.time,void 0),n=a.time),m=a.slice):0==l&&(k(n,a.time,void 0),n=void 0)});return e};e.prototype={__proto__:tv.c.tracks.RectTrack.prototype,decorate:function(c){tv.c.tracks.RectTrack.prototype.decorate.call(this,
c);this.classList.add("inverse-expand")},get process(){return this.process_},set process(c){this.process_=c;this.rects=e.buildRectsFromProcess(c)},getModelEventFromItem:function(c){}};return{ProcessSummaryTrack:e}});"use strict";
tv.exportTo("tv.c.tracks",function(){var e=tv.b.ui.define("spacing-track",tv.c.tracks.HeadingTrack);e.prototype={__proto__:tv.c.tracks.HeadingTrack.prototype,decorate:function(c){tv.c.tracks.HeadingTrack.prototype.decorate.call(this,c);this.classList.add("spacing-track")},draw:function(c,b,a){},addAllObjectsMatchingFilterToSelection:function(c,b){}};return{SpacingTrack:e}});"use strict";
tv.exportTo("tv.c.tracks",function(){var e=tv.b.ui.define("sample-track",tv.c.tracks.RectTrack);e.prototype={__proto__:tv.c.tracks.RectTrack.prototype,decorate:function(c){tv.c.tracks.RectTrack.prototype.decorate.call(this,c)},get samples(){return this.rects},set samples(c){this.rects=c},getModelEventFromItem:function(c){return c}};return{SampleTrack:e}});"use strict";
tv.exportTo("tv.c.tracks",function(){var e=tv.b.ui.define("slice-track",tv.c.tracks.RectTrack);e.prototype={__proto__:tv.c.tracks.RectTrack.prototype,decorate:function(c){tv.c.tracks.RectTrack.prototype.decorate.call(this,c)},get slices(){return this.rects},set slices(c){this.rects=c},getModelEventFromItem:function(c){return c}};return{SliceTrack:e}});"use strict";
tv.exportTo("tv.c.tracks",function(){var e=tv.b.ui.define("slice-group-track",tv.c.tracks.MultiRowTrack);e.prototype={__proto__:tv.c.tracks.MultiRowTrack.prototype,decorate:function(c){tv.c.tracks.MultiRowTrack.prototype.decorate.call(this,c);this.classList.add("slice-group-track");this.group_=void 0;this.defaultToCollapsedWhenSubRowCountMoreThan=100},addSubTrack_:function(c){var b=new tv.c.tracks.SliceTrack(this.viewport);b.slices=c;this.appendChild(b);return b},get group(){return this.group_},set group(c){this.group_=
c;this.setItemsToGroup(this.group_.slices,this.group_)},get eventContainer(){return this.group},addContainersToTrackMap:function(c){c.addContainer(this.group,this)},buildSubRows_:function(c){if(!c.length)return[];for(var b=[],a=0;a<c.length;a++)c[a].subSlices&&c[a].subSlices.splice(0,c[a].subSlices.length),b.push(a);b.sort(function(a,b){var d=c[a],f=c[b];return d.start!=f.start?d.start-f.start:a-b});var f=[[]];this.badSlices_=[];for(a=0;a<b.length;a++){for(var d=c[b[a]],e=!1,g=f.length-1;0<=g;g--)if(0!=
f[g].length){var k=f[g][f[g].length-1];d.start<k.start&&(this.badSlices_.push(d),e=!0);if(k.bounds(d)){for(;f.length<=g+1;)f.push([]);f[g+1].push(d);k.subSlices&&k.subSlices.push(d);e=!0;break}}e||f[0].push(d)}return f}};return{SliceGroupTrack:e}});"use strict";
tv.exportTo("tv.c.tracks",function(){var e=tv.b.ui.define("async-slice-group-track",tv.c.tracks.MultiRowTrack);e.prototype={__proto__:tv.c.tracks.MultiRowTrack.prototype,decorate:function(c){tv.c.tracks.MultiRowTrack.prototype.decorate.call(this,c);this.classList.add("async-slice-group-track");this.group_=void 0},addSubTrack_:function(c){var b=new tv.c.tracks.SliceTrack(this.viewport);b.slices=c;this.appendChild(b);b.asyncStyle=!0;return b},get group(){return this.group_},set group(c){this.group_=
c;this.setItemsToGroup(this.group_.slices,this.group_)},get eventContainer(){return this.group},addContainersToTrackMap:function(c){c.addContainer(this.group,this)},buildSubRows_:function(c,b){b||c.sort(function(a,b){return a.start-b.start});for(var a=function(b,d,c){if(c>=d.length)return!0;var f=d[c];if(b.start>=f[f.length-1].end){if(void 0===b.subSlices||0===b.subSlices.length)return!0;for(f=0;f<b.subSlices.length;f++)if(!a(b.subSlices[f],d,c+1))return!1;return!0}return!1},f=[],d=0;d<c.length;d++){for(var e=
c[d],g=!1,k=f.length,l=0;l<f.length;l++)if(a(e,f,l)){g=!0;k=l;break}g||f.push([]);f[k].push(e);var m=function(a,b,d){if(!(void 0===a||0===a.length)){b===d.length&&d.push([]);for(var c=0;c<a.length;c++)d[b].push(a[c]),m(a[c].subSlices,b+1,d)}};m(e.subSlices,k+1,f)}return f}};return{AsyncSliceGroupTrack:e}});"use strict";
tv.exportTo("tv.c.tracks",function(){var e=tv.b.ui.define("thread-track",tv.c.tracks.ContainerTrack);e.prototype={__proto__:tv.c.tracks.ContainerTrack.prototype,decorate:function(c){tv.c.tracks.ContainerTrack.prototype.decorate.call(this,c);this.classList.add("thread-track")},get thread(){return this.thread_},set thread(c){this.thread_=c;this.updateContents_()},get hasVisibleContent(){return 0<this.tracks_.length},get eventContainer(){return this.thread},addContainersToTrackMap:function(c){c.addContainer(this.thread,
this);for(var b=0;b<this.childNodes.length;++b)this.childNodes[b].addContainersToTrackMap(c)},updateContents_:function(){this.detach();if(this.thread_){this.heading=this.thread_.userFriendlyName+": ";this.tooltip=this.thread_.userFriendlyDetails;this.thread_.asyncSliceGroup.length&&this.appendAsyncSliceTracks_();this.appendThreadSamplesTracks_();if(this.thread_.timeSlices){var c=new tv.c.tracks.SliceTrack(this.viewport);c.heading="";c.height=tv.c.THIN_SLICE_HEIGHT+"px";c.slices=this.thread_.timeSlices;
c.hasVisibleContent&&this.appendChild(c)}this.thread_.sliceGroup.length&&(c=new tv.c.tracks.SliceGroupTrack(this.viewport),c.heading=this.thread_.userFriendlyName,c.tooltip=this.thread_.userFriendlyDetails,c.group=this.thread_.sliceGroup,c.hasVisibleContent&&this.appendChild(c))}},appendAsyncSliceTracks_:function(){this.thread_.asyncSliceGroup.viewSubGroups.forEach(function(c){var b=new tv.c.tracks.AsyncSliceGroupTrack(this.viewport),a=c.slices[0].viewSubGroupTitle;b.group=c;b.heading=a;b.hasVisibleContent&&
this.appendChild(b)},this)},appendThreadSamplesTracks_:function(){var c=this.thread_.samples;if(!(void 0===c||0===c.length)){var b={};c.forEach(function(a){void 0===b[a.title]&&(b[a.title]=[]);b[a.title].push(a)});c=tv.b.dictionaryKeys(b);c.sort();c.forEach(function(a){var c=b[a],d=new tv.c.tracks.SampleTrack(this.viewport);d.group=this.thread_;d.samples=c;d.heading=this.thread_.userFriendlyName+": "+a;d.tooltip=this.thread_.userFriendlyDetails;d.selectionGenerator=function(){for(var a=new tv.c.Selection,
b=0;b<d.samples.length;b++)a.push(d.samples[b]);return a};this.appendChild(d)},this)}},collapsedDidChange:function(c){if(c){c=parseInt(this.tracks[0].height);for(var b=0;b<this.tracks.length;++b)2<c?this.tracks[b].height=Math.floor(c)+"px":this.tracks[b].style.display="none",c*=0.5}else for(b=0;b<this.tracks.length;++b)this.tracks[b].height=this.tracks[0].height,this.tracks[b].style.display=""}};return{ThreadTrack:e}});"use strict";
tv.exportTo("tv.c.tracks",function(){var e=tv.c.analysis.ObjectSnapshotView,c=tv.c.analysis.ObjectInstanceView,b=tv.c.TraceModelSettings,a=tv.c.tracks.SpacingTrack,f=tv.b.ui.define("process-track-base",tv.c.tracks.ContainerTrack);f.prototype={__proto__:tv.c.tracks.ContainerTrack.prototype,decorate:function(a){tv.c.tracks.ContainerTrack.prototype.decorate.call(this,a);this.processBase_=void 0;this.classList.add("process-track-base");this.classList.add("expanded");this.processNameEl_=tv.b.ui.createSpan();
this.processNameEl_.classList.add("process-track-name");this.headerEl_=tv.b.ui.createDiv({className:"process-track-header"});this.headerEl_.appendChild(this.processNameEl_);this.headerEl_.addEventListener("click",this.onHeaderClick_.bind(this));this.appendChild(this.headerEl_)},get processBase(){return this.processBase_},set processBase(a){if(this.processBase_=a)this.expanded=(new b(this.processBase_.model)).getSettingFor(this.processBase_,"expanded",void 0!==this.processBase_.labels&&1==this.processBase_.labels.length&&
"chrome://tracing"==this.processBase_.labels[0]?!1:!0);this.updateContents_()},get expanded(){return this.classList.contains("expanded")},set expanded(a){a=!!a;this.expanded!==a&&(this.classList.toggle("expanded"),this.viewport_.dispatchChangeEvent(),this.processBase_&&(new b(this.processBase_.model)).setSettingFor(this.processBase_,"expanded",a))},get hasVisibleContent(){return this.expanded?1<this.children.length:!0},onHeaderClick_:function(a){a.stopPropagation();a.preventDefault();this.expanded=
!this.expanded},updateContents_:function(){this.tracks_.forEach(function(a){this.removeChild(a)},this);this.processBase_&&(this.processNameEl_.textContent=this.processBase_.userFriendlyName,this.headerEl_.title=this.processBase_.userFriendlyDetails,this.willAppendTracks_(),this.appendSummaryTrack_(),this.appendObjectInstanceTracks_(),this.appendCounterTracks_(),this.appendThreadTracks_(),this.didAppendTracks_())},addEventsToTrackMap:function(a){this.tracks_.forEach(function(b){b.addEventsToTrackMap(a)})},
willAppendTracks_:function(){},didAppendTracks_:function(){},appendSummaryTrack_:function(){var b=new tv.c.tracks.ProcessSummaryTrack(this.viewport);b.process=this.process;b.hasVisibleContent&&(this.appendChild(b),this.appendChild(new a(this.viewport)))},appendObjectInstanceTracks_:function(){var b=this.processBase_.objects.getAllInstancesByTypeName(),f=tv.b.dictionaryKeys(b);f.sort();var g=!1;f.forEach(function(a){var f=b[a],h=c.getTypeInfo(void 0,a),n=e.getTypeInfo(void 0,a);h&&!h.metadata.showInTrackView&&
(h=void 0);n&&!n.metadata.showInTrackView&&(n=void 0);for(var n=h||n,h=[],q=0;q<f.length;q++){var w=f[q];0!==w.snapshots.length&&(!w.hasImplicitSnapshots||n)&&h.push(w)}0!==h.length&&(f=tv.c.tracks.ObjectInstanceTrack.getConstructor(void 0,a),f||(f=(n=e.getTypeInfo(void 0,a))&&n.metadata.showInstances?tv.c.tracks.ObjectInstanceGroupTrack:tv.c.tracks.ObjectInstanceTrack),a=new f(this.viewport),a.objectInstances=h,this.appendChild(a),g=!0)},this);g&&this.appendChild(new a(this.viewport))},appendCounterTracks_:function(){var b=
tv.b.dictionaryValues(this.processBase.counters);b.sort(tv.c.trace_model.Counter.compare);b.forEach(function(b){var d=new tv.c.tracks.CounterTrack(this.viewport);d.counter=b;this.appendChild(d);this.appendChild(new a(this.viewport))}.bind(this))},appendThreadTracks_:function(){var b=tv.b.dictionaryValues(this.processBase.threads);b.sort(tv.c.trace_model.Thread.compare);b.forEach(function(b){var d=new tv.c.tracks.ThreadTrack(this.viewport);d.thread=b;d.hasVisibleContent&&(this.appendChild(d),this.appendChild(new a(this.viewport)))}.bind(this))}};
return{ProcessTrackBase:f}});"use strict";
tv.exportTo("tv.c.tracks",function(){var e=tv.b.ui.define("cpu-track",tv.c.tracks.ContainerTrack);e.prototype={__proto__:tv.c.tracks.ContainerTrack.prototype,decorate:function(c){tv.c.tracks.ContainerTrack.prototype.decorate.call(this,c);this.classList.add("cpu-track")},get cpu(){return this.cpu_},set cpu(c){this.cpu_=c;this.updateContents_()},get tooltip(){return this.tooltip_},set tooltip(c){this.tooltip_=c;this.updateContents_()},get hasVisibleContent(){return 0<this.children.length},updateContents_:function(){this.detach();
if(this.cpu_){var c=this.cpu_.slices;if(c.length){var b=new tv.c.tracks.SliceTrack(this.viewport);b.slices=c;b.heading=this.cpu_.userFriendlyName+":";this.appendChild(b)}this.appendSamplesTracks_();for(var a in this.cpu_.counters)c=this.cpu_.counters[a],b=new tv.c.tracks.CounterTrack(this.viewport),b.heading=this.cpu_.userFriendlyName+" "+c.name+":",b.counter=c,this.appendChild(b)}},appendSamplesTracks_:function(){var c=this.cpu_.samples;if(!(void 0===c||0===c.length)){var b={};c.forEach(function(a){void 0===
b[a.title]&&(b[a.title]=[]);b[a.title].push(a)});c=tv.b.dictionaryKeys(b);c.sort();c.forEach(function(a){var c=b[a],d=new tv.c.tracks.SliceTrack(this.viewport);d.group=this.cpu_;d.slices=c;d.heading=this.cpu_.userFriendlyName+": "+a;d.tooltip=this.cpu_.userFriendlyDetails;d.selectionGenerator=function(){for(var a=new tv.c.Selection,b=0;b<d.slices.length;b++)a.push(d.slices[b]);return a};this.appendChild(d)},this)}}};return{CpuTrack:e}});"use strict";
tv.exportTo("tv.c.tracks",function(){var e=tv.c.tracks.ProcessTrackBase,c=tv.c.tracks.SpacingTrack,b=tv.b.ui.define("kernel-track",e);b.prototype={__proto__:e.prototype,decorate:function(a){tv.c.tracks.ProcessTrackBase.prototype.decorate.call(this,a)},set kernel(a){this.processBase=a},get kernel(){return this.processBase},get eventContainer(){return this.kernel},addContainersToTrackMap:function(a){a.addContainer(this.kernel,this)},willAppendTracks_:function(){var a=tv.b.dictionaryValues(this.kernel.cpus);
a.sort(tv.c.trace_model.Cpu.compare);for(var b=!1,d=0;d<a.length;++d){var e=a[d],g=new tv.c.tracks.CpuTrack(this.viewport);g.cpu=e;g.hasVisibleContent&&(this.appendChild(g),b=!0)}b&&this.appendChild(new c(this.viewport))}};return{KernelTrack:b}});"use strict";
tv.exportTo("tv.c.tracks",function(){var e=tv.c.trace_model.SelectionState,c=tv.b.ui.define("letter-dot-track",tv.c.tracks.HeadingTrack);c.prototype={__proto__:tv.c.tracks.HeadingTrack.prototype,decorate:function(b){tv.c.tracks.HeadingTrack.prototype.decorate.call(this,b);this.classList.add("letter-dot-track");this.items_=void 0},getModelEventFromItem:function(b){throw Error("Not implemented.");},get items(){return this.items_},set items(b){this.items_=b;this.invalidateDrawingContainer()},get height(){return window.getComputedStyle(this).height},
set height(b){this.style.height=b},get dumpRadiusView(){return 7*(window.devicePixelRatio||1)},draw:function(b,a,c){if(void 0!==this.items_)switch(b){case tv.c.tracks.DrawType.SLICE:this.drawSlices_(a,c)}},drawSlices_:function(b,a){var c=this.context(),d=window.devicePixelRatio||1,h=this.getBoundingClientRect(),g=h.height*d,k=0.5*g,l=2*Math.PI,m=tv.b.ui.getColorPalette(),n=tv.b.ui.paletteProperties.highlightIdBoost,q=this.viewport.currentDisplayTransform,w=this.dumpRadiusView,s=q.xViewVectorToWorld(g),
D=this.items_,F=tv.b.findLowIndexInSortedArray(D,function(a){return a.start},b),C=c.font;c.font="400 "+Math.floor(9*d)+"px Arial";c.strokeStyle="rgb(0,0,0)";c.textBaseline="middle";c.textAlign="center";var v=function(b){for(var d=F;d<D.length;++d){var e=D[d],h=e.start;if(h-s>a)break;e.selected===b&&(h=q.xWorldToView(h),c.fillStyle=e.selected?m[e.colorId+n]:m[e.colorId],c.beginPath(),c.arc(h,k,w+0.5,0,l),c.fill(),e.selected?(c.lineWidth=3,c.strokeStyle="rgb(100,100,0)",c.stroke(),c.beginPath(),c.arc(h,
k,w,0,l),c.lineWidth=1.5,c.strokeStyle="rgb(255,255,0)"):(c.lineWidth=1,c.strokeStyle="rgb(0,0,0)"),c.stroke(),c.fillStyle="rgb(255, 255, 255)",c.fillText(e.dotLetter,h,k))}};v(!1);v(!0);c.lineWidth=1;c.font=C;C=e.NONE;D.length&&D[0].selectionState===e.DIMMED&&(C=e.DIMMED);C===e.DIMMED&&(d*=h.width,c.fillStyle="rgba(255,255,255,0.5)",c.fillRect(0,0,d,g))},addEventsToTrackMap:function(b){void 0!==this.items_&&this.items_.forEach(function(a){(a=this.getModelEventFromItem(a))&&b.addEvent(a,this)},this)},
addIntersectingItemsInRangeToSelectionInWorldSpace:function(b,a,c,d){if(void 0!==this.items_){var e=c*this.dumpRadiusView;tv.b.iterateOverIntersectingIntervals(this.items_,function(a){return a.start-e},function(a){return 2*e},b,a,function(a){(a=this.getModelEventFromItem(a))&&d.push(a)}.bind(this))}},addItemNearToProvidedEventToSelection:function(b,a,c){if(void 0!==this.items_){var d=this.items_;b=d.indexOf(b)+a;return 0<=b&&b<d.length?((b=this.getModelEventFromItem(d[b]))&&c.push(b),!0):!1}},addAllObjectsMatchingFilterToSelection:function(b,
a){},addClosestEventToSelection:function(b,a,c,d,e){if(void 0!==this.items_&&(b=tv.b.findClosestElementInSortedArray(this.items_,function(a){return a.start},b,a)))(b=this.getModelEventFromItem(b))&&e.push(b)}};return{LetterDotTrack:c}});"use strict";
tv.exportTo("tv.c.tracks",function(){var e=tv.b.ui.define("alert-track",tv.c.tracks.LetterDotTrack);e.prototype={__proto__:tv.c.tracks.LetterDotTrack.prototype,decorate:function(c){tv.c.tracks.LetterDotTrack.prototype.decorate.call(this,c);this.heading="Alerts";this.alerts_=void 0},get alerts(){return this.alerts_},set alerts(c){this.alerts_=c;this.items=void 0===c?void 0:this.alerts_.map(function(b){return{start:b.start,get selected(){return this.alert.selected},colorId:b.colorId,dotLetter:String.fromCharCode(9888),
alert:b}})},getModelEventFromItem:function(c){return c.alert}};return{AlertTrack:e}});"use strict";
tv.exportTo("tv.c.tracks",function(){var e=tv.b.ui.define("memory-dump-track",tv.c.tracks.LetterDotTrack);e.prototype={__proto__:tv.c.tracks.LetterDotTrack.prototype,decorate:function(c){tv.c.tracks.LetterDotTrack.prototype.decorate.call(this,c);this.heading="Memory dumps";this.memoryDumps_=void 0},get memoryDumps(){return this.memoryDumps_},set memoryDumps(c){this.memoryDumps_=c;if(void 0===c)this.items=void 0;else{var b=tv.b.ui.getColorIdForReservedName("memory_dump");this.items=this.memoryDumps_.map(function(a){return{start:a.start,
get selected(){return this.memoryDump.selected},colorId:b,dotLetter:"M",memoryDump:a}})}},getModelEventFromItem:function(c){return c.memoryDump}};return{MemoryDumpTrack:e}});"use strict";
tv.exportTo("tv.c.tracks",function(){var e=tv.c.tracks.ProcessTrackBase,c=tv.b.ui.define("process-track",e);c.prototype={__proto__:e.prototype,decorate:function(b){tv.c.tracks.ProcessTrackBase.prototype.decorate.call(this,b)},drawTrack:function(b){switch(b){case tv.c.tracks.DrawType.INSTANT_EVENT:if(!this.processBase.instantEvents||0===this.processBase.instantEvents.length)break;var a=this.context(),c=window.devicePixelRatio||1,d=this.getBoundingClientRect(),e=a.canvas.getBoundingClientRect();a.save();
a.translate(0,c*(d.top-e.top));var g=this.viewport.currentDisplayTransform,e=g.xViewToWorld(0),c=g.xViewToWorld(d.width*c);tv.c.drawInstantSlicesAsLines(a,this.viewport.currentDisplayTransform,e,c,d.height,this.processBase.instantEvents,2);a.restore();break;case tv.c.tracks.DrawType.BACKGROUND:this.drawBackground_();return}tv.c.tracks.ContainerTrack.prototype.drawTrack.call(this,b)},drawBackground_:function(){var b=this.context(),a=b.canvas.getBoundingClientRect(),c=window.devicePixelRatio||1,d=!1;
b.fillStyle="#eee";for(var e=0;e<this.children.length;++e)if(this.children[e]instanceof tv.c.tracks.Track&&!(this.children[e]instanceof tv.c.tracks.SpacingTrack)&&(d=!d)){var g=this.children[e].getBoundingClientRect();b.fillRect(0,c*(g.top-a.top),b.canvas.width,c*g.height)}},set process(b){this.processBase=b},get process(){return this.processBase},get eventContainer(){return this.process},addContainersToTrackMap:function(b){b.addContainer(this.process,this);this.tracks_.forEach(function(a){a.addContainersToTrackMap(b)})},
addIntersectingItemsInRangeToSelectionInWorldSpace:function(b,a,c,d){tv.b.iterateOverIntersectingIntervals(this.processBase.instantEvents,function(a){return a.start},function(a){return a.duration},b,a,function(a){d.push(a)}.bind(this));tv.c.tracks.ContainerTrack.prototype.addIntersectingItemsInRangeToSelectionInWorldSpace.apply(this,arguments)},addClosestEventToSelection:function(b,a,c,d,e){this.addClosestInstantEventToSelection(this.processBase.instantEvents,b,a,e);tv.c.tracks.ContainerTrack.prototype.addClosestEventToSelection.apply(this,
arguments)}};return{ProcessTrack:c}});"use strict";
tv.exportTo("tv.c.tracks",function(){function e(b,a){var c=new tv.c.tracks.MultiRowTrack(b);c.heading="Interactions";c.buildSubRows_=function(a){a.sort(function(a,b){var d=a.title.localeCompare(b.title);return d?d:a.start-b.start});return tv.c.tracks.AsyncSliceGroupTrack.prototype.buildSubRows_.call({},a,!0)};c.addSubTrack_=function(a){var b=new tv.c.tracks.SliceTrack(this.viewport);b.slices=a;this.appendChild(b);return b};c.setItemsToGroup(a.interaction_records,{guid:tv.b.GUID.allocate(),model:a,
getSettingsKey:function(){}});return c}var c=tv.b.ui.define("trace-model-track",tv.c.tracks.ContainerTrack);c.prototype={__proto__:tv.c.tracks.ContainerTrack.prototype,decorate:function(b){tv.c.tracks.ContainerTrack.prototype.decorate.call(this,b);this.classList.add("model-track");this.highlighters_=tv.c.tracks.Highlighter.getAllRegisteredTypeInfos().map(function(a){return new a.constructor(b)});this.upperMode_=!1;this.annotationViews_=[]},get upperMode(){return this.upperMode_},set upperMode(b){this.upperMode_=
b;this.updateContents_()},detach:function(){tv.c.tracks.ContainerTrack.prototype.detach.call(this)},get model(){return this.model_},set model(b){this.model_=b;this.updateContents_();this.model_.addEventListener("annotationChange",this.updateAnnotations_.bind(this))},get hasVisibleContent(){return 0<this.children.length},updateContents_:function(){this.textContent="";this.model_&&(this.upperMode_?this.updateContentsForUpperMode_():this.updateContentsForLowerMode_())},updateContentsForUpperMode_:function(){},
updateContentsForLowerMode_:function(){if(this.model_.interaction_records.length){var b=new e(this.viewport_,this.model_);this.appendChild(b)}this.model_.alerts.length&&(b=new tv.c.tracks.AlertTrack(this.viewport_),b.alerts=this.model_.alerts,this.appendChild(b));this.model_.globalMemoryDumps.length&&(b=new tv.c.tracks.MemoryDumpTrack(this.viewport_),b.memoryDumps=this.model_.globalMemoryDumps,this.appendChild(b));this.appendKernelTrack_();b=this.model_.getAllProcesses();b.sort(tv.c.trace_model.Process.compare);
for(var a=0;a<b.length;++a){var c=b[a],d=new tv.c.tracks.ProcessTrack(this.viewport);d.process=c;d.hasVisibleContent&&this.appendChild(d)}this.viewport_.rebuildEventToTrackMap();this.viewport_.rebuildContainerToTrackMap();for(a=0;a<this.highlighters_.length;a++)this.highlighters_[a].processModel(this.model_);this.updateAnnotations_()},updateAnnotations_:function(){this.annotationViews_=[];for(var b=this.model_.getAllAnnotations(),a=0;a<b.length;a++)this.annotationViews_.push(b[a].getOrCreateView(this.viewport_))},
addEventsToTrackMap:function(b){if(this.model_){for(var a=this.children,c=0;c<a.length;++c)a[c].addEventsToTrackMap(b);void 0!==this.instantEvents&&this.instantEvents.forEach(function(a){b.addEvent(a,this)}.bind(this))}},addContainersToTrackMap:function(b){for(var a=this.children,c=0;c<a.length;++c)a[c].addContainersToTrackMap(b)},appendKernelTrack_:function(){var b=new tv.c.tracks.KernelTrack(this.viewport);b.kernel=this.model.kernel;b.hasVisibleContent&&this.appendChild(b)},drawTrack:function(b){var a=
this.context(),c=window.devicePixelRatio||1,d=this.getBoundingClientRect(),e=a.canvas.getBoundingClientRect();a.save();a.translate(0,c*(d.top-e.top));var e=this.viewport.currentDisplayTransform,g=e.xViewToWorld(0),c=e.xViewToWorld(d.width*c);switch(b){case tv.c.tracks.DrawType.GRID:this.viewport.drawMajorMarkLines(a);a.restore();return;case tv.c.tracks.DrawType.FLOW_ARROWS:if(0===this.model_.flowIntervalTree.size){a.restore();return}this.drawFlowArrows_(g,c);a.restore();return;case tv.c.tracks.DrawType.INSTANT_EVENT:if(!this.model_.instantEvents||
0===this.model_.instantEvents.length)break;tv.c.drawInstantSlicesAsLines(a,this.viewport.currentDisplayTransform,g,c,d.height,this.model_.instantEvents,4);break;case tv.c.tracks.DrawType.MARKERS:this.viewport.interestRange.isEmpty||(this.viewport.interestRange.draw(a,g,c),this.viewport.interestRange.drawIndicators(a,g,c));a.restore();return;case tv.c.tracks.DrawType.HIGHLIGHTS:for(b=0;b<this.highlighters_.length;b++)this.highlighters_[b].drawHighlight(a,e,g,c,d.height);a.restore();return;case tv.c.tracks.DrawType.ANNOTATIONS:for(b=
0;b<this.annotationViews_.length;b++)this.annotationViews_[b].draw(this.context());a.restore();return}a.restore();tv.c.tracks.ContainerTrack.prototype.drawTrack.call(this,b)},drawFlowArrows_:function(b,a){var c=this.context(),d=this.viewport.currentDisplayTransform;d.applyTransformToCanvas(c);d=d.xViewVectorToWorld(1);c.strokeStyle="rgba(0, 0, 0, 0.4)";c.fillStyle="rgba(0, 0, 0, 0.4)";c.lineWidth=1<d?1:d;for(var e=this.model_.flowIntervalTree.findIntersection(b,a),g=c.canvas.getBoundingClientRect(),
k=0;k<e.length;++k)this.drawFlowArrow_(c,e[k],g,d)},drawFlowArrow_:function(b,a,c,d){var e=window.devicePixelRatio||1,g=this.viewport.trackForEvent(a.startSlice),k=this.viewport.trackForEvent(a.endSlice),l=g.getBoundingClientRect(),m=k.getBoundingClientRect();a.startSlice.selected||a.endSlice.selected?(b.shadowBlur=1,b.shadowColor="red",b.shadowOffsety=2,b.strokeStyle="red"):a.selected?(b.shadowBlur=1,b.shadowColor="orange",b.shadowOffsety=2,b.strokeStyle="orange"):(b.shadowBlur=0,b.shadowOffsetX=
0,b.strokeStyle="rgba(0, 0, 0, 0.4)");var n=m.left+m.top+m.bottom+m.right;0===l.left+l.top+l.bottom+l.right&&0===n||(g=this.calculateTrackY_(g,c),c=this.calculateTrackY_(k,c),k=e*g,c*=e,g=(a.end-a.start)/2,b.beginPath(),b.moveTo(a.start,k),b.bezierCurveTo(a.start+g,k,a.start+g,c,a.end,c),b.stroke(),d=5*d*e,a.end-a.start<=2*d||(a=a.end,e*=m.height/4,tv.c.drawTriangle(b,a,c,a-d,c-e,a-d,c+e),b.fill()))},calculateTrackY_:function(b,a){var c=b.getBoundingClientRect();return 0===c.left+c.top+c.bottom+c.right?
this.calculateTrackY_(b.parentNode,a):c.top-a.top+c.height/2},addIntersectingItemsInRangeToSelectionInWorldSpace:function(b,a,c,d){tv.b.iterateOverIntersectingIntervals(this.model_.instantEvents,function(a){return a.start},function(a){return a.duration},b,a,function(a){d.push(a)}.bind(this));tv.c.tracks.ContainerTrack.prototype.addIntersectingItemsInRangeToSelectionInWorldSpace.apply(this,arguments)},addClosestEventToSelection:function(b,a,c,d,e){this.addClosestInstantEventToSelection(this.model_.instantEvents,
b,a,e);tv.c.tracks.ContainerTrack.prototype.addClosestEventToSelection.apply(this,arguments)}};return{TraceModelTrack:c}});"use strict";
tv.exportTo("tv.c.tracks",function(){var e=tv.b.ui.define("ruler-track",tv.c.tracks.HeadingTrack),c=Math.log(10);e.prototype={__proto__:tv.c.tracks.HeadingTrack.prototype,decorate:function(b){tv.c.tracks.HeadingTrack.prototype.decorate.call(this,b);this.classList.add("ruler-track");this.strings_secs_=[];this.strings_msecs_=[];this.viewportChange_=this.viewportChange_.bind(this);b.addEventListener("change",this.viewportChange_)},detach:function(){tv.c.tracks.HeadingTrack.prototype.detach.call(this);
this.viewport.removeEventListener("change",this.viewportChange_)},viewportChange_:function(){this.viewport.interestRange.isEmpty?this.classList.remove("tall-mode"):this.classList.add("tall-mode")},draw:function(b,a,c){switch(b){case tv.c.tracks.DrawType.GRID:this.drawGrid_(a,c);break;case tv.c.tracks.DrawType.MARKERS:this.viewport.interestRange.isEmpty||this.viewport.interestRange.draw(this.context(),a,c)}},drawGrid_:function(b,a){for(var e=this.context(),d=window.devicePixelRatio||1,h=e.canvas.getBoundingClientRect(),
g=this.getBoundingClientRect(),h=h.width*d,k=g.height*d,l=!this.viewport.interestRange.isEmpty,m=l?2*k/5:k,n=this.viewport,g=n.currentDisplayTransform,d=150*d,q=g.xViewVectorToWorld(d),w,q=Math.pow(10,Math.ceil(Math.log(q)/c)),s=[10,5,2,1],D=0;D<s.length;++D)if(!(g.xWorldVectorToView(q/s[D])<d)){w=q/s[D-1];break}var F=void 0;100>w?(q="ms",s=1,F=this.strings_msecs_):(q="s",s=1E3,F=this.strings_secs_);var C=g.xWorldVectorToView(w/5),D=Math.floor(b/w)*w,v=Math.floor(0.25*m);e.save();d=window.devicePixelRatio||
1;e.lineWidth=Math.round(d);var y=e.lineWidth%2/2;e.translate(y,-y);e.fillStyle="rgb(0, 0, 0)";e.strokeStyle="rgb(0, 0, 0)";e.textAlign="left";e.textBaseline="top";e.font=9*d+"px sans-serif";n.majorMarkPositions=[];e.beginPath();for(y=D;y<a;y+=w){var B=Math.floor(g.xWorldToView(y)),D=Math.floor(1E5*(y/s))/1E5;F[D]||(F[D]=D+" "+q);e.fillText(F[D],B+2*d,0);n.majorMarkPositions.push(B);tv.c.drawLine(e,B,0,B,m);for(D=1;5>D;++D){var H=Math.floor(B+C*D);tv.c.drawLine(e,H,m-v,H,m)}}e.strokeStyle="rgb(0, 0, 0)";
tv.c.drawLine(e,0,k,h,k);e.stroke();l&&(tv.c.drawLine(e,0,m,h,m),e.stroke(),k=10*d,w=1.75*m,m=3*d,l=10*d,D=2*(m+k),e.textBaseline="middle",e.font=14*d+"px sans-serif",F=n.interestRange,0===F.range?(n=F.min,g=g.xWorldToView(n),s=Math.abs(Math.floor(1E3*(n/s))/1E3),q=s+" "+q,s=g+4*d,C=e.measureText(q).width,s+C>h&&(s=g-4*d-C),e.fillStyle="rgb(0,0,0)",e.fillText(q,s,w)):(q=F.max,d=g.xWorldToView(F.min),n=g.xWorldToView(q),C=F.range,F=g.xWorldVectorToView(C),g=d+F/2,100>C?(q="ms",s=1):(q="s",s=1E3),q=
Math.abs(Math.floor(1E3*(C/s))/1E3)+" "+q,C=e.measureText(q).width,y=C+D+k,s=g-C/2,v=s+C,y>F?(s=n+2*k,s+C>h&&(s=d-2*k-C),e.fillStyle="rgb(0,0,0)",e.fillText(q,s,w),e.strokeStyle="rgb(128,121,121)",e.beginPath(),tv.c.drawLine(e,d,w,n,w),e.stroke(),e.fillStyle="rgb(128,121,121)",tv.c.drawArrow(e,d-1.5*k,w,d,w,l,m),tv.c.drawArrow(e,n+1.5*k,w,n,w,l,m)):D<=F&&(y<=F?(e.fillStyle="rgb(0,0,0)",e.fillText(q,s,w),h=s-k,g=v+k):h=g,e.strokeStyle="rgb(128,121,121)",e.fillStyle="rgb(128,121,121)",tv.c.drawArrow(e,
h,w,d,w,l,m),tv.c.drawArrow(e,g,w,n,w,l,m)),e.restore()))},addIntersectingItemsInRangeToSelection:function(b,a,c,d,e){},addAllObjectsMatchingFilterToSelection:function(b,a){}};return{RulerTrack:e}});"use strict";
tv.exportTo("tv.c",function(){var e=tv.c.Selection,c=tv.c.trace_model.SelectionState,b=tv.c.TimelineViewport,a=new tv.c.TimelineDisplayTransform,f=tv.b.ui.define("div");f.prototype={__proto__:HTMLDivElement.prototype,model_:null,decorate:function(){this.classList.add("timeline-track-view");this.viewport_=new b(this);this.viewportDisplayTransformAtMouseDown_=null;this.rulerTrackContainer_=new tv.c.tracks.DrawingContainer(this.viewport_);this.appendChild(this.rulerTrackContainer_);this.rulerTrackContainer_.invalidate();
this.rulerTrack_=new tv.c.tracks.RulerTrack(this.viewport_);this.rulerTrackContainer_.appendChild(this.rulerTrack_);this.upperModelTrack_=new tv.c.tracks.TraceModelTrack(this.viewport_);this.upperModelTrack_.upperMode=!0;this.rulerTrackContainer_.appendChild(this.upperModelTrack_);this.modelTrackContainer_=new tv.c.tracks.DrawingContainer(this.viewport_);this.appendChild(this.modelTrackContainer_);this.modelTrackContainer_.style.display="block";this.modelTrackContainer_.invalidate();this.viewport_.modelTrackContainer=
this.modelTrackContainer_;this.modelTrack_=new tv.c.tracks.TraceModelTrack(this.viewport_);this.modelTrackContainer_.appendChild(this.modelTrack_);this.timingTool_=new tv.c.TimingTool(this.viewport_,this);this.initMouseModeSelector();this.dragBox_=this.ownerDocument.createElement("div");this.dragBox_.className="drag-box";this.appendChild(this.dragBox_);this.hideDragBox_();this.initHintText_();this.bindEventListener_(document,"keypress",this.onKeypress_,this);this.bindEventListener_(document,"keydown",
this.onKeydown_,this);this.bindEventListener_(document,"keyup",this.onKeyup_,this);this.bindEventListener_(this,"dblclick",this.onDblClick_,this);this.bindEventListener_(this,"mousewheel",this.onMouseWheel_,this);this.addEventListener("mousemove",this.onMouseMove_);this.addEventListener("touchstart",this.onTouchStart_);this.addEventListener("touchmove",this.onTouchMove_);this.addEventListener("touchend",this.onTouchEnd_);this.mouseViewPosAtMouseDown_={x:0,y:0};this.lastMouseViewPos_={x:0,y:0};this.lastTouchViewPositions_=
[];this.selection_=new e;this.highlight_=new e;this.isZooming_=this.isPanningAndScanning_=!1},bindEventListener_:function(a,b,c,e){this.boundListeners_||(this.boundListeners_=[]);c=c.bind(e);this.boundListeners_.push({object:a,event:b,boundFunc:c});a.addEventListener(b,c)},initMouseModeSelector:function(){this.mouseModeSelector_=new tv.b.ui.MouseModeSelector(this);this.appendChild(this.mouseModeSelector_);this.mouseModeSelector_.addEventListener("beginpan",this.onBeginPanScan_.bind(this));this.mouseModeSelector_.addEventListener("updatepan",
this.onUpdatePanScan_.bind(this));this.mouseModeSelector_.addEventListener("endpan",this.onEndPanScan_.bind(this));this.mouseModeSelector_.addEventListener("beginselection",this.onBeginSelection_.bind(this));this.mouseModeSelector_.addEventListener("updateselection",this.onUpdateSelection_.bind(this));this.mouseModeSelector_.addEventListener("endselection",this.onEndSelection_.bind(this));this.mouseModeSelector_.addEventListener("beginzoom",this.onBeginZoom_.bind(this));this.mouseModeSelector_.addEventListener("updatezoom",
this.onUpdateZoom_.bind(this));this.mouseModeSelector_.addEventListener("endzoom",this.onEndZoom_.bind(this));this.mouseModeSelector_.addEventListener("entertiming",this.timingTool_.onEnterTiming.bind(this.timingTool_));this.mouseModeSelector_.addEventListener("begintiming",this.timingTool_.onBeginTiming.bind(this.timingTool_));this.mouseModeSelector_.addEventListener("updatetiming",this.timingTool_.onUpdateTiming.bind(this.timingTool_));this.mouseModeSelector_.addEventListener("endtiming",this.timingTool_.onEndTiming.bind(this.timingTool_));
this.mouseModeSelector_.addEventListener("exittiming",this.timingTool_.onExitTiming.bind(this.timingTool_));var a=tv.b.ui.MOUSE_SELECTOR_MODE;this.mouseModeSelector_.supportedModeMask=a.SELECTION|a.PANSCAN|a.ZOOM|a.TIMING;this.mouseModeSelector_.settingsKey="timelineTrackView.mouseModeSelector";this.mouseModeSelector_.setKeyCodeForMode(a.PANSCAN,50);this.mouseModeSelector_.setKeyCodeForMode(a.SELECTION,49);this.mouseModeSelector_.setKeyCodeForMode(a.ZOOM,51);this.mouseModeSelector_.setKeyCodeForMode(a.TIMING,
52);this.mouseModeSelector_.setKeyCodeCondition(function(){return this.listenToKeys_}.bind(this));this.mouseModeSelector_.setModifierForAlternateMode(a.SELECTION,tv.b.ui.MODIFIER.SHIFT);this.mouseModeSelector_.setModifierForAlternateMode(a.PANSCAN,tv.b.ui.MODIFIER.SPACE);this.mouseModeSelector_.setModifierForAlternateMode(a.ZOOM,tv.b.ui.MODIFIER.CMD_OR_CTRL)},detach:function(){this.modelTrack_.detach();this.upperModelTrack_.detach();for(var a=0;a<this.boundListeners_.length;a++){var b=this.boundListeners_[a];
b.object.removeEventListener(b.event,b.boundFunc)}this.boundListeners_=void 0;this.viewport_.detach()},get viewport(){return this.viewport_},get model(){return this.model_},set model(a){if(!a)throw Error("Model cannot be null");var b=this.model_!==a;this.model_=a;this.modelTrack_.model=a;this.upperModelTrack_.model=a;b&&this.viewport_.setWhenPossible(this.setInitialViewport_.bind(this));tv.b.setPropertyAndDispatchChange(this,"model",a)},get hasVisibleContent(){return this.modelTrack_.hasVisibleContent||
this.upperModelTrack_.hasVisibleContent},setInitialViewport_:function(){this.modelTrackContainer_.updateCanvasSizeIfNeeded_();var b=this.modelTrackContainer_.canvas.width,c,e;this.model_.bounds.isEmpty?(c=0,e=1E3):0===this.model_.bounds.range?(c=this.model_.bounds.min,e=1E3):(c=this.model_.bounds.min,e=this.model_.bounds.range);var f=0.15*e;a.set(this.viewport_.currentDisplayTransform);a.xSetWorldBounds(c-f,c+e+f,b);this.viewport_.setDisplayTransformImmediately(a)},addAllObjectsMatchingFilterToSelectionAsTask:function(a,
b){return this.modelTrack_.addAllObjectsMatchingFilterToSelectionAsTask(a,b)},get focusElement(){return this.focusElement_?this.focusElement_:this.parentElement},set focusElement(a){this.focusElement_=a},get listenToKeys_(){return!this.viewport_.isAttachedToDocumentOrInTestMode||document.activeElement instanceof TracingFindControl||document.activeElement instanceof TracingScriptingControl?!1:!this.focusElement_?!0:0<=this.focusElement.tabIndex?document.activeElement==this.focusElement?!0:tv.b.ui.elementIsChildOf(document.activeElement,
this.focusElement):!0},onMouseMove_:function(a){this.isZooming_||this.storeLastMousePos_(a)},onTouchStart_:function(a){this.storeLastTouchPositions_(a);this.focusElements_()},onTouchMove_:function(a){a.preventDefault();this.onUpdateTransformForTouch_(a)},onTouchEnd_:function(a){this.storeLastTouchPositions_(a);this.focusElements_()},onKeypress_:function(a){if(this.listenToKeys_&&"INPUT"!=document.activeElement.nodeName){var b=this.modelTrackContainer_.canvas.clientWidth;switch(a.keyCode){case 119:case 44:this.zoomBy_(1.5,
!0);break;case 115:case 111:this.zoomBy_(1/1.5,!0);break;case 103:this.onGridToggle_(!0);break;case 71:this.onGridToggle_(!1);break;case 87:case 60:this.zoomBy_(10,!0);break;case 83:case 79:this.zoomBy_(0.1,!0);break;case 97:this.queueSmoothPan_(0.3*b,0);break;case 100:case 101:this.queueSmoothPan_(-0.3*b,0);break;case 65:this.queueSmoothPan_(0.5*b,0);break;case 68:this.queueSmoothPan_(-0.5*b,0);break;case 48:this.setInitialViewport_();break;case 102:this.zoomToSelection();break;case 109:this.setCurrentSelectionAsInterestRange_();
break;case 104:this.toggleHighDetails_()}}},onKeydown_:function(a){if(this.listenToKeys_){var b,c=this.modelTrackContainer_.canvas.clientWidth;switch(a.keyCode){case 37:(b=this.selection.getShiftedSelection(this.viewport,-1))?(this.setSelectionAndClearHighlight(b),this.panToSelection(),a.preventDefault()):this.queueSmoothPan_(0.3*c,0);break;case 39:(b=this.selection.getShiftedSelection(this.viewport,1))?(this.setSelectionAndClearHighlight(b),this.panToSelection(),a.preventDefault()):this.queueSmoothPan_(0.3*
-c,0);break;case 9:-1==this.focusElement.tabIndex&&(a.shiftKey?this.selectPrevious_(a):this.selectNext_(a),a.preventDefault())}}},onKeyup_:function(a){this.listenToKeys_&&(a.shiftKey||this.dragBeginEvent_&&this.setDragBoxPosition_(this.dragBoxXStart_,this.dragBoxYStart_,this.dragBoxXEnd_,this.dragBoxYEnd_))},onDblClick_:function(a){if(this.mouseModeSelector_.mode===tv.b.ui.MOUSE_SELECTOR_MODE.SELECTION&&this.selection.length&&this.selection[0].title){a=new e;var b=new tv.c.ExactTitleFilter(this.selection[0].title);
this.modelTrack_.addAllObjectsMatchingFilterToSelection(b,a);this.setSelectionAndClearHighlight(a)}},onMouseWheel_:function(a){if(a.altKey){var b=Math.pow(1.5,a.wheelDelta/120);this.zoomBy_(b);a.preventDefault()}},queueSmoothPan_:function(a,b){var c=this.viewport_.currentDisplayTransform.xViewVectorToWorld(a),c=new tv.c.TimelineDisplayTransformPanAnimation(c,b);this.viewport_.queueDisplayTransformAnimation(c)},zoomBy_:function(b,c){if(!(0>=b)){c=!!c;var e=this.viewport_,f=this.modelTrackContainer_.canvas.clientWidth,
l=this.lastMouseViewPos_.x*(window.devicePixelRatio||1),m=e.currentDisplayTransform.xViewToWorld(l);c?(f=new tv.c.TimelineDisplayTransformZoomToAnimation(m,l,e.currentDisplayTransform.panY,b),e.queueDisplayTransformAnimation(f)):(a.set(e.currentDisplayTransform),a.scaleX*=b,a.xPanWorldPosToViewPos(m,l,f),e.setDisplayTransformImmediately(a))}},zoomToSelection:function(){if(this.selectionOfInterest.length){var a=this.selectionOfInterest.bounds;a.range&&(a=new tv.c.TimelineDisplayTransformZoomToAnimation(a.center,
this.modelTrackContainer_.canvas.width/2,this.viewport_.currentDisplayTransform.panY,this.modelTrackContainer_.canvas.width/(1.25*a.range)/this.viewport_.currentDisplayTransform.scaleX),this.viewport_.queueDisplayTransformAnimation(a))}},panToSelection:function(){var b;if(this.selectionOfInterest.length){b=this.selectionOfInterest.bounds;var c=this.modelTrackContainer_.canvas.width,e=this.viewport_.currentDisplayTransform;a.set(e);a.xPanWorldBoundsIntoView(b.min,b.max,c);b=a.panX-e.panX;b=new tv.c.TimelineDisplayTransformPanAnimation(b,
0);this.viewport_.queueDisplayTransformAnimation(b)}},navToPosition:function(a){var b=a.location,c=a.scaleX;a=b.getContainingTrack(this.viewport_);var b=b.xWorld,e=this.modelTrackContainer_.canvas.width/5,c=c/this.viewport_.currentDisplayTransform.scaleX;a.scrollIntoViewIfNeeded();a=new tv.c.TimelineDisplayTransformZoomToAnimation(b,e,this.viewport_.currentDisplayTransform.panY,c);this.viewport_.queueDisplayTransformAnimation(a);this.xNavStringMarker_&&this.model.removeAnnotation(this.xNavStringMarker_);
this.xNavStringMarker_=new tv.c.trace_model.XMarkerAnnotation(b);this.model.addAnnotation(this.xNavStringMarker_)},removeXNavStringMarker:function(){this.xNavStringMarker_&&this.model.removeAnnotation(this.xNavStringMarker_)},setCurrentSelectionAsInterestRange_:function(){var a=this.selection.bounds;a.empty?this.viewport_.interestRange.reset():this.viewport_.interestRange.min==a.min&&this.viewport_.interestRange.max==a.max?this.viewport_.interestRange.reset():this.viewport_.interestRange.set(a)},
toggleHighDetails_:function(){this.viewport_.highDetails=!this.viewport_.highDetails},set selection(a){this.setSelectionAndHighlight(a,this.highlight_)},get selection(){return this.selection_},set highlight(a){this.setSelectionAndHighlight(this.selection_,a)},get highlight(){return this.highlight_},get selectionOfInterest(){return!this.selection_.length&&this.highlight_.length?this.highlight_:this.selection_},setSelectionAndClearHighlight:function(a){this.setSelectionAndHighlight(a,null)},setHighlightAndClearSelection:function(a){this.setSelectionAndHighlight(null,
a)},setSelectionAndHighlight:function(a,b){if(!(a===this.selection_&&b===this.highlight_)){if(null!==a&&!(a instanceof e)||null!==b&&!(b instanceof e))throw Error("Expected Selection");b&&b.length?(this.resetEventsTo_(c.DIMMED),b!==this.highlight_&&(this.highlight_=b),this.setSelectionState_(b,c.HIGHLIGHTED)):(this.resetEventsTo_(c.NONE),this.highlight_=new e);a&&a.length?(a!==this.selection_&&(this.selection_=a),this.setSelectionState_(a,c.SELECTED)):this.selection_=new e;tv.b.dispatchSimpleEvent(this,
"selectionChange");this.showHintText_("Press 'm' to mark current selection");if(this.selectionOfInterest.length){var f=this.viewport_.trackForEvent(this.selectionOfInterest[0]);f&&f.scrollIntoViewIfNeeded()}this.viewport_.dispatchChangeEvent()}},setSelectionState_:function(a,b){for(var c=0;c<a.length;c++)a[c].selectionState=b},resetEventsTo_:function(a){var b=this.highlight_.length;b&&a!==c.DIMMED||!b&&a===c.DIMMED?this.model.iterateAllEvents(function(b){b.selectionState=a}):(this.setSelectionState_(this.selection_,
a),this.setSelectionState_(this.highlight_,a))},hideDragBox_:function(){this.dragBox_.style.left="-1000px";this.dragBox_.style.top="-1000px";this.dragBox_.style.width=0;this.dragBox_.style.height=0},setDragBoxPosition_:function(a,b,c,e){var f=Math.min(b,e);e=Math.max(b,e);b=Math.min(a,c);a=Math.max(a,c);this.modelTrack_.getBoundingClientRect();c=b+(a-b);e=f+(e-f);var m=this.modelTrackContainer_.getBoundingClientRect(),n=m.left,q=m.top,w=m.right,m=m.bottom,s=window.getComputedStyle(this.querySelector("heading")).width,
s=parseInt(s),n=n+s;s={};b>w||c<n||f>m||e<q?f=!1:(s.left=Math.max(n,b),s.top=Math.max(q,f),s.right=Math.min(w,c),s.bottom=Math.min(m,e),s.width=s.right-s.left,s.height=s.bottom-s.top,f=s);this.dragBox_.style.left=f.left+"px";this.dragBox_.style.width=f.width+"px";this.dragBox_.style.top=f.top+"px";this.dragBox_.style.height=f.height+"px";f=window.devicePixelRatio||1;c=this.modelTrackContainer_.canvas;e=this.viewport_.currentDisplayTransform;b=e.xViewToWorld((b-c.offsetLeft)*f);a=e.xViewToWorld((a-
c.offsetLeft)*f);f=Math.round(100*(a-b))/100;this.dragBox_.textContent=f+"ms";f=new tv.b.Event("selectionChanging");f.loWX=b;f.hiWX=a;this.dispatchEvent(f)},onGridToggle_:function(a){var b=a?this.selection.bounds.min:this.selection.bounds.max;if(this.viewport_.gridEnabled&&this.viewport_.gridSide===a&&this.viewport_.gridInitialTimebase===b)this.viewport_.gridside=void 0,this.viewport_.gridEnabled=!1,this.viewport_.gridInitialTimebase=void 0;else{var c=Math.ceil((b-this.model_.bounds.min)/this.viewport_.gridStep_);
this.viewport_.gridEnabled=!0;this.viewport_.gridSide=a;this.viewport_.gridInitialTimebase=b;this.viewport_.gridTimebase=b-(c+1)*this.viewport_.gridStep_}},storeLastMousePos_:function(a){this.lastMouseViewPos_=this.extractRelativeMousePosition_(a)},storeLastTouchPositions_:function(a){this.lastTouchViewPositions_=this.extractRelativeTouchPositions_(a)},extractRelativeMousePosition_:function(a){var b=this.modelTrackContainer_.canvas;return{x:a.clientX-b.offsetLeft,y:a.clientY-b.offsetTop}},extractRelativeTouchPositions_:function(a){for(var b=
this.modelTrackContainer_.canvas,c=[],e=0;e<a.touches.length;++e)c.push({x:a.touches[e].clientX-b.offsetLeft,y:a.touches[e].clientY-b.offsetTop});return c},storeInitialMouseDownPos_:function(a){a=this.extractRelativeMousePosition_(a);this.mouseViewPosAtMouseDown_.x=a.x;this.mouseViewPosAtMouseDown_.y=a.y},focusElements_:function(){document.activeElement&&document.activeElement.blur();0<=this.focusElement.tabIndex&&this.focusElement.focus()},storeInitialInteractionPositionsAndFocus_:function(a){this.storeInitialMouseDownPos_(a);
this.storeLastMousePos_(a);this.focusElements_()},onBeginPanScan_:function(a){this.viewportDisplayTransformAtMouseDown_=this.viewport_.currentDisplayTransform.clone();this.isPanningAndScanning_=!0;this.storeInitialInteractionPositionsAndFocus_(a);a.preventDefault()},onUpdatePanScan_:function(b){if(this.isPanningAndScanning_){var c=(window.devicePixelRatio||1)*(this.lastMouseViewPos_.x-this.mouseViewPosAtMouseDown_.x),e=this.lastMouseViewPos_.y-this.mouseViewPosAtMouseDown_.y;a.set(this.viewportDisplayTransformAtMouseDown_);
a.incrementPanXInViewUnits(c);a.panY-=e;this.viewport_.setDisplayTransformImmediately(a);b.preventDefault();b.stopPropagation();this.storeLastMousePos_(b)}},onEndPanScan_:function(a){this.isPanningAndScanning_=!1;this.storeLastMousePos_(a);a.isClick||a.preventDefault()},onBeginSelection_:function(a){var b=this.modelTrackContainer_.canvas,c=this.modelTrack_.getBoundingClientRect(),b=b.getBoundingClientRect();c&&(a.clientX>=c.left&&a.clientX<c.right&&a.clientY>=c.top&&a.clientY<c.bottom&&a.clientX>=
b.left&&a.clientX<b.right)&&(this.dragBeginEvent_=a,this.storeInitialInteractionPositionsAndFocus_(a),a.preventDefault())},onUpdateSelection_:function(a){this.dragBeginEvent_&&(this.dragBoxXStart_=this.dragBeginEvent_.clientX,this.dragBoxXEnd_=a.clientX,this.dragBoxYStart_=this.dragBeginEvent_.clientY,this.dragBoxYEnd_=a.clientY,this.setDragBoxPosition_(this.dragBoxXStart_,this.dragBoxYStart_,this.dragBoxXEnd_,this.dragBoxYEnd_))},onEndSelection_:function(a){a.preventDefault();if(this.dragBeginEvent_){this.hideDragBox_();
var b=this.dragBeginEvent_;this.dragBeginEvent_=null;var c=Math.min(b.clientY,a.clientY),f=Math.max(b.clientY,a.clientY),l=Math.min(b.clientX,a.clientX);a=Math.max(b.clientX,a.clientX);b=this.modelTrackContainer_.canvas.getBoundingClientRect().left;l-=b;b=a-b;a=new e;this.modelTrack_.addIntersectingItemsInRangeToSelection(l,b,c,f,a);c=new tv.c.RequestSelectionChangeEvent;c.selection=a;this.dispatchEvent(c)}},onBeginZoom_:function(a){this.isZooming_=!0;this.storeInitialInteractionPositionsAndFocus_(a);
a.preventDefault()},onUpdateZoom_:function(a){if(this.isZooming_){var b=this.extractRelativeMousePosition_(a);this.zoomBy_(1+0.01*(this.lastMouseViewPos_.y-b.y),!1);this.storeLastMousePos_(a)}},onEndZoom_:function(a){this.isZooming_=!1;a.isClick||a.preventDefault()},computeTouchCenter_:function(a){for(var b=0,c=0,e=0;e<a.length;++e)b+=a[e].x,c+=a[e].y;return{x:b/a.length,y:c/a.length}},computeTouchSpan_:function(a){for(var b=Number.MAX_VALUE,c=Number.MAX_VALUE,e=Number.MIN_VALUE,f=Number.MIN_VALUE,
m=0;m<a.length;++m)b=Math.min(b,a[m].x),c=Math.min(c,a[m].y),e=Math.max(e,a[m].x),f=Math.max(f,a[m].y);return Math.sqrt((b-e)*(b-e)+(c-f)*(c-f))},onUpdateTransformForTouch_:function(b){var c=this.extractRelativeTouchPositions_(b),e=this.lastTouchViewPositions_,f=this.computeTouchCenter_(c),l=this.computeTouchCenter_(e),m=this.computeTouchSpan_(c),n=this.computeTouchSpan_(e),e=this.viewport_,c=this.modelTrackContainer_.canvas.clientWidth,q=window.devicePixelRatio||1,w=q*(f.x-l.x),l=f.y-l.y,m=10<n?
m/n:1,f=q*f.x,q=e.currentDisplayTransform.xViewToWorld(f);a.set(e.currentDisplayTransform);a.scaleX*=m;a.xPanWorldPosToViewPos(q,f,c);a.incrementPanXInViewUnits(w);a.panY-=l;e.setDisplayTransformImmediately(a);this.storeLastTouchPositions_(b)},initHintText_:function(){this.hintTextBox_=this.ownerDocument.createElement("div");this.hintTextBox_.className="hint-text";this.hintTextBox_.style.display="none";this.appendChild(this.hintTextBox_);this.pendingHintTextClearTimeout_=void 0},showHintText_:function(a){this.pendingHintTextClearTimeout_&&
(window.clearTimeout(this.pendingHintTextClearTimeout_),this.pendingHintTextClearTimeout_=void 0);this.pendingHintTextClearTimeout_=setTimeout(this.hideHintText_.bind(this),1E3);this.hintTextBox_.textContent=a;this.hintTextBox_.style.display=""},hideHintText_:function(){this.pendingHintTextClearTimeout_=void 0;this.hintTextBox_.style.display="none"}};return{TimelineTrackView:f}});"use strict";
Polymer("tracing-find-control",{filterKeyDown:function(e){e.stopPropagation();13===e.keyCode&&(e.shiftKey?this.findPrevious():this.findNext())},filterKeyPress:function(e){e.stopPropagation()},filterBlur:function(e){this.updateHitCountEl()},filterFocus:function(e){this.controller.reset();this.$.filter.select()},filterMouseUp:function(e){e.preventDefault()},get controller(){return this.controller_},set controller(e){this.controller_=e;this.updateHitCountEl()},focus:function(){this.$.filter.focus()},
get hasFocus(){return this===document.activeElement},filterTextChanged:function(){this.controller.filterText=this.$.filter.value;this.$.hitCount.textContent="";this.$.spinner.style.visibility="visible";this.controller.updateFilterHits().then(function(){this.$.spinner.style.visibility="hidden";this.updateHitCountEl()}.bind(this))},findNext:function(){this.controller&&this.controller.findNext();this.updateHitCountEl()},findPrevious:function(){this.controller&&this.controller.findPrevious();this.updateHitCountEl()},
updateHitCountEl:function(){if(!this.controller||!this.hasFocus)this.$.hitCount.textContent="";else{var e=this.controller.filterHits.length;this.$.hitCount.textContent=(0===e?-1:this.controller.currentHitIndex)+1+" of "+e}}});"use strict";Polymer("tv-c-scripting-object",{get scriptName(){throw Error("Not implemented");},get scriptValue(){return this},onTimelineChanged:function(e){}});"use strict";
Polymer("tv-e-tquery-context",{ready:function(){this.event=void 0;this.ancestors=[]},push:function(e){var c=document.createElement(this.element.name);c.ancestors=this.ancestors.slice();c.ancestors.push(e);return c},pop:function(e){e=document.createElement(this.element.name);e.event=this.ancestors[this.ancestors.length-1];e.ancestors=this.ancestors.slice(0,this.ancestors.length-1);return e}});"use strict";
Polymer("tv-e-tquery-filter",{get scriptName(){},evaluate:function(e){throw Error("Not implemented");},matchValue_:function(e,c){return c instanceof RegExp?c.test(e):c instanceof Function?c(e):e===c},normalizeFilterExpression:function(e){if(e instanceof String||"string"==typeof e||e instanceof RegExp){var c=document.createElement("tv-e-tquery-filter-has-title");c.expected=e;return c}return e}});"use strict";
Polymer("tv-e-tquery-filter-has-ancestor",{ready:function(){this.subExpression_=void 0},get scriptName(){return"hasAncestor"},get scriptValue(){return function(e){var c=document.createElement(this.element.name);c.subExpression=e;return c}.bind(this)},set subExpression(e){this.subExpression_=this.normalizeFilterExpression(e)},get subExpression(){return this.subExpression_},evaluate:function(e){if(!this.subExpression)return 0<e.ancestors.length;for(;e.ancestors.length;)if(e=e.pop(),this.subExpression.evaluate(e))return!0;
return!1}});"use strict";Polymer("tv-e-tquery-filter-has-title",{ready:function(){this.expected=void 0},get scriptName(){return"hasTitle"},get scriptValue(){return function(e){var c=document.createElement(this.element.name);c.expected=e;return c}.bind(this)},evaluate:function(e){return this.matchValue_(e.event.title,this.expected)}});"use strict";
Polymer("tv-e-tquery",{ready:function(){this.selection_=this.filterExpression_=this.parent_=this.timeline_=void 0},get scriptName(){return"$t"},onTimelineChanged:function(e){this.timeline_=e;this.selection_=void 0},get timeline(){return this.timeline_},filter:function(e){var c=document.createElement("tv-e-tquery");c.timeline_=this.timeline;c.parent_=this;c.filterExpression_=document.createElement("tv-e-tquery-filter").normalizeFilterExpression(e);return c},createFilterTaskGraph_:function(){for(var e=
[],c=this;void 0!==c;)e.push(c),c=c.parent_;for(var b=new tv.b.Task,a=b,f=e.length-1;0<=f;f--)c=e[f],void 0===c.selection_&&(c.selection_=new tv.c.Selection,a=void 0===c.parent_?a.after(this.selectEverythingAsTask_(c.selection_)):this.createFilterTaskForNode_(a,c,e[f+1]));return{rootTask:b,lastTask:a,lastNode:c}},createFilterTaskForNode_:function(e,c,b){return e.after(function(){c.evaluateFilterExpression_(b.selection_,c.selection_)},this)},evaluateFilterExpression_:function(e,c){var b={};e.forEach(function(a){var f=
document.createElement("tv-e-tquery-context");f.event=a;this.evaluateFilterExpressionForEvent_(f,e,c,b)}.bind(this))},evaluateFilterExpressionForEvent_:function(e,c,b,a){var f=e.event;c.contains(f)&&!a[f.guid]&&(a[f.guid]=!0,(!this.filterExpression_||this.filterExpression_.evaluate(e))&&b.push(f));if(f.subSlices){e=e.push(f);for(var d=0;d<f.subSlices.length;d++)e.event=f.subSlices[d],this.evaluateFilterExpressionForEvent_(e,c,b,a)}},show:function(){var e=this.createFilterTaskGraph_();e.lastTask=e.lastTask.after(function(){this.timeline.setHighlightAndClearSelection(e.lastNode.selection_)},
this);return e.rootTask},selectEverythingAsTask_:function(e){var c=new tv.c.Filter;return this.timeline.addAllObjectsMatchingFilterToSelectionAsTask(c,e)},get selection(){if(void 0===this.selection_){var e=this.createFilterTaskGraph_();tv.b.Task.RunSynchronously(e.rootTask)}return this.selection_}});"use strict";
Polymer("tv-c-scripting-controller",{ready:function(){this.timeline_=void 0;this.scriptObjectNames_=[];this.scriptObjectValues_=[];tv.b.getPolymerElementsThatSubclass("tv-c-scripting-object").forEach(function(e){e=document.createElement(e);e.scriptName&&(this.addScriptObject(e.scriptName,e.scriptValue),window[e.scriptName]=e.scriptValue)}.bind(this))},get timeline(){return this.timeline_},set timeline(e){this.timeline_=e;this.scriptObjectValues_.forEach(function(c){if(c.onTimelineChanged)c.onTimelineChanged(e)})},
addScriptObject:function(e,c){this.scriptObjectNames_.push(e);this.scriptObjectValues_.push(c)},executeCommand:function(e){return(new Function(this.scriptObjectNames_,"return eval("+e+")")).apply(null,this.scriptObjectValues_)}});"use strict";
Polymer("tracing-scripting-control",{_isEnterKey:function(e){return 229!==e.keyCode&&"Enter"===e.keyIdentifier},_setFocused:function(e){var c=this.$.prompt;e?(c.focus(),this.$.root.classList.add("focused"),0<c.innerText.length&&window.getSelection().collapse(c.firstChild,c.innerText.length)):(c.blur(),this.$.root.classList.remove("focused"),e=document.createElement("input"),e.focus(),e.setSelectionRange(0,0),e.blur())},onConsoleFocus:function(e){e.stopPropagation();this._setFocused(!0)},onConsoleBlur:function(e){e.stopPropagation();
this._setFocused(!1)},promptKeyDown:function(e){e.stopPropagation();if(this._isEnterKey(e)){e=this.$.prompt;var c=e.innerText;if(0!==c.length){e.innerText="";this.addLine_(String.fromCharCode(187)+" "+c);try{var b=this.controller_.executeCommand(c)}catch(a){b=a.stack||a.stackTrace}b instanceof tv.b.Task?tv.b.Task.RunWhenIdle(b):this.addLine_(b)}}},addLine_:function(e){var c=this.$.history;0!==c.innerText.length&&(c.innerText+="\n");c.innerText+=e},promptKeyPress:function(e){e.stopPropagation()},toggleVisibility:function(){var e=
this.$.root;this.visible?(e.classList.add("hidden"),this._setFocused(!1)):(e.classList.remove("hidden"),this._setFocused(!0))},get hasFocus(){return this===document.activeElement},get visible(){return!this.$.root.classList.contains("hidden")},get controller(){return this.controller_},set controller(e){this.controller_=e}});"use strict";
Polymer("tv-c-side-panel",{ready:function(){this.objectInstance_=void 0},get rangeOfInterest(){throw Error("Not implemented");},set rangeOfInterest(e){throw Error("Not implemented");},get selection(){throw Error("Not implemented");},set selection(e){throw Error("Not implemented");},get model(){throw Error("Not implemented");},set model(e){throw Error("Not implemented");}});"use strict";
Polymer("tv-c-side-panel-container",{ready:function(){this.activePanelContainer_=this.$.active_panel_container;this.tabStrip_=this.$.tab_strip;this.model_=void 0;this.rangeOfInterest_=new tv.b.Range},get model(){return this.model_},set model(e){this.model_=e;this.activePanelType_=void 0;this.updateContents_()},get expanded(){this.hasAttribute("expanded")},get activePanel(){return 0===this.activePanelContainer_.children.length?void 0:this.activePanelContainer_.children[0]},get activePanelType(){return this.activePanelType_},
set activePanelType(e){if(void 0===this.model_)throw Error("Cannot activate panel without a model");var c=void 0;e&&(c=document.createElement(e));if(void 0!==c&&!c.supportsModel(this.model_))throw Error("Cannot activate panel: does not support this model");this.activePanelType&&this.getLabelElementForPanelType_(this.activePanelType).removeAttribute("selected");this.activePanelContainer_.textContent="";void 0===e?(this.removeAttribute("expanded"),this.activePanelType_=void 0):(this.getLabelElementForPanelType_(e).setAttribute("selected",
!0),this.setAttribute("expanded",!0),this.activePanelContainer_.appendChild(c),c.rangeOfInterest=this.rangeOfInterest_,c.selection=this.selection_,c.model=this.model_,this.activePanelType_=e)},getPanelTypeForConstructor_:function(e){for(var c=0;c<this.tabStrip_.children.length;c++)if(this.tabStrip_.children[c].panelType.constructor==e)return this.tabStrip_.children[c].panelType},getLabelElementForPanelType_:function(e){for(var c=0;c<this.tabStrip_.children.length;c++)if(this.tabStrip_.children[c].panelType==
e)return this.tabStrip_.children[c]},updateContents_:function(){var e=this.activePanelType;this.tabStrip_.textContent="";var c=[];tv.b.getPolymerElementsThatSubclass("tv-c-side-panel").forEach(function(b){var a=document.createElement("tab-strip-label"),e=document.createElement(b);a.textContent=e.textLabel;a.panelType=b;e=e.supportsModel(this.model_);this.model_&&e.supported?(c.push(b),a.setAttribute("enabled",!0),a.addEventListener("click",function(){this.activePanelType=this.activePanelType===b?
void 0:b}.bind(this))):a.title="Not supported for the current trace: "+e.reason;this.tabStrip_.appendChild(a)},this);e&&-1!=c.indexOf(e)?(this.activePanelType=e,this.setAttribute("expanded",!0)):(this.activePanelContainer_.textContent="",this.removeAttribute("expanded"))},get selection(){return this.selection_},set selection(e){this.selection_=e;this.activePanel&&(this.activePanel.selection=e)},get rangeOfInterest(){return this.rangeOfInterest_},set rangeOfInterest(e){if(void 0==e)throw Error("Must not be undefined");
this.rangeOfInterest_=e;this.activePanel&&(this.activePanel.rangeOfInterest=e)}});"use strict";
tv.exportTo("tv.c",function(){var e=document.currentScript.ownerDocument,c=tv.b.ui.define("x-timeline-view");c.prototype={__proto__:HTMLUnknownElement.prototype,decorate:function(){var b=tv.b.instantiateTemplate("#timeline-view-template",e);this.appendChild(b);this.titleEl_=this.querySelector(".title");this.leftControlsEl_=this.querySelector("#left-controls");this.rightControlsEl_=this.querySelector("#right-controls");this.collapsingControlsEl_=this.querySelector("#collapsing-controls");this.sidePanelContainer_=
this.querySelector("tv-c-side-panel-container");this.trackViewContainer_=this.querySelector("track-view-container");this.findCtl_=new TracingFindControl;this.findCtl_.controller=new tv.c.FindController;this.scriptingCtl_=new TracingScriptingControl;this.scriptingCtl_.controller=document.createElement("tv-c-scripting-controller");this.showFlowEvents_=!1;this.rightControls.appendChild(tv.b.ui.createCheckBox(this,"showFlowEvents","tv.c.TimelineView.showFlowEvents",!1,"Flow events"));this.highlightVSync_=
!1;this.highlightVSyncCheckbox_=tv.b.ui.createCheckBox(this,"highlightVSync","tv.c.TimelineView.highlightVSync",!1,"Highlight VSync");this.rightControls.appendChild(this.highlightVSyncCheckbox_);this.rightControls.appendChild(this.createMetadataButton_());this.rightControls.appendChild(this.findCtl_);this.rightControls.appendChild(this.createConsoleButton_());this.rightControls.appendChild(this.createHelpButton_());this.collapsingControls.appendChild(this.scriptingCtl_);this.dragEl_=this.querySelector("x-drag-handle");
tv.b.ui.decorate(this.dragEl_,tv.b.ui.DragHandle);this.analysisEl_=this.querySelector("#analysis");this.addEventListener("requestSelectionChange",this.onRequestSelectionChange_.bind(this));this.onViewportChanged_=this.onViewportChanged_.bind(this);this.onSelectionChanged_=this.onSelectionChanged_.bind(this);document.addEventListener("keydown",this.onKeyDown_.bind(this),!0);document.addEventListener("keypress",this.onKeypress_.bind(this),!0);this.dragEl_.target=this.analysisEl_;this.selections_={};
window.addEventListener("popstate",this.onPopState_.bind(this))},updateDocumentFavicon:function(){var b=tv.c.FaviconsByHue[this.model?this.model.faviconHue:"blue"];void 0===b&&(b=tv.c.FaviconsByHue.blue);var a=document.head.querySelector('link[rel="shortcut icon"]');a||(a=document.createElement("link"),a.rel="shortcut icon",document.head.appendChild(a));a.href=b},get showFlowEvents(){return this.showFlowEvents_},set showFlowEvents(b){this.showFlowEvents_=b;this.trackView_&&(this.trackView_.viewport.showFlowEvents=
b)},get highlightVSync(){return this.highlightVSync_},set highlightVSync(b){this.highlightVSync_=b;this.trackView_&&(this.trackView_.viewport.highlightVSync=b)},createHelpButton_:function(){var b=tv.b.instantiateTemplate("#help-btn-template",e),a=b.querySelector(".view-help-button"),c=b.querySelector(".view-help-text"),d=new tv.b.ui.Overlay;d.title="chrome://tracing Help";d.classList.add("view-help-overlay");d.appendChild(b);a.addEventListener("click",function(a){d.visible=!d.visible;for(var b=tv.isMac?
"cmd ":"ctrl",e=c.querySelectorAll("span.mod"),l=0;l<e.length;l++)e[l].textContent=b;a.stopPropagation();return!1}.bind(this));return a},createConsoleButton_:function(){var b=tv.b.instantiateTemplate("#console-btn-template",e).querySelector(".view-console-button");b.addEventListener("click",function(a){this.scriptingCtl_.toggleVisibility();a.stopPropagation();return!1}.bind(this));return b},createMetadataButton_:function(){var b=tv.b.instantiateTemplate("#metadata-btn-template",e),a=b.querySelector(".view-metadata-button"),
c=b.querySelector(".info-button-text"),d=new tv.b.ui.Overlay;d.title="Metadata for trace";d.classList.add("view-metadata-overlay");d.appendChild(b);a.addEventListener("click",function(a){d.visible=!0;var b=[],e=this.model,l;for(l in e.metadata){var m=e.metadata[l],n=JSON.stringify(m.name),m=JSON.stringify(m.value,void 0," ");b.push(n+": "+m)}c.textContent=b.join("\n");a.stopPropagation();return!1}.bind(this));b=function(){a.style.display=this.model&&this.model.metadata.length?"":"none"}.bind(this);
b();this.addEventListener("modelChange",b);return a},get leftControls(){return this.leftControlsEl_},get rightControls(){return this.rightControlsEl_},get collapsingControls(){return this.collapsingControlsEl_},get viewTitle(){return this.titleEl_.textContent.substring(this.titleEl_.textContent.length-2)},set viewTitle(b){void 0===b?(this.titleEl_.textContent="",this.titleEl_.hidden=!0):(this.titleEl_.hidden=!1,this.titleEl_.textContent=b)},get model(){if(this.trackView_)return this.trackView_.model},
set model(b){var a=b!=this.model,c=b&&!b.bounds.isEmpty;a&&(this.trackViewContainer_.textContent="",this.trackView_&&(this.trackView_.viewport.removeEventListener("change",this.onViewportChanged_),this.trackView_.removeEventListener("selectionChange",this.onSelectionChanged_),this.trackView_.detach(),this.trackView_=void 0,this.findCtl_.controller.timeline=void 0,this.scriptingCtl_.controller.timeline=void 0),this.sidePanelContainer_.model=void 0);c&&!this.trackView_&&(this.trackView_=new tv.c.TimelineTrackView,
this.trackView_.focusElement=this.focusElement_?this.focusElement_:this.parentElement,this.trackViewContainer_.appendChild(this.trackView_),this.findCtl_.controller.timeline=this.trackView_,this.scriptingCtl_.controller.timeline=this.trackView_,this.trackView_.addEventListener("selectionChange",this.onSelectionChanged_),this.trackView_.viewport.addEventListener("change",this.onViewportChanged_));c&&(this.trackView_.model=b,this.sidePanelContainer_.model=b,this.trackView_.viewport.showFlowEvents=this.showFlowEvents,
this.trackView_.viewport.highlightVSync=this.highlightVSync,this.clearSelectionHistory_());tv.b.dispatchSimpleEvent(this,"modelChange");a&&(this.onSelectionChanged_(),this.onViewportChanged_())},get timeline(){return this.trackView_},get settings(){this.settings_||(this.settings_=new tv.b.Settings);return this.settings_},set focusElement(b){this.focusElement_=b;this.trackView_&&(this.trackView_.focusElement=b)},get focusElement(){return this.focusElement_?this.focusElement_:this.parentElement},get listenToKeys_(){if(tv.b.ui.isElementAttachedToDocument(this))return!this.focusElement_?
!0:0<=this.focusElement.tabIndex?document.activeElement==this.focusElement:!0},onKeyDown_:function(b){this.listenToKeys_&&27===b.keyCode&&(this.focus(),b.preventDefault())},onKeypress_:function(b){if(this.listenToKeys_){switch(b.keyCode){case 96:this.scriptingCtl_.toggleVisibility(),this.scriptingCtl_.hasFocus||this.focus(),b.preventDefault()}if(!this.scriptingCtl_.hasFocus){switch(b.keyCode){case 47:this.findCtl_.hasFocus?this.focus():this.findCtl_.focus();b.preventDefault();break;case 63:this.querySelector(".view-help-button").click(),
b.preventDefault()}if(!this.findCtl_.hasFocus)switch(b.keyCode){case 118:this.toggleHighlightVSync_(),b.preventDefault()}}}},onSelectionChanged_:function(b){b=this.trackViewContainer_.scrollTop;var a=this.trackView_?this.trackView_.selectionOfInterest:new tv.c.Selection;this.analysisEl_.selection=a;this.trackViewContainer_.scrollTop=b;this.sidePanelContainer_.selection=a},onRequestSelectionChange_:function(b){this.selections_[b.selection.guid]=b.selection;window.history.pushState({selection_guid:b.selection.guid},
"");this.trackView_.selection=b.selection;b.stopPropagation()},onPopState_:function(b){if(null!==b.state){var a=this.selections_[b.state.selection_guid];a&&(this.trackView_.selection=a);b.stopPropagation()}},clearSelectionHistory_:function(){this.selections_={}},onViewportChanged_:function(b){b=this.sidePanelContainer_;if(this.trackView_){var a=this.trackView_.viewport.interestRange.asRangeObject();b.rangeOfInterest.equals(a)||(b.rangeOfInterest=a)}else b.rangeOfInterest.reset()},toggleHighlightVSync_:function(){this.highlightVSyncCheckbox_.checked=
!this.highlightVSyncCheckbox_.checked}};return{TimelineView:c}});"use strict";
tv.exportTo("tv",function(){var e=tv.b.ui.define("trace-viewer",tv.c.TimelineView);e.prototype={__proto__:tv.c.TimelineView.prototype,decorate:function(c){function b(){d.model=k;d.viewTitle=e;d.timeline&&(d.timeline.focusElement=d)}function a(){var a=new tv.b.ui.Overlay;a.textContent=tv.b.normalizeException(err).message;a.title="Import error";a.visible=!0}tv.c.TimelineView.prototype.decorate.call(this);if(void 0!==c){var e=c,d=this,h=new XMLHttpRequest,g=/[.]gz$/.test(e)||/[.]zip$/.test(e);h.overrideMimeType("text/plain; charset=x-user-defined");
h.open("GET",e,!0);g&&(h.responseType="arraybuffer");h.onreadystatechange=function(c){4==h.readyState&&window.setTimeout(function(){if(200==h.status){var c=g?h.response:h.responseText;k=new tv.c.TraceModel;k.importTracesWithProgressDialog([c],!0).then(b,a)}else{var c=h.status,d=new tv.b.ui.Overlay;d.textContent=c+": "+e+" could not be loaded";d.title="Failed to fetch data";d.visible=!0}},0)};h.send(null);var k}}};return{TraceViewer:e}});
!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var c;"undefined"!=typeof window?c=window:"undefined"!=typeof global?c=global:"undefined"!=typeof self&&(c=self);c.JSZip=e()}}(function(){return function c(b,a,f){function d(g,l){if(!a[g]){if(!b[g]){var m="function"==typeof require&&require;if(!l&&m)return m(g,!0);if(h)return h(g,!0);throw Error("Cannot find module '"+g+"'");}m=a[g]={exports:{}};b[g][0].call(m.exports,
function(a){var c=b[g][1][a];return d(c?c:a)},m,m.exports,c,b,a,f)}return a[g].exports}for(var h="function"==typeof require&&require,g=0;g<f.length;g++)d(f[g]);return d}({1:[function(c,b,a){a.encode=function(a){for(var b,c,g,k,l,m,n="",q=0;q<a.length;)b=a.charCodeAt(q++),c=a.charCodeAt(q++),g=a.charCodeAt(q++),k=b>>2,b=(3&b)<<4|c>>4,l=(15&c)<<2|g>>6,m=63&g,isNaN(c)?l=m=64:isNaN(g)&&(m=64),n=n+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".charAt(k)+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".charAt(b)+
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".charAt(l)+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".charAt(m);return n};a.decode=function(a){var b,c,g,k,l,m="",n=0;for(a=a.replace(/[^A-Za-z0-9\+\/\=]/g,"");n<a.length;)b="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(a.charAt(n++)),c="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(a.charAt(n++)),k="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(a.charAt(n++)),
l="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(a.charAt(n++)),b=b<<2|c>>4,c=(15&c)<<4|k>>2,g=(3&k)<<6|l,m+=String.fromCharCode(b),64!=k&&(m+=String.fromCharCode(c)),64!=l&&(m+=String.fromCharCode(g));return m}},{}],2:[function(c,b){function a(){this.crc32=this.uncompressedSize=this.compressedSize=0;this.compressedContent=this.compressionMethod=null}a.prototype={getContent:function(){return null},getCompressedContent:function(){return null}};b.exports=a},{}],3:[function(c,
b,a){a.STORE={magic:"\x00\x00",compress:function(a){return a},uncompress:function(a){return a},compressInputType:null,uncompressInputType:null};a.DEFLATE=c("./flate")},{"./flate":8}],4:[function(c,b){var a=c("./utils"),f=[0,1996959894,3993919788,2567524794,124634137,1886057615,3915621685,2657392035,249268274,2044508324,3772115230,2547177864,162941995,2125561021,3887607047,2428444049,498536548,1789927666,4089016648,2227061214,450548861,1843258603,4107580753,2211677639,325883990,1684777152,4251122042,
2321926636,335633487,1661365465,4195302755,2366115317,997073096,1281953886,3579855332,2724688242,1006888145,1258607687,3524101629,2768942443,901097722,1119000684,3686517206,2898065728,853044451,1172266101,3705015759,2882616665,651767980,1373503546,3369554304,3218104598,565507253,1454621731,3485111705,3099436303,671266974,1594198024,3322730930,2970347812,795835527,1483230225,3244367275,3060149565,1994146192,31158534,2563907772,4023717930,1907459465,112637215,2680153253,3904427059,2013776290,251722036,
2517215374,3775830040,2137656763,141376813,2439277719,3865271297,1802195444,476864866,2238001368,4066508878,1812370925,453092731,2181625025,4111451223,1706088902,314042704,2344532202,4240017532,1658658271,366619977,2362670323,4224994405,1303535960,984961486,2747007092,3569037538,1256170817,1037604311,2765210733,3554079995,1131014506,879679996,2909243462,3663771856,1141124467,855842277,2852801631,3708648649,1342533948,654459306,3188396048,3373015174,1466479909,544179635,3110523913,3462522015,1591671054,
702138776,2966460450,3352799412,1504918807,783551873,3082640443,3233442989,3988292384,2596254646,62317068,1957810842,3939845945,2647816111,81470997,1943803523,3814918930,2489596804,225274430,2053790376,3826175755,2466906013,167816743,2097651377,4027552580,2265490386,503444072,1762050814,4150417245,2154129355,426522225,1852507879,4275313526,2312317920,282753626,1742555852,4189708143,2394877945,397917763,1622183637,3604390888,2714866558,953729732,1340076626,3518719985,2797360999,1068828381,1219638859,
3624741850,2936675148,906185462,1090812512,3747672003,2825379669,829329135,1181335161,3412177804,3160834842,628085408,1382605366,3423369109,3138078467,570562233,1426400815,3317316542,2998733608,733239954,1555261956,3268935591,3050360625,752459403,1541320221,2607071920,3965973030,1969922972,40735498,2617837225,3943577151,1913087877,83908371,2512341634,3803740692,2075208622,213261112,2463272603,3855990285,2094854071,198958881,2262029012,4057260610,1759359992,534414190,2176718541,4139329115,1873836001,
414664567,2282248934,4279200368,1711684554,285281116,2405801727,4167216745,1634467795,376229701,2685067896,3608007406,1308918612,956543938,2808555105,3495958263,1231636301,1047427035,2932959818,3654703836,1088359270,936918E3,2847714899,3736837829,1202900863,817233897,3183342108,3401237130,1404277552,615818150,3134207493,3453421203,1423857449,601450431,3009837614,3294710456,1567103746,711928724,3020668471,3272380065,1510334235,755167117];b.exports=function(b,c){if("undefined"==typeof b||!b.length)return 0;
var g="string"!==a.getTypeOf(b);"undefined"==typeof c&&(c=0);var k=0,k=k=0;c^=-1;for(var l=0,m=b.length;m>l;l++)k=g?b[l]:b.charCodeAt(l),k=255&(c^k),k=f[k],c=c>>>8^k;return-1^c}},{"./utils":21}],5:[function(c,b){function a(){this.data=null;this.index=this.length=0}var f=c("./utils");a.prototype={checkOffset:function(a){this.checkIndex(this.index+a)},checkIndex:function(a){if(this.length<a||0>a)throw Error("End of data reached (data length = "+this.length+", asked index = "+a+"). Corrupted zip ?");
},setIndex:function(a){this.checkIndex(a);this.index=a},skip:function(a){this.setIndex(this.index+a)},byteAt:function(){},readInt:function(a){var b,c=0;this.checkOffset(a);for(b=this.index+a-1;b>=this.index;b--)c=(c<<8)+this.byteAt(b);return this.index+=a,c},readString:function(a){return f.transformTo("string",this.readData(a))},readData:function(){},lastIndexOfSignature:function(){},readDate:function(){var a=this.readInt(4);return new Date((a>>25&127)+1980,(a>>21&15)-1,a>>16&31,a>>11&31,a>>5&63,
(31&a)<<1)}};b.exports=a},{"./utils":21}],6:[function(c,b,a){a.base64=!1;a.binary=!1;a.dir=!1;a.createFolders=!1;a.date=null;a.compression=null;a.comment=null},{}],7:[function(c,b,a){var f=c("./utils");a.string2binary=function(a){return f.string2binary(a)};a.string2Uint8Array=function(a){return f.transformTo("uint8array",a)};a.uint8Array2String=function(a){return f.transformTo("string",a)};a.string2Blob=function(a){a=f.transformTo("arraybuffer",a);return f.arrayBuffer2Blob(a)};a.arrayBuffer2Blob=
function(a){return f.arrayBuffer2Blob(a)};a.transformTo=function(a,b){return f.transformTo(a,b)};a.getTypeOf=function(a){return f.getTypeOf(a)};a.checkSupport=function(a){return f.checkSupport(a)};a.MAX_VALUE_16BITS=f.MAX_VALUE_16BITS;a.MAX_VALUE_32BITS=f.MAX_VALUE_32BITS;a.pretty=function(a){return f.pretty(a)};a.findCompression=function(a){return f.findCompression(a)};a.isRegExp=function(a){return f.isRegExp(a)}},{"./utils":21}],8:[function(c,b,a){b="undefined"!=typeof Uint8Array&&"undefined"!=
typeof Uint16Array&&"undefined"!=typeof Uint32Array;var f=c("pako");a.uncompressInputType=b?"uint8array":"array";a.compressInputType=b?"uint8array":"array";a.magic="\b\x00";a.compress=function(a){return f.deflateRaw(a)};a.uncompress=function(a){return f.inflateRaw(a)}},{pako:24}],9:[function(c,b){function a(b,c){return this instanceof a?(this.files={},this.comment=null,this.root="",b&&this.load(b,c),void(this.clone=function(){var b=new a,c;for(c in this)"function"!=typeof this[c]&&(b[c]=this[c]);
return b})):new a(b,c)}var f=c("./base64");a.prototype=c("./object");a.prototype.load=c("./load");a.support=c("./support");a.defaults=c("./defaults");a.utils=c("./deprecatedPublicUtils");a.base64={encode:function(a){return f.encode(a)},decode:function(a){return f.decode(a)}};a.compressions=c("./compressions");b.exports=a},{"./base64":1,"./compressions":3,"./defaults":6,"./deprecatedPublicUtils":7,"./load":10,"./object":13,"./support":17}],10:[function(c,b){var a=c("./base64"),f=c("./zipEntries");
b.exports=function(b,c){var g,k,l,m;c=c||{};c.base64&&(b=a.decode(b));k=new f(b,c);g=k.files;for(l=0;l<g.length;l++)m=g[l],this.file(m.fileName,m.decompressed,{binary:!0,optimizedBinaryString:!0,date:m.date,dir:m.dir,comment:m.fileComment.length?m.fileComment:null,createFolders:c.createFolders});return k.zipComment.length&&(this.comment=k.zipComment),this}},{"./base64":1,"./zipEntries":22}],11:[function(c,b){(function(a){b.exports=function(b,c){return new a(b,c)};b.exports.test=function(b){return a.isBuffer(b)}}).call(this,
"undefined"!=typeof Buffer?Buffer:void 0)},{}],12:[function(c,b){function a(a){this.data=a;this.length=this.data.length;this.index=0}var f=c("./uint8ArrayReader");a.prototype=new f;a.prototype.readData=function(a){this.checkOffset(a);var b=this.data.slice(this.index,this.index+a);return this.index+=a,b};b.exports=a},{"./uint8ArrayReader":18}],13:[function(c,b){var a=c("./support"),f=c("./utils"),d=c("./crc32"),h=c("./signature"),g=c("./defaults"),k=c("./base64"),l=c("./compressions"),m=c("./compressedObject"),
n=c("./nodeBuffer"),q=c("./utf8"),w=c("./stringWriter"),s=c("./uint8ArrayWriter"),D=function(a){if(a._data instanceof m&&(a._data=a._data.getContent(),a.options.binary=!0,a.options.base64=!1,"uint8array"===f.getTypeOf(a._data))){var b=a._data;a._data=new Uint8Array(b.length);0!==b.length&&a._data.set(b,0)}return a._data},F=function(b){var c=D(b);return"string"===f.getTypeOf(c)?!b.options.binary&&a.nodebuffer?n(c,"utf-8"):b.asBinary():c},C=function(a){var b=D(this);return null===b||"undefined"==typeof b?
"":(this.options.base64&&(b=k.decode(b)),b=a&&this.options.binary?x.utf8decode(b):f.transformTo("string",b),a||this.options.binary||(b=f.transformTo("string",x.utf8encode(b))),b)},v=function(a,b,c){this.name=a;this.dir=c.dir;this.date=c.date;this.comment=c.comment;this._data=b;this.options=c;this._initialMetadata={dir:c.dir,date:c.date}};v.prototype={asText:function(){return C.call(this,!0)},asBinary:function(){return C.call(this,!1)},asNodeBuffer:function(){var a=F(this);return f.transformTo("nodebuffer",
a)},asUint8Array:function(){var a=F(this);return f.transformTo("uint8array",a)},asArrayBuffer:function(){return this.asUint8Array().buffer}};var y=function(a,b){var c,d="";for(c=0;b>c;c++)d+=String.fromCharCode(255&a),a>>>=8;return d},B=function(){var a,b,c={};for(a=0;a<arguments.length;a++)for(b in arguments[a])arguments[a].hasOwnProperty(b)&&"undefined"==typeof c[b]&&(c[b]=arguments[a][b]);return c},H=function(a,b,c){var d,h=f.getTypeOf(b),k=c;c=(k=k||{},!0!==k.base64||null!==k.binary&&void 0!==
k.binary||(k.binary=!0),k=B(k,g),k.date=k.date||new Date,null!==k.compression&&(k.compression=k.compression.toUpperCase()),k);if(c.createFolders){k=a;"/"==k.slice(-1)&&(k=k.substring(0,k.length-1));var l=k.lastIndexOf("/");(d=0<l?k.substring(0,l):"")&&z.call(this,d,!0)}if(c.dir||null===b||"undefined"==typeof b)c.base64=!1,c.binary=!1,b=null;else if("string"===h)c.binary&&!c.base64&&!0!==c.optimizedBinaryString&&(b=f.string2binary(b));else{if(c.base64=!1,c.binary=!0,!(h||b instanceof m))throw Error("The data of '"+
a+"' is in an unsupported format !");"arraybuffer"===h&&(b=f.transformTo("uint8array",b))}b=new v(a,b,c);return this.files[a]=b,b},z=function(a,b){return"/"!=a.slice(-1)&&(a+="/"),b="undefined"!=typeof b?b:!1,this.files[a]||H.call(this,a,null,{dir:!0,createFolders:b}),this.files[a]},x={load:function(){throw Error("Load method is not defined. Is the file jszip-load.js included ?");},filter:function(a){var b,c,d,f,h=[];for(b in this.files)this.files.hasOwnProperty(b)&&(d=this.files[b],f=new v(d.name,
d._data,B(d.options)),c=b.slice(this.root.length,b.length),b.slice(0,this.root.length)===this.root&&a(c,f)&&h.push(f));return h},file:function(a,b,c){if(1===arguments.length){if(f.isRegExp(a)){var d=a;return this.filter(function(a,b){return!b.dir&&d.test(a)})}return this.filter(function(b,c){return!c.dir&&b===a})[0]||null}return a=this.root+a,H.call(this,a,b,c),this},folder:function(a){if(!a)return this;if(f.isRegExp(a))return this.filter(function(b,c){return c.dir&&a.test(b)});var b=z.call(this,
this.root+a),c=this.clone();return c.root=b.name,c},remove:function(a){a=this.root+a;var b=this.files[a];if(b||("/"!=a.slice(-1)&&(a+="/"),b=this.files[a]),b&&!b.dir)delete this.files[a];else for(var b=this.filter(function(b,c){return c.name.slice(0,a.length)===a}),c=0;c<b.length;c++)delete this.files[b[c].name];return this},generate:function(a){a=B(a||{},{base64:!0,compression:"STORE",type:"base64",comment:null});f.checkSupport(a.type);var b,c,g=[];c=b=0;var n=f.transformTo("string",this.utf8encode(a.comment||
this.comment||"")),x;for(x in this.files)if(this.files.hasOwnProperty(x)){var D=this.files[x],v=D.options.compression||a.compression.toUpperCase(),u=l[v];if(!u)throw Error(v+" is not a valid compression method !");var v=D,t=void 0,C=new m,v=(v._data instanceof m?(C.uncompressedSize=v._data.uncompressedSize,C.crc32=v._data.crc32,0===C.uncompressedSize||v.dir?(u=l.STORE,C.compressedContent="",C.crc32=0):v._data.compressionMethod===u.magic?C.compressedContent=v._data.getCompressedContent():(t=v._data.getContent(),
C.compressedContent=u.compress(f.transformTo(u.compressInputType,t)))):(t=F(v),(!t||0===t.length||v.dir)&&(u=l.STORE,t=""),C.uncompressedSize=t.length,C.crc32=d(t),C.compressedContent=u.compress(f.transformTo(u.compressInputType,t))),C.compressedSize=C.compressedContent.length,C.compressionMethod=u.magic,C),z=D,D=v,u=b,H=void 0,ea=void 0,S=void 0,I=void 0,t=(D.compressedContent,f.transformTo("string",q.utf8encode(z.name))),S=z.comment||"",C=f.transformTo("string",q.utf8encode(S)),Z=t.length!==z.name.length,
fa=C.length!==S.length,H=z.options,pa="",la="",X="",S=z._initialMetadata.dir!==z.dir?z.dir:H.dir,I=z._initialMetadata.date!==z.date?z.date:H.date,H=I.getHours(),H=H<<6,H=H|I.getMinutes(),H=H<<5,H=H|I.getSeconds()/2,ea=I.getFullYear()-1980,ea=ea<<4,ea=ea|I.getMonth()+1,ea=ea<<5,ea=ea|I.getDate();Z&&(la=y(1,1)+y(d(t),4)+t,pa+="up"+y(la.length,2)+la);fa&&(X=y(1,1)+y(this.crc32(C),4)+C,pa+="uc"+y(X.length,2)+X);z="";z+="\n\x00";z+=Z||fa?"\x00\b":"\x00\x00";z+=D.compressionMethod;z+=y(H,2);z+=y(ea,2);
z+=y(D.crc32,4);z+=y(D.compressedSize,4);z+=y(D.uncompressedSize,4);z+=y(t.length,2);z+=y(pa.length,2);Z=h.LOCAL_FILE_HEADER+z+t+pa;u=h.CENTRAL_FILE_HEADER+"\u0014\x00"+z+y(C.length,2)+"\x00\x00\x00\x00"+(!0===S?"\u0010\x00\x00\x00":"\x00\x00\x00\x00")+y(u,4)+t+pa+C;D={fileRecord:Z,dirRecord:u,compressedObject:D};b+=D.fileRecord.length+v.compressedSize;c+=D.dirRecord.length;g.push(D)}x="";x=h.CENTRAL_DIRECTORY_END+"\x00\x00\x00\x00"+y(g.length,2)+y(g.length,2)+y(c,4)+y(b,4)+y(n.length,2)+n;n=a.type.toLowerCase();
b="uint8array"===n||"arraybuffer"===n||"blob"===n||"nodebuffer"===n?new s(b+c+x.length):new w(b+c+x.length);for(c=0;c<g.length;c++)b.append(g[c].fileRecord),b.append(g[c].compressedObject.compressedContent);for(c=0;c<g.length;c++)b.append(g[c].dirRecord);b.append(x);g=b.finalize();switch(a.type.toLowerCase()){case "uint8array":case "arraybuffer":case "nodebuffer":return f.transformTo(a.type.toLowerCase(),g);case "blob":return f.arrayBuffer2Blob(f.transformTo("arraybuffer",g));case "base64":return a.base64?
k.encode(g):g;default:return g}},crc32:function(a,b){return d(a,b)},utf8encode:function(a){return f.transformTo("string",q.utf8encode(a))},utf8decode:function(a){return q.utf8decode(a)}};b.exports=x},{"./base64":1,"./compressedObject":2,"./compressions":3,"./crc32":4,"./defaults":6,"./nodeBuffer":11,"./signature":14,"./stringWriter":16,"./support":17,"./uint8ArrayWriter":19,"./utf8":20,"./utils":21}],14:[function(c,b,a){a.LOCAL_FILE_HEADER="PK\u0003\u0004";a.CENTRAL_FILE_HEADER="PK\u0001\u0002";a.CENTRAL_DIRECTORY_END=
"PK\u0005\u0006";a.ZIP64_CENTRAL_DIRECTORY_LOCATOR="PK\u0006\u0007";a.ZIP64_CENTRAL_DIRECTORY_END="PK\u0006\u0006";a.DATA_DESCRIPTOR="PK\u0007\b"},{}],15:[function(c,b){function a(a,b){this.data=a;b||(this.data=d.string2binary(this.data));this.length=this.data.length;this.index=0}var f=c("./dataReader"),d=c("./utils");a.prototype=new f;a.prototype.byteAt=function(a){return this.data.charCodeAt(a)};a.prototype.lastIndexOfSignature=function(a){return this.data.lastIndexOf(a)};a.prototype.readData=function(a){this.checkOffset(a);
var b=this.data.slice(this.index,this.index+a);return this.index+=a,b};b.exports=a},{"./dataReader":5,"./utils":21}],16:[function(c,b){var a=c("./utils"),f=function(){this.data=[]};f.prototype={append:function(b){b=a.transformTo("string",b);this.data.push(b)},finalize:function(){return this.data.join("")}};b.exports=f},{"./utils":21}],17:[function(c,b,a){c="undefined"!=typeof Buffer?Buffer:void 0;if(a.base64=!0,a.array=!0,a.string=!0,a.arraybuffer="undefined"!=typeof ArrayBuffer&&"undefined"!=typeof Uint8Array,
a.nodebuffer="undefined"!=typeof c,a.uint8array="undefined"!=typeof Uint8Array,"undefined"==typeof ArrayBuffer)a.blob=!1;else{c=new ArrayBuffer(0);try{a.blob=0===(new Blob([c],{type:"application/zip"})).size}catch(f){try{var d=new (window.BlobBuilder||window.WebKitBlobBuilder||window.MozBlobBuilder||window.MSBlobBuilder);d.append(c);a.blob=0===d.getBlob("application/zip").size}catch(h){a.blob=!1}}}},{}],18:[function(c,b){function a(a){a&&(this.data=a,this.length=this.data.length,this.index=0)}var f=
c("./dataReader");a.prototype=new f;a.prototype.byteAt=function(a){return this.data[a]};a.prototype.lastIndexOfSignature=function(a){var b=a.charCodeAt(0),c=a.charCodeAt(1),f=a.charCodeAt(2);a=a.charCodeAt(3);for(var l=this.length-4;0<=l;--l)if(this.data[l]===b&&this.data[l+1]===c&&this.data[l+2]===f&&this.data[l+3]===a)return l;return-1};a.prototype.readData=function(a){if(this.checkOffset(a),0===a)return new Uint8Array(0);var b=this.data.subarray(this.index,this.index+a);return this.index+=a,b};
b.exports=a},{"./dataReader":5}],19:[function(c,b){var a=c("./utils"),f=function(a){this.data=new Uint8Array(a);this.index=0};f.prototype={append:function(b){0!==b.length&&(b=a.transformTo("uint8array",b),this.data.set(b,this.index),this.index+=b.length)},finalize:function(){return this.data}};b.exports=f},{"./utils":21}],20:[function(c,b,a){var f=c("./utils"),d=c("./support"),h=c("./nodeBuffer"),g=Array(256);for(c=0;256>c;c++)g[c]=252<=c?6:248<=c?5:240<=c?4:224<=c?3:192<=c?2:1;g[254]=g[254]=1;var k=
function(a){var b,c,d,h,k=a.length,D=Array(2*k);for(b=c=0;k>b;)if(d=a[b++],128>d)D[c++]=d;else if(h=g[d],4<h)D[c++]=65533,b+=h-1;else{for(d&=2===h?31:3===h?15:7;1<h&&k>b;)d=d<<6|63&a[b++],h--;1<h?D[c++]=65533:65536>d?D[c++]=d:(d-=65536,D[c++]=55296|d>>10&1023,D[c++]=56320|1023&d)}return D.length!==c&&(D.subarray?D=D.subarray(0,c):D.length=c),f.applyFromCharCode(D)};a.utf8encode=function(a){if(d.nodebuffer)a=h(a,"utf-8");else{var b,c,f,g,k,D=a.length,F=0;for(g=0;D>g;g++)c=a.charCodeAt(g),55296===(64512&
c)&&D>g+1&&(f=a.charCodeAt(g+1),56320===(64512&f)&&(c=65536+(c-55296<<10)+(f-56320),g++)),F+=128>c?1:2048>c?2:65536>c?3:4;b=d.uint8array?new Uint8Array(F):Array(F);for(g=k=0;F>k;g++)c=a.charCodeAt(g),55296===(64512&c)&&D>g+1&&(f=a.charCodeAt(g+1),56320===(64512&f)&&(c=65536+(c-55296<<10)+(f-56320),g++)),128>c?b[k++]=c:2048>c?(b[k++]=192|c>>>6,b[k++]=128|63&c):65536>c?(b[k++]=224|c>>>12,b[k++]=128|c>>>6&63,b[k++]=128|63&c):(b[k++]=240|c>>>18,b[k++]=128|c>>>12&63,b[k++]=128|c>>>6&63,b[k++]=128|63&c);
a=b}return a};a.utf8decode=function(a){if(d.nodebuffer)return f.transformTo("nodebuffer",a).toString("utf-8");a=f.transformTo(d.uint8array?"uint8array":"array",a);for(var b=[],c=0,h=a.length;h>c;){var w;w=Math.min(c+65536,h);var s=void 0;w=w||a.length;w>a.length&&(w=a.length);for(s=w-1;0<=s&&128===(192&a[s]);)s--;w=0>s?w:0===s?w:s+g[a[s]]>w?s:w;b.push(d.uint8array?k(a.subarray(c,w)):k(a.slice(c,w)));c=w}return b.join("")}},{"./nodeBuffer":11,"./support":17,"./utils":21}],21:[function(c,b,a){function f(a){return a}
function d(a,b){for(var c=0;c<a.length;++c)b[c]=255&a.charCodeAt(c);return b}function h(b){var c=65536,d=[],f=b.length,h=a.getTypeOf(b),g=0,k=!0;try{switch(h){case "uint8array":String.fromCharCode.apply(null,new Uint8Array(0));break;case "nodebuffer":String.fromCharCode.apply(null,m(0))}}catch(l){k=!1}if(!k){c="";for(d=0;d<b.length;d++)c+=String.fromCharCode(b[d]);return c}for(;f>g&&1<c;)try{d.push("array"===h||"nodebuffer"===h?String.fromCharCode.apply(null,b.slice(g,Math.min(g+c,f))):String.fromCharCode.apply(null,
b.subarray(g,Math.min(g+c,f)))),g+=c}catch(n){c=Math.floor(c/2)}return d.join("")}function g(a,b){for(var c=0;c<a.length;c++)b[c]=a[c];return b}var k=c("./support"),l=c("./compressions"),m=c("./nodeBuffer");a.string2binary=function(a){for(var b="",c=0;c<a.length;c++)b+=String.fromCharCode(255&a.charCodeAt(c));return b};a.arrayBuffer2Blob=function(b){a.checkSupport("blob");try{return new Blob([b],{type:"application/zip"})}catch(c){try{var d=new (window.BlobBuilder||window.WebKitBlobBuilder||window.MozBlobBuilder||
window.MSBlobBuilder);return d.append(b),d.getBlob("application/zip")}catch(f){throw Error("Bug : can't construct the Blob.");}}};a.applyFromCharCode=h;var n={};n.string={string:f,array:function(a){return d(a,Array(a.length))},arraybuffer:function(a){return n.string.uint8array(a).buffer},uint8array:function(a){return d(a,new Uint8Array(a.length))},nodebuffer:function(a){return d(a,m(a.length))}};n.array={string:h,array:f,arraybuffer:function(a){return(new Uint8Array(a)).buffer},uint8array:function(a){return new Uint8Array(a)},
nodebuffer:function(a){return m(a)}};n.arraybuffer={string:function(a){return h(new Uint8Array(a))},array:function(a){return g(new Uint8Array(a),Array(a.byteLength))},arraybuffer:f,uint8array:function(a){return new Uint8Array(a)},nodebuffer:function(a){return m(new Uint8Array(a))}};n.uint8array={string:h,array:function(a){return g(a,Array(a.length))},arraybuffer:function(a){return a.buffer},uint8array:f,nodebuffer:function(a){return m(a)}};n.nodebuffer={string:h,array:function(a){return g(a,Array(a.length))},
arraybuffer:function(a){return n.nodebuffer.uint8array(a).buffer},uint8array:function(a){return g(a,new Uint8Array(a.length))},nodebuffer:f};a.transformTo=function(b,c){if(c||(c=""),!b)return c;a.checkSupport(b);var d=a.getTypeOf(c);return n[d][b](c)};a.getTypeOf=function(a){return"string"==typeof a?"string":"[object Array]"===Object.prototype.toString.call(a)?"array":k.nodebuffer&&m.test(a)?"nodebuffer":k.uint8array&&a instanceof Uint8Array?"uint8array":k.arraybuffer&&a instanceof ArrayBuffer?"arraybuffer":
void 0};a.checkSupport=function(a){if(!k[a.toLowerCase()])throw Error(a+" is not supported by this browser");};a.MAX_VALUE_16BITS=65535;a.MAX_VALUE_32BITS=-1;a.pretty=function(a){var b,c,d="";for(c=0;c<(a||"").length;c++)b=a.charCodeAt(c),d+="\\x"+(16>b?"0":"")+b.toString(16).toUpperCase();return d};a.findCompression=function(a){for(var b in l)if(l.hasOwnProperty(b)&&l[b].magic===a)return l[b];return null};a.isRegExp=function(a){return"[object RegExp]"===Object.prototype.toString.call(a)}},{"./compressions":3,
"./nodeBuffer":11,"./support":17}],22:[function(c,b){function a(a,b){this.files=[];this.loadOptions=b;a&&this.load(a)}var f=c("./stringReader"),d=c("./nodeBufferReader"),h=c("./uint8ArrayReader"),g=c("./utils"),k=c("./signature"),l=c("./zipEntry"),m=c("./support"),n=c("./object");a.prototype={checkSignature:function(a){var b=this.reader.readString(4);if(b!==a)throw Error("Corrupted zip or bug : unexpected signature ("+g.pretty(b)+", expected "+g.pretty(a)+")");},readBlockEndOfCentral:function(){this.diskNumber=
this.reader.readInt(2);this.diskWithCentralDirStart=this.reader.readInt(2);this.centralDirRecordsOnThisDisk=this.reader.readInt(2);this.centralDirRecords=this.reader.readInt(2);this.centralDirSize=this.reader.readInt(4);this.centralDirOffset=this.reader.readInt(4);this.zipCommentLength=this.reader.readInt(2);this.zipComment=this.reader.readString(this.zipCommentLength);this.zipComment=n.utf8decode(this.zipComment)},readBlockZip64EndOfCentral:function(){this.zip64EndOfCentralSize=this.reader.readInt(8);
this.versionMadeBy=this.reader.readString(2);this.versionNeeded=this.reader.readInt(2);this.diskNumber=this.reader.readInt(4);this.diskWithCentralDirStart=this.reader.readInt(4);this.centralDirRecordsOnThisDisk=this.reader.readInt(8);this.centralDirRecords=this.reader.readInt(8);this.centralDirSize=this.reader.readInt(8);this.centralDirOffset=this.reader.readInt(8);this.zip64ExtensibleData={};for(var a,b,c,d=this.zip64EndOfCentralSize-44;0<d;)a=this.reader.readInt(2),b=this.reader.readInt(4),c=this.reader.readString(b),
this.zip64ExtensibleData[a]={id:a,length:b,value:c}},readBlockZip64EndOfCentralLocator:function(){if(this.diskWithZip64CentralDirStart=this.reader.readInt(4),this.relativeOffsetEndOfZip64CentralDir=this.reader.readInt(8),this.disksCount=this.reader.readInt(4),1<this.disksCount)throw Error("Multi-volumes zip are not supported");},readLocalFiles:function(){var a,b;for(a=0;a<this.files.length;a++)b=this.files[a],this.reader.setIndex(b.localHeaderOffset),this.checkSignature(k.LOCAL_FILE_HEADER),b.readLocalPart(this.reader),
b.handleUTF8()},readCentralDir:function(){var a;for(this.reader.setIndex(this.centralDirOffset);this.reader.readString(4)===k.CENTRAL_FILE_HEADER;)a=new l({zip64:this.zip64},this.loadOptions),a.readCentralPart(this.reader),this.files.push(a)},readEndOfCentral:function(){var a=this.reader.lastIndexOfSignature(k.CENTRAL_DIRECTORY_END);if(-1===a)throw Error("Corrupted zip : can't find end of central directory");if(this.reader.setIndex(a),this.checkSignature(k.CENTRAL_DIRECTORY_END),this.readBlockEndOfCentral(),
this.diskNumber===g.MAX_VALUE_16BITS||this.diskWithCentralDirStart===g.MAX_VALUE_16BITS||this.centralDirRecordsOnThisDisk===g.MAX_VALUE_16BITS||this.centralDirRecords===g.MAX_VALUE_16BITS||this.centralDirSize===g.MAX_VALUE_32BITS||this.centralDirOffset===g.MAX_VALUE_32BITS){if(this.zip64=!0,a=this.reader.lastIndexOfSignature(k.ZIP64_CENTRAL_DIRECTORY_LOCATOR),-1===a)throw Error("Corrupted zip : can't find the ZIP64 end of central directory locator");this.reader.setIndex(a);this.checkSignature(k.ZIP64_CENTRAL_DIRECTORY_LOCATOR);
this.readBlockZip64EndOfCentralLocator();this.reader.setIndex(this.relativeOffsetEndOfZip64CentralDir);this.checkSignature(k.ZIP64_CENTRAL_DIRECTORY_END);this.readBlockZip64EndOfCentral()}},prepareReader:function(a){var b=g.getTypeOf(a);this.reader="string"!==b||m.uint8array?"nodebuffer"===b?new d(a):new h(g.transformTo("uint8array",a)):new f(a,this.loadOptions.optimizedBinaryString)},load:function(a){this.prepareReader(a);this.readEndOfCentral();this.readCentralDir();this.readLocalFiles()}};b.exports=
a},{"./nodeBufferReader":12,"./object":13,"./signature":14,"./stringReader":15,"./support":17,"./uint8ArrayReader":18,"./utils":21,"./zipEntry":23}],23:[function(c,b){function a(a,b){this.options=a;this.loadOptions=b}var f=c("./stringReader"),d=c("./utils"),h=c("./compressedObject"),g=c("./object");a.prototype={isEncrypted:function(){return 1===(1&this.bitFlag)},useUTF8:function(){return 2048===(2048&this.bitFlag)},prepareCompressedContent:function(a,b,c){return function(){var d=a.index;a.setIndex(b);
var f=a.readData(c);return a.setIndex(d),f}},prepareContent:function(a,b,c,f,h){return function(){var a=d.transformTo(f.uncompressInputType,this.getCompressedContent()),a=f.uncompress(a);if(a.length!==h)throw Error("Bug : uncompressed data size mismatch");return a}},readLocalPart:function(a){var b,c;if(a.skip(22),this.fileNameLength=a.readInt(2),c=a.readInt(2),this.fileName=a.readString(this.fileNameLength),a.skip(c),-1==this.compressedSize||-1==this.uncompressedSize)throw Error("Bug or corrupted zip : didn't get enough informations from the central directory (compressedSize == -1 || uncompressedSize == -1)");
if(b=d.findCompression(this.compressionMethod),null===b)throw Error("Corrupted zip : compression "+d.pretty(this.compressionMethod)+" unknown (inner file : "+this.fileName+")");if(this.decompressed=new h,this.decompressed.compressedSize=this.compressedSize,this.decompressed.uncompressedSize=this.uncompressedSize,this.decompressed.crc32=this.crc32,this.decompressed.compressionMethod=this.compressionMethod,this.decompressed.getCompressedContent=this.prepareCompressedContent(a,a.index,this.compressedSize,
b),this.decompressed.getContent=this.prepareContent(a,a.index,this.compressedSize,b,this.uncompressedSize),this.loadOptions.checkCRC32&&(this.decompressed=d.transformTo("string",this.decompressed.getContent()),g.crc32(this.decompressed)!==this.crc32))throw Error("Corrupted zip : CRC32 mismatch");},readCentralPart:function(a){if(this.versionMadeBy=a.readString(2),this.versionNeeded=a.readInt(2),this.bitFlag=a.readInt(2),this.compressionMethod=a.readString(2),this.date=a.readDate(),this.crc32=a.readInt(4),
this.compressedSize=a.readInt(4),this.uncompressedSize=a.readInt(4),this.fileNameLength=a.readInt(2),this.extraFieldsLength=a.readInt(2),this.fileCommentLength=a.readInt(2),this.diskNumberStart=a.readInt(2),this.internalFileAttributes=a.readInt(2),this.externalFileAttributes=a.readInt(4),this.localHeaderOffset=a.readInt(4),this.isEncrypted())throw Error("Encrypted zip are not supported");this.fileName=a.readString(this.fileNameLength);this.readExtraFields(a);this.parseZIP64ExtraField(a);this.fileComment=
a.readString(this.fileCommentLength);this.dir=16&this.externalFileAttributes?!0:!1},parseZIP64ExtraField:function(){if(this.extraFields[1]){var a=new f(this.extraFields[1].value);this.uncompressedSize===d.MAX_VALUE_32BITS&&(this.uncompressedSize=a.readInt(8));this.compressedSize===d.MAX_VALUE_32BITS&&(this.compressedSize=a.readInt(8));this.localHeaderOffset===d.MAX_VALUE_32BITS&&(this.localHeaderOffset=a.readInt(8));this.diskNumberStart===d.MAX_VALUE_32BITS&&(this.diskNumberStart=a.readInt(4))}},
readExtraFields:function(a){var b,c,d,f=a.index;for(this.extraFields=this.extraFields||{};a.index<f+this.extraFieldsLength;)b=a.readInt(2),c=a.readInt(2),d=a.readString(c),this.extraFields[b]={id:b,length:c,value:d}},handleUTF8:function(){if(this.useUTF8())this.fileName=g.utf8decode(this.fileName),this.fileComment=g.utf8decode(this.fileComment);else{var a=this.findExtraFieldUnicodePath();null!==a&&(this.fileName=a);a=this.findExtraFieldUnicodeComment();null!==a&&(this.fileComment=a)}},findExtraFieldUnicodePath:function(){var a=
this.extraFields[28789];if(a){var b=new f(a.value);return 1!==b.readInt(1)?null:g.crc32(this.fileName)!==b.readInt(4)?null:g.utf8decode(b.readString(a.length-5))}return null},findExtraFieldUnicodeComment:function(){var a=this.extraFields[25461];if(a){var b=new f(a.value);return 1!==b.readInt(1)?null:g.crc32(this.fileComment)!==b.readInt(4)?null:g.utf8decode(b.readString(a.length-5))}return null}};b.exports=a},{"./compressedObject":2,"./object":13,"./stringReader":15,"./utils":21}],24:[function(c,
b){var a=c("./lib/utils/common").assign,f=c("./lib/deflate"),d=c("./lib/inflate"),h=c("./lib/zlib/constants"),g={};a(g,f,d,h);b.exports=g},{"./lib/deflate":25,"./lib/inflate":26,"./lib/utils/common":27,"./lib/zlib/constants":30}],25:[function(c,b,a){function f(a,b){var c=new m(b);if(c.push(a,!0),c.err)throw c.msg;return c.result}var d=c("./zlib/deflate.js"),h=c("./utils/common"),g=c("./utils/strings"),k=c("./zlib/messages"),l=c("./zlib/zstream"),m=function(a){a=this.options=h.assign({level:-1,method:8,
chunkSize:16384,windowBits:15,memLevel:8,strategy:0,to:""},a||{});a.raw&&0<a.windowBits?a.windowBits=-a.windowBits:a.gzip&&0<a.windowBits&&16>a.windowBits&&(a.windowBits+=16);this.err=0;this.msg="";this.ended=!1;this.chunks=[];this.strm=new l;this.strm.avail_out=0;var b=d.deflateInit2(this.strm,a.level,a.method,a.windowBits,a.memLevel,a.strategy);if(0!==b)throw Error(k[b]);a.header&&d.deflateSetHeader(this.strm,a.header)};m.prototype.push=function(a,b){var c,f,k=this.strm,l=this.options.chunkSize;
if(this.ended)return!1;f=b===~~b?b:!0===b?4:0;k.input="string"==typeof a?g.string2buf(a):a;k.next_in=0;k.avail_in=k.input.length;do{if(0===k.avail_out&&(k.output=new h.Buf8(l),k.next_out=0,k.avail_out=l),c=d.deflate(k,f),1!==c&&0!==c)return this.onEnd(c),this.ended=!0,!1;(0===k.avail_out||0===k.avail_in&&4===f)&&this.onData("string"===this.options.to?g.buf2binstring(h.shrinkBuf(k.output,k.next_out)):h.shrinkBuf(k.output,k.next_out))}while((0<k.avail_in||0===k.avail_out)&&1!==c);return 4===f?(c=d.deflateEnd(this.strm),
this.onEnd(c),this.ended=!0,0===c):!0};m.prototype.onData=function(a){this.chunks.push(a)};m.prototype.onEnd=function(a){0===a&&(this.result="string"===this.options.to?this.chunks.join(""):h.flattenChunks(this.chunks));this.chunks=[];this.err=a;this.msg=this.strm.msg};a.Deflate=m;a.deflate=f;a.deflateRaw=function(a,b){return b=b||{},b.raw=!0,f(a,b)};a.gzip=function(a,b){return b=b||{},b.gzip=!0,f(a,b)}},{"./utils/common":27,"./utils/strings":28,"./zlib/deflate.js":32,"./zlib/messages":37,"./zlib/zstream":39}],
26:[function(c,b,a){function f(a,b){var c=new q(b);if(c.push(a,!0),c.err)throw c.msg;return c.result}var d=c("./zlib/inflate.js"),h=c("./utils/common"),g=c("./utils/strings"),k=c("./zlib/constants"),l=c("./zlib/messages"),m=c("./zlib/zstream"),n=c("./zlib/gzheader"),q=function(a){var b=this.options=h.assign({chunkSize:16384,windowBits:0,to:""},a||{});b.raw&&0<=b.windowBits&&16>b.windowBits&&(b.windowBits=-b.windowBits,0===b.windowBits&&(b.windowBits=-15));!(0<=b.windowBits&&16>b.windowBits)||a&&a.windowBits||
(b.windowBits+=32);15<b.windowBits&&48>b.windowBits&&0===(15&b.windowBits)&&(b.windowBits|=15);this.err=0;this.msg="";this.ended=!1;this.chunks=[];this.strm=new m;this.strm.avail_out=0;a=d.inflateInit2(this.strm,b.windowBits);if(a!==k.Z_OK)throw Error(l[a]);this.header=new n;d.inflateGetHeader(this.strm,this.header)};q.prototype.push=function(a,b){var c,f,l,m,n,q=this.strm,H=this.options.chunkSize;if(this.ended)return!1;f=b===~~b?b:!0===b?k.Z_FINISH:k.Z_NO_FLUSH;q.input="string"==typeof a?g.binstring2buf(a):
a;q.next_in=0;q.avail_in=q.input.length;do{if(0===q.avail_out&&(q.output=new h.Buf8(H),q.next_out=0,q.avail_out=H),c=d.inflate(q,k.Z_NO_FLUSH),c!==k.Z_STREAM_END&&c!==k.Z_OK)return this.onEnd(c),this.ended=!0,!1;q.next_out&&(0===q.avail_out||c===k.Z_STREAM_END||0===q.avail_in&&f===k.Z_FINISH)&&("string"===this.options.to?(l=g.utf8border(q.output,q.next_out),m=q.next_out-l,n=g.buf2string(q.output,l),q.next_out=m,q.avail_out=H-m,m&&h.arraySet(q.output,q.output,l,m,0),this.onData(n)):this.onData(h.shrinkBuf(q.output,
q.next_out)))}while(0<q.avail_in&&c!==k.Z_STREAM_END);return c===k.Z_STREAM_END&&(f=k.Z_FINISH),f===k.Z_FINISH?(c=d.inflateEnd(this.strm),this.onEnd(c),this.ended=!0,c===k.Z_OK):!0};q.prototype.onData=function(a){this.chunks.push(a)};q.prototype.onEnd=function(a){a===k.Z_OK&&(this.result="string"===this.options.to?this.chunks.join(""):h.flattenChunks(this.chunks));this.chunks=[];this.err=a;this.msg=this.strm.msg};a.Inflate=q;a.inflate=f;a.inflateRaw=function(a,b){return b=b||{},b.raw=!0,f(a,b)};a.ungzip=
f},{"./utils/common":27,"./utils/strings":28,"./zlib/constants":30,"./zlib/gzheader":33,"./zlib/inflate.js":35,"./zlib/messages":37,"./zlib/zstream":39}],27:[function(c,b,a){c="undefined"!=typeof Uint8Array&&"undefined"!=typeof Uint16Array&&"undefined"!=typeof Int32Array;a.assign=function(a){for(var b=Array.prototype.slice.call(arguments,1);b.length;){var c=b.shift();if(c){if("object"!=typeof c)throw new TypeError(c+"must be non-object");for(var d in c)c.hasOwnProperty(d)&&(a[d]=c[d])}}return a};
a.shrinkBuf=function(a,b){return a.length===b?a:a.subarray?a.subarray(0,b):(a.length=b,a)};var f={arraySet:function(a,b,c,d,f){if(b.subarray&&a.subarray)return void a.set(b.subarray(c,c+d),f);for(var n=0;d>n;n++)a[f+n]=b[c+n]},flattenChunks:function(a){var b,c,d,f,n;b=d=0;for(c=a.length;c>b;b++)d+=a[b].length;n=new Uint8Array(d);b=d=0;for(c=a.length;c>b;b++)f=a[b],n.set(f,d),d+=f.length;return n}},d={arraySet:function(a,b,c,d,f){for(var n=0;d>n;n++)a[f+n]=b[c+n]},flattenChunks:function(a){return[].concat.apply([],
a)}};a.setTyped=function(b){b?(a.Buf8=Uint8Array,a.Buf16=Uint16Array,a.Buf32=Int32Array,a.assign(a,f)):(a.Buf8=Array,a.Buf16=Array,a.Buf32=Array,a.assign(a,d))};a.setTyped(c)},{}],28:[function(c,b,a){function f(a,b){if(65537>b&&(a.subarray&&g||!a.subarray&&h))return String.fromCharCode.apply(null,d.shrinkBuf(a,b));for(var c="",f=0;b>f;f++)c+=String.fromCharCode(a[f]);return c}var d=c("./common"),h=!0,g=!0;try{String.fromCharCode.apply(null,[0])}catch(k){h=!1}try{String.fromCharCode.apply(null,new Uint8Array(1))}catch(l){g=
!1}var m=new d.Buf8(256);for(c=0;256>c;c++)m[c]=252<=c?6:248<=c?5:240<=c?4:224<=c?3:192<=c?2:1;m[254]=m[254]=1;a.string2buf=function(a){var b,c,f,h,g,k=a.length,l=0;for(h=0;k>h;h++)c=a.charCodeAt(h),55296===(64512&c)&&k>h+1&&(f=a.charCodeAt(h+1),56320===(64512&f)&&(c=65536+(c-55296<<10)+(f-56320),h++)),l+=128>c?1:2048>c?2:65536>c?3:4;b=new d.Buf8(l);for(h=g=0;l>g;h++)c=a.charCodeAt(h),55296===(64512&c)&&k>h+1&&(f=a.charCodeAt(h+1),56320===(64512&f)&&(c=65536+(c-55296<<10)+(f-56320),h++)),128>c?b[g++]=
c:2048>c?(b[g++]=192|c>>>6,b[g++]=128|63&c):65536>c?(b[g++]=224|c>>>12,b[g++]=128|c>>>6&63,b[g++]=128|63&c):(b[g++]=240|c>>>18,b[g++]=128|c>>>12&63,b[g++]=128|c>>>6&63,b[g++]=128|63&c);return b};a.buf2binstring=function(a){return f(a,a.length)};a.binstring2buf=function(a){for(var b=new d.Buf8(a.length),c=0,f=b.length;f>c;c++)b[c]=a.charCodeAt(c);return b};a.buf2string=function(a,b){var c,d,h,g,k=b||a.length,l=Array(2*k);for(c=d=0;k>c;)if(h=a[c++],128>h)l[d++]=h;else if(g=m[h],4<g)l[d++]=65533,c+=
g-1;else{for(h&=2===g?31:3===g?15:7;1<g&&k>c;)h=h<<6|63&a[c++],g--;1<g?l[d++]=65533:65536>h?l[d++]=h:(h-=65536,l[d++]=55296|h>>10&1023,l[d++]=56320|1023&h)}return f(l,d)};a.utf8border=function(a,b){var c;b=b||a.length;b>a.length&&(b=a.length);for(c=b-1;0<=c&&128===(192&a[c]);)c--;return 0>c?b:0===c?b:c+m[a[c]]>b?c:b}},{"./common":27}],29:[function(c,b){b.exports=function(a,b,c,h){var g=65535&a|0;a=a>>>16&65535|0;for(var k=0;0!==c;){k=2E3<c?2E3:c;c-=k;do g=g+b[h++]|0,a=a+g|0;while(--k);g%=65521;a%=
65521}return g|a<<16|0}},{}],30:[function(c,b){b.exports={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8}},{}],31:[function(c,b){var a=function(){for(var a,b=[],c=0;256>
c;c++){a=c;for(var g=0;8>g;g++)a=1&a?3988292384^a>>>1:a>>>1;b[c]=a}return b}();b.exports=function(b,c,h,g){h=g+h;for(b^=-1;h>g;g++)b=b>>>8^a[255&(b^c[g])];return-1^b}},{}],32:[function(c,b,a){function f(a,b){return a.msg=x[b],b}function d(a){for(var b=a.length;0<=--b;)a[b]=0}function h(a){var b=a.state,c=b.pending;c>a.avail_out&&(c=a.avail_out);0!==c&&(y.arraySet(a.output,b.pending_buf,b.pending_out,c,a.next_out),a.next_out+=c,b.pending_out+=c,a.total_out+=c,a.avail_out-=c,b.pending-=c,0===b.pending&&
(b.pending_out=0))}function g(a,b){B._tr_flush_block(a,0<=a.block_start?a.block_start:-1,a.strstart-a.block_start,b);a.block_start=a.strstart;h(a.strm)}function k(a,b){a.pending_buf[a.pending++]=b}function l(a,b){a.pending_buf[a.pending++]=b>>>8&255;a.pending_buf[a.pending++]=255&b}function m(a,b){var c,d,f=a.max_chain_length,h=a.strstart,g=a.prev_length,k=a.nice_match,l=a.strstart>a.w_size-fa?a.strstart-(a.w_size-fa):0,E=a.window,m=a.w_mask,w=a.prev,x=a.strstart+Z,n=E[h+g-1],s=E[h+g];a.prev_length>=
a.good_match&&(f>>=2);k>a.lookahead&&(k=a.lookahead);do if(c=b,E[c+g]===s&&E[c+g-1]===n&&E[c]===E[h]&&E[++c]===E[h+1]){h+=2;c++;do;while(E[++h]===E[++c]&&E[++h]===E[++c]&&E[++h]===E[++c]&&E[++h]===E[++c]&&E[++h]===E[++c]&&E[++h]===E[++c]&&E[++h]===E[++c]&&E[++h]===E[++c]&&x>h);if(d=Z-(x-h),h=x-Z,d>g){if(a.match_start=b,g=d,d>=k)break;n=E[h+g-1];s=E[h+g]}}while((b=w[b&m])>l&&0!==--f);return g<=a.lookahead?g:a.lookahead}function n(a){var b,c,d,f,h=a.w_size;do{if(f=a.window_size-a.lookahead-a.strstart,
a.strstart>=h+(h-fa)){y.arraySet(a.window,a.window,h,h,0);a.match_start-=h;a.strstart-=h;a.block_start-=h;b=c=a.hash_size;do d=a.head[--b],a.head[b]=d>=h?d-h:0;while(--c);b=c=h;do d=a.prev[--b],a.prev[b]=d>=h?d-h:0;while(--c);f+=h}if(0===a.strm.avail_in)break;b=a.strm;d=a.window;var g=a.strstart+a.lookahead,k=b.avail_in;if(c=(k>f&&(k=f),0===k?0:(b.avail_in-=k,y.arraySet(d,b.input,b.next_in,k,g),1===b.state.wrap?b.adler=H(b.adler,d,k,g):2===b.state.wrap&&(b.adler=z(b.adler,d,k,g)),b.next_in+=k,b.total_in+=
k,k)),a.lookahead+=c,a.lookahead+a.insert>=I){f=a.strstart-a.insert;a.ins_h=a.window[f];for(a.ins_h=(a.ins_h<<a.hash_shift^a.window[f+1])&a.hash_mask;a.insert&&(a.ins_h=(a.ins_h<<a.hash_shift^a.window[f+I-1])&a.hash_mask,a.prev[f&a.w_mask]=a.head[a.ins_h],a.head[a.ins_h]=f,f++,a.insert--,!(a.lookahead+a.insert<I)););}}while(a.lookahead<fa&&0!==a.strm.avail_in)}function q(a,b){for(var c,d;;){if(a.lookahead<fa){if(n(a),a.lookahead<fa&&b===G)return X;if(0===a.lookahead)break}if(c=0,a.lookahead>=I&&(a.ins_h=
(a.ins_h<<a.hash_shift^a.window[a.strstart+I-1])&a.hash_mask,c=a.prev[a.strstart&a.w_mask]=a.head[a.ins_h],a.head[a.ins_h]=a.strstart),0!==c&&a.strstart-c<=a.w_size-fa&&(a.match_length=m(a,c)),a.match_length>=I)if(d=B._tr_tally(a,a.strstart-a.match_start,a.match_length-I),a.lookahead-=a.match_length,a.match_length<=a.max_lazy_match&&a.lookahead>=I){a.match_length--;do a.strstart++,a.ins_h=(a.ins_h<<a.hash_shift^a.window[a.strstart+I-1])&a.hash_mask,c=a.prev[a.strstart&a.w_mask]=a.head[a.ins_h],a.head[a.ins_h]=
a.strstart;while(0!==--a.match_length);a.strstart++}else a.strstart+=a.match_length,a.match_length=0,a.ins_h=a.window[a.strstart],a.ins_h=(a.ins_h<<a.hash_shift^a.window[a.strstart+1])&a.hash_mask;else d=B._tr_tally(a,0,a.window[a.strstart]),a.lookahead--,a.strstart++;if(d&&(g(a,!1),0===a.strm.avail_out))return X}return a.insert=a.strstart<I-1?a.strstart:I-1,b===E?(g(a,!0),0===a.strm.avail_out?ra:ha):a.last_lit&&(g(a,!1),0===a.strm.avail_out)?X:qa}function w(a,b){for(var c,d,f;;){if(a.lookahead<fa){if(n(a),
a.lookahead<fa&&b===G)return X;if(0===a.lookahead)break}if(c=0,a.lookahead>=I&&(a.ins_h=(a.ins_h<<a.hash_shift^a.window[a.strstart+I-1])&a.hash_mask,c=a.prev[a.strstart&a.w_mask]=a.head[a.ins_h],a.head[a.ins_h]=a.strstart),a.prev_length=a.match_length,a.prev_match=a.match_start,a.match_length=I-1,0!==c&&a.prev_length<a.max_lazy_match&&a.strstart-c<=a.w_size-fa&&(a.match_length=m(a,c),5>=a.match_length&&(a.strategy===T||a.match_length===I&&4096<a.strstart-a.match_start)&&(a.match_length=I-1)),a.prev_length>=
I&&a.match_length<=a.prev_length){f=a.strstart+a.lookahead-I;d=B._tr_tally(a,a.strstart-1-a.prev_match,a.prev_length-I);a.lookahead-=a.prev_length-1;a.prev_length-=2;do++a.strstart<=f&&(a.ins_h=(a.ins_h<<a.hash_shift^a.window[a.strstart+I-1])&a.hash_mask,c=a.prev[a.strstart&a.w_mask]=a.head[a.ins_h],a.head[a.ins_h]=a.strstart);while(0!==--a.prev_length);if(a.match_available=0,a.match_length=I-1,a.strstart++,d&&(g(a,!1),0===a.strm.avail_out))return X}else if(a.match_available){if(d=B._tr_tally(a,0,
a.window[a.strstart-1]),d&&g(a,!1),a.strstart++,a.lookahead--,0===a.strm.avail_out)return X}else a.match_available=1,a.strstart++,a.lookahead--}return a.match_available&&(B._tr_tally(a,0,a.window[a.strstart-1]),a.match_available=0),a.insert=a.strstart<I-1?a.strstart:I-1,b===E?(g(a,!0),0===a.strm.avail_out?ra:ha):a.last_lit&&(g(a,!1),0===a.strm.avail_out)?X:qa}function s(){this.strm=null;this.status=0;this.pending_buf=null;this.wrap=this.pending=this.pending_out=this.pending_buf_size=0;this.gzhead=
null;this.gzindex=0;this.method=u;this.last_flush=-1;this.w_mask=this.w_bits=this.w_size=0;this.window=null;this.window_size=0;this.head=this.prev=null;this.nice_match=this.good_match=this.strategy=this.level=this.max_lazy_match=this.max_chain_length=this.prev_length=this.lookahead=this.match_start=this.strstart=this.match_available=this.prev_match=this.match_length=this.block_start=this.hash_shift=this.hash_mask=this.hash_bits=this.hash_size=this.ins_h=0;this.dyn_ltree=new y.Buf16(2*ea);this.dyn_dtree=
new y.Buf16(2*(2*V+1));this.bl_tree=new y.Buf16(2*(2*M+1));d(this.dyn_ltree);d(this.dyn_dtree);d(this.bl_tree);this.bl_desc=this.d_desc=this.l_desc=null;this.bl_count=new y.Buf16(S+1);this.heap=new y.Buf16(2*oa+1);d(this.heap);this.heap_max=this.heap_len=0;this.depth=new y.Buf16(2*oa+1);d(this.depth);this.bi_valid=this.bi_buf=this.insert=this.matches=this.static_len=this.opt_len=this.d_buf=this.last_lit=this.lit_bufsize=this.l_buf=0}function D(a){var b;return a&&a.state?(a.total_in=a.total_out=0,
a.data_type=ja,b=a.state,b.pending=0,b.pending_out=0,0>b.wrap&&(b.wrap=-b.wrap),b.status=b.wrap?pa:la,a.adler=2===b.wrap?0:1,b.last_flush=G,B._tr_init(b),K):f(a,Q)}function F(a){var b=D(a);b===K&&(a=a.state,a.window_size=2*a.w_size,d(a.head),a.max_lazy_match=v[a.level].max_lazy,a.good_match=v[a.level].good_length,a.nice_match=v[a.level].nice_length,a.max_chain_length=v[a.level].max_chain,a.strstart=0,a.block_start=0,a.lookahead=0,a.insert=0,a.match_length=a.prev_length=I-1,a.match_available=0,a.ins_h=
0);return b}function C(a,b,c,d,h,g){if(!a)return Q;var k=1;if(b===O&&(b=6),0>d?(k=0,d=-d):15<d&&(k=2,d-=16),1>h||h>t||c!==u||8>d||15<d||0>b||9<b||0>g||g>U)return f(a,Q);8===d&&(d=9);var l=new s;return a.state=l,l.strm=a,l.wrap=k,l.gzhead=null,l.w_bits=d,l.w_size=1<<l.w_bits,l.w_mask=l.w_size-1,l.hash_bits=h+7,l.hash_size=1<<l.hash_bits,l.hash_mask=l.hash_size-1,l.hash_shift=~~((l.hash_bits+I-1)/I),l.window=new y.Buf8(2*l.w_size),l.head=new y.Buf16(l.hash_size),l.prev=new y.Buf16(l.w_size),l.lit_bufsize=
1<<h+6,l.pending_buf_size=4*l.lit_bufsize,l.pending_buf=new y.Buf8(l.pending_buf_size),l.d_buf=l.lit_bufsize>>1,l.l_buf=3*l.lit_bufsize,l.level=b,l.strategy=g,l.method=c,F(a)}var v,y=c("../utils/common"),B=c("./trees"),H=c("./adler32"),z=c("./crc32"),x=c("./messages"),G=0,E=4,K=0,Q=-2,O=-1,T=1,U=4,ja=2,u=8,t=9,oa=286,V=30,M=19,ea=2*oa+1,S=15,I=3,Z=258,fa=Z+I+1,pa=42,la=113,X=1,qa=2,ra=3,ha=4;c=function(a,b,c,d,f){this.good_length=a;this.max_lazy=b;this.nice_length=c;this.max_chain=d;this.func=f};
v=[new c(0,0,0,0,function(a,b){var c=65535;for(c>a.pending_buf_size-5&&(c=a.pending_buf_size-5);;){if(1>=a.lookahead){if(n(a),0===a.lookahead&&b===G)return X;if(0===a.lookahead)break}a.strstart+=a.lookahead;a.lookahead=0;var d=a.block_start+c;if((0===a.strstart||a.strstart>=d)&&(a.lookahead=a.strstart-d,a.strstart=d,g(a,!1),0===a.strm.avail_out)||a.strstart-a.block_start>=a.w_size-fa&&(g(a,!1),0===a.strm.avail_out))return X}return a.insert=0,b===E?(g(a,!0),0===a.strm.avail_out?ra:ha):(a.strstart>
a.block_start&&g(a,!1),X)}),new c(4,4,8,4,q),new c(4,5,16,8,q),new c(4,6,32,32,q),new c(4,4,16,16,w),new c(8,16,32,32,w),new c(8,16,128,128,w),new c(8,32,128,256,w),new c(32,128,258,1024,w),new c(32,258,258,4096,w)];a.deflateInit=function(a,b){return C(a,b,u,15,8,0)};a.deflateInit2=C;a.deflateReset=F;a.deflateResetKeep=D;a.deflateSetHeader=function(a,b){return a&&a.state?2!==a.state.wrap?Q:(a.state.gzhead=b,K):Q};a.deflate=function(a,b){var c,r,m,w;if(!a||!a.state||5<b||0>b)return a?f(a,Q):Q;if(r=
a.state,!a.output||!a.input&&0!==a.avail_in||666===r.status&&b!==E)return f(a,0===a.avail_out?-5:Q);if(r.strm=a,c=r.last_flush,r.last_flush=b,r.status===pa)2===r.wrap?(a.adler=0,k(r,31),k(r,139),k(r,8),r.gzhead?(k(r,(r.gzhead.text?1:0)+(r.gzhead.hcrc?2:0)+(r.gzhead.extra?4:0)+(r.gzhead.name?8:0)+(r.gzhead.comment?16:0)),k(r,255&r.gzhead.time),k(r,r.gzhead.time>>8&255),k(r,r.gzhead.time>>16&255),k(r,r.gzhead.time>>24&255),k(r,9===r.level?2:2<=r.strategy||2>r.level?4:0),k(r,255&r.gzhead.os),r.gzhead.extra&&
r.gzhead.extra.length&&(k(r,255&r.gzhead.extra.length),k(r,r.gzhead.extra.length>>8&255)),r.gzhead.hcrc&&(a.adler=z(a.adler,r.pending_buf,r.pending,0)),r.gzindex=0,r.status=69):(k(r,0),k(r,0),k(r,0),k(r,0),k(r,0),k(r,9===r.level?2:2<=r.strategy||2>r.level?4:0),k(r,3),r.status=la)):(m=u+(r.w_bits-8<<4)<<8,w=-1,w=2<=r.strategy||2>r.level?0:6>r.level?1:6===r.level?2:3,m|=w<<6,0!==r.strstart&&(m|=32),r.status=la,l(r,m+(31-m%31)),0!==r.strstart&&(l(r,a.adler>>>16),l(r,65535&a.adler)),a.adler=1);if(69===
r.status)if(r.gzhead.extra){for(m=r.pending;r.gzindex<(65535&r.gzhead.extra.length)&&(r.pending!==r.pending_buf_size||(r.gzhead.hcrc&&r.pending>m&&(a.adler=z(a.adler,r.pending_buf,r.pending-m,m)),h(a),m=r.pending,r.pending!==r.pending_buf_size));)k(r,255&r.gzhead.extra[r.gzindex]),r.gzindex++;r.gzhead.hcrc&&r.pending>m&&(a.adler=z(a.adler,r.pending_buf,r.pending-m,m));r.gzindex===r.gzhead.extra.length&&(r.gzindex=0,r.status=73)}else r.status=73;if(73===r.status)if(r.gzhead.name){m=r.pending;do{if(r.pending===
r.pending_buf_size&&(r.gzhead.hcrc&&r.pending>m&&(a.adler=z(a.adler,r.pending_buf,r.pending-m,m)),h(a),m=r.pending,r.pending===r.pending_buf_size)){w=1;break}w=r.gzindex<r.gzhead.name.length?255&r.gzhead.name.charCodeAt(r.gzindex++):0;k(r,w)}while(0!==w);r.gzhead.hcrc&&r.pending>m&&(a.adler=z(a.adler,r.pending_buf,r.pending-m,m));0===w&&(r.gzindex=0,r.status=91)}else r.status=91;if(91===r.status)if(r.gzhead.comment){m=r.pending;do{if(r.pending===r.pending_buf_size&&(r.gzhead.hcrc&&r.pending>m&&(a.adler=
z(a.adler,r.pending_buf,r.pending-m,m)),h(a),m=r.pending,r.pending===r.pending_buf_size)){w=1;break}w=r.gzindex<r.gzhead.comment.length?255&r.gzhead.comment.charCodeAt(r.gzindex++):0;k(r,w)}while(0!==w);r.gzhead.hcrc&&r.pending>m&&(a.adler=z(a.adler,r.pending_buf,r.pending-m,m));0===w&&(r.status=103)}else r.status=103;if(103===r.status&&(r.gzhead.hcrc?(r.pending+2>r.pending_buf_size&&h(a),r.pending+2<=r.pending_buf_size&&(k(r,255&a.adler),k(r,a.adler>>8&255),a.adler=0,r.status=la)):r.status=la),0!==
r.pending){if(h(a),0===a.avail_out)return r.last_flush=-1,K}else if(0===a.avail_in&&(b<<1)-(4<b?9:0)<=(c<<1)-(4<c?9:0)&&b!==E)return f(a,-5);if(666===r.status&&0!==a.avail_in)return f(a,-5);if(0!==a.avail_in||0!==r.lookahead||b!==G&&666!==r.status){var x;if(2===r.strategy)a:{for(var s;;){if(0===r.lookahead&&(n(r),0===r.lookahead)){if(b===G){x=X;break a}break}if(r.match_length=0,s=B._tr_tally(r,0,r.window[r.strstart]),r.lookahead--,r.strstart++,s&&(g(r,!1),0===r.strm.avail_out)){x=X;break a}}x=(r.insert=
0,b===E?(g(r,!0),0===r.strm.avail_out?ra:ha):r.last_lit&&(g(r,!1),0===r.strm.avail_out)?X:qa)}else if(3===r.strategy)a:{var q,t;for(s=r.window;;){if(r.lookahead<=Z){if(n(r),r.lookahead<=Z&&b===G){x=X;break a}if(0===r.lookahead)break}if(r.match_length=0,r.lookahead>=I&&0<r.strstart&&(t=r.strstart-1,q=s[t],q===s[++t]&&q===s[++t]&&q===s[++t])){c=r.strstart+Z;do;while(q===s[++t]&&q===s[++t]&&q===s[++t]&&q===s[++t]&&q===s[++t]&&q===s[++t]&&q===s[++t]&&q===s[++t]&&c>t);r.match_length=Z-(c-t);r.match_length>
r.lookahead&&(r.match_length=r.lookahead)}if(r.match_length>=I?(x=B._tr_tally(r,1,r.match_length-I),r.lookahead-=r.match_length,r.strstart+=r.match_length,r.match_length=0):(x=B._tr_tally(r,0,r.window[r.strstart]),r.lookahead--,r.strstart++),x&&(g(r,!1),0===r.strm.avail_out)){x=X;break a}}x=(r.insert=0,b===E?(g(r,!0),0===r.strm.avail_out?ra:ha):r.last_lit&&(g(r,!1),0===r.strm.avail_out)?X:qa)}else x=v[r.level].func(r,b);if((x===ra||x===ha)&&(r.status=666),x===X||x===ra)return 0===a.avail_out&&(r.last_flush=
-1),K;if(x===qa&&(1===b?B._tr_align(r):5!==b&&(B._tr_stored_block(r,0,0,!1),3===b&&(d(r.head),0===r.lookahead&&(r.strstart=0,r.block_start=0,r.insert=0))),h(a),0===a.avail_out))return r.last_flush=-1,K}return b!==E?K:0>=r.wrap?1:(2===r.wrap?(k(r,255&a.adler),k(r,a.adler>>8&255),k(r,a.adler>>16&255),k(r,a.adler>>24&255),k(r,255&a.total_in),k(r,a.total_in>>8&255),k(r,a.total_in>>16&255),k(r,a.total_in>>24&255)):(l(r,a.adler>>>16),l(r,65535&a.adler)),h(a),0<r.wrap&&(r.wrap=-r.wrap),0!==r.pending?K:1)};
a.deflateEnd=function(a){var b;return a&&a.state?(b=a.state.status,b!==pa&&69!==b&&73!==b&&91!==b&&103!==b&&b!==la&&666!==b?f(a,Q):(a.state=null,b===la?f(a,-3):K)):Q};a.deflateInfo="pako deflate (from Nodeca project)"},{"../utils/common":27,"./adler32":29,"./crc32":31,"./messages":37,"./trees":38}],33:[function(c,b){b.exports=function(){this.os=this.xflags=this.time=this.text=0;this.extra=null;this.extra_len=0;this.comment=this.name="";this.hcrc=0;this.done=!1}},{}],34:[function(c,b){b.exports=function(a,
b){var c,h,g,k,l,m,n,q,w,s,D,F,C,v,y,B,H,z,x,G,E,K,Q,O;c=a.state;h=a.next_in;Q=a.input;g=h+(a.avail_in-5);k=a.next_out;O=a.output;l=k-(b-a.avail_out);m=k+(a.avail_out-257);n=c.dmax;q=c.wsize;w=c.whave;s=c.wnext;D=c.window;F=c.hold;C=c.bits;v=c.lencode;y=c.distcode;B=(1<<c.lenbits)-1;H=(1<<c.distbits)-1;a:do{15>C&&(F+=Q[h++]<<C,C+=8,F+=Q[h++]<<C,C+=8);z=v[F&B];b:for(;;){if(x=z>>>24,F>>>=x,C-=x,x=z>>>16&255,0===x)O[k++]=65535&z;else{if(!(16&x)){if(0===(64&x)){z=v[(65535&z)+(F&(1<<x)-1)];continue b}if(32&
x){c.mode=12;break a}a.msg="invalid literal/length code";c.mode=30;break a}G=65535&z;(x&=15)&&(x>C&&(F+=Q[h++]<<C,C+=8),G+=F&(1<<x)-1,F>>>=x,C-=x);15>C&&(F+=Q[h++]<<C,C+=8,F+=Q[h++]<<C,C+=8);z=y[F&H];c:for(;;){if(x=z>>>24,F>>>=x,C-=x,x=z>>>16&255,!(16&x)){if(0===(64&x)){z=y[(65535&z)+(F&(1<<x)-1)];continue c}a.msg="invalid distance code";c.mode=30;break a}if(E=65535&z,x&=15,x>C&&(F+=Q[h++]<<C,C+=8,x>C&&(F+=Q[h++]<<C,C+=8)),E+=F&(1<<x)-1,E>n){a.msg="invalid distance too far back";c.mode=30;break a}if(F>>>=
x,C-=x,x=k-l,E>x){if(x=E-x,x>w&&c.sane){a.msg="invalid distance too far back";c.mode=30;break a}if(z=0,K=D,0===s){if(z+=q-x,G>x){G-=x;do O[k++]=D[z++];while(--x);z=k-E;K=O}}else if(x>s){if(z+=q+s-x,x-=s,G>x){G-=x;do O[k++]=D[z++];while(--x);if(z=0,G>s){x=s;G-=x;do O[k++]=D[z++];while(--x);z=k-E;K=O}}}else if(z+=s-x,G>x){G-=x;do O[k++]=D[z++];while(--x);z=k-E;K=O}for(;2<G;)O[k++]=K[z++],O[k++]=K[z++],O[k++]=K[z++],G-=3;G&&(O[k++]=K[z++],1<G&&(O[k++]=K[z++]))}else{z=k-E;do O[k++]=O[z++],O[k++]=O[z++],
O[k++]=O[z++],G-=3;while(2<G);G&&(O[k++]=O[z++],1<G&&(O[k++]=O[z++]))}break}}break}}while(g>h&&m>k);G=C>>3;h-=G;C-=G<<3;a.next_in=h;a.next_out=k;a.avail_in=g>h?5+(g-h):5-(h-g);a.avail_out=m>k?257+(m-k):257-(k-m);c.hold=F&(1<<C)-1;c.bits=C}},{}],35:[function(c,b,a){function f(a){return(a>>>24&255)+(a>>>8&65280)+((65280&a)<<8)+((255&a)<<24)}function d(){this.mode=0;this.last=!1;this.wrap=0;this.havedict=!1;this.total=this.check=this.dmax=this.flags=0;this.head=null;this.wnext=this.whave=this.wsize=
this.wbits=0;this.window=null;this.extra=this.offset=this.length=this.bits=this.hold=0;this.distcode=this.lencode=null;this.have=this.ndist=this.nlen=this.ncode=this.distbits=this.lenbits=0;this.next=null;this.lens=new q.Buf16(320);this.work=new q.Buf16(288);this.distdyn=this.lendyn=null;this.was=this.back=this.sane=0}function h(a){var b;return a&&a.state?(b=a.state,a.total_in=a.total_out=b.total=0,a.msg="",b.wrap&&(a.adler=1&b.wrap),b.mode=y,b.last=0,b.havedict=0,b.dmax=32768,b.head=null,b.hold=
0,b.bits=0,b.lencode=b.lendyn=new q.Buf32(B),b.distcode=b.distdyn=new q.Buf32(H),b.sane=1,b.back=-1,C):v}function g(a){var b;return a&&a.state?(b=a.state,b.wsize=0,b.whave=0,b.wnext=0,h(a)):v}function k(a,b){var c,d;return a&&a.state?(d=a.state,0>b?(c=0,b=-b):(c=(b>>4)+1,48>b&&(b&=15)),b&&(8>b||15<b)?v:(null!==d.window&&d.wbits!==b&&(d.window=null),d.wrap=c,d.wbits=b,g(a))):v}function l(a,b){var c,f;return a?(f=new d,a.state=f,f.window=null,c=k(a,b),c!==C&&(a.state=null),c):v}var m,n,q=c("../utils/common"),
w=c("./adler32"),s=c("./crc32"),D=c("./inffast"),F=c("./inftrees"),C=0,v=-2,y=1,B=852,H=592,z=!0;a.inflateReset=g;a.inflateReset2=k;a.inflateResetKeep=h;a.inflateInit=function(a){return l(a,15)};a.inflateInit2=l;a.inflate=function(a,b){var c,d,h,g,k,l,B,u,t,H,V,M,ea,S,I,Z,fa,pa,la,X,qa,ra,ha=0,na=new q.Buf8(4),Oa=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15];if(!a||!a.state||!a.output||!a.input&&0!==a.avail_in)return v;c=a.state;12===c.mode&&(c.mode=13);k=a.next_out;h=a.output;B=a.avail_out;g=
a.next_in;d=a.input;l=a.avail_in;u=c.hold;t=c.bits;H=l;V=B;qa=C;a:for(;;)switch(c.mode){case y:if(0===c.wrap){c.mode=13;break}for(;16>t;){if(0===l)break a;l--;u+=d[g++]<<t;t+=8}if(2&c.wrap&&35615===u){c.check=0;na[0]=255&u;na[1]=u>>>8&255;c.check=s(c.check,na,2,0);t=u=0;c.mode=2;break}if(c.flags=0,c.head&&(c.head.done=!1),!(1&c.wrap)||(((255&u)<<8)+(u>>8))%31){a.msg="incorrect header check";c.mode=30;break}if(8!==(15&u)){a.msg="unknown compression method";c.mode=30;break}if(u>>>=4,t-=4,X=(15&u)+8,
0===c.wbits)c.wbits=X;else if(X>c.wbits){a.msg="invalid window size";c.mode=30;break}c.dmax=1<<X;a.adler=c.check=1;c.mode=512&u?10:12;t=u=0;break;case 2:for(;16>t;){if(0===l)break a;l--;u+=d[g++]<<t;t+=8}if(c.flags=u,8!==(255&c.flags)){a.msg="unknown compression method";c.mode=30;break}if(57344&c.flags){a.msg="unknown header flags set";c.mode=30;break}c.head&&(c.head.text=u>>8&1);512&c.flags&&(na[0]=255&u,na[1]=u>>>8&255,c.check=s(c.check,na,2,0));t=u=0;c.mode=3;case 3:for(;32>t;){if(0===l)break a;
l--;u+=d[g++]<<t;t+=8}c.head&&(c.head.time=u);512&c.flags&&(na[0]=255&u,na[1]=u>>>8&255,na[2]=u>>>16&255,na[3]=u>>>24&255,c.check=s(c.check,na,4,0));t=u=0;c.mode=4;case 4:for(;16>t;){if(0===l)break a;l--;u+=d[g++]<<t;t+=8}c.head&&(c.head.xflags=255&u,c.head.os=u>>8);512&c.flags&&(na[0]=255&u,na[1]=u>>>8&255,c.check=s(c.check,na,2,0));t=u=0;c.mode=5;case 5:if(1024&c.flags){for(;16>t;){if(0===l)break a;l--;u+=d[g++]<<t;t+=8}c.length=u;c.head&&(c.head.extra_len=u);512&c.flags&&(na[0]=255&u,na[1]=u>>>
8&255,c.check=s(c.check,na,2,0));t=u=0}else c.head&&(c.head.extra=null);c.mode=6;case 6:if(1024&c.flags&&(M=c.length,M>l&&(M=l),M&&(c.head&&(X=c.head.extra_len-c.length,c.head.extra||(c.head.extra=Array(c.head.extra_len)),q.arraySet(c.head.extra,d,g,M,X)),512&c.flags&&(c.check=s(c.check,d,M,g)),l-=M,g+=M,c.length-=M),c.length))break a;c.length=0;c.mode=7;case 7:if(2048&c.flags){if(0===l)break a;M=0;do X=d[g+M++],c.head&&X&&65536>c.length&&(c.head.name+=String.fromCharCode(X));while(X&&l>M);if(512&
c.flags&&(c.check=s(c.check,d,M,g)),l-=M,g+=M,X)break a}else c.head&&(c.head.name=null);c.length=0;c.mode=8;case 8:if(4096&c.flags){if(0===l)break a;M=0;do X=d[g+M++],c.head&&X&&65536>c.length&&(c.head.comment+=String.fromCharCode(X));while(X&&l>M);if(512&c.flags&&(c.check=s(c.check,d,M,g)),l-=M,g+=M,X)break a}else c.head&&(c.head.comment=null);c.mode=9;case 9:if(512&c.flags){for(;16>t;){if(0===l)break a;l--;u+=d[g++]<<t;t+=8}if(u!==(65535&c.check)){a.msg="header crc mismatch";c.mode=30;break}t=u=
0}c.head&&(c.head.hcrc=c.flags>>9&1,c.head.done=!0);a.adler=c.check=0;c.mode=12;break;case 10:for(;32>t;){if(0===l)break a;l--;u+=d[g++]<<t;t+=8}a.adler=c.check=f(u);t=u=0;c.mode=11;case 11:if(0===c.havedict)return a.next_out=k,a.avail_out=B,a.next_in=g,a.avail_in=l,c.hold=u,c.bits=t,2;a.adler=c.check=1;c.mode=12;case 12:if(5===b||6===b)break a;case 13:if(c.last){u>>>=7&t;t-=7&t;c.mode=27;break}for(;3>t;){if(0===l)break a;l--;u+=d[g++]<<t;t+=8}switch(c.last=1&u,u>>>=1,t-=1,3&u){case 0:c.mode=14;break;
case 1:S=c;if(z){Z=void 0;m=new q.Buf32(512);n=new q.Buf32(32);for(Z=0;144>Z;)S.lens[Z++]=8;for(;256>Z;)S.lens[Z++]=9;for(;280>Z;)S.lens[Z++]=7;for(;288>Z;)S.lens[Z++]=8;F(1,S.lens,0,288,m,0,S.work,{bits:9});for(Z=0;32>Z;)S.lens[Z++]=5;F(2,S.lens,0,32,n,0,S.work,{bits:5});z=!1}S.lencode=m;S.lenbits=9;S.distcode=n;S.distbits=5;if(c.mode=20,6===b){u>>>=2;t-=2;break a}break;case 2:c.mode=17;break;case 3:a.msg="invalid block type",c.mode=30}u>>>=2;t-=2;break;case 14:u>>>=7&t;for(t-=7&t;32>t;){if(0===
l)break a;l--;u+=d[g++]<<t;t+=8}if((65535&u)!==(u>>>16^65535)){a.msg="invalid stored block lengths";c.mode=30;break}if(c.length=65535&u,u=0,t=0,c.mode=15,6===b)break a;case 15:c.mode=16;case 16:if(M=c.length){if(M>l&&(M=l),M>B&&(M=B),0===M)break a;q.arraySet(h,d,g,M,k);l-=M;g+=M;B-=M;k+=M;c.length-=M;break}c.mode=12;break;case 17:for(;14>t;){if(0===l)break a;l--;u+=d[g++]<<t;t+=8}if(c.nlen=(31&u)+257,u>>>=5,t-=5,c.ndist=(31&u)+1,u>>>=5,t-=5,c.ncode=(15&u)+4,u>>>=4,t-=4,286<c.nlen||30<c.ndist){a.msg=
"too many length or distance symbols";c.mode=30;break}c.have=0;c.mode=18;case 18:for(;c.have<c.ncode;){for(;3>t;){if(0===l)break a;l--;u+=d[g++]<<t;t+=8}c.lens[Oa[c.have++]]=7&u;u>>>=3;t-=3}for(;19>c.have;)c.lens[Oa[c.have++]]=0;if(c.lencode=c.lendyn,c.lenbits=7,ra={bits:c.lenbits},qa=F(0,c.lens,0,19,c.lencode,0,c.work,ra),c.lenbits=ra.bits,qa){a.msg="invalid code lengths set";c.mode=30;break}c.have=0;c.mode=19;case 19:for(;c.have<c.nlen+c.ndist;){for(;ha=c.lencode[u&(1<<c.lenbits)-1],I=ha>>>24,Z=
65535&ha,!(t>=I);){if(0===l)break a;l--;u+=d[g++]<<t;t+=8}if(16>Z)u>>>=I,t-=I,c.lens[c.have++]=Z;else{if(16===Z){for(S=I+2;S>t;){if(0===l)break a;l--;u+=d[g++]<<t;t+=8}if(u>>>=I,t-=I,0===c.have){a.msg="invalid bit length repeat";c.mode=30;break}X=c.lens[c.have-1];M=3+(3&u);u>>>=2;t-=2}else if(17===Z){for(S=I+3;S>t;){if(0===l)break a;l--;u+=d[g++]<<t;t+=8}u>>>=I;t-=I;X=0;M=3+(7&u);u>>>=3;t-=3}else{for(S=I+7;S>t;){if(0===l)break a;l--;u+=d[g++]<<t;t+=8}u>>>=I;t-=I;X=0;M=11+(127&u);u>>>=7;t-=7}if(c.have+
M>c.nlen+c.ndist){a.msg="invalid bit length repeat";c.mode=30;break}for(;M--;)c.lens[c.have++]=X}}if(30===c.mode)break;if(0===c.lens[256]){a.msg="invalid code -- missing end-of-block";c.mode=30;break}if(c.lenbits=9,ra={bits:c.lenbits},qa=F(1,c.lens,0,c.nlen,c.lencode,0,c.work,ra),c.lenbits=ra.bits,qa){a.msg="invalid literal/lengths set";c.mode=30;break}if(c.distbits=6,c.distcode=c.distdyn,ra={bits:c.distbits},qa=F(2,c.lens,c.nlen,c.ndist,c.distcode,0,c.work,ra),c.distbits=ra.bits,qa){a.msg="invalid distances set";
c.mode=30;break}if(c.mode=20,6===b)break a;case 20:c.mode=21;case 21:if(6<=l&&258<=B){a.next_out=k;a.avail_out=B;a.next_in=g;a.avail_in=l;c.hold=u;c.bits=t;D(a,V);k=a.next_out;h=a.output;B=a.avail_out;g=a.next_in;d=a.input;l=a.avail_in;u=c.hold;t=c.bits;12===c.mode&&(c.back=-1);break}for(c.back=0;ha=c.lencode[u&(1<<c.lenbits)-1],I=ha>>>24,S=ha>>>16&255,Z=65535&ha,!(t>=I);){if(0===l)break a;l--;u+=d[g++]<<t;t+=8}if(S&&0===(240&S)){fa=I;pa=S;for(la=Z;ha=c.lencode[la+((u&(1<<fa+pa)-1)>>fa)],I=ha>>>24,
S=ha>>>16&255,Z=65535&ha,!(t>=fa+I);){if(0===l)break a;l--;u+=d[g++]<<t;t+=8}u>>>=fa;t-=fa;c.back+=fa}if(u>>>=I,t-=I,c.back+=I,c.length=Z,0===S){c.mode=26;break}if(32&S){c.back=-1;c.mode=12;break}if(64&S){a.msg="invalid literal/length code";c.mode=30;break}c.extra=15&S;c.mode=22;case 22:if(c.extra){for(S=c.extra;S>t;){if(0===l)break a;l--;u+=d[g++]<<t;t+=8}c.length+=u&(1<<c.extra)-1;u>>>=c.extra;t-=c.extra;c.back+=c.extra}c.was=c.length;c.mode=23;case 23:for(;ha=c.distcode[u&(1<<c.distbits)-1],I=
ha>>>24,S=ha>>>16&255,Z=65535&ha,!(t>=I);){if(0===l)break a;l--;u+=d[g++]<<t;t+=8}if(0===(240&S)){fa=I;pa=S;for(la=Z;ha=c.distcode[la+((u&(1<<fa+pa)-1)>>fa)],I=ha>>>24,S=ha>>>16&255,Z=65535&ha,!(t>=fa+I);){if(0===l)break a;l--;u+=d[g++]<<t;t+=8}u>>>=fa;t-=fa;c.back+=fa}if(u>>>=I,t-=I,c.back+=I,64&S){a.msg="invalid distance code";c.mode=30;break}c.offset=Z;c.extra=15&S;c.mode=24;case 24:if(c.extra){for(S=c.extra;S>t;){if(0===l)break a;l--;u+=d[g++]<<t;t+=8}c.offset+=u&(1<<c.extra)-1;u>>>=c.extra;t-=
c.extra;c.back+=c.extra}if(c.offset>c.dmax){a.msg="invalid distance too far back";c.mode=30;break}c.mode=25;case 25:if(0===B)break a;if(M=V-B,c.offset>M){if(M=c.offset-M,M>c.whave&&c.sane){a.msg="invalid distance too far back";c.mode=30;break}M>c.wnext?(M-=c.wnext,ea=c.wsize-M):ea=c.wnext-M;M>c.length&&(M=c.length);S=c.window}else S=h,ea=k-c.offset,M=c.length;M>B&&(M=B);B-=M;c.length-=M;do h[k++]=S[ea++];while(--M);0===c.length&&(c.mode=21);break;case 26:if(0===B)break a;h[k++]=c.length;B--;c.mode=
21;break;case 27:if(c.wrap){for(;32>t;){if(0===l)break a;l--;u|=d[g++]<<t;t+=8}if(V-=B,a.total_out+=V,c.total+=V,V&&(a.adler=c.check=c.flags?s(c.check,h,V,k-V):w(c.check,h,V,k-V)),V=B,(c.flags?u:f(u))!==c.check){a.msg="incorrect data check";c.mode=30;break}t=u=0}c.mode=28;case 28:if(c.wrap&&c.flags){for(;32>t;){if(0===l)break a;l--;u+=d[g++]<<t;t+=8}if(u!==(4294967295&c.total)){a.msg="incorrect length check";c.mode=30;break}t=u=0}c.mode=29;case 29:qa=1;break a;case 30:qa=-3;break a;case 31:return-4;
default:return v}a.next_out=k;a.avail_out=B;a.next_in=g;a.avail_in=l;c.hold=u;c.bits=t;if(g=c.wsize||V!==a.avail_out&&30>c.mode&&(27>c.mode||4!==b)){g=a.output;k=a.next_out;d=V-a.avail_out;var ya;l=a.state;g=(null===l.window&&(l.wsize=1<<l.wbits,l.wnext=0,l.whave=0,l.window=new q.Buf8(l.wsize)),d>=l.wsize?(q.arraySet(l.window,g,k-l.wsize,l.wsize,0),l.wnext=0,l.whave=l.wsize):(ya=l.wsize-l.wnext,ya>d&&(ya=d),q.arraySet(l.window,g,k-d,ya,l.wnext),d-=ya,d?(q.arraySet(l.window,g,k-d,d,0),l.wnext=d,l.whave=
l.wsize):(l.wnext+=ya,l.wnext===l.wsize&&(l.wnext=0),l.whave<l.wsize&&(l.whave+=ya))),0)}return g?(c.mode=31,-4):(H-=a.avail_in,V-=a.avail_out,a.total_in+=H,a.total_out+=V,c.total+=V,c.wrap&&V&&(a.adler=c.check=c.flags?s(c.check,h,V,a.next_out-V):w(c.check,h,V,a.next_out-V)),a.data_type=c.bits+(c.last?64:0)+(12===c.mode?128:0)+(20===c.mode||15===c.mode?256:0),(0===H&&0===V||4===b)&&qa===C&&(qa=-5),qa)};a.inflateEnd=function(a){if(!a||!a.state)return v;var b=a.state;return b.window&&(b.window=null),
a.state=null,C};a.inflateGetHeader=function(a,b){var c;return a&&a.state?(c=a.state,0===(2&c.wrap)?v:(c.head=b,b.done=!1,C)):v};a.inflateInfo="pako inflate (from Nodeca project)"},{"../utils/common":27,"./adler32":29,"./crc32":31,"./inffast":34,"./inftrees":36}],36:[function(c,b){var a=c("../utils/common"),f=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,0,0],d=[16,16,16,16,16,16,16,16,17,17,17,17,18,18,18,18,19,19,19,19,20,20,20,20,21,21,21,21,16,72,78],h=
[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0],g=[16,16,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,64,64];b.exports=function(b,c,m,n,q,w,s,D){var F,C,v,y,B,H,z,x;y=D.bits;for(var G=0,E=0,K=0,Q=0,O=0,T=0,U=0,ja=F=0,u=0,t=null,oa=0,V=new a.Buf16(16),T=new a.Buf16(16),M=null,ea=0,G=0;15>=G;G++)V[G]=0;for(E=0;n>E;E++)V[c[m+E]]++;O=y;for(Q=15;1<=Q&&0===V[Q];Q--);if(O>Q&&(O=Q),0===Q)return q[w++]=
20971520,q[w++]=20971520,D.bits=1,0;for(K=1;Q>K&&0===V[K];K++);K>O&&(O=K);for(G=F=1;15>=G;G++)if(F<<=1,F-=V[G],0>F)return-1;if(0<F&&(0===b||1!==Q))return-1;T[1]=0;for(G=1;15>G;G++)T[G+1]=T[G]+V[G];for(E=0;n>E;E++)0!==c[m+E]&&(s[T[c[m+E]]++]=E);if(0===b?(t=M=s,B=19):1===b?(t=f,oa-=257,M=d,ea-=257,B=256):(t=h,M=g,B=-1),u=0,E=0,G=K,y=w,T=O,U=0,v=-1,ja=1<<O,n=ja-1,1===b&&852<ja||2===b&&592<ja)return 1;for(var S=0;;){S++;H=G-U;s[E]<B?(z=0,x=s[E]):s[E]>B?(z=M[ea+s[E]],x=t[oa+s[E]]):(z=96,x=0);F=1<<G-U;
K=C=1<<T;do C-=F,q[y+(u>>U)+C]=H<<24|z<<16|x|0;while(0!==C);for(F=1<<G-1;u&F;)F>>=1;if(0!==F?(u&=F-1,u+=F):u=0,E++,0===--V[G]){if(G===Q)break;G=c[m+s[E]]}if(G>O&&(u&n)!==v){0===U&&(U=O);y+=K;T=G-U;for(F=1<<T;Q>T+U&&(F-=V[T+U],!(0>=F));)T++,F<<=1;if(ja+=1<<T,1===b&&852<ja||2===b&&592<ja)return 1;v=u&n;q[v]=O<<24|T<<16|y-w|0}}return 0!==u&&(q[y+u]=G-U<<24|4194304),D.bits=O,0}},{"../utils/common":27}],37:[function(c,b){b.exports={2:"need dictionary",1:"stream end","0":"","-1":"file error","-2":"stream error",
"-3":"data error","-4":"insufficient memory","-5":"buffer error","-6":"incompatible version"}},{}],38:[function(c,b,a){function f(a){for(var b=a.length;0<=--b;)a[b]=0}function d(a,b){a.pending_buf[a.pending++]=255&b;a.pending_buf[a.pending++]=b>>>8&255}function h(a,b,c){a.bi_valid>U-c?(a.bi_buf|=b<<a.bi_valid&65535,d(a,a.bi_buf),a.bi_buf=b>>U-a.bi_valid,a.bi_valid+=c-U):(a.bi_buf|=b<<a.bi_valid&65535,a.bi_valid+=c)}function g(a,b,c){h(a,c[2*b],c[2*b+1])}function k(a,b){var c=0;do c|=1&a,a>>>=1,c<<=
1;while(0<--b);return c>>>1}function l(a,b,c){var d,f=Array(T+1),h=0;for(d=1;T>=d;d++)f[d]=h=h+c[d-1]<<1;for(c=0;b>=c;c++)d=a[2*c+1],0!==d&&(a[2*c]=k(f[d]++,d))}function m(a){var b;for(b=0;E>b;b++)a.dyn_ltree[2*b]=0;for(b=0;K>b;b++)a.dyn_dtree[2*b]=0;for(b=0;Q>b;b++)a.bl_tree[2*b]=0;a.dyn_ltree[2*ja]=1;a.opt_len=a.static_len=0;a.last_lit=a.matches=0}function n(a){8<a.bi_valid?d(a,a.bi_buf):0<a.bi_valid&&(a.pending_buf[a.pending++]=a.bi_buf);a.bi_buf=0;a.bi_valid=0}function q(a,b,c,d){var f=2*b,h=
2*c;return a[f]<a[h]||a[f]===a[h]&&d[b]<=d[c]}function w(a,b,c){for(var d=a.heap[c],f=c<<1;f<=a.heap_len&&(f<a.heap_len&&q(b,a.heap[f+1],a.heap[f],a.depth)&&f++,!q(b,d,a.heap[f],a.depth));)a.heap[c]=a.heap[f],c=f,f<<=1;a.heap[c]=d}function s(a,b,c){var d,f,k,l,m=0;if(0!==a.last_lit){do d=a.pending_buf[a.d_buf+2*m]<<8|a.pending_buf[a.d_buf+2*m+1],f=a.pending_buf[a.l_buf+m],m++,0===d?g(a,f,b):(k=pa[f],g(a,k+G+1,b),l=V[k],0!==l&&(f-=la[k],h(a,f,l)),d--,k=256>d?fa[d]:fa[256+(d>>>7)],g(a,k,c),l=M[k],0!==
l&&(d-=X[k],h(a,d,l)));while(m<a.last_lit)}g(a,ja,b)}function D(a,b){var c,d,f,h=b.dyn_tree;d=b.stat_desc.static_tree;var g=b.stat_desc.has_stree,k=b.stat_desc.elems,m=-1;a.heap_len=0;a.heap_max=O;for(c=0;k>c;c++)0!==h[2*c]?(a.heap[++a.heap_len]=m=c,a.depth[c]=0):h[2*c+1]=0;for(;2>a.heap_len;)f=a.heap[++a.heap_len]=2>m?++m:0,h[2*f]=1,a.depth[f]=0,a.opt_len--,g&&(a.static_len-=d[2*f+1]);b.max_code=m;for(c=a.heap_len>>1;1<=c;c--)w(a,h,c);f=k;do c=a.heap[1],a.heap[1]=a.heap[a.heap_len--],w(a,h,1),d=
a.heap[1],a.heap[--a.heap_max]=c,a.heap[--a.heap_max]=d,h[2*f]=h[2*c]+h[2*d],a.depth[f]=(a.depth[c]>=a.depth[d]?a.depth[c]:a.depth[d])+1,h[2*c+1]=h[2*d+1]=f,a.heap[1]=f++,w(a,h,1);while(2<=a.heap_len);a.heap[--a.heap_max]=a.heap[1];var n,s,g=b.dyn_tree,k=b.max_code,q=b.stat_desc.static_tree,t=b.stat_desc.has_stree,u=b.stat_desc.extra_bits,y=b.stat_desc.extra_base,v=b.stat_desc.max_length,C=0;for(d=0;T>=d;d++)a.bl_count[d]=0;g[2*a.heap[a.heap_max]+1]=0;for(c=a.heap_max+1;O>c;c++)f=a.heap[c],d=g[2*
g[2*f+1]+1]+1,d>v&&(d=v,C++),g[2*f+1]=d,f>k||(a.bl_count[d]++,n=0,f>=y&&(n=u[f-y]),s=g[2*f],a.opt_len+=s*(d+n),t&&(a.static_len+=s*(q[2*f+1]+n)));if(0!==C){do{for(d=v-1;0===a.bl_count[d];)d--;a.bl_count[d]--;a.bl_count[d+1]+=2;a.bl_count[v]--;C-=2}while(0<C);for(d=v;0!==d;d--)for(f=a.bl_count[d];0!==f;)n=a.heap[--c],n>k||(g[2*n+1]!==d&&(a.opt_len+=(d-g[2*n+1])*g[2*n],g[2*n+1]=d),f--)}l(h,m,a.bl_count)}function F(a,b,c){var d,f,h=-1,g=b[1],k=0,l=7,m=4;0===g&&(l=138,m=3);b[2*(c+1)+1]=65535;for(d=0;c>=
d;d++)f=g,g=b[2*(d+1)+1],++k<l&&f===g||(m>k?a.bl_tree[2*f]+=k:0!==f?(f!==h&&a.bl_tree[2*f]++,a.bl_tree[2*u]++):10>=k?a.bl_tree[2*t]++:a.bl_tree[2*oa]++,k=0,h=f,0===g?(l=138,m=3):f===g?(l=6,m=3):(l=7,m=4))}function C(a,b,c){var d,f,k=-1,l=b[1],m=0,w=7,n=4;0===l&&(w=138,n=3);for(d=0;c>=d;d++)if(f=l,l=b[2*(d+1)+1],!(++m<w&&f===l)){if(n>m){do g(a,f,a.bl_tree);while(0!==--m)}else 0!==f?(f!==k&&(g(a,f,a.bl_tree),m--),g(a,u,a.bl_tree),h(a,m-3,2)):10>=m?(g(a,t,a.bl_tree),h(a,m-3,3)):(g(a,oa,a.bl_tree),h(a,
m-11,7));m=0;k=f;0===l?(w=138,n=3):f===l?(w=6,n=3):(w=7,n=4)}}function v(a){var b,c=4093624447;for(b=0;31>=b;b++,c>>>=1)if(1&c&&0!==a.dyn_ltree[2*b])return H;if(0!==a.dyn_ltree[18]||0!==a.dyn_ltree[20]||0!==a.dyn_ltree[26])return z;for(b=32;G>b;b++)if(0!==a.dyn_ltree[2*b])return z;return H}function y(a,b,c,f){h(a,(x<<1)+(f?1:0),3);n(a);d(a,c);d(a,~c);B.arraySet(a.pending_buf,a.window,b,c,a.pending);a.pending+=c}var B=c("../utils/common"),H=0,z=1,x=0,G=256,E=G+1+29,K=30,Q=19,O=2*E+1,T=15,U=16,ja=256,
u=16,t=17,oa=18,V=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],M=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],ea=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7],S=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],I=Array(2*(E+2));f(I);var Z=Array(2*K);f(Z);var fa=Array(512);f(fa);var pa=Array(256);f(pa);var la=Array(29);f(la);var X=Array(K);f(X);var qa,ra,ha,na=function(a,b,c,d,f){this.static_tree=a;this.extra_bits=b;this.extra_base=c;this.elems=d;this.max_length=f;
this.has_stree=a&&a.length},Oa=function(a,b){this.dyn_tree=a;this.max_code=0;this.stat_desc=b},ya=!1;a._tr_init=function(a){if(!ya){var b,c,d,f=Array(T+1);for(d=c=0;28>d;d++){la[d]=c;for(b=0;b<1<<V[d];b++)pa[c++]=d}pa[c-1]=d;for(d=c=0;16>d;d++){X[d]=c;for(b=0;b<1<<M[d];b++)fa[c++]=d}for(c>>=7;K>d;d++){X[d]=c<<7;for(b=0;b<1<<M[d]-7;b++)fa[256+c++]=d}for(b=0;T>=b;b++)f[b]=0;for(b=0;143>=b;)I[2*b+1]=8,b++,f[8]++;for(;255>=b;)I[2*b+1]=9,b++,f[9]++;for(;279>=b;)I[2*b+1]=7,b++,f[7]++;for(;287>=b;)I[2*b+
1]=8,b++,f[8]++;l(I,E+1,f);for(b=0;K>b;b++)Z[2*b+1]=5,Z[2*b]=k(b,5);qa=new na(I,V,G+1,E,T);ra=new na(Z,M,0,K,T);ha=new na([],ea,0,Q,7);ya=!0}a.l_desc=new Oa(a.dyn_ltree,qa);a.d_desc=new Oa(a.dyn_dtree,ra);a.bl_desc=new Oa(a.bl_tree,ha);a.bi_buf=0;a.bi_valid=0;m(a)};a._tr_stored_block=y;a._tr_flush_block=function(a,b,c,d){var f,g,k=0;if(0<a.level){2===a.strm.data_type&&(a.strm.data_type=v(a));D(a,a.l_desc);D(a,a.d_desc);F(a,a.dyn_ltree,a.l_desc.max_code);F(a,a.dyn_dtree,a.d_desc.max_code);D(a,a.bl_desc);
for(k=Q-1;3<=k&&0===a.bl_tree[2*S[k]+1];k--);k=(a.opt_len+=3*(k+1)+14,k);f=a.opt_len+3+7>>>3;g=a.static_len+3+7>>>3;f>=g&&(f=g)}else f=g=c+5;if(f>=c+4&&-1!==b)y(a,b,c,d);else if(4===a.strategy||g===f)h(a,2+(d?1:0),3),s(a,I,Z);else{h(a,4+(d?1:0),3);b=a.l_desc.max_code+1;c=a.d_desc.max_code+1;k+=1;h(a,b-257,5);h(a,c-1,5);h(a,k-4,4);for(f=0;k>f;f++)h(a,a.bl_tree[2*S[f]+1],3);C(a,a.dyn_ltree,b-1);C(a,a.dyn_dtree,c-1);s(a,a.dyn_ltree,a.dyn_dtree)}m(a);d&&n(a)};a._tr_tally=function(a,b,c){return a.pending_buf[a.d_buf+
2*a.last_lit]=b>>>8&255,a.pending_buf[a.d_buf+2*a.last_lit+1]=255&b,a.pending_buf[a.l_buf+a.last_lit]=255&c,a.last_lit++,0===b?a.dyn_ltree[2*c]++:(a.matches++,b--,a.dyn_ltree[2*(pa[c]+G+1)]++,a.dyn_dtree[2*(256>b?fa[b]:fa[256+(b>>>7)])]++),a.last_lit===a.lit_bufsize-1};a._tr_align=function(a){h(a,2,3);g(a,ja,I);16===a.bi_valid?(d(a,a.bi_buf),a.bi_buf=0,a.bi_valid=0):8<=a.bi_valid&&(a.pending_buf[a.pending++]=255&a.bi_buf,a.bi_buf>>=8,a.bi_valid-=8)}},{"../utils/common":27}],39:[function(c,b){b.exports=
function(){this.input=null;this.total_in=this.avail_in=this.next_in=0;this.output=null;this.total_out=this.avail_out=this.next_out=0;this.msg="";this.state=null;this.data_type=2;this.adler=0}},{}]},{},[9])(9)});"use strict";
tv.exportTo("tv.e.importer.ddms",function(){function e(a){this.position_=0;this.data_=JSZip.utils.transformTo("uint8array",a)}function c(a,b){this.importPriority=3;this.model_=a;this.data_=b}var b=tv.c.importer.Importer;e.prototype={__proto__:Object.prototype,uint8:function(){var a=this.data_[this.position_];this.position_+=1;return a},uint16:function(){var a;a=0+this.uint8();return a+=this.uint8()<<8},uint32:function(){var a;a=0+this.uint8();a+=this.uint8()<<8;a+=this.uint8()<<16;return a+=this.uint8()<<
24},uint64:function(){var a=this.uint32(),b=this.uint32(),a=("0000000"+a.toString(16)).substr(-8);return("0000000"+b.toString(16)).substr(-8)+a},seekTo:function(a){this.position_=a},hasMore:function(){return this.position_<this.data_.length}};c.canImport=function(a){return"string"===typeof a||a instanceof String?(a=a.slice(0,1E3),a.startsWith("*version\n")&&0<=a.indexOf("\nvm=")&&0<=a.indexOf("\n*threads\n")):!1};c.prototype={__proto__:b.prototype,get model(){return this.model_},importEvents:function(a){a=
this.data_.indexOf("\n*end\n")+6;this.metadata_=this.data_.slice(0,a);this.methods_={};this.parseThreads();this.parseMethods();a=new e(this.data_.slice(a));if(1464814675!=a.uint32())throw Error("Failed to match magic value");this.version_=a.uint16();if(3!=this.version_)throw Error("Unknown version");var b=a.uint16();a.uint64();a.uint16();for(a.seekTo(b);a.hasMore();)this.parseTraceEntry(a)},parseTraceEntry:function(a){var b=a.uint16(),c=a.uint32(),e=a.uint32();a=a.uint32();var g=c&-4,c=c&3,b=this.getTid(b),
g=this.getMethodName(g);0==c?b.sliceGroup.beginSlice("java",g,a,void 0,e):b.sliceGroup.openSliceCount&&b.sliceGroup.endSlice(a,e)},parseThreads:function(){var a=this.metadata_.slice(this.metadata_.indexOf("\n*threads\n")+10),a=a.slice(0,a.indexOf("\n*")),a=a.split("\n");a.forEach(this.parseThread.bind(this))},parseThread:function(a){var b=a.slice(0,a.indexOf("\t"));this.getTid(parseInt(b)).name=a.slice(a.indexOf("\t")+1)},getTid:function(a){return this.model_.getOrCreateProcess(0).getOrCreateThread(a)},
parseMethods:function(){var a=this.metadata_.slice(this.metadata_.indexOf("\n*methods\n")+10),a=a.slice(0,a.indexOf("\n*")),a=a.split("\n");a.forEach(this.parseMethod.bind(this))},parseMethod:function(a){a=a.split("\t");var b=parseInt(a[0]);this.addMethod(b,a[1]+"."+a[2]+a[3])},addMethod:function(a,b){this.methods_[a]=b},getMethodName:function(a){return this.methods_[a]}};tv.c.importer.Importer.register(c);return{DdmsImporter:c}});"use strict";
tv.exportTo("tv.e.importer.linux_perf",function(){function e(b){this.importer=b;this.model=b.model}e.prototype={__proto__:Object.prototype};var c=new tv.b.ExtensionRegistryOptions(tv.b.BASIC_REGISTRY_MODE);c.mandatoryBaseClass=e;tv.b.decorateExtensionRegistry(e,c);return{Parser:e}});"use strict";
tv.exportTo("tv.e.importer.linux_perf",function(){function e(b){c.call(this,b);b.registerEventHandler("memory_bus_usage",e.prototype.traceMarkWriteBusEvent.bind(this));this.model_=b.model_;this.ppids_={}}var c=tv.e.importer.linux_perf.Parser;e.prototype={__proto__:c.prototype,traceMarkWriteBusEvent:function(b,a,c,d,e,g){c=/bus=(\S+) rw_bytes=(\d+) r_bytes=(\d+) w_bytes=(\d+) cycles=(\d+) ns=(\d+)/.exec(e.details);b=c[1];parseInt(c[2]);a=parseInt(c[3]);parseInt(c[4]);parseInt(c[5]);c=parseInt(c[6]);
var k=1E9*a/c,k=k/1048576;a=this.model_.kernel.getOrCreateCounter(null,"bus "+b+" read");0===a.numSeries&&a.addSeries(new tv.c.trace_model.CounterSeries("value",tv.b.ui.getColorIdForGeneralPurposeString(a.name+".value")));a.series.forEach(function(a){a.addCounterSample(d,k)});a=this.model_.kernel.getOrCreateCounter(null,"bus "+b+" write");0===a.numSeries&&a.addSeries(new tv.c.trace_model.CounterSeries("value",tv.b.ui.getColorIdForGeneralPurposeString(a.name+".value")));a.series.forEach(function(a){a.addCounterSample(d,
k)});return!0}};c.register(e);return{BusParser:e}});"use strict";
tv.exportTo("tv.e.importer.linux_perf",function(){function e(b){c.call(this,b);b.registerEventHandler("clock_set_rate",e.prototype.traceMarkWriteClockEvent.bind(this));this.model_=b.model_;this.ppids_={}}var c=tv.e.importer.linux_perf.Parser;e.prototype={__proto__:c.prototype,traceMarkWriteClockEvent:function(b,a,c,d,e,g){b=/(\S+) state=(\d+) cpu_id=(\d+)/.exec(e.details);a=b[1];var k=parseInt(b[2]);b=this.model_.kernel.getOrCreateCounter(null,a);0===b.numSeries&&b.addSeries(new tv.c.trace_model.CounterSeries("value",
tv.b.ui.getColorIdForGeneralPurposeString(b.name+".value")));b.series.forEach(function(a){a.addCounterSample(d,k)});return!0}};c.register(e);return{ClockParser:e}});"use strict";
tv.exportTo("tv.e.importer.linux_perf",function(){function e(a){b.call(this,a);a.registerEventHandler("cpufreq_interactive_up",e.prototype.cpufreqUpDownEvent.bind(this));a.registerEventHandler("cpufreq_interactive_down",e.prototype.cpufreqUpDownEvent.bind(this));a.registerEventHandler("cpufreq_interactive_already",e.prototype.cpufreqTargetEvent.bind(this));a.registerEventHandler("cpufreq_interactive_notyet",e.prototype.cpufreqTargetEvent.bind(this));a.registerEventHandler("cpufreq_interactive_setspeed",
e.prototype.cpufreqTargetEvent.bind(this));a.registerEventHandler("cpufreq_interactive_target",e.prototype.cpufreqTargetEvent.bind(this));a.registerEventHandler("cpufreq_interactive_boost",e.prototype.cpufreqBoostUnboostEvent.bind(this));a.registerEventHandler("cpufreq_interactive_unboost",e.prototype.cpufreqBoostUnboostEvent.bind(this))}function c(a){var b={};a=a.split(/\s+/);for(var c=a.length,e=0;e<c;e++){var g=a[e].split("=");b[g[0]]=parseInt(g[1])}return b}var b=tv.e.importer.linux_perf.Parser;
e.prototype={__proto__:b.prototype,cpufreqSlice:function(a,b,c,e){c=this.importer.getOrCreatePseudoThread("cpufreq");c.openSlice=b;a=new tv.c.trace_model.Slice("",c.openSlice,tv.b.ui.getColorIdForGeneralPurposeString(c.openSlice),a,e,0);c.thread.sliceGroup.pushSlice(a)},cpufreqBoostSlice:function(a,b,c){var e=this.importer.getOrCreatePseudoThread("cpufreq_boost");e.openSlice=b;a=new tv.c.trace_model.Slice("",e.openSlice,tv.b.ui.getColorIdForGeneralPurposeString(e.openSlice),a,c,0);e.thread.sliceGroup.pushSlice(a)},
cpufreqUpDownEvent:function(a,b,d,e,g){b=c(g.details);this.cpufreqSlice(e,a,b.cpu,b);return!0},cpufreqTargetEvent:function(a,b,d,e,g){b=c(g.details);this.cpufreqSlice(e,a,b.cpu,b);return!0},cpufreqBoostUnboostEvent:function(a,b,c,e,g){this.cpufreqBoostSlice(e,a,{type:g.details});return!0}};b.register(e);return{CpufreqParser:e}});"use strict";
tv.exportTo("tv.e.importer.linux_perf",function(){function e(b){c.call(this,b);b.registerEventHandler("f2fs_write_begin",e.prototype.f2fsWriteBeginEvent.bind(this));b.registerEventHandler("f2fs_write_end",e.prototype.f2fsWriteEndEvent.bind(this));b.registerEventHandler("f2fs_sync_file_enter",e.prototype.f2fsSyncFileEnterEvent.bind(this));b.registerEventHandler("f2fs_sync_file_exit",e.prototype.f2fsSyncFileExitEvent.bind(this));b.registerEventHandler("ext4_sync_file_enter",e.prototype.ext4SyncFileEnterEvent.bind(this));
b.registerEventHandler("ext4_sync_file_exit",e.prototype.ext4SyncFileExitEvent.bind(this));b.registerEventHandler("ext4_da_write_begin",e.prototype.ext4WriteBeginEvent.bind(this));b.registerEventHandler("ext4_da_write_end",e.prototype.ext4WriteEndEvent.bind(this));b.registerEventHandler("block_rq_issue",e.prototype.blockRqIssueEvent.bind(this));b.registerEventHandler("block_rq_complete",e.prototype.blockRqCompleteEvent.bind(this))}var c=tv.e.importer.linux_perf.Parser;e.prototype={__proto__:c.prototype,
openAsyncSlice:function(b,a,c,d,e,g){c=this.importer.getOrCreateKernelThread(a+":"+c,d);b=new (tv.c.trace_model.AsyncSlice.getConstructor(a,g))(a,g,tv.b.ui.getColorIdForGeneralPurposeString(g),b);b.startThread=c.thread;c.openAsyncSlices||(c.openAsyncSlices={});c.openAsyncSlices[e]=b},closeAsyncSlice:function(b,a,c,d,e,g){c=this.importer.getOrCreateKernelThread(a+":"+c,d);if(c.openAsyncSlices&&(d=c.openAsyncSlices[e]))d.duration=b-d.start,d.args=g,d.endThread=c.thread,d.subSlices=[new tv.c.trace_model.Slice(a,
d.title,d.colorId,d.start,d.args,d.duration)],c.thread.asyncSliceGroup.push(d),delete c.openAsyncSlices[e]},f2fsWriteBeginEvent:function(b,a,c,d,e){var g=/dev = \((\d+,\d+)\), ino = (\d+), pos = (\d+), len = (\d+), flags = (\d+)/.exec(e.details);if(!g)return!1;b=g[1];a=parseInt(g[2]);c=parseInt(g[3]);g=parseInt(g[4]);this.openAsyncSlice(d,"f2fs",e.threadName,e.pid,b+"-"+a+"-"+c+"-"+g,"f2fs_write");return!0},f2fsWriteEndEvent:function(b,a,c,d,e){var g=/dev = \((\d+,\d+)\), ino = (\d+), pos = (\d+), len = (\d+), copied = (\d+)/.exec(e.details);
if(!g)return!1;b=g[1];a=parseInt(g[2]);c=parseInt(g[3]);var k=parseInt(g[4]),g=parseInt(g[5])!==k;this.closeAsyncSlice(d,"f2fs",e.threadName,e.pid,b+"-"+a+"-"+c+"-"+k,{device:b,inode:a,error:g});return!0},ext4WriteBeginEvent:function(b,a,c,d,e){var g=/dev (\d+,\d+) ino (\d+) pos (\d+) len (\d+) flags (\d+)/.exec(e.details);if(!g)return!1;b=g[1];a=parseInt(g[2]);c=parseInt(g[3]);g=parseInt(g[4]);this.openAsyncSlice(d,"ext4",e.threadName,e.pid,b+"-"+a+"-"+c+"-"+g,"ext4_write");return!0},ext4WriteEndEvent:function(b,
a,c,d,e){var g=/dev (\d+,\d+) ino (\d+) pos (\d+) len (\d+) copied (\d+)/.exec(e.details);if(!g)return!1;b=g[1];a=parseInt(g[2]);c=parseInt(g[3]);var k=parseInt(g[4]),g=parseInt(g[5])!==k;this.closeAsyncSlice(d,"ext4",e.threadName,e.pid,b+"-"+a+"-"+c+"-"+k,{device:b,inode:a,error:g});return!0},f2fsSyncFileEnterEvent:function(b,a,c,d,e){a=RegExp("dev = \\((\\d+,\\d+)\\), ino = (\\d+), pino = (\\d+), i_mode = (\\S+), i_size = (\\d+), i_nlink = (\\d+), i_blocks = (\\d+), i_advise = (\\d+)").exec(e.details);
if(!a)return!1;b=a[1];a=parseInt(a[2]);this.openAsyncSlice(d,"f2fs",e.threadName,e.pid,b+"-"+a,"fsync");return!0},f2fsSyncFileExitEvent:function(b,a,c,d,e){c=/dev = \((\d+,\d+)\), ino = (\d+), checkpoint is (\S+), datasync = (\d+), ret = (\d+)/.exec(e.details.replace("not needed","not_needed"));if(!c)return!1;b=c[1];a=parseInt(c[2]);c=parseInt(c[5]);this.closeAsyncSlice(d,"f2fs",e.threadName,e.pid,b+"-"+a,{device:b,inode:a,error:c});return!0},ext4SyncFileEnterEvent:function(b,a,c,d,e){b=/dev (\d+,\d+) ino (\d+) parent (\d+) datasync (\d+)/.exec(e.details);
if(!b)return!1;a=b[1];c=parseInt(b[2]);this.openAsyncSlice(d,"ext4",e.threadName,e.pid,a+"-"+c,1==b[4]?"fdatasync":"fsync");return!0},ext4SyncFileExitEvent:function(b,a,c,d,e){c=/dev (\d+,\d+) ino (\d+) ret (\d+)/.exec(e.details);if(!c)return!1;b=c[1];a=parseInt(c[2]);c=parseInt(c[3]);this.closeAsyncSlice(d,"ext4",e.threadName,e.pid,b+"-"+a,{device:b,inode:a,error:c});return!0},blockRqIssueEvent:function(b,a,c,d,e){var g=/(\d+,\d+) (F)?([DWRN])(F)?(A)?(S)?(M)? \d+ \(.*\) (\d+) \+ (\d+) \[.*\]/.exec(e.details);
if(!g)return!1;switch(g[3]){case "D":b="discard";break;case "W":b="write";break;case "R":b="read";break;case "N":b="none";break;default:b="unknown"}g[2]&&(b+=" flush");"F"==g[4]&&(b+=" fua");"A"==g[5]&&(b+=" ahead");"S"==g[6]&&(b+=" sync");"M"==g[7]&&(b+=" meta");a=g[1];c=parseInt(g[8]);g=parseInt(g[9]);this.openAsyncSlice(d,"block",e.threadName,e.pid,a+"-"+c+"-"+g,b);return!0},blockRqCompleteEvent:function(b,a,c,d,e){var g=/(\d+,\d+) (F)?([DWRN])(F)?(A)?(S)?(M)? \(.*\) (\d+) \+ (\d+) \[(.*)\]/.exec(e.details);
if(!g)return!1;b=g[1];a=parseInt(g[8]);c=parseInt(g[9]);g=parseInt(g[10]);this.closeAsyncSlice(d,"block",e.threadName,e.pid,b+"-"+a+"-"+c,{device:b,sector:a,numSectors:c,error:g});return!0}};c.register(e);return{DiskParser:e}});"use strict";
tv.exportTo("tv.e.importer.linux_perf",function(){function e(b){c.call(this,b);b.registerEventHandler("drm_vblank_event",e.prototype.vblankEvent.bind(this))}var c=tv.e.importer.linux_perf.Parser;e.prototype={__proto__:c.prototype,drmVblankSlice:function(b,a,c){var d=this.importer.getOrCreatePseudoThread("drm_vblank");d.openSlice=a;b=new tv.c.trace_model.Slice("",d.openSlice,tv.b.ui.getColorIdForGeneralPurposeString(d.openSlice),b,c,0);d.thread.sliceGroup.pushSlice(b)},vblankEvent:function(b,a,c,d,
e){a=/crtc=(\d+), seq=(\d+)/.exec(e.details);if(!a)return!1;b=parseInt(a[1]);a=parseInt(a[2]);this.drmVblankSlice(d,"vblank:"+b,{crtc:b,seq:a});return!0}};c.register(e);return{DrmParser:e}});"use strict";
tv.exportTo("tv.e.importer.linux_perf",function(){function e(a){c.call(this,a);a.registerEventHandler("irq_handler_entry",e.prototype.irqHandlerEntryEvent.bind(this));a.registerEventHandler("irq_handler_exit",e.prototype.irqHandlerExitEvent.bind(this));a.registerEventHandler("softirq_raise",e.prototype.softirqRaiseEvent.bind(this));a.registerEventHandler("softirq_entry",e.prototype.softirqEntryEvent.bind(this));a.registerEventHandler("softirq_exit",e.prototype.softirqExitEvent.bind(this))}var c=tv.e.importer.linux_perf.Parser,
b=/irq=(\d+) name=(.+)/,a=/irq=(\d+) ret=(.+)/,f=/vec=(\d+) \[action=(.+)\]/;e.prototype={__proto__:c.prototype,irqHandlerEntryEvent:function(a,c,e,f,l){a=b.exec(l.details);if(!a)return!1;parseInt(a[1]);a=a[2];c=this.importer.getOrCreatePseudoThread("irqs cpu "+c);c.lastEntryTs=f;c.irqName=a;return!0},irqHandlerExitEvent:function(b,c,e,f,l){b=a.exec(l.details);if(!b)return!1;parseInt(b[1]);e=b[2];c=this.importer.getOrCreatePseudoThread("irqs cpu "+c);void 0!==c.lastEntryTs&&(f-=c.lastEntryTs,f=new tv.c.trace_model.Slice("",
c.irqName,tv.b.ui.getColorIdForGeneralPurposeString(b[1]),c.lastEntryTs,{ret:e},f),c.thread.sliceGroup.pushSlice(f));c.lastEntryTs=void 0;c.irqName=void 0;return!0},softirqRaiseEvent:function(a,b,c,e,f){return!0},softirqEntryEvent:function(a,b,c,e,l){if(!f.exec(l.details))return!1;this.importer.getOrCreatePseudoThread("softirq cpu "+b).lastEntryTs=e;return!0},softirqExitEvent:function(a,b,c,e,l){a=f.exec(l.details);if(!a)return!1;c=parseInt(a[1]);l=a[2];b=this.importer.getOrCreatePseudoThread("softirq cpu "+
b);void 0!==b.lastEntryTs&&(e-=b.lastEntryTs,e=new tv.c.trace_model.Slice("",l,tv.b.ui.getColorIdForGeneralPurposeString(a[1]),b.lastEntryTs,{vec:c},e),b.thread.sliceGroup.pushSlice(e));b.lastEntryTs=void 0;return!0}};c.register(e);return{IrqParser:e}});"use strict";
tv.exportTo("tv.e.importer.linux_perf",function(){function e(b){c.call(this,b);b.registerEventHandler("exynos_busfreq_target_int",e.prototype.busfreqTargetIntEvent.bind(this));b.registerEventHandler("exynos_busfreq_target_mif",e.prototype.busfreqTargetMifEvent.bind(this));b.registerEventHandler("exynos_page_flip_state",e.prototype.pageFlipStateEvent.bind(this))}var c=tv.e.importer.linux_perf.Parser;e.prototype={__proto__:c.prototype,exynosBusfreqSample:function(b,a,c){b=this.importer.getOrCreateCpu(0).getOrCreateCounter("",
b);0===b.numSeries&&b.addSeries(new tv.c.trace_model.CounterSeries("frequency",tv.b.ui.getColorIdForGeneralPurposeString(b.name+".frequency")));b.series.forEach(function(b){b.addCounterSample(a,c)})},busfreqTargetIntEvent:function(b,a,c,d,e){b=/frequency=(\d+)/.exec(e.details);if(!b)return!1;this.exynosBusfreqSample("INT Frequency",d,parseInt(b[1]));return!0},busfreqTargetMifEvent:function(b,a,c,d,e){b=/frequency=(\d+)/.exec(e.details);if(!b)return!1;this.exynosBusfreqSample("MIF Frequency",d,parseInt(b[1]));
return!0},exynosPageFlipStateOpenSlice:function(b,a,c,d){a=this.importer.getOrCreatePseudoThread("exynos_flip_state (pipe:"+a+", fb:"+c+")");a.openSliceTS=b;a.openSlice=d},exynosPageFlipStateCloseSlice:function(b,a,c,d){a=this.importer.getOrCreatePseudoThread("exynos_flip_state (pipe:"+a+", fb:"+c+")");a.openSlice&&(b=new tv.c.trace_model.Slice("",a.openSlice,tv.b.ui.getColorIdForGeneralPurposeString(a.openSlice),a.openSliceTS,d,b-a.openSliceTS),a.thread.sliceGroup.pushSlice(b));a.openSlice=void 0},
pageFlipStateEvent:function(b,a,c,d,e){c=/pipe=(\d+), fb=(\d+), state=(.*)/.exec(e.details);if(!c)return!1;b=parseInt(c[1]);a=parseInt(c[2]);c=c[3];this.exynosPageFlipStateCloseSlice(d,b,a,{pipe:b,fb:a});"flipped"!==c&&this.exynosPageFlipStateOpenSlice(d,b,a,c);return!0}};c.register(e);return{ExynosParser:e}});"use strict";
tv.exportTo("tv.e.importer.linux_perf",function(){function e(b){c.call(this,b);b.registerEventHandler("tracing_mark_write:log",e.prototype.logEvent.bind(this));b.registerEventHandler("tracing_mark_write:SyncInterpret",e.prototype.syncEvent.bind(this));b.registerEventHandler("tracing_mark_write:HandleTimer",e.prototype.timerEvent.bind(this))}var c=tv.e.importer.linux_perf.Parser;e.prototype={__proto__:c.prototype,gestureOpenSlice:function(b,a,c){this.importer.getOrCreatePseudoThread("gesture").thread.sliceGroup.beginSlice("touchpad_gesture",
b,a,c)},gestureCloseSlice:function(b,a){var c=this.importer.getOrCreatePseudoThread("gesture").thread;if(c.sliceGroup.openSliceCount){var d=c.sliceGroup.mostRecentlyOpenedPartialSlice;d.title!=b?this.importer.model.importWarning({type:"title_match_error",message:"Titles do not match. Title is "+d.title+" in openSlice, and is "+b+" in endSlice"}):c.sliceGroup.endSlice(a)}},logEvent:function(b,a,c,d,e){b=/^\s*(\w+):\s*(\w+)$/.exec(e.details);switch(b[1]){case "start":this.gestureOpenSlice("GestureLog",
d,{name:b[2]});break;case "end":this.gestureCloseSlice("GestureLog",d)}return!0},syncEvent:function(b,a,c,d,e){b=/^\s*(\w+):\s*(\w+)$/.exec(e.details);switch(b[1]){case "start":this.gestureOpenSlice("SyncInterpret",d,{interpreter:b[2]});break;case "end":this.gestureCloseSlice("SyncInterpret",d)}return!0},timerEvent:function(b,a,c,d,e){b=/^\s*(\w+):\s*(\w+)$/.exec(e.details);switch(b[1]){case "start":this.gestureOpenSlice("HandleTimer",d,{interpreter:b[2]});break;case "end":this.gestureCloseSlice("HandleTimer",
d)}return!0}};c.register(e);return{GestureParser:e}});"use strict";
tv.exportTo("tv.e.importer.linux_perf",function(){function e(b){c.call(this,b);b.registerEventHandler("i915_gem_object_create",e.prototype.gemObjectCreateEvent.bind(this));b.registerEventHandler("i915_gem_object_bind",e.prototype.gemObjectBindEvent.bind(this));b.registerEventHandler("i915_gem_object_unbind",e.prototype.gemObjectBindEvent.bind(this));b.registerEventHandler("i915_gem_object_change_domain",e.prototype.gemObjectChangeDomainEvent.bind(this));b.registerEventHandler("i915_gem_object_pread",
e.prototype.gemObjectPreadWriteEvent.bind(this));b.registerEventHandler("i915_gem_object_pwrite",e.prototype.gemObjectPreadWriteEvent.bind(this));b.registerEventHandler("i915_gem_object_fault",e.prototype.gemObjectFaultEvent.bind(this));b.registerEventHandler("i915_gem_object_clflush",e.prototype.gemObjectDestroyEvent.bind(this));b.registerEventHandler("i915_gem_object_destroy",e.prototype.gemObjectDestroyEvent.bind(this));b.registerEventHandler("i915_gem_ring_dispatch",e.prototype.gemRingDispatchEvent.bind(this));
b.registerEventHandler("i915_gem_ring_flush",e.prototype.gemRingFlushEvent.bind(this));b.registerEventHandler("i915_gem_request",e.prototype.gemRequestEvent.bind(this));b.registerEventHandler("i915_gem_request_add",e.prototype.gemRequestEvent.bind(this));b.registerEventHandler("i915_gem_request_complete",e.prototype.gemRequestEvent.bind(this));b.registerEventHandler("i915_gem_request_retire",e.prototype.gemRequestEvent.bind(this));b.registerEventHandler("i915_gem_request_wait_begin",e.prototype.gemRequestEvent.bind(this));
b.registerEventHandler("i915_gem_request_wait_end",e.prototype.gemRequestEvent.bind(this));b.registerEventHandler("i915_gem_ring_wait_begin",e.prototype.gemRingWaitEvent.bind(this));b.registerEventHandler("i915_gem_ring_wait_end",e.prototype.gemRingWaitEvent.bind(this));b.registerEventHandler("i915_reg_rw",e.prototype.regRWEvent.bind(this));b.registerEventHandler("i915_flip_request",e.prototype.flipEvent.bind(this));b.registerEventHandler("i915_flip_complete",e.prototype.flipEvent.bind(this));b.registerEventHandler("intel_gpu_freq_change",
e.prototype.gpuFrequency.bind(this))}var c=tv.e.importer.linux_perf.Parser;e.prototype={__proto__:c.prototype,i915FlipOpenSlice:function(b,a,c){var d=this.importer.getOrCreatePseudoThread("i915_flip");d.openSliceTS=b;d.openSlice="flip:"+a+"/"+c},i915FlipCloseSlice:function(b,a){var c=this.importer.getOrCreatePseudoThread("i915_flip");if(c.openSlice){var d=new tv.c.trace_model.Slice("",c.openSlice,tv.b.ui.getColorIdForGeneralPurposeString(c.openSlice),c.openSliceTS,a,b-c.openSliceTS);c.thread.sliceGroup.pushSlice(d)}c.openSlice=
void 0},i915GemObjectSlice:function(b,a,c,d){var e=this.importer.getOrCreatePseudoThread("i915_gem");e.openSlice=a+":"+c;b=new tv.c.trace_model.Slice("",e.openSlice,tv.b.ui.getColorIdForGeneralPurposeString(e.openSlice),b,d,0);e.thread.sliceGroup.pushSlice(b)},i915GemRingSlice:function(b,a,c,d,e){var g=this.importer.getOrCreatePseudoThread("i915_gem_ring");g.openSlice=a+":"+c+"."+d;b=new tv.c.trace_model.Slice("",g.openSlice,tv.b.ui.getColorIdForGeneralPurposeString(g.openSlice),b,e,0);g.thread.sliceGroup.pushSlice(b)},
i915RegSlice:function(b,a,c,d){var e=this.importer.getOrCreatePseudoThread("i915_reg");e.openSlice=a+":"+c;b=new tv.c.trace_model.Slice("",e.openSlice,tv.b.ui.getColorIdForGeneralPurposeString(e.openSlice),b,d,0);e.thread.sliceGroup.pushSlice(b)},i915FreqChangeSlice:function(b,a,c){var d=this.importer.getOrCreatePseudoThread("i915_gpu_freq");d.openSlice=a;b=new tv.c.trace_model.Slice("",d.openSlice,tv.b.ui.getColorIdForGeneralPurposeString(d.openSlice),b,c,0);d.thread.sliceGroup.pushSlice(b)},gemObjectCreateEvent:function(b,
a,c,d,e){c=/obj=(\w+), size=(\d+)/.exec(e.details);if(!c)return!1;a=c[1];c=parseInt(c[2]);this.i915GemObjectSlice(d,b,a,{obj:a,size:c});return!0},gemObjectBindEvent:function(b,a,c,d,e){e=/obj=(\w+), offset=(\w+), size=(\d+)/.exec(e.details);if(!e)return!1;a=e[1];c=e[2];e=parseInt(e[3]);this.i915ObjectGemSlice(d,b+":"+a,{obj:a,offset:c,size:e});return!0},gemObjectChangeDomainEvent:function(b,a,c,d,e){a=/obj=(\w+), read=(\w+=>\w+), write=(\w+=>\w+)/.exec(e.details);if(!a)return!1;c=a[1];this.i915GemObjectSlice(d,
b,c,{obj:c,read:a[2],write:a[3]});return!0},gemObjectPreadWriteEvent:function(b,a,c,d,e){e=/obj=(\w+), offset=(\d+), len=(\d+)/.exec(e.details);if(!e)return!1;a=e[1];c=parseInt(e[2]);e=parseInt(e[3]);this.i915GemObjectSlice(d,b,a,{obj:a,offset:c,len:e});return!0},gemObjectFaultEvent:function(b,a,c,d,e){e=/obj=(\w+), (\w+) index=(\d+)/.exec(e.details);if(!e)return!1;a=e[1];c=e[2];e=parseInt(e[3]);this.i915GemObjectSlice(d,b,a,{obj:a,type:c,index:e});return!0},gemObjectDestroyEvent:function(b,a,c,d,
e){a=/obj=(\w+)/.exec(e.details);if(!a)return!1;a=a[1];this.i915GemObjectSlice(d,b,a,{obj:a});return!0},gemRingDispatchEvent:function(b,a,c,d,e){e=/dev=(\d+), ring=(\d+), seqno=(\d+)/.exec(e.details);if(!e)return!1;a=parseInt(e[1]);c=parseInt(e[2]);e=parseInt(e[3]);this.i915GemRingSlice(d,b,a,c,{dev:a,ring:c,seqno:e});return!0},gemRingFlushEvent:function(b,a,c,d,e){a=/dev=(\d+), ring=(\w+), invalidate=(\w+), flush=(\w+)/.exec(e.details);if(!a)return!1;c=parseInt(a[1]);e=parseInt(a[2]);this.i915GemRingSlice(d,
b,c,e,{dev:c,ring:e,invalidate:a[3],flush:a[4]});return!0},gemRequestEvent:function(b,a,c,d,e){e=/dev=(\d+), ring=(\d+), seqno=(\d+)/.exec(e.details);if(!e)return!1;a=parseInt(e[1]);c=parseInt(e[2]);e=parseInt(e[3]);this.i915GemRingSlice(d,b,a,c,{dev:a,ring:c,seqno:e});return!0},gemRingWaitEvent:function(b,a,c,d,e){c=/dev=(\d+), ring=(\d+)/.exec(e.details);if(!c)return!1;a=parseInt(c[1]);c=parseInt(c[2]);this.i915GemRingSlice(d,b,a,c,{dev:a,ring:c});return!0},regRWEvent:function(b,a,c,d,e){b=/(\w+) reg=(\w+), len=(\d+), val=(\(\w+, \w+\))/.exec(e.details);
if(!b)return!1;a=b[1];c=b[2];this.i915RegSlice(d,a,c,{rw:a,reg:c,len:b[3],data:b[3]});return!0},flipEvent:function(b,a,c,d,e){c=/plane=(\d+), obj=(\w+)/.exec(e.details);if(!c)return!1;a=parseInt(c[1]);c=c[2];"i915_flip_request"==b?this.i915FlipOpenSlice(d,c,a):this.i915FlipCloseSlice(d,{obj:c,plane:a});return!0},gpuFrequency:function(b,a,c,d,e){a=/new_freq=(\d+)/.exec(e.details);if(!a)return!1;a=parseInt(a[1]);this.i915FreqChangeSlice(d,b,{freq:a});return!0}};c.register(e);return{I915Parser:e}});
"use strict";
tv.exportTo("tv.e.importer.linux_perf",function(){function e(b){c.call(this,b);b.registerEventHandler("mali_dvfs_event",e.prototype.dvfsEventEvent.bind(this));b.registerEventHandler("mali_dvfs_set_clock",e.prototype.dvfsSetClockEvent.bind(this));b.registerEventHandler("mali_dvfs_set_voltage",e.prototype.dvfsSetVoltageEvent.bind(this));this.addJMCounter("mali_hwc_MESSAGES_SENT","Messages Sent");this.addJMCounter("mali_hwc_MESSAGES_RECEIVED","Messages Received");this.addJMCycles("mali_hwc_GPU_ACTIVE","GPU Active");
this.addJMCycles("mali_hwc_IRQ_ACTIVE","IRQ Active");for(var a=0;7>a;a++){var f="JS"+a,d="mali_hwc_"+f;this.addJMCounter(d+"_JOBS",f+" Jobs");this.addJMCounter(d+"_TASKS",f+" Tasks");this.addJMCycles(d+"_ACTIVE",f+" Active");this.addJMCycles(d+"_WAIT_READ",f+" Wait Read");this.addJMCycles(d+"_WAIT_ISSUE",f+" Wait Issue");this.addJMCycles(d+"_WAIT_DEPEND",f+" Wait Depend");this.addJMCycles(d+"_WAIT_FINISH",f+" Wait Finish")}this.addTilerCounter("mali_hwc_TRIANGLES","Triangles");this.addTilerCounter("mali_hwc_QUADS",
"Quads");this.addTilerCounter("mali_hwc_POLYGONS","Polygons");this.addTilerCounter("mali_hwc_POINTS","Points");this.addTilerCounter("mali_hwc_LINES","Lines");this.addTilerCounter("mali_hwc_VCACHE_HIT","VCache Hit");this.addTilerCounter("mali_hwc_VCACHE_MISS","VCache Miss");this.addTilerCounter("mali_hwc_FRONT_FACING","Front Facing");this.addTilerCounter("mali_hwc_BACK_FACING","Back Facing");this.addTilerCounter("mali_hwc_PRIM_VISIBLE","Prim Visible");this.addTilerCounter("mali_hwc_PRIM_CULLED","Prim Culled");
this.addTilerCounter("mali_hwc_PRIM_CLIPPED","Prim Clipped");this.addTilerCounter("mali_hwc_WRBUF_HIT","Wrbuf Hit");this.addTilerCounter("mali_hwc_WRBUF_MISS","Wrbuf Miss");this.addTilerCounter("mali_hwc_WRBUF_LINE","Wrbuf Line");this.addTilerCounter("mali_hwc_WRBUF_PARTIAL","Wrbuf Partial");this.addTilerCounter("mali_hwc_WRBUF_STALL","Wrbuf Stall");this.addTilerCycles("mali_hwc_ACTIVE","Tiler Active");this.addTilerCycles("mali_hwc_INDEX_WAIT","Index Wait");this.addTilerCycles("mali_hwc_INDEX_RANGE_WAIT",
"Index Range Wait");this.addTilerCycles("mali_hwc_VERTEX_WAIT","Vertex Wait");this.addTilerCycles("mali_hwc_PCACHE_WAIT","Pcache Wait");this.addTilerCycles("mali_hwc_WRBUF_WAIT","Wrbuf Wait");this.addTilerCycles("mali_hwc_BUS_READ","Bus Read");this.addTilerCycles("mali_hwc_BUS_WRITE","Bus Write");this.addTilerCycles("mali_hwc_TILER_UTLB_STALL","Tiler UTLB Stall");this.addTilerCycles("mali_hwc_TILER_UTLB_HIT","Tiler UTLB Hit");this.addFragCycles("mali_hwc_FRAG_ACTIVE","Active");this.addFragCounter("mali_hwc_FRAG_PRIMATIVES",
"Primitives");this.addFragCounter("mali_hwc_FRAG_PRIMATIVES_DROPPED","Primitives Dropped");this.addFragCycles("mali_hwc_FRAG_CYCLE_DESC","Descriptor Processing");this.addFragCycles("mali_hwc_FRAG_CYCLES_PLR","PLR Processing??");this.addFragCycles("mali_hwc_FRAG_CYCLES_VERT","Vertex Processing");this.addFragCycles("mali_hwc_FRAG_CYCLES_TRISETUP","Triangle Setup");this.addFragCycles("mali_hwc_FRAG_CYCLES_RAST","Rasterization???");this.addFragCounter("mali_hwc_FRAG_THREADS","Threads");this.addFragCounter("mali_hwc_FRAG_DUMMY_THREADS",
"Dummy Threads");this.addFragCounter("mali_hwc_FRAG_QUADS_RAST","Quads Rast");this.addFragCounter("mali_hwc_FRAG_QUADS_EZS_TEST","Quads EZS Test");this.addFragCounter("mali_hwc_FRAG_QUADS_EZS_KILLED","Quads EZS Killed");this.addFragCounter("mali_hwc_FRAG_QUADS_LZS_TEST","Quads LZS Test");this.addFragCounter("mali_hwc_FRAG_QUADS_LZS_KILLED","Quads LZS Killed");this.addFragCycles("mali_hwc_FRAG_CYCLE_NO_TILE","No Tiles");this.addFragCounter("mali_hwc_FRAG_NUM_TILES","Tiles");this.addFragCounter("mali_hwc_FRAG_TRANS_ELIM",
"Transactions Eliminated");this.addComputeCycles("mali_hwc_COMPUTE_ACTIVE","Active");this.addComputeCounter("mali_hwc_COMPUTE_TASKS","Tasks");this.addComputeCounter("mali_hwc_COMPUTE_THREADS","Threads Started");this.addComputeCycles("mali_hwc_COMPUTE_CYCLES_DESC","Waiting for Descriptors");this.addTripipeCycles("mali_hwc_TRIPIPE_ACTIVE","Active");this.addArithCounter("mali_hwc_ARITH_WORDS","Instructions (/Pipes)");this.addArithCycles("mali_hwc_ARITH_CYCLES_REG","Reg scheduling stalls (/Pipes)");this.addArithCycles("mali_hwc_ARITH_CYCLES_L0",
"L0 cache miss stalls (/Pipes)");this.addArithCounter("mali_hwc_ARITH_FRAG_DEPEND","Frag dep check failures (/Pipes)");this.addLSCounter("mali_hwc_LS_WORDS","Instruction Words Completed");this.addLSCounter("mali_hwc_LS_ISSUES","Full Pipeline Issues");this.addLSCounter("mali_hwc_LS_RESTARTS","Restarts (unpairable insts)");this.addLSCounter("mali_hwc_LS_REISSUES_MISS","Pipeline reissue (cache miss/uTLB)");this.addLSCounter("mali_hwc_LS_REISSUES_VD","Pipeline reissue (varying data)");this.addLSCounter("mali_hwc_LS_REISSUE_ATTRIB_MISS",
"Pipeline reissue (attribute cache miss)");this.addLSCounter("mali_hwc_LS_REISSUE_NO_WB","Writeback not used");this.addTexCounter("mali_hwc_TEX_WORDS","Words");this.addTexCounter("mali_hwc_TEX_BUBBLES","Bubbles");this.addTexCounter("mali_hwc_TEX_WORDS_L0","Words L0");this.addTexCounter("mali_hwc_TEX_WORDS_DESC","Words Desc");this.addTexCounter("mali_hwc_TEX_THREADS","Threads");this.addTexCounter("mali_hwc_TEX_RECIRC_FMISS","Recirc due to Full Miss");this.addTexCounter("mali_hwc_TEX_RECIRC_DESC","Recirc due to Desc Miss");
this.addTexCounter("mali_hwc_TEX_RECIRC_MULTI","Recirc due to Multipass");this.addTexCounter("mali_hwc_TEX_RECIRC_PMISS","Recirc due to Partial Cache Miss");this.addTexCounter("mali_hwc_TEX_RECIRC_CONF","Recirc due to Cache Conflict");this.addLSCCounter("mali_hwc_LSC_READ_HITS","Read Hits");this.addLSCCounter("mali_hwc_LSC_READ_MISSES","Read Misses");this.addLSCCounter("mali_hwc_LSC_WRITE_HITS","Write Hits");this.addLSCCounter("mali_hwc_LSC_WRITE_MISSES","Write Misses");this.addLSCCounter("mali_hwc_LSC_ATOMIC_HITS",
"Atomic Hits");this.addLSCCounter("mali_hwc_LSC_ATOMIC_MISSES","Atomic Misses");this.addLSCCounter("mali_hwc_LSC_LINE_FETCHES","Line Fetches");this.addLSCCounter("mali_hwc_LSC_DIRTY_LINE","Dirty Lines");this.addLSCCounter("mali_hwc_LSC_SNOOPS","Snoops");this.addAXICounter("mali_hwc_AXI_TLB_STALL","Address channel stall");this.addAXICounter("mali_hwc_AXI_TLB_MISS","Cache Miss");this.addAXICounter("mali_hwc_AXI_TLB_TRANSACTION","Transactions");this.addAXICounter("mali_hwc_LS_TLB_MISS","LS Cache Miss");
this.addAXICounter("mali_hwc_LS_TLB_HIT","LS Cache Hit");this.addAXICounter("mali_hwc_AXI_BEATS_READ","Read Beats");this.addAXICounter("mali_hwc_AXI_BEATS_WRITE","Write Beats");this.addMMUCounter("mali_hwc_MMU_TABLE_WALK","Page Table Walks");this.addMMUCounter("mali_hwc_MMU_REPLAY_MISS","Cache Miss from Replay Buffer");this.addMMUCounter("mali_hwc_MMU_REPLAY_FULL","Replay Buffer Full");this.addMMUCounter("mali_hwc_MMU_NEW_MISS","Cache Miss on New Request");this.addMMUCounter("mali_hwc_MMU_HIT","Cache Hit");
this.addMMUCycles("mali_hwc_UTLB_STALL","UTLB Stalled");this.addMMUCycles("mali_hwc_UTLB_REPLAY_MISS","UTLB Replay Miss");this.addMMUCycles("mali_hwc_UTLB_REPLAY_FULL","UTLB Replay Full");this.addMMUCycles("mali_hwc_UTLB_NEW_MISS","UTLB New Miss");this.addMMUCycles("mali_hwc_UTLB_HIT","UTLB Hit");this.addL2Counter("mali_hwc_L2_READ_BEATS","Read Beats");this.addL2Counter("mali_hwc_L2_WRITE_BEATS","Write Beats");this.addL2Counter("mali_hwc_L2_ANY_LOOKUP","Any Lookup");this.addL2Counter("mali_hwc_L2_READ_LOOKUP",
"Read Lookup");this.addL2Counter("mali_hwc_L2_SREAD_LOOKUP","Shareable Read Lookup");this.addL2Counter("mali_hwc_L2_READ_REPLAY","Read Replayed");this.addL2Counter("mali_hwc_L2_READ_SNOOP","Read Snoop");this.addL2Counter("mali_hwc_L2_READ_HIT","Read Cache Hit");this.addL2Counter("mali_hwc_L2_CLEAN_MISS","CleanUnique Miss");this.addL2Counter("mali_hwc_L2_WRITE_LOOKUP","Write Lookup");this.addL2Counter("mali_hwc_L2_SWRITE_LOOKUP","Shareable Write Lookup");this.addL2Counter("mali_hwc_L2_WRITE_REPLAY",
"Write Replayed");this.addL2Counter("mali_hwc_L2_WRITE_SNOOP","Write Snoop");this.addL2Counter("mali_hwc_L2_WRITE_HIT","Write Cache Hit");this.addL2Counter("mali_hwc_L2_EXT_READ_FULL","ExtRD with BIU Full");this.addL2Counter("mali_hwc_L2_EXT_READ_HALF","ExtRD with BIU >1/2 Full");this.addL2Counter("mali_hwc_L2_EXT_WRITE_FULL","ExtWR with BIU Full");this.addL2Counter("mali_hwc_L2_EXT_WRITE_HALF","ExtWR with BIU >1/2 Full");this.addL2Counter("mali_hwc_L2_EXT_READ","External Read (ExtRD)");this.addL2Counter("mali_hwc_L2_EXT_READ_LINE",
"ExtRD (linefill)");this.addL2Counter("mali_hwc_L2_EXT_WRITE","External Write (ExtWR)");this.addL2Counter("mali_hwc_L2_EXT_WRITE_LINE","ExtWR (linefill)");this.addL2Counter("mali_hwc_L2_EXT_WRITE_SMALL","ExtWR (burst size <64B)");this.addL2Counter("mali_hwc_L2_EXT_BARRIER","External Barrier");this.addL2Counter("mali_hwc_L2_EXT_AR_STALL","Address Read stalls");this.addL2Counter("mali_hwc_L2_EXT_R_BUF_FULL","Response Buffer full stalls");this.addL2Counter("mali_hwc_L2_EXT_RD_BUF_FULL","Read Data Buffer full stalls");
this.addL2Counter("mali_hwc_L2_EXT_R_RAW","RAW hazard stalls");this.addL2Counter("mali_hwc_L2_EXT_W_STALL","Write Data stalls");this.addL2Counter("mali_hwc_L2_EXT_W_BUF_FULL","Write Data Buffer full");this.addL2Counter("mali_hwc_L2_EXT_R_W_HAZARD","WAW or WAR hazard stalls");this.addL2Counter("mali_hwc_L2_TAG_HAZARD","Tag hazard replays");this.addL2Cycles("mali_hwc_L2_SNOOP_FULL","Snoop buffer full");this.addL2Cycles("mali_hwc_L2_REPLAY_FULL","Replay buffer full");b.registerEventHandler("tracing_mark_write:mali_driver",
e.prototype.maliDDKEvent.bind(this));this.model_=b.model_}var c=tv.e.importer.linux_perf.Parser;e.prototype={__proto__:c.prototype,maliDDKOpenSlice:function(b,a,c,d,e){b=this.importer.model_.getOrCreateProcess(b).getOrCreateThread(a);d=/^([\w\d_]*)(?:\(\))?:?\s*(.*)$/.exec(d);b.sliceGroup.beginSlice("gpu-driver",d[1],c,{args:d[2],blockinfo:e})},maliDDKCloseSlice:function(b,a,c,d,e){b=this.importer.model_.getOrCreateProcess(b).getOrCreateThread(a);b.sliceGroup.openSliceCount&&b.sliceGroup.endSlice(c)},
autoDetectLineRE:function(b){var a=/^\s*\(([\w\-]*)\)\s*(\w+):\s*([\w\\\/\.\-]*@\d*):?\s*(.*)$/;if(a.test(b))return a;a=/^s*()(\w+):\s*([\w\\\/.\-]*):?\s*(.*)$/;return a.test(b)?a:null},lineRE:null,maliDDKEvent:function(b,a,c,d,e){if(null==this.lineRE&&(this.lineRE=this.autoDetectLineRE(e.details),null==this.lineRE))return!1;b=this.lineRE.exec(e.details);a=""===b[1]?"mali":b[1];switch(b[2]){case "cros_trace_print_enter":this.maliDDKOpenSlice(c,a,d,b[4],b[3]);break;case "cros_trace_print_exit":this.maliDDKCloseSlice(c,
a,d,[],b[3])}return!0},dvfsSample:function(b,a,c,d){var e=parseInt(d);b=this.model_.kernel.getOrCreateCounter("DVFS",b);0===b.numSeries&&b.addSeries(new tv.c.trace_model.CounterSeries(a,tv.b.ui.getColorIdForGeneralPurposeString(b.name)));b.series.forEach(function(a){a.addCounterSample(c,e)})},dvfsEventEvent:function(b,a,c,d,e){b=/utilization=(\d+)/.exec(e.details);if(!b)return!1;this.dvfsSample("DVFS Utilization","utilization",d,b[1]);return!0},dvfsSetClockEvent:function(b,a,c,d,e){b=/frequency=(\d+)/.exec(e.details);
if(!b)return!1;this.dvfsSample("DVFS Frequency","frequency",d,b[1]);return!0},dvfsSetVoltageEvent:function(b,a,c,d,e){b=/voltage=(\d+)/.exec(e.details);if(!b)return!1;this.dvfsSample("DVFS Voltage","voltage",d,b[1]);return!0},hwcSample:function(b,a,c,d,e){e=/val=(\d+)/.exec(e.details);if(!e)return!1;var g=parseInt(e[1]);b=this.model_.kernel.getOrCreateCounter(b,a);0===b.numSeries&&b.addSeries(new tv.c.trace_model.CounterSeries(c,tv.b.ui.getColorIdForGeneralPurposeString(b.name)));b.series.forEach(function(a){a.addCounterSample(d,
g)});return!0},jmSample:function(b,a,c,d){return this.hwcSample("mali:jm","JM: "+b,a,c,d)},addJMCounter:function(b,a){this.importer.registerEventHandler(b,function(b,c,e,g,k){return this.jmSample(a,"count",g,k)}.bind(this))},addJMCycles:function(b,a){this.importer.registerEventHandler(b,function(b,c,e,g,k){return this.jmSample(a,"cycles",g,k)}.bind(this))},tilerSample:function(b,a,c,d){return this.hwcSample("mali:tiler","Tiler: "+b,a,c,d)},addTilerCounter:function(b,a){this.importer.registerEventHandler(b,
function(b,c,e,g,k){return this.tilerSample(a,"count",g,k)}.bind(this))},addTilerCycles:function(b,a){this.importer.registerEventHandler(b,function(b,c,e,g,k){return this.tilerSample(a,"cycles",g,k)}.bind(this))},fragSample:function(b,a,c,d){return this.hwcSample("mali:fragment","Fragment: "+b,a,c,d)},addFragCounter:function(b,a){this.importer.registerEventHandler(b,function(b,c,e,g,k){return this.fragSample(a,"count",g,k)}.bind(this))},addFragCycles:function(b,a){this.importer.registerEventHandler(b,
function(b,c,e,g,k){return this.fragSample(a,"cycles",g,k)}.bind(this))},computeSample:function(b,a,c,d){return this.hwcSample("mali:compute","Compute: "+b,a,c,d)},addComputeCounter:function(b,a){this.importer.registerEventHandler(b,function(b,c,e,g,k){return this.computeSample(a,"count",g,k)}.bind(this))},addComputeCycles:function(b,a){this.importer.registerEventHandler(b,function(b,c,e,g,k){return this.computeSample(a,"cycles",g,k)}.bind(this))},addTripipeCycles:function(b,a){this.importer.registerEventHandler(b,
function(b,c,e,g,k){return this.hwcSample("mali:shader","Tripipe: "+a,"cycles",g,k)}.bind(this))},arithSample:function(b,a,c,d){return this.hwcSample("mali:arith","Arith: "+b,a,c,d)},addArithCounter:function(b,a){this.importer.registerEventHandler(b,function(b,c,e,g,k){return this.arithSample(a,"count",g,k)}.bind(this))},addArithCycles:function(b,a){this.importer.registerEventHandler(b,function(b,c,e,g,k){return this.arithSample(a,"cycles",g,k)}.bind(this))},addLSCounter:function(b,a){this.importer.registerEventHandler(b,
function(b,c,e,g,k){return this.hwcSample("mali:ls","LS: "+a,"count",g,k)}.bind(this))},textureSample:function(b,a,c,d){return this.hwcSample("mali:texture","Texture: "+b,a,c,d)},addTexCounter:function(b,a){this.importer.registerEventHandler(b,function(b,c,e,g,k){return this.textureSample(a,"count",g,k)}.bind(this))},addLSCCounter:function(b,a){this.importer.registerEventHandler(b,function(b,c,e,g,k){return this.hwcSample("mali:lsc","LSC: "+a,"count",g,k)}.bind(this))},addAXICounter:function(b,a){this.importer.registerEventHandler(b,
function(b,c,e,g,k){return this.hwcSample("mali:axi","AXI: "+a,"count",g,k)}.bind(this))},mmuSample:function(b,a,c,d){return this.hwcSample("mali:mmu","MMU: "+b,a,c,d)},addMMUCounter:function(b,a){this.importer.registerEventHandler(b,function(b,c,e,g,k){return this.mmuSample(a,"count",g,k)}.bind(this))},addMMUCycles:function(b,a){this.importer.registerEventHandler(b,function(b,c,e,g,k){return this.mmuSample(a,"cycles",g,k)}.bind(this))},l2Sample:function(b,a,c,d){return this.hwcSample("mali:l2","L2: "+
b,a,c,d)},addL2Counter:function(b,a){this.importer.registerEventHandler(b,function(b,c,e,g,k){return this.l2Sample(a,"count",g,k)}.bind(this))},addL2Cycles:function(b,a){this.importer.registerEventHandler(b,function(b,c,e,g,k){return this.l2Sample(a,"cycles",g,k)}.bind(this))}};c.register(e);return{MaliParser:e}});"use strict";
tv.exportTo("tv.e.importer.linux_perf",function(){function e(a){c.call(this,a);a.registerEventHandler("mm_vmscan_kswapd_wake",e.prototype.kswapdWake.bind(this));a.registerEventHandler("mm_vmscan_kswapd_sleep",e.prototype.kswapdSleep.bind(this));a.registerEventHandler("mm_vmscan_direct_reclaim_begin",e.prototype.reclaimBegin.bind(this));a.registerEventHandler("mm_vmscan_direct_reclaim_end",e.prototype.reclaimEnd.bind(this))}var c=tv.e.importer.linux_perf.Parser,b=/nid=(\d+) order=(\d+)/,a=/order=(\d+) may_writepage=\d+ gfp_flags=(.+)/,
f=/nr_reclaimed=(\d+)/;e.prototype={__proto__:c.prototype,openAsyncSlice:function(a,b,c,e,f,m){c=this.importer.getOrCreateKernelThread(b+":"+c,e);a=new tv.c.trace_model.AsyncSlice(b,m,tv.c.getColorIdForGeneralPurposeString(m),a);a.startThread=c.thread;c.openAsyncSlices||(c.openAsyncSlices={});c.openAsyncSlices[f]=a},closeAsyncSlice:function(a,b,c,e,f,m){c=this.importer.getOrCreateKernelThread(b+":"+c,e);if(c.openAsyncSlices&&(e=c.openAsyncSlices[f]))e.duration=a-e.start,e.args=m,e.endThread=c.thread,
e.subSlices=[new tv.c.trace_model.Slice(b,e.title,e.colorId,e.start,e.args,e.duration)],c.thread.asyncSliceGroup.push(e),delete c.openAsyncSlices[f]},kswapdWake:function(a,c,e,f,l){a=b.exec(l.details);if(!a)return!1;parseInt(a[1]);a=parseInt(a[2]);e=this.importer.getOrCreateKernelThread("kswapd: "+l.threadName,e,e);e.openSliceTS?a>e.order&&(e.order=a):(e.openSliceTS=f,e.order=a);return!0},kswapdSleep:function(a,b,c,e,f){a=this.importer.getOrCreateKernelThread("kswapd: "+f.threadName,c,c);a.openSliceTS&&
(e=new tv.c.trace_model.Slice("",f.threadName,tv.b.ui.getColorIdForGeneralPurposeString(f.threadName),a.openSliceTS,{order:a.order},e-a.openSliceTS),a.thread.sliceGroup.pushSlice(e));a.openSliceTS=void 0;a.order=void 0;return!0},reclaimBegin:function(b,c,e,f,l){c=a.exec(l.details);if(!c)return!1;b=parseInt(c[1]);c=c[2];e=this.importer.getOrCreateKernelThread("direct reclaim: "+l.threadName,e,e);e.openSliceTS=f;e.order=b;e.gfp=c;return!0},reclaimEnd:function(a,b,c,e,l){a=f.exec(l.details);if(!a)return!1;
a=parseInt(a[1]);c=this.importer.getOrCreateKernelThread("direct reclaim: "+l.threadName,c,c);void 0!==c.openSliceTS&&(e=new tv.c.trace_model.Slice("","direct reclaim",tv.b.ui.getColorIdForGeneralPurposeString(l.threadName),c.openSliceTS,{order:c.order,gfp:c.gfp,nr_reclaimed:a},e-c.openSliceTS),c.thread.sliceGroup.pushSlice(e));c.openSliceTS=void 0;c.order=void 0;c.gfp=void 0;return!0}};c.register(e);return{MemReclaimParser:e}});"use strict";
tv.exportTo("tv.e.importer.linux_perf",function(){function e(b){c.call(this,b);b.registerEventHandler("power_start",e.prototype.powerStartEvent.bind(this));b.registerEventHandler("power_frequency",e.prototype.powerFrequencyEvent.bind(this));b.registerEventHandler("cpu_frequency",e.prototype.cpuFrequencyEvent.bind(this));b.registerEventHandler("cpu_idle",e.prototype.cpuIdleEvent.bind(this))}var c=tv.e.importer.linux_perf.Parser;e.prototype={__proto__:c.prototype,cpuStateSlice:function(b,a,c,d){a=this.importer.getOrCreateCpu(a);
"1"!=c?this.importer.model.importWarning({type:"parse_error",message:"Don't understand power_start events of type "+c}):(c=a.getOrCreateCounter("","C-State"),0===c.numSeries&&c.addSeries(new tv.c.trace_model.CounterSeries("state",tv.b.ui.getColorIdForGeneralPurposeString(c.name+".state"))),c.series.forEach(function(a){a.addCounterSample(b,d)}))},cpuIdleSlice:function(b,a,c){a=this.importer.getOrCreateCpu(a).getOrCreateCounter("","C-State");0===a.numSeries&&a.addSeries(new tv.c.trace_model.CounterSeries("state",
tv.b.ui.getColorIdForGeneralPurposeString(a.name)));var d=4294967295!=c?c+1:0;a.series.forEach(function(a){a.addCounterSample(b,d)})},cpuFrequencySlice:function(b,a,c){a=this.importer.getOrCreateCpu(a).getOrCreateCounter("","Clock Frequency");0===a.numSeries&&a.addSeries(new tv.c.trace_model.CounterSeries("state",tv.b.ui.getColorIdForGeneralPurposeString(a.name+".state")));a.series.forEach(function(a){a.addCounterSample(b,c)})},powerStartEvent:function(b,a,c,d,e){b=/type=(\d+) state=(\d) cpu_id=(\d)+/.exec(e.details);
if(!b)return!1;a=parseInt(b[3]);c=parseInt(b[2]);this.cpuStateSlice(d,a,b[1],c);return!0},powerFrequencyEvent:function(b,a,c,d,e){a=/type=(\d+) state=(\d+) cpu_id=(\d)+/.exec(e.details);if(!a)return!1;b=parseInt(a[3]);a=parseInt(a[2]);this.cpuFrequencySlice(d,b,a);return!0},cpuFrequencyEvent:function(b,a,c,d,e){a=/state=(\d+) cpu_id=(\d)+/.exec(e.details);if(!a)return!1;b=parseInt(a[2]);a=parseInt(a[1]);this.cpuFrequencySlice(d,b,a);return!0},cpuIdleEvent:function(b,a,c,d,e){a=/state=(\d+) cpu_id=(\d)+/.exec(e.details);
if(!a)return!1;b=parseInt(a[2]);a=parseInt(a[1]);this.cpuIdleSlice(d,b,a);return!0}};c.register(e);return{PowerParser:e}});"use strict";
tv.exportTo("tv.e.importer.linux_perf",function(){function e(a){c.call(this,a);a.registerEventHandler("regulator_enable",e.prototype.regulatorEnableEvent.bind(this));a.registerEventHandler("regulator_enable_delay",e.prototype.regulatorEnableDelayEvent.bind(this));a.registerEventHandler("regulator_enable_complete",e.prototype.regulatorEnableCompleteEvent.bind(this));a.registerEventHandler("regulator_disable",e.prototype.regulatorDisableEvent.bind(this));a.registerEventHandler("regulator_disable_complete",
e.prototype.regulatorDisableCompleteEvent.bind(this));a.registerEventHandler("regulator_set_voltage",e.prototype.regulatorSetVoltageEvent.bind(this));a.registerEventHandler("regulator_set_voltage_complete",e.prototype.regulatorSetVoltageCompleteEvent.bind(this));this.model_=a.model_}var c=tv.e.importer.linux_perf.Parser,b=/name=(.+)/,a=/name=(.+)/,f=/name=(\S+), val=(\d+)/;e.prototype={__proto__:c.prototype,getCtr_:function(a,b){var c=this.model_.kernel.getOrCreateCounter(null,"vreg "+a+" "+b);void 0===
c.series[0]&&c.addSeries(new tv.c.trace_model.CounterSeries(b,tv.b.ui.getColorIdForGeneralPurposeString(a+"."+b)));return c},regulatorEnableEvent:function(a,c,e,f,l){a=b.exec(l.details);if(!a)return!1;this.getCtr_(a[1],"enabled").series[0].addCounterSample(f,1);return!0},regulatorEnableDelayEvent:function(a,b,c,e,f){return!0},regulatorEnableCompleteEvent:function(a,b,c,e,f){return!0},regulatorDisableEvent:function(b,c,e,f,l){b=a.exec(l.details);if(!b)return!1;this.getCtr_(b[1],"enabled").series[0].addCounterSample(f,
0);return!0},regulatorDisableCompleteEvent:function(a,b,c,e,f){return!0},regulatorSetVoltageEvent:function(a,b,c,e,f){return!0},regulatorSetVoltageCompleteEvent:function(a,b,c,e,l){b=f.exec(l.details);if(!b)return!1;a=b[1];b=parseInt(b[2]);this.getCtr_(a,"voltage").series[0].addCounterSample(e,b);return!0}};c.register(e);return{RegulatorParser:e}});"use strict";
tv.exportTo("tv.e.importer.linux_perf",function(){function e(a){c.call(this,a);a.registerEventHandler("sched_switch",e.prototype.schedSwitchEvent.bind(this));a.registerEventHandler("sched_wakeup",e.prototype.schedWakeupEvent.bind(this))}var c=tv.e.importer.linux_perf.Parser,b={},a=RegExp("prev_comm=(.+) prev_pid=(\\d+) prev_prio=(\\d+) prev_state=(\\S\\+?|\\S\\|\\S) ==> next_comm=(.+) next_pid=(\\d+) next_prio=(\\d+)");b.schedSwitchRE=a;var f=/comm=(.+) pid=(\d+) prio=(\d+) success=(\d+) target_cpu=(\d+)/;
b.schedWakeupRE=f;e.prototype={__proto__:c.prototype,schedSwitchEvent:function(b,c,e,f,l){var m=a.exec(l.details);if(!m)return!1;b=m[4];e=m[5];l=parseInt(m[6]);var m=parseInt(m[7]),n=this.importer.threadsByLinuxPid[l],n=n?n.userFriendlyName:e;this.importer.getOrCreateCpu(c).switchActiveThread(f,{stateWhenDescheduled:b},l,n,{comm:e,tid:l,prio:m});return!0},schedWakeupEvent:function(a,b,c,e,l){l=f.exec(l.details);if(!l)return!1;a=c;b=l[1];c=parseInt(l[2]);l=parseInt(l[3]);this.importer.markPidRunnable(e,
c,b,l,a);return!0}};c.register(e);return{SchedParser:e,_SchedParserTestExports:b}});"use strict";
tv.exportTo("tv.e.importer.linux_perf",function(){function e(a){c.call(this,a);a.registerEventHandler("sync_timeline",e.prototype.timelineEvent.bind(this));a.registerEventHandler("sync_wait",e.prototype.syncWaitEvent.bind(this));a.registerEventHandler("sync_pt",e.prototype.syncPtEvent.bind(this));this.model_=a.model_}var c=tv.e.importer.linux_perf.Parser,b=/name=(\S+) value=(\S*)/,a=/(\S+) name=(\S+) state=(\d+)/,f=/name=(\S+) value=(\S*)/;e.prototype={__proto__:c.prototype,timelineEvent:function(a,
c,e,f,l){a=b.exec(l.details);if(!a)return!1;c=this.importer.getOrCreatePseudoThread(a[1]);void 0!==c.lastActiveTs&&(e=f-c.lastActiveTs,l=c.lastActiveValue,void 0==l&&(l=" "),e=new tv.c.trace_model.Slice("",l,tv.b.ui.getColorIdForGeneralPurposeString(l),c.lastActiveTs,{},e),c.thread.sliceGroup.pushSlice(e));c.lastActiveTs=f;c.lastActiveValue=a[2];return!0},syncWaitEvent:function(b,c,e,f,l){b=a.exec(l.details);if(!b||void 0===l.tgid)return!1;c=parseInt(l.tgid);e=this.model_.getOrCreateProcess(c).getOrCreateThread(e);
e.name=l.threadName;l=e.kernelSliceGroup;if(!l.isTimestampValidForBeginOrEnd(f))return this.model_.importWarning({type:"parse_error",message:"Timestamps are moving backward."}),!1;e='fence_wait("'+b[2]+'")';if("begin"==b[1])l.beginSlice(null,e,f,{"Start state":b[3]});else if("end"==b[1])0<l.openSliceCount&&l.endSlice(f);else return!1;return!0},syncPtEvent:function(a,b,c,e,l){return!f.exec(l.details)?!1:!0}};c.register(e);return{SyncParser:e}});"use strict";
tv.exportTo("tv.e.importer.linux_perf",function(){function e(a){c.call(this,a);a.registerEventHandler("workqueue_execute_start",e.prototype.executeStartEvent.bind(this));a.registerEventHandler("workqueue_execute_end",e.prototype.executeEndEvent.bind(this));a.registerEventHandler("workqueue_queue_work",e.prototype.executeQueueWork.bind(this));a.registerEventHandler("workqueue_activate_work",e.prototype.executeActivateWork.bind(this))}var c=tv.e.importer.linux_perf.Parser,b=/work struct (.+): function (\S+)/,
a=/work struct (.+)/;e.prototype={__proto__:c.prototype,executeStartEvent:function(a,c,e,g,k){a=b.exec(k.details);if(!a)return!1;e=this.importer.getOrCreateKernelThread(k.threadName,e,e);e.openSliceTS=g;e.openSlice=a[2];return!0},executeEndEvent:function(b,c,e,g,k){if(!a.exec(k.details))return!1;b=this.importer.getOrCreateKernelThread(k.threadName,e,e);b.openSlice&&(g=new tv.c.trace_model.Slice("",b.openSlice,tv.b.ui.getColorIdForGeneralPurposeString(b.openSlice),b.openSliceTS,{},g-b.openSliceTS),
b.thread.sliceGroup.pushSlice(g));b.openSlice=void 0;return!0},executeQueueWork:function(a,b,c,e,k){return!0},executeActivateWork:function(a,b,c,e,k){return!0}};c.register(e);return{WorkqueueParser:e}});"use strict";
tv.exportTo("tv.e.importer.linux_perf",function(){function e(a){b.call(this,a);a.registerEventHandler("tracing_mark_write:android",e.prototype.traceMarkWriteAndroidEvent.bind(this));a.registerEventHandler("0:android",e.prototype.traceMarkWriteAndroidEvent.bind(this));this.model_=a.model_;this.ppids_={}}function c(a){var b={};if(a){a=a.split(";");for(var c=0;c<a.length;++c){var e=a[c].split("=");e[0]&&(b[e.shift()]=e.join("="))}}return b}var b=tv.e.importer.linux_perf.Parser;e.prototype={__proto__:b.prototype,
openAsyncSlice:function(a,b,c,e,g,k){g=new (tv.c.trace_model.AsyncSlice.getConstructor(b,c))(b,c,tv.b.ui.getColorIdForGeneralPurposeString(c),g,k);g.id=e;g.startThread=a;this.openAsyncSlices||(this.openAsyncSlices={});this.openAsyncSlices[b+":"+c+":"+e]=g},closeAsyncSlice:function(a,b,c,e,g,k){if(this.openAsyncSlices&&(b=b+":"+c+":"+e,c=this.openAsyncSlices[b])){for(var l in k)void 0!==c.args[l]&&this.model_.importWarning({type:"parse_error",message:"Both the S and F events of "+c.title+" provided values for argument "+
l+". The value of the F event will be used."}),c.args[l]=k[l];c.endThread=a;c.duration=g-c.start;c.startThread.asyncSliceGroup.push(c);c.subSlices=[new tv.c.trace_model.Slice(c.category,c.title,c.colorId,c.start,c.args,c.duration)];delete this.openAsyncSlices[b]}},traceMarkWriteAndroidEvent:function(a,b,d,e,g){b=g.details.split("|");switch(b[0]){case "B":var k=parseInt(b[1]),l=b[2];a=c(b[3]);b=b[4];void 0===b&&(b="android");var m=this.model_.getOrCreateProcess(k).getOrCreateThread(d);m.name=g.threadName;
if(!m.sliceGroup.isTimestampValidForBeginOrEnd(e))return this.model_.importWarning({type:"parse_error",message:"Timestamps are moving backward."}),!1;this.ppids_[d]=k;m.sliceGroup.beginSlice(b,l,e,a);break;case "E":k=this.ppids_[d];if(void 0===k)break;m=this.model_.getOrCreateProcess(k).getOrCreateThread(d);if(!m.sliceGroup.openSliceCount)break;d=m.sliceGroup.endSlice(e);a=c(b[3]);for(l in a)void 0!==d.args[l]&&this.model_.importWarning({type:"parse_error",message:"Both the B and E events of "+d.title+
" provided values for argument "+l+". The value of the E event will be used."}),d.args[l]=a[l];break;case "C":var k=parseInt(b[1]),l=b[2],n=parseInt(b[3]);b=b[4];void 0===b&&(b="android");d=this.model_.getOrCreateProcess(k).getOrCreateCounter(b,l);0===d.numSeries&&d.addSeries(new tv.c.trace_model.CounterSeries(n,tv.b.ui.getColorIdForGeneralPurposeString(d.name+".value")));d.series.forEach(function(a){a.addCounterSample(e,n)});break;case "S":var k=parseInt(b[1]),l=b[2],q=parseInt(b[3]);a=c(b[4]);b=
b[5];void 0===b&&(b="android");m=this.model_.getOrCreateProcess(k).getOrCreateThread(d);m.name=g.threadName;this.ppids_[d]=k;this.openAsyncSlice(m,b,l,q,e,a);break;case "F":k=parseInt(b[1]);l=b[2];q=parseInt(b[3]);a=c(b[4]);b=b[5];void 0===b&&(b="android");m=this.model_.getOrCreateProcess(k).getOrCreateThread(d);m.name=g.threadName;this.ppids_[d]=k;this.closeAsyncSlice(m,b,l,q,e,a);break;default:return!1}return!0}};b.register(e);return{AndroidParser:e}});"use strict";
tv.exportTo("tv.e.importer.linux_perf",function(){function e(a){c.call(this,a);a.registerEventHandler("graph_ent",e.prototype.traceKernelFuncEnterEvent.bind(this));a.registerEventHandler("graph_ret",e.prototype.traceKernelFuncReturnEvent.bind(this));this.model_=a.model_;this.ppids_={}}var c=tv.e.importer.linux_perf.Parser,b=/func=(.+)/;e.prototype={__proto__:c.prototype,traceKernelFuncEnterEvent:function(a,c,d,e,g){a=b.exec(g.details);if(!a||void 0===g.tgid)return!1;c=parseInt(g.tgid);a=a[1];d=this.model_.getOrCreateProcess(c).getOrCreateThread(d);
d.name=g.threadName;g=d.kernelSliceGroup;if(!g.isTimestampValidForBeginOrEnd(e))return this.model_.importWarning({type:"parse_error",message:"Timestamps are moving backward."}),!1;g.beginSlice(null,a,e,{});return!0},traceKernelFuncReturnEvent:function(a,b,c,e,g){if(void 0===g.tgid)return!1;a=parseInt(g.tgid);c=this.model_.getOrCreateProcess(a).getOrCreateThread(c);c.name=g.threadName;g=c.kernelSliceGroup;if(!g.isTimestampValidForBeginOrEnd(e))return this.model_.importWarning({type:"parse_error",message:"Timestamps are moving backward."}),
!1;0<g.openSliceCount&&g.endSlice(e);return!0}};c.register(e);return{KernelFuncParser:e}});"use strict";
tv.exportTo("tv.c.importer",function(){function e(c){this.lines_=c.split("\n");this.curLine_=0;this.savedLines_=void 0}e.prototype={advanceToLineMatching:function(c){for(;this.curLine_<this.lines_.length;this.curLine_++){var b=this.lines_[this.curLine_];void 0!==this.savedLines_&&this.savedLines_.push(b);if(c.test(b))return!0}return!1},get curLineNumber(){return this.curLine_},beginSavingLines:function(){this.savedLines_=[]},endSavingLinesAndGetResult:function(){var c=this.savedLines_;this.savedLines_=
void 0;return c}};return{SimpleLineReader:e}});"use strict";
tv.exportTo("tv.e.importer.linux_perf",function(){function e(a,b){this.importPriority=2;this.model_=a;this.events_=b;this.newlyAddedClockSyncRecords_=[];this.wakeups_=[];this.kernelThreadStates_={};this.buildMapFromLinuxPidsToThreads();this.lines_=[];this.pseudoThreadCounter=1;this.parsers_=[];this.eventHandlers_={}}function c(a){return"{"==a[0]?!1:d.test(a)?h:g.test(a)?k:l.test(a)?m:null}var b=tv.c.importer.Importer,a=tv.c.ClockSyncRecord,f={},d=RegExp("^\\s*(.+)-(\\d+)\\s+\\(\\s*(\\d+|-+)\\)\\s\\[(\\d+)\\]\\s+[dX.][N.][Hhs.][0-9a-f.]\\s+(\\d+\\.\\d+):\\s+(\\S+):\\s(.*)$"),
h=function(a){a=d.exec(a);if(!a)return a;var b=a[3];"-"===b[0]&&(b=void 0);return{threadName:a[1],pid:a[2],tgid:b,cpuNumber:a[4],timestamp:a[5],eventName:a[6],details:a[7]}};f.lineParserWithTGID=h;var g=/^\s*(.+)-(\d+)\s+\[(\d+)\]\s+[dX.][N.][Hhs.][0-9a-f.]\s+(\d+\.\d+):\s+(\S+):\s(.*)$/,k=function(a){a=g.exec(a);return!a?a:{threadName:a[1],pid:a[2],cpuNumber:a[3],timestamp:a[4],eventName:a[5],details:a[6]}};f.lineParserWithIRQInfo=k;var l=/^\s*(.+)-(\d+)\s+\[(\d+)\]\s*(\d+\.\d+):\s+(\S+):\s(.*)$/,
m=function(a){a=l.exec(a);return!a?a:{threadName:a[1],pid:a[2],cpuNumber:a[3],timestamp:a[4],eventName:a[5],details:a[6]}};f.lineParserWithLegacyFmt=m;var n=/trace_event_clock_sync: parent_ts=(\d+\.?\d*)/;f.traceEventClockSyncRE=n;var q=/trace_event_clock_sync: name=(\w+)/;f.autoDetectLineParser=c;e.canImport=function(a){if(!("string"===typeof a||a instanceof String))return!1;if(e._extractEventsFromSystraceHTML(a,!1).ok||/^# tracer:/.test(a))return!0;var b=/^(.+)\n/.exec(a);b&&(a=b[1]);return c(a)?
!0:!1};e._extractEventsFromSystraceHTML=function(a,b){function c(a,b){return-1===a.indexOf(b,a.length-b.length)?a:a.substring(a,a.length-b.length)}var d={ok:!1};void 0===b&&(b=!0);if(!1==/^<!DOCTYPE HTML>/.test(a))return d;var e=new tv.c.importer.SimpleLineReader(a);if(!e.advanceToLineMatching(/^  <script>$/)||!e.advanceToLineMatching(/^  var linuxPerfData = "\\$/))return d;var f=e.curLineNumber+1;e.beginSavingLines();if(!e.advanceToLineMatching(/^  <\/script>$/))return d;var g=e.endSavingLinesAndGetResult(),
g=g.slice(1,g.length-1);if(!e.advanceToLineMatching(/^<\/body>$/)||!e.advanceToLineMatching(/^<\/html>$/))return d;e=[];if(b)for(var h=0;h<g.length;h++){var k=g[h],k=c(k,"\\n\\");e.push(k)}else e=[g[g.length-1]];g=e[e.length-1];h=c(g,'\\n";');if(h==g)return d;e[e.length-1]=h;return{ok:!0,lines:b?e:void 0,events_begin_at_line:f}};e.prototype={__proto__:b.prototype,get model(){return this.model_},buildMapFromLinuxPidsToThreads:function(){this.threadsByLinuxPid={};this.model_.getAllThreads().forEach(function(a){this.threadsByLinuxPid[a.tid]=
a}.bind(this))},getOrCreateCpu:function(a){return this.model_.kernel.getOrCreateCpu(a)},getOrCreateKernelThread:function(a,b,c){this.kernelThreadStates_[a]||(c=this.model_.getOrCreateProcess(b).getOrCreateThread(c),c.name=a,this.kernelThreadStates_[a]={pid:b,thread:c,openSlice:void 0,openSliceTS:void 0},this.threadsByLinuxPid[b]=c);return this.kernelThreadStates_[a]},getOrCreatePseudoThread:function(a){var b=this.kernelThreadStates_[a];b||(b=this.getOrCreateKernelThread(a,0,this.pseudoThreadCounter),
this.pseudoThreadCounter++);return b},importEvents:function(a){this.parsers_=this.createParsers_();this.registerDefaultHandlers_();this.parseLines();this.importClockSyncRecords();a=this.computeTimeTransform();void 0===a?this.model_.importWarning({type:"clock_sync",message:"Cannot import kernel trace without a clock sync."}):(this.shiftNewlyAddedClockSyncRecords(a),this.importCpuData(a),this.buildMapFromLinuxPidsToThreads(),this.buildPerThreadCpuSlicesFromCpuState(),this.computeCpuTimestampsForSlicesAsNeeded())},
buildPerThreadCpuSlicesFromCpuState:function(){for(var a in this.model_.kernel.cpus)for(var b=this.model_.kernel.cpus[a],c=0;c<b.slices.length;c++){var d=b.slices[c],e=this.threadsByLinuxPid[d.args.tid];e&&(d.threadThatWasRunning=e,e.tempCpuSlices||(e.tempCpuSlices=[]),e.tempCpuSlices.push(d))}for(c in this.wakeups_)if(a=this.wakeups_[c],e=this.threadsByLinuxPid[a.tid])e.tempWakeups=e.tempWakeups||[],e.tempWakeups.push(a);var c=tv.b.ui.getColorIdForReservedName,f=c("thread_state_running"),g=c("thread_state_runnable"),
h=c("thread_state_sleeping"),k=c("thread_state_iowait"),l=c("thread_state_unknown");this.model_.getAllThreads().forEach(function(a){if(void 0!==a.tempCpuSlices){var b=a.tempCpuSlices;delete a.tempCpuSlices;b.sort(function(a,b){return a.start-b.start});var c=a.tempWakeups||[];delete a.tempWakeups;c.sort(function(a,b){return a.ts-b.ts});var d=[];if(b.length){var e=b[0];if(c.length&&c[0].ts<e.start){var m=c.shift();d.push(new tv.c.trace_model.ThreadTimeSlice(a,"","Runnable",g,m.ts,{"wakeup from tid":m.fromTid},
e.start-m.ts))}var n=new tv.c.trace_model.ThreadTimeSlice(a,"","Running",f,e.start,{},e.duration);n.cpuOnWhichThreadWasRunning=e.cpu;d.push(n)}m=void 0;for(e=1;e<b.length;e++){for(var q=b[e-1],s=b[e],w=s.start-q.end;c.length&&c[0].ts<s.start;)n=c.shift(),void 0===m&&n.ts>q.end&&(m=n);n=function(b,c){void 0!==m&&(w=m.ts-q.end);d.push(new tv.c.trace_model.ThreadTimeSlice(a,"",b,c,q.end,{},w));void 0!==m&&(d.push(new tv.c.trace_model.ThreadTimeSlice(a,"","Runnable",g,m.ts,{"wakeup from tid":m.fromTid},
s.start-m.ts)),m=void 0)};"S"==q.args.stateWhenDescheduled?n("Sleeping",h):"R"==q.args.stateWhenDescheduled||"R+"==q.args.stateWhenDescheduled?d.push(new tv.c.trace_model.ThreadTimeSlice(a,"","Runnable",g,q.end,{},w)):"D"==q.args.stateWhenDescheduled?n("Uninterruptible Sleep",k):"T"==q.args.stateWhenDescheduled?d.push(new tv.c.trace_model.ThreadTimeSlice(a,"","__TASK_STOPPED",k,q.end,{},w)):"t"==q.args.stateWhenDescheduled?d.push(new tv.c.trace_model.ThreadTimeSlice(a,"","debug",k,q.end,{},w)):"Z"==
q.args.stateWhenDescheduled?d.push(new tv.c.trace_model.ThreadTimeSlice(a,"","Zombie",k,q.end,{},w)):"X"==q.args.stateWhenDescheduled?d.push(new tv.c.trace_model.ThreadTimeSlice(a,"","Exit Dead",k,q.end,{},w)):"x"==q.args.stateWhenDescheduled?d.push(new tv.c.trace_model.ThreadTimeSlice(a,"","Task Dead",k,q.end,{},w)):"K"==q.args.stateWhenDescheduled?d.push(new tv.c.trace_model.ThreadTimeSlice(a,"","Wakekill",k,q.end,{},w)):"W"==q.args.stateWhenDescheduled?d.push(new tv.c.trace_model.ThreadTimeSlice(a,
"","Waking",k,q.end,{},w)):"D|K"==q.args.stateWhenDescheduled?n("Uninterruptible Sleep | WakeKill",k):"D|W"==q.args.stateWhenDescheduled?n("Uninterruptible Sleep | Waking",k):(d.push(new tv.c.trace_model.ThreadTimeSlice(a,"","UNKNOWN",l,q.end,{},w)),this.model_.importWarning({type:"parse_error",message:"Unrecognized sleep state: "+q.args.stateWhenDescheduled}));n=new tv.c.trace_model.ThreadTimeSlice(a,"","Running",f,s.start,{},s.duration);n.cpuOnWhichThreadWasRunning=q.cpu;d.push(n)}a.timeSlices=
d}},this)},computeCpuTimestampsForSlicesAsNeeded:function(){},computeTimeTransform:function(){var a=0!==this.model.getClockSyncRecordsNamed("linux_perf_importer").length,b=this.model_.getClockSyncRecordsNamed("monotonic");if(0==b.length)return a?void 0:0;a=b[0].args;return 0==a.parentTS||a.parentTS==a.perfTS?0:a.parentTS-a.perfTS},createParsers_:function(){return tv.e.importer.linux_perf.Parser.getAllRegisteredTypeInfos().map(function(a){return new a.constructor(this)},this)},registerDefaultHandlers_:function(){this.registerEventHandler("tracing_mark_write",
e.prototype.traceMarkingWriteEvent.bind(this));this.registerEventHandler("0",e.prototype.traceMarkingWriteEvent.bind(this));this.registerEventHandler("tracing_mark_write:trace_event_clock_sync",function(){return!0});this.registerEventHandler("0:trace_event_clock_sync",function(){return!0})},registerEventHandler:function(a,b){this.eventHandlers_[a]=b},markPidRunnable:function(a,b,c,d,e){this.wakeups_.push({ts:a,tid:b,fromTid:e})},traceClockSyncEvent:function(b,c,d,e,f){if(b=/name=(\w+?)\s(.+)/.exec(f.details)){f=
b[1];b=b[2].split(" ");c={perfTS:e};for(d=0;d<b.length;d++){var g=b[d].split("=");if(2!=g.length)throw Error("omgbbq");c[g[0]]=g[1]}this.addClockSyncRecord(new a(f,e,c));return!0}b=/parent_ts=(\d+\.?\d*)/.exec(f.details);if(!b)return!1;this.addClockSyncRecord(new a("monotonic",e,{perfTS:e,parentTS:1E3*b[1]}));return!0},traceMarkingWriteEvent:function(a,b,c,d,e,f){e.details=e.details.replace(/\\n.*$/,"");var g=/^\s*(\w+):\s*(.*)$/.exec(e.details);if(g)e.subEventName=g[1],e.details=g[2];else if(g=e.details.substring(0,
2),"B|"==g||"E"==g||"E|"==g||"X|"==g||"C|"==g||"S|"==g||"F|"==g)e.subEventName="android";else return!1;a=a+":"+e.subEventName;g=this.eventHandlers_[a];return!g?(this.model_.importWarning({type:"parse_error",message:"Unknown trace_marking_write event "+a}),!0):g(a,b,c,d,e,f)},importClockSyncRecords:function(){this.forEachLine(function(a,b,c,d,e){a=b.eventName;"tracing_mark_write"!==a&&"0"!==a||(n.exec(b.details)&&this.traceClockSyncEvent(a,c,d,e,b),q.exec(b.details)&&this.traceClockSyncEvent(a,c,d,
e,b))}.bind(this))},addClockSyncRecord:function(a){this.newlyAddedClockSyncRecords_.push(a);this.model_.clockSyncRecords.push(a)},shiftNewlyAddedClockSyncRecords:function(a){this.newlyAddedClockSyncRecords_.forEach(function(b){b.ts+=a})},importCpuData:function(a){this.forEachLine(function(b,c,d,e,f){var g=c.eventName,h=this.eventHandlers_[g];h?(f+=a,h(g,d,e,f,c)||this.model_.importWarning({type:"parse_error",message:"Malformed "+g+" event ("+b+")"})):this.model_.importWarning({type:"parse_error",
message:"Unknown event "+g+" ("+b+")"})}.bind(this))},parseLines:function(){for(var a=e._extractEventsFromSystraceHTML(this.events_,!0),a=a.ok?a.lines:this.events_.split("\n"),b=null,d=0;d<a.length;++d){var f=a[d];if(!(0==f.length||/^#/.test(f))){if(null==b&&(b=c(f),null==b)){this.model_.importWarning({type:"parse_error",message:"Cannot parse line: "+f});continue}var g=b(f);g?this.lines_.push([f,g,parseInt(g.cpuNumber),parseInt(g.pid),1E3*parseFloat(g.timestamp)]):this.model_.importWarning({type:"parse_error",
message:"Unrecognized line: "+f})}}},forEachLine:function(a){for(var b=0;b<this.lines_.length;++b)a.apply(this,this.lines_[b])}};tv.c.importer.Importer.register(e);return{LinuxPerfImporter:e,_LinuxPerfImporterTestExports:f}});"use strict";
tv.exportTo("tv.e.audits",function(){function e(c,b){this.modelHelper=c;this.process=b}e.prototype={get pid(){return this.process.pid},getFrameEventsInRange:function(c,b){var a;a="main_frametime_type"==c?"BenchmarkInstrumentation::MainThreadRenderingStats":"BenchmarkInstrumentation::ImplThreadRenderingStats";var e=[];this.process.iterateAllEvents(function(c){c.title===a&&b.intersectsExplicitRange(c.start,c.end)&&e.push(c)});e.sort(function(a,b){return a.start-b.start});return e}};return{ChromeProcessHelper:e,
MAIN_FRAMETIME_TYPE:"main_frametime_type",IMPL_FRAMETIME_TYPE:"impl_frametime_type",getSlicesIntersectingRange:function(c,b){for(var a=[],e=0;e<b.length;e++){var d=b[e];c.intersectsExplicitRange(d.start,d.end)&&a.push(d)}return a},getFrametimeDataFromEvents:function(c){for(var b=[],a=1;a<c.length;a++)b.push({x:c[a].start,frametime:c[a].start-c[a-1].start});return b}}});"use strict";
tv.exportTo("tv.e.audits",function(){function e(c,b){tv.e.audits.ChromeProcessHelper.call(this,c,b)}e.prototype={__proto__:tv.e.audits.ChromeProcessHelper.prototype,getLoadingEventsInRange:function(c){var b=[];tv.b.iterItems(this.process.threads,function(a,e){e.iterateAllEvents(function(a){0===a.title.indexOf("WebContentsImpl Loading")&&c.intersectsExplicitRange(a.start,a.end)&&b.push(a)})});return b},get hasLatencyEvents(){var c=!1;this.modelHelper.model.getAllThreads().forEach(function(b){b.iterateAllEvents(function(a){0===
a.title.indexOf("InputLatency")&&(c=!0)})});return c},getLatencyEventsInRange:function(c){var b=[];this.modelHelper.model.getAllThreads().forEach(function(a){a.iterateAllEvents(function(a){0===a.title.indexOf("InputLatency")&&c.intersectsExplicitRange(a.start,a.end)&&b.push(a)})});return b},getLatencyDataInRange:function(c){var b=[];this.getLatencyEventsInRange(c).forEach(function(a){if("data"in a.args){var c=a.args.data;if("INPUT_EVENT_LATENCY_TERMINATED_FRAME_SWAP_COMPONENT"in c){var d=0,d=c.INPUT_EVENT_LATENCY_TERMINATED_FRAME_SWAP_COMPONENT.time;
if("INPUT_EVENT_LATENCY_ORIGINAL_COMPONENT"in c)d-=c.INPUT_EVENT_LATENCY_ORIGINAL_COMPONENT.time;else if("INPUT_EVENT_LATENCY_UI_COMPONENT"in c)d-=c.INPUT_EVENT_LATENCY_UI_COMPONENT.time;else if("INPUT_EVENT_LATENCY_BEGIN_RWH_COMPONENT"in c)d-=c.INPUT_EVENT_LATENCY_BEGIN_RWH_COMPONENT.time;else throw Error("No valid begin latency component");a={x:a.start,latency:d/1E3}}else a=void 0}else a=void 0;a&&b.push(a)});b.sort(function(a,b){return a.x-b.x});return b},getAllNetworkEventsInRange:function(c){var b=
[];this.modelHelper.model.getAllThreads().forEach(function(a){a.asyncSliceGroup.slices.forEach(function(a){var d=!1;if("net"==a.cat||"disabled-by-default-netlog"==a.cat||"netlog"==a.cat)d=!0;d&&c.intersectsExplicitRange(a.start,a.end)&&b.push(a)})});return b}};return{ChromeBrowserHelper:e}});"use strict";
tv.exportTo("tv.e.audits",function(){function e(c,b){tv.e.audits.ChromeProcessHelper.call(this,c,b);var a=b.findAllThreadsNamed(tv.e.audits.CHROME_RENDERER_THREAD_NAME);if(1!==a.length)throw Error("omgah: more than one renderer!");this.mainThread_=a[0]}e.prototype={__proto__:tv.e.audits.ChromeProcessHelper.prototype,get mainThread(){return this.mainThread_}};return{ChromeRendererHelper:e}});"use strict";
tv.exportTo("tv.e.audits",function(){function e(b){var c=[];b.getAllProcesses().forEach(function(b){0!==b.findAllThreadsNamed(a).length&&c.push(b)},this);return 0===c.length||1<c.length?void 0:c[0]}function c(a){var b=[];a.getAllProcesses().forEach(function(a){0!==a.findAllThreadsNamed(f).length&&b.push(a)});return b}function b(a){this.model_=a;this.browser_=(this.browserProcess_=e(a))?new tv.e.audits.ChromeBrowserHelper(this,this.browserProcess_):void 0;this.rendererProcesses_=c(a);this.renderers_=
{};this.rendererProcesses_.forEach(function(a){a=new tv.e.audits.ChromeRendererHelper(this,a);this.renderers_[a.pid]=a},this)}var a="CrBrowserMain",f="CrRendererMain";b.supportsModel=function(a){return void 0!==e(a)||c(a).length?!0:!1};b.prototype={get pid(){throw Error("woah");},get process(){throw Error("woah");},get model(){return this.model_},get browserProcess(){return this.browserProcess_},get browser(){return this.browser_},get rendererProcesses(){return this.rendererProcesses_},get renderers(){return this.renderers_}};
return{CHROME_RENDERER_THREAD_NAME:f,ChromeModelHelper:b}});
!function(){function e(a){return null!=a&&!isNaN(a)}function c(a){return a.length}function b(a,b){try{for(var c in b)Object.defineProperty(a.prototype,c,{value:b[c],enumerable:!1})}catch(d){a.prototype=b}}function a(){}function f(a){return hb+a in this}function d(){var a=[];return this.forEach(function(b){a.push(b)}),a}function h(){var a=0,b;for(b in this)b.charCodeAt(0)===Tb&&++a;return a}function g(){for(var a in this)if(a.charCodeAt(0)===Tb)return!1;return!0}function k(){}function l(a,b,c){return function(){var d=
c.apply(b,arguments);return d===b?a:d}}function m(a,b){if(b in a)return b;b=b.charAt(0).toUpperCase()+b.substring(1);for(var c=0,d=ae.length;d>c;++c){var e=ae[c]+b;if(e in a)return e}}function n(){}function q(){}function w(b){function c(){for(var a,e=d,f=-1,J=e.length;++f<J;)(a=e[f].on)&&a.apply(this,arguments);return b}var d=[],e=new a;return c.on=function(a,c){var f,J=e.get(a);return 2>arguments.length?J&&J.on:(J&&(J.on=null,d=d.slice(0,f=d.indexOf(J)).concat(d.slice(f+1)),e.remove(a)),c&&d.push(e.set(a,
{on:c})),b)},c}function s(){p.event.preventDefault()}function D(){for(var a,b=p.event;a=b.sourceEvent;)b=a;return b}function F(a){for(var b=new q,c=0,d=arguments.length;++c<d;)b[arguments[c]]=w(b);return b.of=function(c,d){return function(e){try{var f=e.sourceEvent=p.event;e.target=a;p.event=e;b[e.type].apply(c,d)}finally{p.event=f}}},b}function C(a){return Ub(a,ia),a}function v(a){return"function"==typeof a?a:function(){return Wc(a,this)}}function y(a){return"function"==typeof a?a:function(){return Xc(a,
this)}}function B(a,b){function c(){this.removeAttribute(a)}function d(){this.removeAttributeNS(a.space,a.local)}function e(){this.setAttribute(a,b)}function f(){this.setAttributeNS(a.space,a.local,b)}function g(){var c=b.apply(this,arguments);null==c?this.removeAttribute(a):this.setAttribute(a,c)}function h(){var c=b.apply(this,arguments);null==c?this.removeAttributeNS(a.space,a.local):this.setAttributeNS(a.space,a.local,c)}return a=p.ns.qualify(a),null==b?a.local?d:c:"function"==typeof b?a.local?
h:g:a.local?f:e}function H(a){return a.trim().replace(/\s+/g," ")}function z(a){return RegExp("(?:^|\\s+)"+p.requote(a)+"(?:\\s+|$)","g")}function x(a,b){function c(){for(var d=-1;++d<e;)a[d](this,b)}function d(){for(var c=-1,f=b.apply(this,arguments);++c<e;)a[c](this,f)}a=a.trim().split(/^|\s+/).map(G);var e=a.length;return"function"==typeof b?d:c}function G(a){var b=z(a);return function(c,d){if(e=c.classList)return d?e.add(a):e.remove(a);var e=c.getAttribute("class")||"";d?(b.lastIndex=0,b.test(e)||
c.setAttribute("class",H(e+" "+a))):c.setAttribute("class",H(e.replace(b," ")))}}function E(a,b,c){function d(){this.style.removeProperty(a)}function e(){this.style.setProperty(a,b,c)}function f(){var d=b.apply(this,arguments);null==d?this.style.removeProperty(a):this.style.setProperty(a,d,c)}return null==b?d:"function"==typeof b?f:e}function K(a,b){function c(){delete this[a]}function d(){this[a]=b}function e(){var c=b.apply(this,arguments);null==c?delete this[a]:this[a]=c}return null==b?c:"function"==
typeof b?e:d}function Q(a){return"function"==typeof a?a:(a=p.ns.qualify(a)).local?function(){return this.ownerDocument.createElementNS(a.space,a.local)}:function(){return this.ownerDocument.createElementNS(this.namespaceURI,a)}}function O(a){return function(){return be(this,a)}}function T(a){return arguments.length||(a=p.ascending),function(b,c){return b&&c?a(b.__data__,c.__data__):!b-!c}}function U(a,b){for(var c=0,d=a.length;d>c;c++)for(var e,f=a[c],g=0,h=f.length;h>g;g++)(e=f[g])&&b(e,g,c);return a}
function ja(a){return Ub(a,Sa),a}function u(a){var b,c;return function(d,e,f){d=a[f].update;var g=d.length;f!=c&&(c=f,b=0);for(e>=b&&(b=e+1);!(e=d[b])&&++b<g;);return e}}function t(){var a=this.__transition__;a&&++a.active}function oa(a,b,c){function d(){var b=this[g];b&&(this.removeEventListener(a,b,b.$),delete this[g])}function e(){var f=k(b,$a(arguments));d.call(this);this.addEventListener(a,this[g]=f,f.$=c);f._=b}function f(){var b,c=RegExp("^__on([^.]+)"+p.requote(a)+"$"),d;for(d in this)if(b=
d.match(c)){var e=this[d];this.removeEventListener(b[1],e,e.$);delete this[d]}}var g="__on"+a,h=a.indexOf("."),k=V;0<h&&(a=a.substring(0,h));var wa=Yc.get(a);return wa&&(a=wa,k=M),h?b?e:d:b?n:f}function V(a,b){return function(c){var d=p.event;p.event=c;b[0]=this.__data__;try{a.apply(this,b)}finally{p.event=d}}}function M(a,b){var c=V(a,b);return function(a){var b=a.relatedTarget;b&&(b===this||8&b.compareDocumentPosition(this))||c.call(this,a)}}function ea(){var a=".dragsuppress-"+ ++pg,b="click"+
a,c=p.select(za).on("touchmove"+a,s).on("dragstart"+a,s).on("selectstart"+a,s);if(Fb){var d=ab.style,e=d[Fb];d[Fb]="none"}return function(f){function g(){c.on(b,null)}c.on(a,null);Fb&&(d[Fb]=e);f&&(c.on(b,function(){s();g()},!0),setTimeout(g,0))}}function S(a,b){b.changedTouches&&(b=b.changedTouches[0]);var c=a.ownerSVGElement||a;if(c.createSVGPoint){var d=c.createSVGPoint();if(0>Zc&&(za.scrollX||za.scrollY)){var c=p.select("body").append("svg").style({position:"absolute",top:0,left:0,margin:0,padding:0,
border:"none"},"important"),e=c[0][0].getScreenCTM();Zc=!(e.f||e.e);c.remove()}return Zc?(d.x=b.pageX,d.y=b.pageY):(d.x=b.clientX,d.y=b.clientY),d=d.matrixTransform(a.getScreenCTM().inverse()),[d.x,d.y]}c=a.getBoundingClientRect();return[b.clientX-c.left-a.clientLeft,b.clientY-c.top-a.clientTop]}function I(a,b,c){return(b[0]-a[0])*(c[1]-a[1])-(b[1]-a[1])*(c[0]-a[0])}function Z(a){return 1<a?Ba:-1>a?-Ba:Math.asin(a)}function fa(a){return((a=Math.exp(a))+1/a)/2}function pa(a){return(a=Math.sin(a/2))*
a}function la(){}function X(a,b,c){return new qa(a,b,c)}function qa(a,b,c){this.h=a;this.s=b;this.l=c}function ra(a,b,c){function d(a){return 360<a?a-=360:0>a&&(a+=360),60>a?e+(f-e)*a/60:180>a?f:240>a?e+(f-e)*(240-a)/60:e}var e,f;return a=isNaN(a)?0:0>(a%=360)?a+360:a,b=isNaN(b)?0:0>b?0:1<b?1:b,c=0>c?0:1<c?1:c,f=0.5>=c?c*(1+b):c+b-c*b,e=2*c-f,Pa(Math.round(255*d(a+120)),Math.round(255*d(a)),Math.round(255*d(a-120)))}function ha(a,b,c){return new na(a,b,c)}function na(a,b,c){this.h=a;this.c=b;this.l=
c}function Oa(a,b,c){return isNaN(a)&&(a=0),isNaN(b)&&(b=0),ya(c,Math.cos(a*=Y)*b,Math.sin(a)*b)}function ya(a,b,c){return new r(a,b,c)}function r(a,b,c){this.l=a;this.a=b;this.b=c}function Wd(a,b,c){a=(a+16)/116;b=a+b/500;c=a-c/200;return b=Qc(b)*ce,a=Qc(a)*de,c=Qc(c)*ee,Pa(Sc(3.2404542*b-1.5371385*a-0.4985314*c),Sc(-0.969266*b+1.8760108*a+0.041556*c),Sc(0.0556434*b-0.2040259*a+1.0572252*c))}function Xd(a,b,c){return 0<a?ha(Math.atan2(c,b)*ma,Math.sqrt(b*b+c*c),a):ha(0/0,0/0,a)}function Qc(a){return 0.206893034<
a?a*a*a:(a-4/29)/7.787037}function Rc(a){return 0.008856<a?Math.pow(a,1/3):7.787037*a+4/29}function Sc(a){return Math.round(255*(0.00304>=a?12.92*a:1.055*Math.pow(a,1/2.4)-0.055))}function Sb(a){return Pa(a>>16,255&a>>8,255&a)+""}function Pa(a,b,c){return new Tc(a,b,c)}function Tc(a,b,c){this.r=a;this.g=b;this.b=c}function rb(a){return 16>a?"0"+Math.max(0,a).toString(16):Math.min(255,a).toString(16)}function Yd(a,b,c){var d,e,f,g,h=0,k=0,wa=0;if(e=/([a-z]+)\((.*)\)/i.exec(a))switch(f=e[2].split(","),
e[1]){case "hsl":return c(parseFloat(f[0]),parseFloat(f[1])/100,parseFloat(f[2])/100);case "rgb":return b(Vc(f[0]),Vc(f[1]),Vc(f[2]))}return(g=Vb.get(a))?b(g.r,g.g,g.b):(null!=a&&"#"===a.charAt(0)&&(d=parseInt(a.substring(1),16),isNaN(d)||(4===a.length?(h=(3840&d)>>4,h|=h>>4,k=240&d,k|=k>>4,wa=15&d,wa|=wa<<4):7===a.length&&(h=(16711680&d)>>16,k=(65280&d)>>8,wa=255&d))),b(h,k,wa))}function Zd(a,b,c){var d,e,f=Math.min(a/=255,b/=255,c/=255),g=Math.max(a,b,c),h=g-f,k=(g+f)/2;return h?(e=0.5>k?h/(g+f):
h/(2-g-f),d=a==g?(b-c)/h+(c>b?6:0):b==g?(c-a)/h+2:(a-b)/h+4,d*=60):(d=0/0,e=0<k&&1>k?0:d),X(d,e,k)}function $d(a,b,c){a=Uc(a);b=Uc(b);c=Uc(c);var d=Rc((0.4124564*a+0.3575761*b+0.1804375*c)/ce),e=Rc((0.2126729*a+0.7151522*b+0.072175*c)/de);a=Rc((0.0193339*a+0.119192*b+0.9503041*c)/ee);return ya(116*e-16,500*(d-e),200*(e-a))}function Uc(a){return 0.04045>=(a/=255)?a/12.92:Math.pow((a+0.055)/1.055,2.4)}function Vc(a){var b=parseFloat(a);return"%"===a.charAt(a.length-1)?Math.round(2.55*b):b}function ka(a){return"function"==
typeof a?a:function(){return a}}function va(a){return a}function $c(a){return function(b,c,d){return 2===arguments.length&&"function"==typeof c&&(d=c,c=null),Wb(b,c,a,d)}}function Wb(a,b,c,d){function e(){var a,b=k.status;if(!b&&k.responseText||200<=b&&300>b||304===b){try{a=c.call(f,k)}catch(d){return g.error.call(f,d),void 0}g.load.call(f,a)}else g.error.call(f,k)}var f={},g=p.dispatch("beforesend","progress","load","error"),h={},k=new XMLHttpRequest,wa=null;return!za.XDomainRequest||"withCredentials"in
k||!/^(http(s)?:)?\/\//.test(a)||(k=new XDomainRequest),"onload"in k?k.onload=k.onerror=e:k.onreadystatechange=function(){3<k.readyState&&e()},k.onprogress=function(a){var b=p.event;p.event=a;try{g.progress.call(f,k)}finally{p.event=b}},f.header=function(a,b){return a=(a+"").toLowerCase(),2>arguments.length?h[a]:(null==b?delete h[a]:h[a]=b+"",f)},f.mimeType=function(a){return arguments.length?(b=null==a?null:a+"",f):b},f.responseType=function(a){return arguments.length?(wa=a,f):wa},f.response=function(a){return c=
a,f},["get","post"].forEach(function(a){f[a]=function(){return f.send.apply(f,[a].concat($a(arguments)))}}),f.send=function(c,d,e){if(2===arguments.length&&"function"==typeof d&&(e=d,d=null),k.open(c,a,!0),null==b||"accept"in h||(h.accept=b+",*/*"),k.setRequestHeader)for(var R in h)k.setRequestHeader(R,h[R]);return null!=b&&k.overrideMimeType&&k.overrideMimeType(b),null!=wa&&(k.responseType=wa),null!=e&&f.on("error",e).on("load",function(a){e(null,a)}),g.beforesend.call(f,k),k.send(null==d?null:d),
f},f.abort=function(){return k.abort(),f},p.rebind(f,g,"on"),null==d?f:f.get(qg(d))}function qg(a){return 1===a.length?function(b,c){a(null==b?c:null)}:a}function ad(){var a=fe(),a=ge()-a;24<a?(isFinite(a)&&(clearTimeout(Xb),Xb=setTimeout(ad,a)),Yb=0):(Yb=1,he(ad))}function fe(){var a=Date.now();for(Ta=Zb;Ta;)a>=Ta.t&&(Ta.f=Ta.c(a-Ta.t)),Ta=Ta.n;return a}function ge(){for(var a,b=Zb,c=1/0;b;)b.f?b=a?a.n=b.n:Zb=b.n:(b.t<c&&(c=b.t),b=(a=b).n);return $b=a,c}function bd(a,b){return b-(a?Math.ceil(Math.log(a)/
Math.LN10):1)}function rg(a){var b=a.decimal,c=a.thousands,d=a.grouping,e=a.currency,f=d?function(a){for(var b=a.length,e=[],A=0,f=d[0];0<b&&0<f;)e.push(a.substring(b-=f,b+f)),f=d[A=(A+1)%d.length];return e.reverse().join(c)}:va;return function(a){a=ie.exec(a);var c=a[1]||" ",d=a[2]||">",A=a[3]||"",R=a[4]||"",ga=a[5],g=+a[6],h=a[7],k=a[8],l=a[9],m=1,n="",q="",aa=!1;switch(k&&(k=+k.substring(1)),(ga||"0"===c&&"="===d)&&(ga=c="0",d="=",h&&(g-=Math.floor((g-1)/4))),l){case "n":h=!0;l="g";break;case "%":m=
100;q="%";l="f";break;case "p":m=100;q="%";l="r";break;case "b":case "o":case "x":case "X":"#"===R&&(n="0"+l.toLowerCase());case "c":case "d":aa=!0;k=0;break;case "s":m=-1,l="r"}"$"===R&&(n=e[0],q=e[1]);"r"!=l||k||(l="g");null!=k&&("g"==l?k=Math.max(1,Math.min(21,k)):("e"==l||"f"==l)&&(k=Math.max(0,Math.min(20,k))));var l=sg.get(l)||tg,r=ga&&h;return function(a){var e=q;if(aa&&a%1)return"";var R=0>a||0===a&&0>1/a?(a=-a,"-"):A;0>m?(e=p.formatPrefix(a,k),a=e.scale(a),e=e.symbol+q):a*=m;a=l(a,k);var ba=
a.lastIndexOf("."),xa=0>ba?a:a.substring(0,ba),ba=0>ba?"":b+a.substring(ba+1);!ga&&h&&(xa=f(xa));var da=n.length+xa.length+ba.length+(r?0:R.length),s=g>da?Array(da=g-da+1).join(c):"";return r&&(xa=f(s+xa)),R+=n,a=xa+ba,("<"===d?R+a+s:">"===d?s+R+a:"^"===d?s.substring(0,da>>=1)+R+a+s.substring(da):R+(r?a:s+a))+e}}}function tg(a){return a+""}function Ua(){this._=new Date(1<arguments.length?Date.UTC.apply(this,arguments):arguments[0])}function ib(a,b,c){function d(b){var c=a(b),e=f(c,1);return e-b>b-
c?c:e}function e(c){return b(c=a(new Aa(c-1)),1),c}function f(a,c){return b(a=new Aa(+a),c),a}function g(a,d,A){a=e(a);var f=[];if(1<A)for(;d>a;)c(a)%A||f.push(new Date(+a)),b(a,1);else for(;d>a;)f.push(new Date(+a)),b(a,1);return f}a.floor=a;a.round=d;a.ceil=e;a.offset=f;a.range=g;var h=a.utc=bc(a);return h.floor=h,h.round=bc(d),h.ceil=bc(e),h.offset=bc(f),h.range=function(a,b,c){try{Aa=Ua;var d=new Ua;return d._=a,g(d,b,c)}finally{Aa=Date}},a}function bc(a){return function(b,c){try{Aa=Ua;var d=
new Ua;return d._=b,a(d,c)._}finally{Aa=Date}}}function ug(a){function b(a){function d(b){for(var c,A,f,J=[],R=-1,ga=0;++R<e;)37===a.charCodeAt(R)&&(J.push(a.substring(ga,R)),null!=(A=ke[c=a.charAt(++R)])&&(c=a.charAt(++R)),(f=r[c])&&(c=f(b,null==A?"e"===c?" ":"0":A)),J.push(c),ga=R+1);return J.push(a.substring(ga,R)),J.join("")}var e=a.length;return d.parse=function(b){var d={y:1900,m:0,d:1,H:0,M:0,S:0,L:0,Z:null};if(c(d,a,b,0)!=b.length)return null;"p"in d&&(d.H=d.H%12+12*d.p);b=null!=d.Z&&Aa!==
Ua;var e=new (b?Ua:Aa);return"j"in d?e.setFullYear(d.y,0,d.j):"w"in d&&("W"in d||"U"in d)?(e.setFullYear(d.y,0,1),e.setFullYear(d.y,0,"W"in d?(d.w+6)%7+7*d.W-(e.getDay()+5)%7:d.w+7*d.U-(e.getDay()+6)%7)):e.setFullYear(d.y,d.m,d.d),e.setHours(d.H+Math.floor(d.Z/100),d.M+d.Z%100,d.S,d.L),b?e._:e},d.toString=function(){return a},d}function c(a,b,d,e){for(var A,f,J,R=0,ga=b.length,g=d.length;ga>R;){if(e>=g)return-1;if(A=b.charCodeAt(R++),37===A){if(J=b.charAt(R++),f=t[J in ke?b.charAt(R++):J],!f||0>(e=
f(a,d,e)))return-1}else if(A!=d.charCodeAt(e++))return-1}return e}var d=a.dateTime,e=a.date,f=a.time,g=a.periods,h=a.days,k=a.shortDays,l=a.months,da=a.shortMonths;b.utc=function(a){function c(a){try{Aa=Ua;var b=new Aa;return b._=a,d(b)}finally{Aa=Date}}var d=b(a);return c.parse=function(a){try{Aa=Ua;var b=d.parse(a);return b&&b._}finally{Aa=Date}},c.toString=d.toString,c};b.multi=b.utc.multi=vg;var m=p.map(),L=cc(h),n=dc(h),q=cc(k),Da=dc(k),s=cc(l),dd=dc(l),je=cc(da),aa=dc(da);g.forEach(function(a,
b){m.set(a.toLowerCase(),b)});var r={a:function(a){return k[a.getDay()]},A:function(a){return h[a.getDay()]},b:function(a){return da[a.getMonth()]},B:function(a){return l[a.getMonth()]},c:b(d),d:function(a,b){return Ca(a.getDate(),b,2)},e:function(a,b){return Ca(a.getDate(),b,2)},H:function(a,b){return Ca(a.getHours(),b,2)},I:function(a,b){return Ca(a.getHours()%12||12,b,2)},j:function(a,b){return Ca(1+P.dayOfYear(a),b,3)},L:function(a,b){return Ca(a.getMilliseconds(),b,3)},m:function(a,b){return Ca(a.getMonth()+
1,b,2)},M:function(a,b){return Ca(a.getMinutes(),b,2)},p:function(a){return g[+(12<=a.getHours())]},S:function(a,b){return Ca(a.getSeconds(),b,2)},U:function(a,b){return Ca(P.sundayOfYear(a),b,2)},w:function(a){return a.getDay()},W:function(a,b){return Ca(P.mondayOfYear(a),b,2)},x:b(e),X:b(f),y:function(a,b){return Ca(a.getFullYear()%100,b,2)},Y:function(a,b){return Ca(a.getFullYear()%1E4,b,4)},Z:wg,"%":function(){return"%"}},t={a:function(a,b,c){q.lastIndex=0;return(b=q.exec(b.substring(c)))?(a.w=
Da.get(b[0].toLowerCase()),c+b[0].length):-1},A:function(a,b,c){L.lastIndex=0;return(b=L.exec(b.substring(c)))?(a.w=n.get(b[0].toLowerCase()),c+b[0].length):-1},b:function(a,b,c){je.lastIndex=0;return(b=je.exec(b.substring(c)))?(a.m=aa.get(b[0].toLowerCase()),c+b[0].length):-1},B:function(a,b,c){s.lastIndex=0;return(b=s.exec(b.substring(c)))?(a.m=dd.get(b[0].toLowerCase()),c+b[0].length):-1},c:function(a,b,d){return c(a,r.c.toString(),b,d)},d:le,e:le,H:me,I:me,j:xg,L:yg,m:zg,M:Ag,p:function(a,b,c){b=
m.get(b.substring(c,c+=2).toLowerCase());return null==b?-1:(a.p=b,c)},S:Bg,U:Cg,w:Dg,W:Eg,x:function(a,b,d){return c(a,r.x.toString(),b,d)},X:function(a,b,d){return c(a,r.X.toString(),b,d)},y:Fg,Y:Gg,Z:Hg,"%":Ig};return b}function Ca(a,b,c){var d=0>a?"-":"";a=(d?-a:a)+"";var e=a.length;return d+(c>e?Array(c-e+1).join(b)+a:a)}function cc(a){return RegExp("^(?:"+a.map(p.requote).join("|")+")","i")}function dc(b){for(var c=new a,d=-1,e=b.length;++d<e;)c.set(b[d].toLowerCase(),d);return c}function Dg(a,
b,c){sa.lastIndex=0;return(b=sa.exec(b.substring(c,c+1)))?(a.w=+b[0],c+b[0].length):-1}function Cg(a,b,c){sa.lastIndex=0;return(b=sa.exec(b.substring(c)))?(a.U=+b[0],c+b[0].length):-1}function Eg(a,b,c){sa.lastIndex=0;return(b=sa.exec(b.substring(c)))?(a.W=+b[0],c+b[0].length):-1}function Gg(a,b,c){sa.lastIndex=0;return(b=sa.exec(b.substring(c,c+4)))?(a.y=+b[0],c+b[0].length):-1}function Fg(a,b,c){sa.lastIndex=0;return(b=sa.exec(b.substring(c,c+2)))?(a.y=+b[0]+(68<+b[0]?1900:2E3),c+b[0].length):-1}
function Hg(a,b,c){return/^[+-]\d{4}$/.test(b=b.substring(c,c+5))?(a.Z=+b,c+5):-1}function zg(a,b,c){sa.lastIndex=0;return(b=sa.exec(b.substring(c,c+2)))?(a.m=b[0]-1,c+b[0].length):-1}function le(a,b,c){sa.lastIndex=0;return(b=sa.exec(b.substring(c,c+2)))?(a.d=+b[0],c+b[0].length):-1}function xg(a,b,c){sa.lastIndex=0;return(b=sa.exec(b.substring(c,c+3)))?(a.j=+b[0],c+b[0].length):-1}function me(a,b,c){sa.lastIndex=0;return(b=sa.exec(b.substring(c,c+2)))?(a.H=+b[0],c+b[0].length):-1}function Ag(a,
b,c){sa.lastIndex=0;return(b=sa.exec(b.substring(c,c+2)))?(a.M=+b[0],c+b[0].length):-1}function Bg(a,b,c){sa.lastIndex=0;return(b=sa.exec(b.substring(c,c+2)))?(a.S=+b[0],c+b[0].length):-1}function yg(a,b,c){sa.lastIndex=0;return(b=sa.exec(b.substring(c,c+3)))?(a.L=+b[0],c+b[0].length):-1}function wg(a){var b=a.getTimezoneOffset();a=0<b?"-":"+";var c=~~($(b)/60),b=$(b)%60;return a+Ca(c,"0",2)+Ca(b,"0",2)}function Ig(a,b,c){ne.lastIndex=0;return(a=ne.exec(b.substring(c,c+1)))?c+a[0].length:-1}function vg(a){for(var b=
a.length,c=-1;++c<b;)a[c][0]=this(a[c][0]);return function(b){for(var c=0,d=a[c];!d[1](b);)d=a[++c];return d[0](b)}}function ed(){}function oe(a,b,c){var d=c.s=a+b,e=d-a;c.t=a-(d-e)+(b-e)}function ec(a,b){a&&pe.hasOwnProperty(a.type)&&pe[a.type](a,b)}function fd(a,b,c){var d=-1,e=a.length-c;for(b.lineStart();++d<e;)c=a[d],b.point(c[0],c[1],c[2]);b.lineEnd()}function qe(a,b){var c=-1,d=a.length;for(b.polygonStart();++c<d;)fd(a[c],b,1);b.polygonEnd()}function Jg(){function a(b,c){b*=Y;c=c*Y/2+W/4;var A=
b-d,J=0<=A?1:-1,R=J*A,A=Math.cos(c),g=Math.sin(c),h=f*g,k=e*A+h*Math.cos(R),J=h*J*Math.sin(R);jb.add(Math.atan2(J,k));d=b;e=A;f=g}var b,c,d,e,f;Fa.point=function(g,h){Fa.point=a;d=(b=g)*Y;e=Math.cos(h=(c=h)*Y/2+W/4);f=Math.sin(h)};Fa.lineEnd=function(){a(b,c)}}function kb(a){var b=a[0];a=a[1];var c=Math.cos(a);return[c*Math.cos(b),c*Math.sin(b),Math.sin(a)]}function fc(a,b){return a[0]*b[0]+a[1]*b[1]+a[2]*b[2]}function sb(a,b){return[a[1]*b[2]-a[2]*b[1],a[2]*b[0]-a[0]*b[2],a[0]*b[1]-a[1]*b[0]]}function gd(a,
b){a[0]+=b[0];a[1]+=b[1];a[2]+=b[2]}function gc(a,b){return[a[0]*b,a[1]*b,a[2]*b]}function hc(a){var b=Math.sqrt(a[0]*a[0]+a[1]*a[1]+a[2]*a[2]);a[0]/=b;a[1]/=b;a[2]/=b}function ic(a){return[Math.atan2(a[1],a[0]),Z(a[2])]}function jc(a,b){return $(a[0]-b[0])<N&&$(a[1]-b[1])<N}function hd(a,b){a*=Y;var c=Math.cos(b*=Y);Gb(c*Math.cos(a),c*Math.sin(a),Math.sin(b))}function Gb(a,b,c){++Hb;Va+=(a-Va)/Hb;Wa+=(b-Wa)/Hb;Qa+=(c-Qa)/Hb}function re(){function a(e,A){e*=Y;var f=Math.cos(A*=Y),g=f*Math.cos(e),
f=f*Math.sin(e),h=Math.sin(A),k=Math.atan2(Math.sqrt((k=c*h-d*f)*k+(k=d*g-b*h)*k+(k=b*f-c*g)*k),b*g+c*f+d*h);tb+=k;Ia+=k*(b+(b=g));Ja+=k*(c+(c=f));Ea+=k*(d+(d=h));Gb(b,c,d)}var b,c,d;La.point=function(e,f){e*=Y;var g=Math.cos(f*=Y);b=g*Math.cos(e);c=g*Math.sin(e);d=Math.sin(f);La.point=a;Gb(b,c,d)}}function se(){La.point=hd}function Kg(){function a(b,c){b*=Y;var A=Math.cos(c*=Y),J=A*Math.cos(b),A=A*Math.sin(b),R=Math.sin(c),g=e*R-f*A,h=f*J-d*R,k=d*A-e*J,l=Math.sqrt(g*g+h*h+k*k),m=d*J+e*A+f*R,p=l&&
-(1<m?0:-1>m?W:Math.acos(m))/l,l=Math.atan2(l,m);bb+=p*g;cb+=p*h;Ra+=p*k;tb+=l;Ia+=l*(d+(d=J));Ja+=l*(e+(e=A));Ea+=l*(f+(f=R));Gb(d,e,f)}var b,c,d,e,f;La.point=function(g,h){b=g;c=h;La.point=a;g*=Y;var k=Math.cos(h*=Y);d=k*Math.cos(g);e=k*Math.sin(g);f=Math.sin(h);Gb(d,e,f)};La.lineEnd=function(){a(b,c);La.lineEnd=se;La.point=hd}}function ub(){return!0}function te(a,b,c,d,e){var f=[],g=[];if(a.forEach(function(a){if(!(0>=(b=a.length-1))){var b,c=a[0],d=a[b];if(jc(c,d)){e.lineStart();for(d=0;b>d;++d)e.point((c=
a[d])[0],c[1]);return e.lineEnd(),void 0}b=new kc(c,a,null,!0);c=new kc(c,null,b,!1);b.o=c;f.push(b);g.push(c);b=new kc(d,a,null,!1);c=new kc(d,null,b,!0);b.o=c;f.push(b);g.push(c)}}),g.sort(b),ue(f),ue(g),f.length){a=0;b=c;for(c=g.length;c>a;++a)g[a].e=b=!b;for(var h,k=f[0];;){for(var l=k,da=!0;l.v;)if((l=l.n)===k)return;b=l.z;e.lineStart();do{if(l.v=l.o.v=!0,l.e){if(da){a=0;for(c=b.length;c>a;++a)e.point((h=b[a])[0],h[1])}else d(l.x,l.n.x,1,e);l=l.n}else{if(da){b=l.p.z;for(a=b.length-1;0<=a;--a)e.point((h=
b[a])[0],h[1])}else d(l.x,l.p.x,-1,e);l=l.p}l=l.o;b=l.z;da=!da}while(!l.v);e.lineEnd()}}}function ue(a){if(b=a.length){for(var b,c,d=0,e=a[0];++d<b;)e.n=c=a[d],c.p=e,e=c;e.n=c=a[0];c.p=e}}function kc(a,b,c,d){this.x=a;this.z=b;this.o=c;this.e=d;this.v=!1;this.n=this.p=null}function ve(a,b,c,d){return function(e,f){function g(b,c){var d=e(b,c);a(b=d[0],c=d[1])&&f.point(b,c)}function h(a,b){var c=e(a,b);r.point(c[0],c[1])}function k(){s.point=h;r.lineStart()}function l(){s.point=g;r.lineEnd()}function da(a,
b){Da.push([a,b]);var c=e(a,b);t.point(c[0],c[1])}function m(){t.lineStart();Da=[]}function L(){da(Da[0][0],Da[0][1]);t.lineEnd();var a;a=t.clean();var b=aa.buffer(),c=b.length;if(Da.pop(),q.push(Da),Da=null,c){if(1&a){a=b[0];var d,c=a.length-1,b=-1;for(f.lineStart();++b<c;)f.point((d=a[b])[0],d[1]);return f.lineEnd(),void 0}1<c&&2&a&&b.push(b.pop().concat(b.shift()));n.push(b.filter(Lg))}}var n,q,Da,r=b(f),dd=e.invert(d[0],d[1]),s={point:g,lineStart:k,lineEnd:l,polygonStart:function(){s.point=da;
s.lineStart=m;s.lineEnd=L;n=[];q=[];f.polygonStart()},polygonEnd:function(){s.point=g;s.lineStart=k;s.lineEnd=l;n=p.merge(n);var a,b=dd;a=q;var d=b[0],e=b[1],A=[Math.sin(d),-Math.cos(d),0],J=0,ga=0;jb.reset();for(var h=0,ba=a.length;ba>h;++h){var ua=a[h],da=ua.length;if(da)for(var m=ua[0],L=m[0],b=m[1]/2+W/4,Eb=Math.sin(b),aa=Math.cos(b),Da=1;;){Da===da&&(Da=0);var b=ua[Da],r=b[0],t=b[1]/2+W/4,w=Math.sin(t),t=Math.cos(t),u=r-L,cd=0<=u?1:-1,v=cd*u,ac=v>W,Eb=Eb*w;if(jb.add(Math.atan2(Eb*cd*Math.sin(v),
aa*t+Eb*Math.cos(v))),J+=ac?u+cd*Ga:u,ac^L>=d^r>=d)m=sb(kb(m),kb(b)),hc(m),L=sb(A,m),hc(L),L=(ac^0<=u?-1:1)*Z(L[2]),(e>L||e===L&&(m[0]||m[1]))&&(ga+=ac^0<=u?1:-1);if(!Da++)break;L=r;Eb=w;aa=t;m=b}}a=(-N>J||N>J&&0>jb)^1&ga;n.length?te(n,Mg,a,c,f):a&&(f.lineStart(),c(null,null,1,f),f.lineEnd());f.polygonEnd();n=q=null},sphere:function(){f.polygonStart();f.lineStart();c(null,null,1,f);f.lineEnd();f.polygonEnd()}},aa=we(),t=b(aa);return s}}function Lg(a){return 1<a.length}function we(){var a,b=[];return{lineStart:function(){b.push(a=
[])},point:function(b,c){a.push([b,c])},lineEnd:n,buffer:function(){var c=b;return b=[],a=null,c},rejoin:function(){1<b.length&&b.push(b.pop().concat(b.shift()))}}}function Mg(a,b){return(0>(a=a.x)[0]?a[1]-Ba-N:Ba-a[1])-(0>(b=b.x)[0]?b[1]-Ba-N:Ba-b[1])}function Ng(a){function b(a,c){return Math.cos(a)*Math.cos(c)>e}function c(a,b,d){var A=kb(a),f=kb(b),J=[1,0,0],f=sb(A,f),R=fc(f,f),A=f[0],g=R-A*A;if(!g)return!d&&a;R=e*R/g;g=-e*A/g;A=sb(J,f);J=gc(J,R);f=gc(f,g);gd(J,f);f=fc(J,A);R=fc(A,A);g=f*f-R*
(fc(J,J)-1);if(!(0>g)){var ga=Math.sqrt(g),g=gc(A,(-f-ga)/R);if(gd(g,J),g=ic(g),!d)return g;var ca;d=a[0];var h=b[0];a=a[1];b=b[1];d>h&&(ca=d,d=h,h=ca);var k=h-d,ua=$(k-W)<N,l=ua||N>k;if(!ua&&a>b&&(ca=a,a=b,b=ca),l?ua?0<a+b^g[1]<($(g[0]-d)<N?a:b):a<=g[1]&&g[1]<=b:k>W^(d<=g[0]&&g[0]<=h))return ca=gc(A,(-f+ga)/R),gd(ca,J),[g,ic(ca)]}}function d(b,c){var e=f?a:W-a,J=0;return-e>b?J|=1:b>e&&(J|=2),-e>c?J|=4:c>e&&(J|=8),J}var e=Math.cos(a),f=0<e,g=$(e)>N,h=id(a,6*Y);return ve(b,function(a){var e,A,h,k,
ba;return{lineStart:function(){k=h=!1;ba=1},point:function(ua,l){var m,p=[ua,l],n=b(ua,l),q=f?n?0:d(ua,l):n?d(ua+(0>ua?W:-W),l):0;if(!e&&(k=h=n)&&a.lineStart(),n!==h&&(m=c(e,p),(jc(e,m)||jc(p,m))&&(p[0]+=N,p[1]+=N,n=b(p[0],p[1]))),n!==h)ba=0,n?(a.lineStart(),m=c(p,e),a.point(m[0],m[1])):(m=c(e,p),a.point(m[0],m[1]),a.lineEnd()),e=m;else if(g&&e&&f^n){var s;q&A||!(s=c(p,e,!0))||(ba=0,f?(a.lineStart(),a.point(s[0][0],s[0][1]),a.point(s[1][0],s[1][1]),a.lineEnd()):(a.point(s[1][0],s[1][1]),a.lineEnd(),
a.lineStart(),a.point(s[0][0],s[0][1])))}!n||e&&jc(e,p)||a.point(p[0],p[1]);e=p;h=n;A=q},lineEnd:function(){h&&a.lineEnd();e=null},clean:function(){return ba|(k&&h)<<1}}},h,f?[0,-a]:[-W,a-W])}function xe(a,b,c,d){return function(e){var f,g=e.a,h=e.b,k=g.x,g=g.y,l=0,da=1,m=h.x-k,h=h.y-g;if(f=a-k,m||!(0<f)){if(f/=m,0>m){if(l>f)return;da>f&&(da=f)}else if(0<m){if(f>da)return;f>l&&(l=f)}if(f=c-k,m||!(0>f)){if(f/=m,0>m){if(f>da)return;f>l&&(l=f)}else if(0<m){if(l>f)return;da>f&&(da=f)}if(f=b-g,h||!(0<
f)){if(f/=h,0>h){if(l>f)return;da>f&&(da=f)}else if(0<h){if(f>da)return;f>l&&(l=f)}if(f=d-g,h||!(0>f)){if(f/=h,0>h){if(f>da)return;f>l&&(l=f)}else if(0<h){if(l>f)return;da>f&&(da=f)}return 0<l&&(e.a={x:k+l*m,y:g+l*h}),1>da&&(e.b={x:k+da*m,y:g+da*h}),e}}}}}}function ye(a,b,c,d){function e(d,f){return $(d[0]-a)<N?0<f?0:3:$(d[0]-c)<N?0<f?2:1:$(d[1]-b)<N?0<f?1:0:0<f?3:2}function f(a,b){return g(a.x,b.x)}function g(a,b){var c=e(a,1),d=e(b,1);return c!==d?c-d:0===c?b[1]-a[1]:1===c?a[0]-b[0]:2===c?a[1]-
b[1]:b[0]-a[0]}return function(h){function k(f,h,ca,ua){var l=0,Db=0;if(null==f||(l=e(f,ca))!==(Db=e(h,ca))||0>g(f,h)^0<ca){do ua.point(0===l||3===l?a:c,1<l?d:b);while((l=(l+ca+4)%4)!==Db)}else ua.point(h[0],h[1])}function l(e,f){e>=a&&(c>=e&&f>=b&&d>=f)&&h.point(e,f)}function da(e,f){e=Math.max(-lc,Math.min(lc,e));f=Math.max(-lc,Math.min(lc,f));var g=e>=a&&c>=e&&f>=b&&d>=f;if(L&&n.push([e,f]),u)q=e,s=f,r=g,u=!1,g&&(h.lineStart(),h.point(e,f));else if(g&&aa)h.point(e,f);else{var ca={a:{x:t,y:w},b:{x:e,
y:f}};x(ca)?(aa||(h.lineStart(),h.point(ca.a.x,ca.a.y)),h.point(ca.b.x,ca.b.y),g||h.lineEnd(),v=!1):g&&(h.lineStart(),h.point(e,f),v=!1)}t=e;w=f;aa=g}var m,L,n,q,s,r,t,w,aa,u,v,y=h,z=we(),x=xe(a,b,c,d),B={point:l,lineStart:function(){B.point=da;L&&L.push(n=[]);u=!0;aa=!1;t=w=0/0},lineEnd:function(){m&&(da(q,s),r&&aa&&z.rejoin(),m.push(z.buffer()));B.point=l;aa&&h.lineEnd()},polygonStart:function(){h=z;m=[];L=[];v=!0},polygonEnd:function(){h=y;m=p.merge(m);var b;b=[a,d];for(var c=0,e=L.length,J=b[1],
R=0;e>R;++R)for(var g,ba=1,l=L[R],xa=l.length,wa=l[0];xa>ba;++ba)g=l[ba],wa[1]<=J?g[1]>J&&0<I(wa,g,b)&&++c:g[1]<=J&&0>I(wa,g,b)&&--c,wa=g;b=0!==c;c=v&&b;e=m.length;(c||e)&&(h.polygonStart(),c&&(h.lineStart(),k(null,null,1,h),h.lineEnd()),e&&te(m,f,b,k,h),h.polygonEnd());m=L=n=null}};return B}}function ze(a,b){function c(d,e){return d=a(d,e),b(d[0],d[1])}return a.invert&&b.invert&&(c.invert=function(c,d){return c=b.invert(c,d),c&&a.invert(c[0],c[1])}),c}function jd(a){var b=0,c=W/3,d=kd(a);a=d(b,c);
return a.parallels=function(a){return arguments.length?d(b=a[0]*W/180,c=a[1]*W/180):[180*(b/W),180*(c/W)]},a}function Ae(a,b){function c(a,b){var d=Math.sqrt(f-2*e*Math.sin(b))/e;return[d*Math.sin(a*=e),g-d*Math.cos(a)]}var d=Math.sin(a),e=(d+Math.sin(b))/2,f=1+d*(2*e-d),g=Math.sqrt(f)/e;return c.invert=function(a,b){var c=g-b;return[Math.atan2(a,c)/e,Z((f-(a*a+c*c)*e*e)/(2*e))]},c}function Og(){function a(b,c){mc+=e*b-d*c;d=b;e=c}var b,c,d,e;db.point=function(f,g){db.point=a;b=d=f;c=e=g};db.lineEnd=
function(){a(b,c)}}function Pg(){function a(b,c){g.push("M",b,",",c,f)}function b(a,d){g.push("M",a,",",d);h.point=c}function c(a,b){g.push("L",a,",",b)}function d(){h.point=a}function e(){g.push("Z")}var f=Be(4.5),g=[],h={point:a,lineStart:function(){h.point=b},lineEnd:d,polygonStart:function(){h.lineEnd=e},polygonEnd:function(){h.lineEnd=d;h.point=a},pointRadius:function(a){return f=Be(a),h},result:function(){if(g.length){var a=g.join("");return g=[],a}}};return h}function Be(a){return"m0,"+a+"a"+
a+","+a+" 0 1,1 0,"+-2*a+"a"+a+","+a+" 0 1,1 0,"+2*a+"z"}function lb(a,b){Va+=a;Wa+=b;++Qa}function Ce(){function a(d,e){var A=d-b,f=e-c,A=Math.sqrt(A*A+f*f);Ia+=A*(b+d)/2;Ja+=A*(c+e)/2;Ea+=A;lb(b=d,c=e)}var b,c;Ma.point=function(d,e){Ma.point=a;lb(b=d,c=e)}}function De(){Ma.point=lb}function Qg(){function a(b,c){var A=b-d,f=c-e,A=Math.sqrt(A*A+f*f);Ia+=A*(d+b)/2;Ja+=A*(e+c)/2;Ea+=A;A=e*b-d*c;bb+=A*(d+b);cb+=A*(e+c);Ra+=3*A;lb(d=b,e=c)}var b,c,d,e;Ma.point=function(f,g){Ma.point=a;lb(b=d=f,c=e=g)};
Ma.lineEnd=function(){a(b,c)}}function Rg(a){function b(c,d){a.moveTo(c,d);a.arc(c,d,g,0,Ga)}function c(b,e){a.moveTo(b,e);h.point=d}function d(b,c){a.lineTo(b,c)}function e(){h.point=b}function f(){a.closePath()}var g=4.5,h={point:b,lineStart:function(){h.point=c},lineEnd:e,polygonStart:function(){h.lineEnd=f},polygonEnd:function(){h.lineEnd=e;h.point=b},pointRadius:function(a){return g=a,h},result:n};return h}function Ee(a){function b(a){return(h?d:c)(a)}function c(b){return Fe(b,function(c,d){c=
a(c,d);b.point(c[0],c[1])})}function d(b){function c(d,e){d=a(d,e);b.point(d[0],d[1])}function f(){s=0/0;v.point=J;b.lineStart()}function J(c,d){var f=kb([c,d]),R=a(c,d);e(s,r,q,t,w,u,s=R[0],r=R[1],q=c,t=f[0],w=f[1],u=f[2],h,b);b.point(s,r)}function R(){v.point=c;b.lineEnd()}function g(){f();v.point=ga;v.lineEnd=k}function ga(a,b){J(ca=a,b);l=s;xa=r;m=t;p=w;n=u;v.point=J}function k(){e(s,r,q,t,w,u,l,xa,ca,m,p,n,h,b);v.lineEnd=R;R()}var ca,l,xa,m,p,n,q,s,r,t,w,u,v={point:c,lineStart:f,lineEnd:R,polygonStart:function(){b.polygonStart();
v.lineStart=g},polygonEnd:function(){b.polygonEnd();v.lineStart=f}};return v}function e(b,c,d,J,R,h,ga,k,l,ua,m,p,n,q){var s=ga-b,r=k-c,t=s*s+r*r;if(t>4*f&&n--){var w=J+ua,u=R+m,v=h+p,z=Math.sqrt(w*w+u*u+v*v),y=Math.asin(v/=z),x=$($(v)-1)<N||$(d-l)<N?(d+l)/2:Math.atan2(u,w),B=a(x,y),y=B[0],B=B[1],D=y-b,C=B-c,F=r*D-s*C;(F*F/t>f||0.3<$((s*D+r*C)/t-0.5)||g>J*ua+R*m+h*p)&&(e(b,c,d,J,R,h,y,B,x,w/=z,u/=z,v,n,q),q.point(y,B),e(y,B,x,w,u,v,ga,k,l,ua,m,p,n,q))}}var f=0.5,g=Math.cos(30*Y),h=16;return b.precision=
function(a){return arguments.length?(h=0<(f=a*a)&&16,b):Math.sqrt(f)},b}function Sg(a){var b=Ee(function(b,c){return a([b*ma,c*ma])});return function(a){return Ge(b(a))}}function He(a){this.stream=a}function Fe(a,b){return{point:b,sphere:function(){a.sphere()},lineStart:function(){a.lineStart()},lineEnd:function(){a.lineEnd()},polygonStart:function(){a.polygonStart()},polygonEnd:function(){a.polygonEnd()}}}function eb(a){return kd(function(){return a})()}function kd(a){function b(a){return a=h(a[0]*
Y,a[1]*Y),[a[0]*L+k,l-a[1]*L]}function c(a){return a=h.invert((a[0]-k)/L,(l-a[1])/L),a&&[a[0]*ma,a[1]*ma]}function d(){h=ze(g=ld(w,v,aa),f);var a=f(r,t);return k=q-a[0]*L,l=s+a[1]*L,e()}function e(){return m&&(m.valid=!1,m=null),b}var f,g,h,k,l,m,n=Ee(function(a,b){return a=f(a,b),[a[0]*L+k,l-a[1]*L]}),L=150,q=480,s=250,r=0,t=0,w=0,v=0,aa=0,u=Ie,y=va,z=null,B=null;return b.stream=function(a){return m&&(m.valid=!1),m=Ge(u(g,n(y(a)))),m.valid=!0,m},b.clipAngle=function(a){return arguments.length?(u=
null==a?(z=a,Ie):Ng((z=+a)*Y),e()):z},b.clipExtent=function(a){return arguments.length?(B=a,y=a?ye(a[0][0],a[0][1],a[1][0],a[1][1]):va,e()):B},b.scale=function(a){return arguments.length?(L=+a,d()):L},b.translate=function(a){return arguments.length?(q=+a[0],s=+a[1],d()):[q,s]},b.center=function(a){return arguments.length?(r=a[0]%360*Y,t=a[1]%360*Y,d()):[r*ma,t*ma]},b.rotate=function(a){return arguments.length?(w=a[0]%360*Y,v=a[1]%360*Y,aa=2<a.length?a[2]%360*Y:0,d()):[w*ma,v*ma,aa*ma]},p.rebind(b,
n,"precision"),function(){return f=a.apply(this,arguments),b.invert=f.invert&&c,d()}}function Ge(a){return Fe(a,function(b,c){a.point(b*Y,c*Y)})}function Ib(a,b){return[a,b]}function Je(a,b){return[a>W?a-Ga:-W>a?a+Ga:a,b]}function ld(a,b,c){return a?b||c?ze(Ke(a),Le(b,c)):Ke(a):b||c?Le(b,c):Je}function Me(a){return function(b,c){return b+=a,[b>W?b-Ga:-W>b?b+Ga:b,c]}}function Ke(a){var b=Me(a);return b.invert=Me(-a),b}function Le(a,b){function c(a,b){var A=Math.cos(b),J=Math.cos(a)*A,A=Math.sin(a)*
A,R=Math.sin(b),h=R*d+J*e;return[Math.atan2(A*f-h*g,J*d-R*e),Z(h*f+A*g)]}var d=Math.cos(a),e=Math.sin(a),f=Math.cos(b),g=Math.sin(b);return c.invert=function(a,b){var c=Math.cos(b),A=Math.cos(a)*c,c=Math.sin(a)*c,J=Math.sin(b),R=J*f-c*g;return[Math.atan2(c*f+J*g,A*d+R*e),Z(R*d-A*e)]},c}function id(a,b){var c=Math.cos(a),d=Math.sin(a);return function(e,f,g,h){var k=g*b;null!=e?(e=Ne(c,e),f=Ne(c,f),(0<g?f>e:e>f)&&(e+=g*Ga)):(e=a+g*Ga,f=a-0.5*k);for(var l;0<g?e>f:f>e;e-=k)h.point((l=ic([c,-d*Math.cos(e),
-d*Math.sin(e)]))[0],l[1])}}function Ne(a,b){var c=kb(b);c[0]-=a;hc(c);var d=1<-c[1]?0:-1>-c[1]?W:Math.acos(-c[1]);return((0>-c[2]?-d:d)+2*Math.PI-N)%(2*Math.PI)}function Oe(a,b,c){var d=p.range(a,b-N,c).concat(b);return function(a){return d.map(function(b){return[a,b]})}}function Pe(a,b,c){var d=p.range(a,b-N,c).concat(b);return function(a){return d.map(function(b){return[b,a]})}}function md(a){return a.source}function nd(a){return a.target}function Tg(a,b,c,d){var e=Math.cos(b),f=Math.sin(b),g=
Math.cos(d),h=Math.sin(d),k=e*Math.cos(a),l=e*Math.sin(a),m=g*Math.cos(c),p=g*Math.sin(c),L=2*Math.asin(Math.sqrt(pa(d-b)+e*g*pa(c-a))),n=1/Math.sin(L);c=L?function(a){var b=Math.sin(a*=L)*n,c=Math.sin(L-a)*n;a=c*k+b*m;var d=c*l+b*p,b=c*f+b*h;return[Math.atan2(d,a)*ma,Math.atan2(b,Math.sqrt(a*a+d*d))*ma]}:function(){return[a*ma,b*ma]};return c.distance=L,c}function Jb(a,b){function c(b,d){var e=Math.cos(b),f=Math.cos(d),e=a(e*f);return[e*f*Math.sin(b),e*Math.sin(d)]}return c.invert=function(a,c){var d=
Math.sqrt(a*a+c*c),e=b(d),A=Math.sin(e),e=Math.cos(e);return[Math.atan2(a*A,d*e),Math.asin(d&&c*A/d)]},c}function Qe(a,b){function c(a,b){var d=$($(b)-Ba)<N?0:f/Math.pow(Math.tan(W/4+b/2),e);return[d*Math.sin(e*a),f-d*Math.cos(e*a)]}var d=Math.cos(a),e=a===b?Math.sin(a):Math.log(d/Math.cos(b))/Math.log(Math.tan(W/4+b/2)/Math.tan(W/4+a/2)),f=d*Math.pow(Math.tan(W/4+a/2),e)/e;return e?(c.invert=function(a,b){var c=f-b,d=(0<e?1:0>e?-1:0)*Math.sqrt(a*a+c*c);return[Math.atan2(a,c)/e,2*Math.atan(Math.pow(f/
d,1/e))-Ba]},c):nc}function Re(a,b){function c(a,b){var d=f-b;return[d*Math.sin(e*a),f-d*Math.cos(e*a)]}var d=Math.cos(a),e=a===b?Math.sin(a):(d-Math.cos(b))/(b-a),f=d/e+a;return $(e)<N?Ib:(c.invert=function(a,b){var c=f-b;return[Math.atan2(a,c)/e,f-(0<e?1:0>e?-1:0)*Math.sqrt(a*a+c*c)]},c)}function nc(a,b){return[a,Math.log(Math.tan(W/4+b/2))]}function Se(a){var b,c=eb(a),d=c.scale,e=c.translate,f=c.clipExtent;return c.scale=function(){var a=d.apply(c,arguments);return a===c?b?c.clipExtent(null):
c:a},c.translate=function(){var a=e.apply(c,arguments);return a===c?b?c.clipExtent(null):c:a},c.clipExtent=function(a){var A=f.apply(c,arguments);if(A===c){if(b=null==a){var g=W*d(),h=e();f([[h[0]-g,h[1]-g],[h[0]+g,h[1]+g]])}}else b&&(A=null);return A},c.clipExtent(null)}function od(a,b){return[Math.log(Math.tan(W/4+b/2)),-a]}function vb(a){return a[0]}function Kb(a){return a[1]}function Te(a){for(var b=a.length,c=[0,1],d=2,e=2;b>e;e++){for(;1<d&&0>=I(a[c[d-2]],a[c[d-1]],a[e]);)--d;c[d++]=e}return c.slice(0,
d)}function Ug(a,b){return a[0]-b[0]||a[1]-b[1]}function pd(a,b,c){return(c[0]-b[0])*(a[1]-b[1])<(c[1]-b[1])*(a[0]-b[0])}function Ue(a,b,c,d){var e=a[0],f=c[0],g=b[0]-e,h=d[0]-f;a=a[1];c=c[1];b=b[1]-a;d=d[1]-c;f=(h*(a-c)-d*(e-f))/(d*g-h*b);return[e+f*g,a+f*b]}function Ve(a){var b=a[0];a=a[a.length-1];return!(b[0]-a[0]||b[1]-a[1])}function Vg(){oc(this);this.edge=this.site=this.circle=null}function We(a){var b=Xe.pop()||new Vg;return b.site=a,b}function qd(a){wb(a);xb.remove(a);Xe.push(a);oc(a)}function Ye(a,
b){var c=a.site,d=c.x,e=c.y,f=e-b;if(!f)return d;var g=a.P;if(!g)return-1/0;var c=g.site,g=c.x,c=c.y,h=c-b;if(!h)return g;var k=g-d,l=1/f-1/h,m=k/h;return l?(-m+Math.sqrt(m*m-2*l*(k*k/(-2*h)-c+h/2+e-f/2)))/l+d:(d+g)/2}function Ze(a){this.site=a;this.edges=[]}function $e(a,b){return b.angle-a.angle}function Wg(){oc(this);this.x=this.y=this.arc=this.site=this.cy=null}function yb(a){var b=a.P,c=a.N;if(b&&c){var d=b.site,b=a.site,e=c.site;if(d!==e){var c=b.x,f=b.y,g=d.x-c,h=d.y-f,d=e.x-c,e=e.y-f,k=2*
(g*e-h*d);if(!(k>=-rd)){var l=g*g+h*h,m=d*d+e*e,h=(e*l-h*m)/k,g=(g*m-d*l)/k,e=g+f,f=af.pop()||new Wg;f.arc=a;f.site=b;f.x=h+c;f.y=e+Math.sqrt(h*h+g*g);f.cy=e;a.circle=f;a=null;for(b=Lb._;b;)if(f.y<b.y||f.y===b.y&&f.x<=b.x){if(!b.L){a=b.P;break}b=b.L}else{if(!b.R){a=b;break}b=b.R}Lb.insert(a,f);a||(sd=f)}}}}function wb(a){var b=a.circle;b&&(b.P||(sd=b.N),Lb.remove(b),af.push(b),oc(b),a.circle=null)}function Xg(a,b){var c=a.b;if(c)return!0;var d,e,f=a.a,c=b[0][0],g=b[1][0],h=b[0][1],k=b[1][1],l=a.l,
m=a.r,p=l.x,l=l.y,L=m.x,m=m.y;e=(p+L)/2;if(m===l){if(c>e||e>=g)return;if(p>L){if(f){if(f.y>=k)return}else f={x:e,y:h};c={x:e,y:k}}else{if(f){if(f.y<h)return}else f={x:e,y:k};c={x:e,y:h}}}else if(d=(p-L)/(m-l),e=(l+m)/2-d*e,-1>d||1<d)if(p>L){if(f){if(f.y>=k)return}else f={x:(h-e)/d,y:h};c={x:(k-e)/d,y:k}}else{if(f){if(f.y<h)return}else f={x:(k-e)/d,y:k};c={x:(h-e)/d,y:h}}else if(m>l){if(f){if(f.x>=g)return}else f={x:c,y:d*c+e};c={x:g,y:d*g+e}}else{if(f){if(f.x<c)return}else f={x:g,y:d*g+e};c={x:c,
y:d*c+e}}return a.a=f,a.b=c,!0}function bf(a,b){this.l=a;this.r=b;this.a=this.b=null}function Mb(a,b,c,d){var e=new bf(a,b);return zb.push(e),c&&pc(e,a,b,c),d&&pc(e,b,a,d),mb[a.i].edges.push(new qc(e,a,b)),mb[b.i].edges.push(new qc(e,b,a)),e}function Yg(a,b,c){a=new bf(a,null);return a.a=b,a.b=c,zb.push(a),a}function pc(a,b,c,d){a.a||a.b?a.l===c?a.b=d:a.a=d:(a.a=d,a.l=b,a.r=c)}function qc(a,b,c){var d=a.a,e=a.b;this.edge=a;this.site=b;this.angle=c?Math.atan2(c.y-b.y,c.x-b.x):a.l===b?Math.atan2(e.x-
d.x,d.y-e.y):Math.atan2(d.x-e.x,e.y-d.y)}function td(){this._=null}function oc(a){a.U=a.C=a.L=a.R=a.P=a.N=null}function Nb(a,b){var c=b.R,d=b.U;d?d.L===b?d.L=c:d.R=c:a._=c;c.U=d;b.U=c;b.R=c.L;b.R&&(b.R.U=b);c.L=b}function Ob(a,b){var c=b.L,d=b.U;d?d.L===b?d.L=c:d.R=c:a._=c;c.U=d;b.U=c;b.L=c.R;b.L&&(b.L.U=b);c.R=b}function cf(a){for(;a.L;)a=a.L;return a}function ud(a,b){var c,d,e,f=a.sort(Zg).pop();zb=[];mb=Array(a.length);xb=new td;for(Lb=new td;;)if(e=sd,f&&(!e||f.y<e.y||f.y===e.y&&f.x<e.x)){if(f.x!==
c||f.y!==d){mb[f.i]=new Ze(f);c=f;for(var g=d=void 0,h=void 0,k=void 0,l=c.x,m=c.y,p=xb._;p;)if(h=Ye(p,m)-l,h>N)p=p.L;else{var L=l,n;var q=p;n=m;var s=q.N;s?n=Ye(s,n):(q=q.site,n=q.y===n?q.x:1/0);if(k=L-n,!(k>N)){h>-N?(d=p.P,g=p):k>-N?(d=p,g=p.N):d=g=p;break}if(!p.R){d=p;break}p=p.R}h=We(c);if(xb.insert(d,h),d||g)if(d===g)wb(d),g=We(d.site),xb.insert(h,g),h.edge=g.edge=Mb(d.site,h.site),yb(d),yb(g);else if(g){wb(d);wb(g);k=d.site;m=k.x;p=k.y;L=c.x-m;n=c.y-p;var l=g.site,q=l.x-m,s=l.y-p,r=2*(L*s-n*
q),t=L*L+n*n,w=q*q+s*s,m={x:(s*t-n*w)/r+m,y:(L*w-q*t)/r+p};pc(g.edge,k,l,m);h.edge=Mb(k,c,null,m);g.edge=Mb(c,l,null,m);yb(d);yb(g)}else h.edge=Mb(d.site,h.site);c=f.x;d=f.y}f=a.pop()}else{if(!e)break;l=e.arc;g=l.circle;k=g.x;m=g.cy;g={x:k,y:m};L=l.P;p=l.N;h=[l];qd(l);for(l=L;l.circle&&$(k-l.circle.x)<N&&$(m-l.circle.cy)<N;)L=l.P,h.unshift(l),qd(l),l=L;h.unshift(l);wb(l);for(L=p;L.circle&&$(k-L.circle.x)<N&&$(m-L.circle.cy)<N;)p=L.N,h.push(L),qd(L),L=p;h.push(L);wb(L);k=void 0;m=h.length;for(k=1;m>
k;++k)L=h[k],l=h[k-1],pc(L.edge,l.site,L.site,g);l=h[0];L=h[m-1];L.edge=Mb(l.site,L.site,null,g);yb(l);yb(L)}if(b){f=zb;c=xe(b[0][0],b[0][1],b[1][0],b[1][1]);for(d=f.length;d--;)e=f[d],(!Xg(e,b)||!c(e)||$(e.a.x-e.b.x)<N&&$(e.a.y-e.b.y)<N)&&(e.a=e.b=null,f.splice(d,1));var aa,l=b[0][0],m=b[1][0],p=b[0][1],L=b[1][1];n=mb;for(q=n.length;q--;)if(aa=n[q],aa&&aa.prepare()){g=aa.edges;h=g.length;for(d=0;h>d;)k=g[d].end(),f=k.x,c=k.y,s=g[++d%h].start(),e=s.x,s=s.y,($(f-e)>N||$(c-s)>N)&&(g.splice(d,0,new qc(Yg(aa.site,
k,$(f-l)<N&&L-c>N?{x:l,y:$(e-l)<N?s:L}:$(c-L)<N&&m-f>N?{x:$(s-L)<N?e:m,y:L}:$(f-m)<N&&c-p>N?{x:m,y:$(e-m)<N?s:p}:$(c-p)<N&&f-l>N?{x:$(s-p)<N?e:l,y:p}:null),aa.site,null)),++h)}}aa={cells:mb,edges:zb};return xb=Lb=zb=mb=null,aa}function Zg(a,b){return b.y-a.y||b.x-a.x}function $g(a){return a.x}function ah(a){return a.y}function df(){return{leaf:!0,nodes:[],point:null,x:null,y:null}}function Pb(a,b,c,d,e,f){if(!a(b,c,d,e,f)){var g=0.5*(c+e),h=0.5*(d+f);b=b.nodes;b[0]&&Pb(a,b[0],c,d,g,h);b[1]&&Pb(a,
b[1],g,d,e,h);b[2]&&Pb(a,b[2],c,h,g,f);b[3]&&Pb(a,b[3],g,h,e,f)}}function vd(a,b){a=p.rgb(a);b=p.rgb(b);var c=a.r,d=a.g,e=a.b,f=b.r-c,g=b.g-d,h=b.b-e;return function(a){return"#"+rb(Math.round(c+f*a))+rb(Math.round(d+g*a))+rb(Math.round(e+h*a))}}function ef(a,b){var c,d={},e={};for(c in a)c in b?d[c]=nb(a[c],b[c]):e[c]=a[c];for(c in b)c in a||(e[c]=b[c]);return function(a){for(c in d)e[c]=d[c](a);return e}}function Xa(a,b){return b-=a=+a,function(c){return a+b*c}}function ff(a,b){var c,d,e,f,g=0,
h=[],k=[];a+="";b+="";for(d=rc.lastIndex=0;c=rc.exec(b);++d)c.index&&h.push(b.substring(g,c.index)),k.push({i:h.length,x:c[0]}),h.push(null),g=rc.lastIndex;g<b.length&&h.push(b.substring(g));d=0;for(e=k.length;(c=rc.exec(a))&&e>d;++d)if(f=k[d],f.x==c[0]){if(f.i)if(null==h[f.i+1]){h[f.i-1]+=f.x;h.splice(f.i,1);for(c=d+1;e>c;++c)k[c].i--}else{h[f.i-1]+=f.x+h[f.i+1];h.splice(f.i,2);for(c=d+1;e>c;++c)k[c].i-=2}else if(null==h[f.i+1])h[f.i]=f.x;else{h[f.i]=f.x+h[f.i+1];h.splice(f.i+1,1);for(c=d+1;e>c;++c)k[c].i--}k.splice(d,
1);e--;d--}else f.x=Xa(parseFloat(c[0]),parseFloat(f.x));for(;e>d;)f=k.pop(),null==h[f.i+1]?h[f.i]=f.x:(h[f.i]=f.x+h[f.i+1],h.splice(f.i+1,1)),e--;return 1===h.length?null==h[0]?(f=k[0].x,function(a){return f(a)+""}):function(){return b}:function(a){for(d=0;e>d;++d)h[(f=k[d]).i]=f.x(a);return h.join("")}}function nb(a,b){for(var c,d=p.interpolators.length;0<=--d&&!(c=p.interpolators[d](a,b)););return c}function sc(a,b){var c,d=[],e=[],f=a.length,g=b.length,h=Math.min(a.length,b.length);for(c=0;h>
c;++c)d.push(nb(a[c],b[c]));for(;f>c;++c)e[c]=a[c];for(;g>c;++c)e[c]=b[c];return function(a){for(c=0;h>c;++c)e[c]=d[c](a);return e}}function bh(a){return function(b){return 0>=b?0:1<=b?1:a(b)}}function gf(a){return function(b){return 1-a(1-b)}}function hf(a){return function(b){return 0.5*(0.5>b?a(2*b):2-a(2-2*b))}}function ch(a){return a*a}function dh(a){return a*a*a}function eh(a){if(0>=a)return 0;if(1<=a)return 1;var b=a*a,c=b*a;return 4*(0.5>a?c:3*(a-b)+c-0.75)}function fh(a){return 1-Math.cos(a*
Ba)}function gh(a){return Math.pow(2,10*(a-1))}function hh(a){return 1-Math.sqrt(1-a*a)}function ih(a){return 1/2.75>a?7.5625*a*a:2/2.75>a?7.5625*(a-=1.5/2.75)*a+0.75:2.5/2.75>a?7.5625*(a-=2.25/2.75)*a+0.9375:7.5625*(a-=2.625/2.75)*a+0.984375}function jf(a,b){return b-=a,function(c){return Math.round(a+b*c)}}function kf(a){var b=[a.a,a.b],c=[a.c,a.d],d=lf(b),e=b[0]*c[0]+b[1]*c[1],f=lf((c[0]+=-e*b[0],c[1]+=-e*b[1],c))||0;b[0]*c[1]<c[0]*b[1]&&(b[0]*=-1,b[1]*=-1,d*=-1,e*=-1);this.rotate=(d?Math.atan2(b[1],
b[0]):Math.atan2(-c[0],c[1]))*ma;this.translate=[a.e,a.f];this.scale=[d,f];this.skew=f?Math.atan2(e,f)*ma:0}function lf(a){var b=Math.sqrt(a[0]*a[0]+a[1]*a[1]);return b&&(a[0]/=b,a[1]/=b),b}function mf(a,b){var c,d=[],e=[],f=p.transform(a),g=p.transform(b),h=f.translate,k=g.translate,l=f.rotate,m=g.rotate,n=f.skew,L=g.skew,f=f.scale,g=g.scale;return h[0]!=k[0]||h[1]!=k[1]?(d.push("translate(",null,",",null,")"),e.push({i:1,x:Xa(h[0],k[0])},{i:3,x:Xa(h[1],k[1])})):k[0]||k[1]?d.push("translate("+k+
")"):d.push(""),l!=m?(180<l-m?m+=360:180<m-l&&(l+=360),e.push({i:d.push(d.pop()+"rotate(",null,")")-2,x:Xa(l,m)})):m&&d.push(d.pop()+"rotate("+m+")"),n!=L?e.push({i:d.push(d.pop()+"skewX(",null,")")-2,x:Xa(n,L)}):L&&d.push(d.pop()+"skewX("+L+")"),f[0]!=g[0]||f[1]!=g[1]?(c=d.push(d.pop()+"scale(",null,",",null,")"),e.push({i:c-4,x:Xa(f[0],g[0])},{i:c-2,x:Xa(f[1],g[1])})):(1!=g[0]||1!=g[1])&&d.push(d.pop()+"scale("+g+")"),c=e.length,function(a){for(var b,f=-1;++f<c;)d[(b=e[f]).i]=b.x(a);return d.join("")}}
function jh(a,b){return b=b-(a=+a)?1/(b-a):0,function(c){return(c-a)*b}}function kh(a,b){return b=b-(a=+a)?1/(b-a):0,function(c){return Math.max(0,Math.min(1,(c-a)*b))}}function lh(a){var b=a.source;a=a.target;var c;var d=a;if(b===d)c=b;else{c=nf(b);for(var d=nf(d),e=c.pop(),f=d.pop(),g=null;e===f;)g=e,e=c.pop(),f=d.pop();c=g}for(d=[b];b!==c;)b=b.parent,d.push(b);for(b=d.length;a!==c;)d.splice(b,0,a),a=a.parent;return d}function nf(a){for(var b=[],c=a.parent;null!=c;)b.push(a),a=c,c=c.parent;return b.push(a),
b}function mh(a){a.fixed|=2}function nh(a){a.fixed&=-7}function oh(a){a.fixed|=4;a.px=a.x;a.py=a.y}function ph(a){a.fixed&=-5}function of(a,b,c){var d=0,e=0;if(a.charge=0,!a.leaf)for(var f,g=a.nodes,h=g.length,k=-1;++k<h;)f=g[k],null!=f&&(of(f,b,c),a.charge+=f.charge,d+=f.charge*f.cx,e+=f.charge*f.cy);a.point&&(a.leaf||(a.point.x+=Math.random()-0.5,a.point.y+=Math.random()-0.5),b*=c[a.point.index],a.charge+=a.pointCharge=b,d+=b*a.point.x,e+=b*a.point.y);a.cx=d/a.charge;a.cy=e/a.charge}function Qb(a,
b){return p.rebind(a,b,"sort","children","value"),a.nodes=a,a.links=qh,a}function rh(a){return a.children}function sh(a){return a.value}function th(a,b){return b.value-a.value}function qh(a){return p.merge(a.map(function(a){return(a.children||[]).map(function(b){return{source:a,target:b}})}))}function uh(a){return a.x}function vh(a){return a.y}function wh(a,b,c){a.y0=b;a.y=c}function wd(a){return p.range(a.length)}function xd(a){var b=-1;a=a[0].length;for(var c=[];++b<a;)c[b]=0;return c}function xh(a){for(var b,
c=1,d=0,e=a[0][1],f=a.length;f>c;++c)(b=a[c][1])>e&&(d=c,e=b);return d}function yh(a){return a.reduce(zh,0)}function zh(a,b){return a+b[1]}function Ah(a,b){return pf(a,Math.ceil(Math.log(b.length)/Math.LN2+1))}function pf(a,b){for(var c=-1,d=+a[0],e=(a[1]-d)/b,f=[];++c<=b;)f[c]=e*c+d;return f}function Bh(a){return[p.min(a),p.max(a)]}function qf(a,b){return a.parent==b.parent?1:2}function yd(a){var b=a.children;return b&&b.length?b[0]:a._tree.thread}function zd(a){var b,c=a.children;return c&&(b=c.length)?
c[b-1]:a._tree.thread}function tc(a,b){var c=a.children;if(c&&(e=c.length))for(var d,e,f=-1;++f<e;)0<b(d=tc(c[f],b),a)&&(a=d);return a}function Ch(a,b){return a.x-b.x}function Dh(a,b){return b.x-a.x}function Eh(a,b){return a.depth-b.depth}function Ya(a,b){function c(a,d){var e=a.children;if(e&&(A=e.length))for(var f,A,g=null,h=-1;++h<A;)f=e[h],c(f,g),g=f;b(a,d)}c(a,null)}function Fh(a,b){return a.value-b.value}function Ad(a,b){var c=a._pack_next;a._pack_next=b;b._pack_prev=a;b._pack_next=c;c._pack_prev=
b}function rf(a,b){a._pack_next=b;b._pack_prev=a}function sf(a,b){var c=b.x-a.x,d=b.y-a.y,e=a.r+b.r;return 0.999*e*e>c*c+d*d}function tf(a){function b(a){m=Math.min(a.x-a.r,m);p=Math.max(a.x+a.r,p);n=Math.min(a.y-a.r,n);q=Math.max(a.y+a.r,q)}if((c=a.children)&&(l=c.length)){var c,d,e,f,g,h,k,l,m=1/0,p=-1/0,n=1/0,q=-1/0;if(c.forEach(Gh),d=c[0],d.x=-d.r,d.y=0,b(d),1<l&&(e=c[1],e.x=e.r,e.y=0,b(e),2<l)){f=c[2];uf(d,e,f);b(f);Ad(d,f);d._pack_prev=f;Ad(f,e);e=d._pack_next;for(g=3;l>g;g++){uf(d,e,f=c[g]);
var s=0,r=1,t=1;for(h=e._pack_next;h!==e;h=h._pack_next,r++)if(sf(h,f)){s=1;break}if(1==s)for(k=d._pack_prev;k!==h._pack_prev&&!sf(k,f);k=k._pack_prev,t++);s?(t>r||r==t&&e.r<d.r?rf(d,e=h):rf(d=k,e),g--):(Ad(d,f),e=f,b(f))}}d=(m+p)/2;e=(n+q)/2;for(g=h=0;l>g;g++)f=c[g],f.x-=d,f.y-=e,h=Math.max(h,f.r+Math.sqrt(f.x*f.x+f.y*f.y));a.r=h;c.forEach(Hh)}}function Gh(a){a._pack_next=a._pack_prev=a}function Hh(a){delete a._pack_next;delete a._pack_prev}function vf(a,b,c,d){var e=a.children;if(a.x=b+=d*a.x,a.y=
c+=d*a.y,a.r*=d,e){a=-1;for(var f=e.length;++a<f;)vf(e[a],b,c,d)}}function uf(a,b,c){var d=a.r+c.r,e=b.x-a.x,f=b.y-a.y;if(d&&(e||f)){var g=b.r+c.r,h=e*e+f*f,g=g*g,d=d*d;b=0.5+(d-g)/(2*h);g=Math.sqrt(Math.max(0,2*g*(d+h)-(d-=h)*d-g*g))/(2*h);c.x=a.x+b*e+g*f;c.y=a.y+b*f-g*e}else c.x=a.x+d,c.y=a.y}function Ih(a){return 1+p.max(a,function(a){return a.y})}function Jh(a){return a.reduce(function(a,b){return a+b.x},0)/a.length}function wf(a){var b=a.children;return b&&b.length?wf(b[0]):a}function xf(a){var b,
c=a.children;return c&&(b=c.length)?xf(c[b-1]):a}function Bd(a){return{x:a.x,y:a.y,dx:a.dx,dy:a.dy}}function yf(a,b){var c=a.x+b[3],d=a.y+b[0],e=a.dx-b[1]-b[3],f=a.dy-b[0]-b[2];return 0>e&&(c+=e/2,e=0),0>f&&(d+=f/2,f=0),{x:c,y:d,dx:e,dy:f}}function Ab(a){var b=a[0];a=a[a.length-1];return a>b?[b,a]:[a,b]}function uc(a){return a.rangeExtent?a.rangeExtent():Ab(a.range())}function Kh(a,b,c,d){var e=c(a[0],a[1]),f=d(b[0],b[1]);return function(a){return f(e(a))}}function vc(a,b){var c,d=0,e=a.length-1,
f=a[d],g=a[e];return f>g&&(c=d,d=e,e=c,c=f,f=g,g=c),a[d]=b.floor(f),a[e]=b.ceil(g),a}function zf(a){return a?{floor:function(b){return Math.floor(b/a)*a},ceil:function(b){return Math.ceil(b/a)*a}}:Lh}function Mh(a,b,c,d){var e=[],f=[],g=0,h=Math.min(a.length,b.length)-1;for(a[h]<a[0]&&(a=a.slice().reverse(),b=b.slice().reverse());++g<=h;)e.push(c(a[g-1],a[g])),f.push(d(b[g-1],b[g]));return function(b){var c=p.bisect(a,b,1,h)-1;return f[c](e[c](b))}}function Af(a,b,c,d){function e(){var k=2<Math.min(a.length,
b.length)?Mh:Kh,l=d?kh:jh;return g=k(a,b,l,c),h=k(b,a,l,nb),f}function f(a){return g(a)}var g,h;return f.invert=function(a){return h(a)},f.domain=function(b){return arguments.length?(a=b.map(Number),e()):a},f.range=function(a){return arguments.length?(b=a,e()):b},f.rangeRound=function(a){return f.range(a).interpolate(jf)},f.clamp=function(a){return arguments.length?(d=a,e()):d},f.interpolate=function(a){return arguments.length?(c=a,e()):c},f.ticks=function(b){return p.range.apply(p,fb(a,b))},f.tickFormat=
function(b,c){return Cd(a,b,c)},f.nice=function(b){return vc(a,zf(fb(a,b)[2])),e()},f.copy=function(){return Af(a,b,c,d)},e()}function Dd(a,b){return p.rebind(a,b,"range","rangeRound","interpolate","clamp")}function fb(a,b){null==b&&(b=10);var c=Ab(a),d=c[1]-c[0],e=Math.pow(10,Math.floor(Math.log(d/b)/Math.LN10)),d=b/d*e;return 0.15>=d?e*=10:0.35>=d?e*=5:0.75>=d&&(e*=2),c[0]=Math.ceil(c[0]/e)*e,c[1]=Math.floor(c[1]/e)*e+0.5*e,c[2]=e,c}function Cd(a,b,c){var d=fb(a,b);return p.format(c?c.replace(ie,
function(a,b,c,e,f,A,g,h,k,J){return[b,c,e,f,A,g,h,k||"."+Nh(J,d),J].join("")}):",."+Ed(d[2])+"f")}function Ed(a){return-Math.floor(Math.log(a)/Math.LN10+0.01)}function Nh(a,b){var c=Ed(b[2]);return a in Oh?Math.abs(c-Ed(Math.max(Math.abs(b[0]),Math.abs(b[1]))))+ +("e"!==a):c-2*("%"===a)}function Bf(a,b,c,d){function e(a){return(c?Math.log(0>a?0:a):-Math.log(0<a?0:-a))/Math.log(b)}function f(a){return c?Math.pow(b,a):-Math.pow(b,-a)}function g(b){return a(e(b))}return g.invert=function(b){return f(a.invert(b))},
g.domain=function(b){return arguments.length?(c=0<=b[0],a.domain((d=b.map(Number)).map(e)),g):d},g.base=function(c){return arguments.length?(b=+c,a.domain(d.map(e)),g):b},g.nice=function(){var b=vc(d.map(e),c?Math:Ph);return a.domain(b),d=b.map(f),g},g.ticks=function(){var a=Ab(d),A=[],g=a[0],a=a[1],h=Math.floor(e(g)),k=Math.ceil(e(a)),l=b%1?2:b;if(isFinite(k-h)){if(c){for(;k>h;h++)for(var m=1;l>m;m++)A.push(f(h)*m);A.push(f(h))}else for(A.push(f(h));h++<k;)for(m=l-1;0<m;m--)A.push(f(h)*m);for(h=
0;A[h]<g;h++);for(k=A.length;A[k-1]>a;k--);A=A.slice(h,k)}return A},g.tickFormat=function(a,b){if(!arguments.length)return Cf;2>arguments.length?b=Cf:"function"!=typeof b&&(b=p.format(b));var d,A=Math.max(0.1,a/g.ticks().length),h=c?(d=1E-12,Math.ceil):(d=-1E-12,Math.floor);return function(a){return a/f(h(e(a)+d))<=A?b(a):""}},g.copy=function(){return Bf(a.copy(),b,c,d)},Dd(g,a)}function Df(a,b,c){function d(b){return a(e(b))}var e=wc(b),f=wc(1/b);return d.invert=function(b){return f(a.invert(b))},
d.domain=function(b){return arguments.length?(a.domain((c=b.map(Number)).map(e)),d):c},d.ticks=function(a){return p.range.apply(p,fb(c,a))},d.tickFormat=function(a,b){return Cd(c,a,b)},d.nice=function(a){return d.domain(vc(c,zf(fb(c,a)[2])))},d.exponent=function(g){return arguments.length?(e=wc(b=g),f=wc(1/b),a.domain(c.map(e)),d):b},d.copy=function(){return Df(a.copy(),b,c)},Dd(d,a)}function wc(a){return function(b){return 0>b?-Math.pow(-b,a):Math.pow(b,a)}}function Ef(b,c){function d(a){return g[((f.get(a)||
"range"===c.t&&f.set(a,b.push(a)))-1)%g.length]}function e(a,c){return p.range(b.length).map(function(b){return a+c*b})}var f,g,h;return d.domain=function(e){if(!arguments.length)return b;b=[];f=new a;for(var g,h=-1,k=e.length;++h<k;)f.has(g=e[h])||f.set(g,b.push(g));return d[c.t].apply(d,c.a)},d.range=function(a){return arguments.length?(g=a,h=0,c={t:"range",a:arguments},d):g},d.rangePoints=function(a,f){2>arguments.length&&(f=0);var k=a[0],l=a[1],ba=(l-k)/(Math.max(1,b.length-1)+f);return g=e(2>
b.length?(k+l)/2:k+ba*f/2,ba),h=0,c={t:"rangePoints",a:arguments},d},d.rangeBands=function(a,f,k){2>arguments.length&&(f=0);3>arguments.length&&(k=f);var l=a[1]<a[0],ba=a[l-0],m=(a[1-l]-ba)/(b.length-f+2*k);return g=e(ba+m*k,m),l&&g.reverse(),h=m*(1-f),c={t:"rangeBands",a:arguments},d},d.rangeRoundBands=function(a,f,k){2>arguments.length&&(f=0);3>arguments.length&&(k=f);var l=a[1]<a[0],ba=a[l-0],m=a[1-l],p=Math.floor((m-ba)/(b.length-f+2*k));return g=e(ba+Math.round((m-ba-(b.length-f)*p)/2),p),l&&
g.reverse(),h=Math.round(p*(1-f)),c={t:"rangeRoundBands",a:arguments},d},d.rangeBand=function(){return h},d.rangeExtent=function(){return Ab(c.a[0])},d.copy=function(){return Ef(b,c)},d.domain(b)}function Ff(a,b){function c(){var f=0,g=b.length;for(e=[];++f<g;)e[f-1]=p.quantile(a,f/g);return d}function d(a){return isNaN(a=+a)?void 0:b[p.bisect(e,a)]}var e;return d.domain=function(b){return arguments.length?(a=b.filter(function(a){return!isNaN(a)}).sort(p.ascending),c()):a},d.range=function(a){return arguments.length?
(b=a,c()):b},d.quantiles=function(){return e},d.invertExtent=function(c){return c=b.indexOf(c),0>c?[0/0,0/0]:[0<c?e[c-1]:a[0],c<e.length?e[c]:a[a.length-1]]},d.copy=function(){return Ff(a,b)},c()}function Gf(a,b,c){function d(b){return c[Math.max(0,Math.min(g,Math.floor(f*(b-a))))]}function e(){return f=c.length/(b-a),g=c.length-1,d}var f,g;return d.domain=function(c){return arguments.length?(a=+c[0],b=+c[c.length-1],e()):[a,b]},d.range=function(a){return arguments.length?(c=a,e()):c},d.invertExtent=
function(b){return b=c.indexOf(b),b=0>b?0/0:b/f+a,[b,b+1/f]},d.copy=function(){return Gf(a,b,c)},e()}function Hf(a,b){function c(d){return d>=d?b[p.bisect(a,d)]:void 0}return c.domain=function(b){return arguments.length?(a=b,c):a},c.range=function(a){return arguments.length?(b=a,c):b},c.invertExtent=function(c){return c=b.indexOf(c),[a[c-1],a[c]]},c.copy=function(){return Hf(a,b)},c}function If(a){function b(a){return+a}return b.invert=b,b.domain=b.range=function(c){return arguments.length?(a=c.map(b),
b):a},b.ticks=function(b){return p.range.apply(p,fb(a,b))},b.tickFormat=function(b,c){return Cd(a,b,c)},b.copy=function(){return If(a)},b}function Qh(a){return a.innerRadius}function Rh(a){return a.outerRadius}function Jf(a){return a.startAngle}function Kf(a){return a.endAngle}function Lf(a){function b(g){function k(){l.push("M",f(a(m),h))}for(var J,l=[],m=[],p=-1,xa=g.length,n=ka(c),q=ka(d);++p<xa;)e.call(this,J=g[p],p)?m.push([+n.call(this,J,p),+q.call(this,J,p)]):m.length&&(k(),m=[]);return m.length&&
k(),l.length?l.join(""):null}var c=vb,d=Kb,e=ub,f=Ha,g=f.key,h=0.7;return b.x=function(a){return arguments.length?(c=a,b):c},b.y=function(a){return arguments.length?(d=a,b):d},b.defined=function(a){return arguments.length?(e=a,b):e},b.interpolate=function(a){return arguments.length?(g="function"==typeof a?f=a:(f=Fd.get(a)||Ha).key,b):g},b.tension=function(a){return arguments.length?(h=a,b):h},b}function Ha(a){return a.join("L")}function Gd(a){for(var b=0,c=a.length,d=a[0],e=[d[0],",",d[1]];++b<c;)e.push("V",
(d=a[b])[1],"H",d[0]);return e.join("")}function Hd(a){for(var b=0,c=a.length,d=a[0],e=[d[0],",",d[1]];++b<c;)e.push("H",(d=a[b])[0],"V",d[1]);return e.join("")}function xc(a,b){if(1>b.length||a.length!=b.length&&a.length!=b.length+2)return Ha(a);var c=a.length!=b.length,d="",e=a[0],f=a[1],g=b[0],h=g,k=1;if(c&&(d+="Q"+(f[0]-2*g[0]/3)+","+(f[1]-2*g[1]/3)+","+f[0]+","+f[1],e=a[1],k=2),1<b.length){h=b[1];f=a[k];k++;d+="C"+(e[0]+g[0])+","+(e[1]+g[1])+","+(f[0]-h[0])+","+(f[1]-h[1])+","+f[0]+","+f[1];
for(e=2;e<b.length;e++,k++)f=a[k],h=b[e],d+="S"+(f[0]-h[0])+","+(f[1]-h[1])+","+f[0]+","+f[1]}c&&(c=a[k],d+="Q"+(f[0]+2*h[0]/3)+","+(f[1]+2*h[1]/3)+","+c[0]+","+c[1]);return d}function Id(a,b){for(var c,d=[],e=(1-b)/2,f=a[0],g=a[1],h=1,k=a.length;++h<k;)c=f,f=g,g=a[h],d.push([e*(g[0]-c[0]),e*(g[1]-c[1])]);return d}function Mf(a){if(3>a.length)return Ha(a);var b=1,c=a.length,d=a[0],e=d[0],f=d[1],g=[e,e,e,(d=a[1])[0]],h=[f,f,f,d[1]],e=[e,",",f,"L",Ka(gb,g),",",Ka(gb,h)];for(a.push(a[c-1]);++b<=c;)d=
a[b],g.shift(),g.push(d[0]),h.shift(),h.push(d[1]),Jd(e,g,h);return a.pop(),e.push("L",d),e.join("")}function Ka(a,b){return a[0]*b[0]+a[1]*b[1]+a[2]*b[2]+a[3]*b[3]}function Jd(a,b,c){a.push("C",Ka(Nf,b),",",Ka(Nf,c),",",Ka(Of,b),",",Ka(Of,c),",",Ka(gb,b),",",Ka(gb,c))}function Kd(a,b){return(b[1]-a[1])/(b[0]-a[0])}function Pf(a){for(var b,c,d,e=-1,f=a.length;++e<f;)b=a[e],c=b[0],d=b[1]+ob,b[0]=c*Math.cos(d),b[1]=c*Math.sin(d);return a}function Qf(a){function b(k){function J(){s.push("M",h(a(aa),
p),m,l(a(r.reverse()),p),"Z")}for(var n,q,Db,s=[],r=[],aa=[],t=-1,w=k.length,v=ka(c),u=ka(e),y=c===d?function(){return q}:ka(d),z=e===f?function(){return Db}:ka(f);++t<w;)g.call(this,n=k[t],t)?(r.push([q=+v.call(this,n,t),Db=+u.call(this,n,t)]),aa.push([+y.call(this,n,t),+z.call(this,n,t)])):r.length&&(J(),r=[],aa=[]);return r.length&&J(),s.length?s.join(""):null}var c=vb,d=vb,e=0,f=Kb,g=ub,h=Ha,k=h.key,l=h,m="L",p=0.7;return b.x=function(a){return arguments.length?(c=d=a,b):d},b.x0=function(a){return arguments.length?
(c=a,b):c},b.x1=function(a){return arguments.length?(d=a,b):d},b.y=function(a){return arguments.length?(e=f=a,b):f},b.y0=function(a){return arguments.length?(e=a,b):e},b.y1=function(a){return arguments.length?(f=a,b):f},b.defined=function(a){return arguments.length?(g=a,b):g},b.interpolate=function(a){return arguments.length?(k="function"==typeof a?h=a:(h=Fd.get(a)||Ha).key,l=h.reverse||h,m=h.closed?"M":"L",b):k},b.tension=function(a){return arguments.length?(p=a,b):p},b}function Sh(a){return a.radius}
function Rf(a){return[a.x,a.y]}function Th(a){return function(){var b=a.apply(this,arguments),c=b[0],b=b[1]+ob;return[c*Math.cos(b),c*Math.sin(b)]}}function Uh(){return 64}function Vh(){return"circle"}function Sf(a){a=Math.sqrt(a/W);return"M0,"+a+"A"+a+","+a+" 0 1,1 0,"+-a+"A"+a+","+a+" 0 1,1 0,"+a+"Z"}function Rb(a,b){return Ub(a,ta),a.id=b,a}function Ld(a,b,c,d){var e=a.id;return U(a,"function"==typeof c?function(a,f,A){a.__transition__[e].tween.set(b,d(c.call(a,a.__data__,f,A)))}:(c=d(c),function(a){a.__transition__[e].tween.set(b,
c)}))}function Wh(a){return null==a&&(a=""),function(){this.textContent=a}}function yc(b,c,d,e){var f=b.__transition__||(b.__transition__={active:0,count:0}),g=f[d];if(!g){var h=e.time,g=f[d]={tween:new a,time:h,ease:e.ease,delay:e.delay,duration:e.duration};++f.count;p.timer(function(a){function e(a){return f.active>d?l():(f.active=d,g.event&&g.event.start.call(b,ga,c),g.tween.forEach(function(a,d){(d=d.call(b,ga,c))&&r.push(d)}),p.timer(function(){return s.c=k(a||1)?ub:k,1},0,h),void 0)}function k(a){if(f.active!==
d)return l();a/=q;for(var e=m(a),h=r.length;0<h;)r[--h].call(b,e);return 1<=a?(g.event&&g.event.end.call(b,ga,c),l()):void 0}function l(){return--f.count?delete f[d]:delete b.__transition__,1}var ga=b.__data__,m=g.ease,n=g.delay,q=g.duration,s=Ta,r=[];return s.t=n+h,a>=n?e(a-n):(s.c=e,void 0)},0,h)}}function Tf(a,b){a.attr("transform",function(a){return"translate("+b(a)+",0)"})}function Uf(a,b){a.attr("transform",function(a){return"translate(0,"+b(a)+")"})}function Md(a){return a.toISOString()}function Nd(a,
b,c){function d(b){return a(b)}function e(a,c){var d=(a[1]-a[0])/c,f=p.bisect(zc,d);return f==zc.length?[b.year,fb(a.map(function(a){return a/31536E6}),c)[2]]:f?b[d/zc[f-1]<zc[f]/d?f-1:f]:[Xh,fb(a,c)[2]]}return d.invert=function(b){return pb(a.invert(b))},d.domain=function(b){return arguments.length?(a.domain(b),d):a.domain().map(pb)},d.nice=function(a,b){function c(d){return!isNaN(d)&&!a.range(d,pb(+d+1),b).length}var f=d.domain(),A=Ab(f),A=null==a?e(A,10):"number"==typeof a&&e(A,a);return A&&(a=
A[0],b=A[1]),d.domain(vc(f,1<b?{floor:function(b){for(;c(b=a.floor(b));)b=pb(b-1);return b},ceil:function(b){for(;c(b=a.ceil(b));)b=pb(+b+1);return b}}:a))},d.ticks=function(a,b){var c=Ab(d.domain()),f=null==a?e(c,10):"number"==typeof a?e(c,a):!a.range&&[{range:a},b];return f&&(a=f[0],b=f[1]),a.range(c[0],pb(+c[1]+1),1>b?1:b)},d.tickFormat=function(){return c},d.copy=function(){return Nd(a.copy(),b,c)},Dd(d,a)}function pb(a){return new Date(a)}function Yh(a){return JSON.parse(a.responseText)}function Zh(a){var b=
Na.createRange();return b.selectNode(Na.body),b.createContextualFragment(a.responseText)}var p={version:"3.4.3"};Date.now||(Date.now=function(){return+new Date});var Vf=[].slice,$a=function(a){return Vf.call(a)},Na=document,ab=Na.documentElement,za=window;try{$a(ab.childNodes)[0].nodeType}catch(yi){$a=function(a){for(var b=a.length,c=Array(b);b--;)c[b]=a[b];return c}}try{Na.createElement("div").style.setProperty("opacity",0,"")}catch(zi){var Ac=za.Element.prototype,$h=Ac.setAttribute,ai=Ac.setAttributeNS,
Wf=za.CSSStyleDeclaration.prototype,bi=Wf.setProperty;Ac.setAttribute=function(a,b){$h.call(this,a,b+"")};Ac.setAttributeNS=function(a,b,c){ai.call(this,a,b,c+"")};Wf.setProperty=function(a,b,c){bi.call(this,a,b+"",c)}}p.ascending=function(a,b){return b>a?-1:a>b?1:a>=b?0:0/0};p.descending=function(a,b){return a>b?-1:b>a?1:b>=a?0:0/0};p.min=function(a,b){var c,d,e=-1,f=a.length;if(1===arguments.length){for(;++e<f&&!(null!=(c=a[e])&&c>=c);)c=void 0;for(;++e<f;)null!=(d=a[e])&&c>d&&(c=d)}else{for(;++e<
f&&!(null!=(c=b.call(a,a[e],e))&&c>=c);)c=void 0;for(;++e<f;)null!=(d=b.call(a,a[e],e))&&c>d&&(c=d)}return c};p.max=function(a,b){var c,d,e=-1,f=a.length;if(1===arguments.length){for(;++e<f&&!(null!=(c=a[e])&&c>=c);)c=void 0;for(;++e<f;)null!=(d=a[e])&&d>c&&(c=d)}else{for(;++e<f&&!(null!=(c=b.call(a,a[e],e))&&c>=c);)c=void 0;for(;++e<f;)null!=(d=b.call(a,a[e],e))&&d>c&&(c=d)}return c};p.extent=function(a,b){var c,d,e,f=-1,g=a.length;if(1===arguments.length){for(;++f<g&&!(null!=(c=e=a[f])&&c>=c);)c=
e=void 0;for(;++f<g;)null!=(d=a[f])&&(c>d&&(c=d),d>e&&(e=d))}else{for(;++f<g&&!(null!=(c=e=b.call(a,a[f],f))&&c>=c);)c=void 0;for(;++f<g;)null!=(d=b.call(a,a[f],f))&&(c>d&&(c=d),d>e&&(e=d))}return[c,e]};p.sum=function(a,b){var c,d=0,e=a.length,f=-1;if(1===arguments.length)for(;++f<e;)isNaN(c=+a[f])||(d+=c);else for(;++f<e;)isNaN(c=+b.call(a,a[f],f))||(d+=c);return d};p.mean=function(a,b){var c,d=a.length,f=0,g=-1,h=0;if(1===arguments.length)for(;++g<d;)e(c=a[g])&&(f+=(c-f)/++h);else for(;++g<d;)e(c=
b.call(a,a[g],g))&&(f+=(c-f)/++h);return h?f:void 0};p.quantile=function(a,b){var c=(a.length-1)*b+1,d=Math.floor(c),e=+a[d-1];return(c-=d)?e+c*(a[d]-e):e};p.median=function(a,b){return 1<arguments.length&&(a=a.map(b)),a=a.filter(e),a.length?p.quantile(a.sort(p.ascending),0.5):void 0};p.bisector=function(a){return{left:function(b,c,d,e){3>arguments.length&&(d=0);for(4>arguments.length&&(e=b.length);e>d;){var f=d+e>>>1;a.call(b,b[f],f)<c?d=f+1:e=f}return d},right:function(b,c,d,e){3>arguments.length&&
(d=0);for(4>arguments.length&&(e=b.length);e>d;){var f=d+e>>>1;c<a.call(b,b[f],f)?e=f:d=f+1}return d}}};var Xf=p.bisector(function(a){return a});p.bisectLeft=Xf.left;p.bisect=p.bisectRight=Xf.right;p.shuffle=function(a){for(var b,c,d=a.length;d;)c=0|Math.random()*d--,b=a[d],a[d]=a[c],a[c]=b;return a};p.permute=function(a,b){for(var c=b.length,d=Array(c);c--;)d[c]=a[b[c]];return d};p.pairs=function(a){for(var b=0,c=a.length-1,d=a[0],e=Array(0>c?0:c);c>b;)e[b]=[d,d=a[++b]];return e};p.zip=function(){if(!(e=
arguments.length))return[];for(var a=-1,b=p.min(arguments,c),d=Array(b);++a<b;)for(var e,f=-1,g=d[a]=Array(e);++f<e;)g[f]=arguments[f][a];return d};p.transpose=function(a){return p.zip.apply(p,a)};p.keys=function(a){var b=[],c;for(c in a)b.push(c);return b};p.values=function(a){var b=[],c;for(c in a)b.push(a[c]);return b};p.entries=function(a){var b=[],c;for(c in a)b.push({key:c,value:a[c]});return b};p.merge=function(a){var b,c,d,e=a.length;b=-1;for(var f=0;++b<e;)f+=a[b].length;for(c=Array(f);0<=
--e;){d=a[e];for(b=d.length;0<=--b;)c[--f]=d[b]}return c};var $=Math.abs;p.range=function(a,b,c){if(3>arguments.length&&(c=1,2>arguments.length&&(b=a,a=0)),1/0===(b-a)/c)throw Error("infinite range");var d,e=[],f;d=$(c);for(f=1;d*f%1;)f*=10;var g=-1;if(a*=f,b*=f,c*=f,0>c)for(;(d=a+c*++g)>b;)e.push(d/f);else for(;(d=a+c*++g)<b;)e.push(d/f);return e};p.map=function(b){var c=new a;if(b instanceof a)b.forEach(function(a,b){c.set(a,b)});else for(var d in b)c.set(d,b[d]);return c};b(a,{has:f,get:function(a){return this[hb+
a]},set:function(a,b){return this[hb+a]=b},remove:function(a){return a=hb+a,a in this&&delete this[a]},keys:d,values:function(){var a=[];return this.forEach(function(b,c){a.push(c)}),a},entries:function(){var a=[];return this.forEach(function(b,c){a.push({key:b,value:c})}),a},size:h,empty:g,forEach:function(a){for(var b in this)b.charCodeAt(0)===Tb&&a.call(this,b.substring(1),this[b])}});var hb="\x00",Tb=hb.charCodeAt(0);p.nest=function(){function b(c,h,k){if(k>=g.length)return e?e.call(f,h):d?h.sort(d):
h;for(var l,J,m,p,n=-1,q=h.length,xa=g[k++],s=new a;++n<q;)(p=s.get(l=xa(J=h[n])))?p.push(J):s.set(l,[J]);return c?(J=c(),m=function(a,d){J.set(a,b(c,d,k))}):(J={},m=function(a,d){J[a]=b(c,d,k)}),s.forEach(m),J}function c(a,b){if(b>=g.length)return a;var d=[],e=h[b++];return a.forEach(function(a,e){d.push({key:a,values:c(e,b)})}),e?d.sort(function(a,b){return e(a.key,b.key)}):d}var d,e,f={},g=[],h=[];return f.map=function(a,c){return b(c,a,0)},f.entries=function(a){return c(b(p.map,a,0),0)},f.key=
function(a){return g.push(a),f},f.sortKeys=function(a){return h[g.length-1]=a,f},f.sortValues=function(a){return d=a,f},f.rollup=function(a){return e=a,f},f};p.set=function(a){var b=new k;if(a)for(var c=0,d=a.length;d>c;++c)b.add(a[c]);return b};b(k,{has:f,add:function(a){return this[hb+a]=!0,a},remove:function(a){return a=hb+a,a in this&&delete this[a]},values:d,size:h,empty:g,forEach:function(a){for(var b in this)b.charCodeAt(0)===Tb&&a.call(this,b.substring(1))}});p.behavior={};p.rebind=function(a,
b){for(var c,d=1,e=arguments.length;++d<e;)a[c=arguments[d]]=l(a,b,b[c]);return a};var ae="webkit ms moz Moz o O".split(" ");p.dispatch=function(){for(var a=new q,b=-1,c=arguments.length;++b<c;)a[arguments[b]]=w(a);return a};q.prototype.on=function(a,b){var c=a.indexOf("."),d="";if(0<=c&&(d=a.substring(c+1),a=a.substring(0,c)),a)return 2>arguments.length?this[a].on(d):this[a].on(d,b);if(2===arguments.length){if(null==b)for(a in this)this.hasOwnProperty(a)&&this[a].on(d,null);return this}};p.event=
null;p.requote=function(a){return a.replace(ci,"\\$&")};var ci=/[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g,Ub={}.__proto__?function(a,b){a.__proto__=b}:function(a,b){for(var c in b)a[c]=b[c]},Wc=function(a,b){return b.querySelector(a)},Xc=function(a,b){return b.querySelectorAll(a)},di=ab[m(ab,"matchesSelector")],be=function(a,b){return di.call(a,b)};"function"==typeof Sizzle&&(Wc=function(a,b){return Sizzle(a,b)[0]||null},Xc=Sizzle,be=Sizzle.matchesSelector);p.selection=function(){return Yf};var ia=p.selection.prototype=
[];ia.select=function(a){var b,c,d,e,f=[];a=v(a);for(var g=-1,h=this.length;++g<h;){f.push(b=[]);b.parentNode=(d=this[g]).parentNode;for(var k=-1,l=d.length;++k<l;)(e=d[k])?(b.push(c=a.call(e,e.__data__,k,g)),c&&"__data__"in e&&(c.__data__=e.__data__)):b.push(null)}return C(f)};ia.selectAll=function(a){var b,c,d=[];a=y(a);for(var e=-1,f=this.length;++e<f;)for(var g=this[e],h=-1,k=g.length;++h<k;)(c=g[h])&&(d.push(b=$a(a.call(c,c.__data__,h,e))),b.parentNode=c);return C(d)};var Od={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/"};p.ns={prefix:Od,qualify:function(a){var b=a.indexOf(":"),c=a;return 0<=b&&(c=a.substring(0,b),a=a.substring(b+1)),Od.hasOwnProperty(c)?{space:Od[c],local:a}:a}};ia.attr=function(a,b){if(2>arguments.length){if("string"==typeof a){var c=this.node();return a=p.ns.qualify(a),a.local?c.getAttributeNS(a.space,a.local):c.getAttribute(a)}for(b in a)this.each(B(b,
a[b]));return this}return this.each(B(a,b))};ia.classed=function(a,b){if(2>arguments.length){if("string"==typeof a){var c=this.node(),d=(a=a.trim().split(/^|\s+/)).length,e=-1;if(b=c.classList)for(;++e<d;){if(!b.contains(a[e]))return!1}else for(b=c.getAttribute("class");++e<d;)if(!z(a[e]).test(b))return!1;return!0}for(b in a)this.each(x(b,a[b]));return this}return this.each(x(a,b))};ia.style=function(a,b,c){var d=arguments.length;if(3>d){if("string"!=typeof a){2>d&&(b="");for(c in a)this.each(E(c,
a[c],b));return this}if(2>d)return za.getComputedStyle(this.node(),null).getPropertyValue(a);c=""}return this.each(E(a,b,c))};ia.property=function(a,b){if(2>arguments.length){if("string"==typeof a)return this.node()[a];for(b in a)this.each(K(b,a[b]));return this}return this.each(K(a,b))};ia.text=function(a){return arguments.length?this.each("function"==typeof a?function(){var b=a.apply(this,arguments);this.textContent=null==b?"":b}:null==a?function(){this.textContent=""}:function(){this.textContent=
a}):this.node().textContent};ia.html=function(a){return arguments.length?this.each("function"==typeof a?function(){var b=a.apply(this,arguments);this.innerHTML=null==b?"":b}:null==a?function(){this.innerHTML=""}:function(){this.innerHTML=a}):this.node().innerHTML};ia.append=function(a){return a=Q(a),this.select(function(){return this.appendChild(a.apply(this,arguments))})};ia.insert=function(a,b){return a=Q(a),b=v(b),this.select(function(){return this.insertBefore(a.apply(this,arguments),b.apply(this,
arguments)||null)})};ia.remove=function(){return this.each(function(){var a=this.parentNode;a&&a.removeChild(this)})};ia.data=function(b,c){function d(b,e){var f,g,h,A=b.length,R=e.length,ga=Math.min(A,R),ca=Array(R),p=Array(R),ba=Array(A);if(c){var n=new a,q=new a,xa=[];for(f=-1;++f<A;)ga=c.call(g=b[f],g.__data__,f),n.has(ga)?ba[f]=g:n.set(ga,g),xa.push(ga);for(f=-1;++f<R;)ga=c.call(e,h=e[f],f),(g=n.get(ga))?(ca[f]=g,g.__data__=h):q.has(ga)||(p[f]={__data__:h}),q.set(ga,h),n.remove(ga);for(f=-1;++f<
A;)n.has(xa[f])&&(ba[f]=b[f])}else{for(f=-1;++f<ga;)g=b[f],h=e[f],g?(g.__data__=h,ca[f]=g):p[f]={__data__:h};for(;R>f;++f)p[f]={__data__:e[f]};for(;A>f;++f)ba[f]=b[f]}p.update=ca;p.parentNode=ca.parentNode=ba.parentNode=b.parentNode;k.push(p);l.push(ca);m.push(ba)}var e,f,g=-1,h=this.length;if(!arguments.length){for(b=Array(h=(e=this[0]).length);++g<h;)(f=e[g])&&(b[g]=f.__data__);return b}var k=ja([]),l=C([]),m=C([]);if("function"==typeof b)for(;++g<h;)d(e=this[g],b.call(e,e.parentNode.__data__,g));
else for(;++g<h;)d(e=this[g],b);return l.enter=function(){return k},l.exit=function(){return m},l};ia.datum=function(a){return arguments.length?this.property("__data__",a):this.property("__data__")};ia.filter=function(a){var b,c,d,e=[];"function"!=typeof a&&(a=O(a));for(var f=0,g=this.length;g>f;f++){e.push(b=[]);b.parentNode=(c=this[f]).parentNode;for(var h=0,k=c.length;k>h;h++)(d=c[h])&&a.call(d,d.__data__,h,f)&&b.push(d)}return C(e)};ia.order=function(){for(var a=-1,b=this.length;++a<b;)for(var c,
d=this[a],e=d.length-1,f=d[e];0<=--e;)(c=d[e])&&(f&&f!==c.nextSibling&&f.parentNode.insertBefore(c,f),f=c);return this};ia.sort=function(a){a=T.apply(this,arguments);for(var b=-1,c=this.length;++b<c;)this[b].sort(a);return this.order()};ia.each=function(a){return U(this,function(b,c,d){a.call(b,b.__data__,c,d)})};ia.call=function(a){var b=$a(arguments);return a.apply(b[0]=this,b),this};ia.empty=function(){return!this.node()};ia.node=function(){for(var a=0,b=this.length;b>a;a++)for(var c=this[a],d=
0,e=c.length;e>d;d++){var f=c[d];if(f)return f}return null};ia.size=function(){var a=0;return this.each(function(){++a}),a};var Sa=[];p.selection.enter=ja;p.selection.enter.prototype=Sa;Sa.append=ia.append;Sa.empty=ia.empty;Sa.node=ia.node;Sa.call=ia.call;Sa.size=ia.size;Sa.select=function(a){for(var b,c,d,e,f,g=[],h=-1,k=this.length;++h<k;){d=(e=this[h]).update;g.push(b=[]);b.parentNode=e.parentNode;for(var l=-1,m=e.length;++l<m;)(f=e[l])?(b.push(d[l]=c=a.call(e.parentNode,f.__data__,l,h)),c.__data__=
f.__data__):b.push(null)}return C(g)};Sa.insert=function(a,b){return 2>arguments.length&&(b=u(this)),ia.insert.call(this,a,b)};ia.transition=function(){for(var a,b,c=qb||++Zf,d=[],e=Bc||{time:Date.now(),ease:eh,delay:0,duration:250},f=-1,g=this.length;++f<g;){d.push(a=[]);for(var h=this[f],k=-1,l=h.length;++k<l;)(b=h[k])&&yc(b,k,c,e),a.push(b)}return Rb(d,c)};ia.interrupt=function(){return this.each(t)};p.select=function(a){a=["string"==typeof a?Wc(a,Na):a];return a.parentNode=ab,C([a])};p.selectAll=
function(a){a=$a("string"==typeof a?Xc(a,Na):a);return a.parentNode=ab,C([a])};var Yf=p.select(ab);ia.on=function(a,b,c){var d=arguments.length;if(3>d){if("string"!=typeof a){2>d&&(b=!1);for(c in a)this.each(oa(c,a[c],b));return this}if(2>d)return(d=this.node()["__on"+a])&&d._;c=!1}return this.each(oa(a,b,c))};var Yc=p.map({mouseenter:"mouseover",mouseleave:"mouseout"});Yc.forEach(function(a){"on"+a in Na&&Yc.remove(a)});var Fb="onselectstart"in Na?null:m(ab.style,"userSelect"),pg=0;p.mouse=function(a){return S(a,
D())};var Zc=/WebKit/.test(za.navigator.userAgent)?-1:0;p.touches=function(a,b){return 2>arguments.length&&(b=D().touches),b?$a(b).map(function(b){var c=S(a,b);return c.identifier=b.identifier,c}):[]};p.behavior.drag=function(){function a(){this.on("mousedown.drag",e).on("touchstart.drag",f)}function b(a,e,f,g){return function(){var b,h=this.parentNode,A=c.of(this,arguments),k=p.event.target,l=a(),J=null==l?"drag":"drag-"+l,m=e(h,l),ca=0,n=p.select(za).on(f+"."+J,function(){var a=e(h,l),c=a[0]-m[0],
d=a[1]-m[1];ca|=c|d;m=a;A({type:"drag",x:a[0]+b[0],y:a[1]+b[1],dx:c,dy:d})}).on(g+"."+J,function(){n.on(f+"."+J,null).on(g+"."+J,null);ba(ca&&p.event.target===k);A({type:"dragend"})}),ba=ea();d?(b=d.apply(this,arguments),b=[b.x-m[0],b.y-m[1]]):b=[0,0];A({type:"dragstart"})}}var c=F(a,"drag","dragstart","dragend"),d=null,e=b(n,p.mouse,"mousemove","mouseup"),f=b(function(){return p.event.changedTouches[0].identifier},function(a,b){return p.touches(a).filter(function(a){return a.identifier===b})[0]},
"touchmove","touchend");return a.origin=function(b){return arguments.length?(d=b,a):d},p.rebind(a,c,"on")};var W=Math.PI,Ga=2*W,Ba=W/2,N=1E-6,rd=N*N,Y=W/180,ma=180/W,Cc=Math.SQRT2,Pd=2;p.interpolateZoom=function(a,b){function c(a){var b=a*s;if(q){a=fa(n);var g=f/(Pd*m),A,l=Cc*b+n;A=((l=Math.exp(2*l))-1)/(l+1);A*=a;var J=n,l=((J=Math.exp(J))-1/J)/2,g=g*(A-l);return[d+g*h,e+g*k,f*a/fa(Cc*b+n)]}return[d+a*h,e+a*k,f*Math.exp(Cc*b)]}var d=a[0],e=a[1],f=a[2],g=b[2],h=b[0]-d,k=b[1]-e,l=h*h+k*k,m=Math.sqrt(l),
p=(g*g-f*f+4*l)/(2*f*Pd*m),l=(g*g-f*f-4*l)/(2*g*Pd*m),n=Math.log(Math.sqrt(p*p+1)-p),q=Math.log(Math.sqrt(l*l+1)-l)-n,s=(q||Math.log(g/f))/Cc;return c.duration=1E3*s,c};p.behavior.zoom=function(){function a(b){b.on(G,k).on(ei+".zoom",m).on(E,n).on("dblclick.zoom",q).on(I,l)}function b(a){return[(a[0]-x.x)/x.k,(a[1]-x.y)/x.k]}function c(a){x.k=Math.max(C[0],Math.min(C[1],a))}function d(a,b){b=[b[0]*x.k+x.x,b[1]*x.k+x.y];x.x+=a[0]-b[0];x.y+=a[1]-b[1]}function e(){z&&z.domain(y.range().map(function(a){return(a-
x.x)/x.k}).map(y.invert));B&&B.domain(aa.range().map(function(a){return(a-x.y)/x.k}).map(aa.invert))}function f(a){a({type:"zoomstart"})}function g(a){e();a({type:"zoom",scale:x.k,translate:[x.x,x.y]})}function h(a){a({type:"zoomend"})}function k(){var a=this,c=K.of(a,arguments),e=p.event.target,A=0,l=p.select(za).on(E,function(){A=1;d(p.mouse(a),m);g(c)}).on(H,function(){l.on(E,za===a?n:null).on(H,null);R(A&&p.event.target===e);h(c)}),m=b(p.mouse(a)),R=ea();t.call(a);f(c)}function l(){function a(){var c=
p.touches(m);return A=x.k,c.forEach(function(a){a.identifier in ba&&(ba[a.identifier]=b(a))}),c}function e(){for(var b=p.event.changedTouches,f=0,h=b.length;h>f;++f)ba[b[f].identifier]=null;h=a();f=Date.now();1===h.length?(500>f-u&&(b=h[0],h=ba[b.identifier],c(2*x.k),d(b,h),s(),g(n)),u=f):1<h.length&&(b=h[0],h=h[1],f=b[0]-h[0],b=b[1]-h[1],q=f*f+b*b)}var A,m=this,n=K.of(m,arguments),ba={},q=0,r=p.event.changedTouches[0].identifier,da="touchmove.zoom-"+r,L="touchend.zoom-"+r,w=p.select(za).on(da,function(){for(var a,
b,e,f,h=p.touches(m),k=0,l=h.length;l>k;++k,f=null)if(e=h[k],f=ba[e.identifier]){if(b)break;a=e;b=f}if(f){var J=(J=e[0]-a[0])*J+(J=e[1]-a[1])*J,h=q&&Math.sqrt(J/q);a=[(a[0]+e[0])/2,(a[1]+e[1])/2];b=[(b[0]+f[0])/2,(b[1]+f[1])/2];c(h*A)}u=null;d(a,b);g(n)}).on(L,function(){if(p.event.touches.length){for(var b=p.event.changedTouches,c=0,d=b.length;d>c;++c)delete ba[b[c].identifier];for(var e in ba)return void a()}w.on(da,null).on(L,null);aa.on(G,k).on(I,l);v();h(n)}),aa=p.select(m).on(G,null).on(I,e),
v=ea();t.call(m);e();f(n)}function m(){var a=K.of(this,arguments);v?clearTimeout(v):(t.call(this),f(a));v=setTimeout(function(){v=null;h(a)},50);s();var e=w||p.mouse(this);r||(r=b(e));c(Math.pow(2,0.002*Dc())*x.k);d(e,r);g(a)}function n(){r=null}function q(){var a=K.of(this,arguments),e=p.mouse(this),k=b(e),A=Math.log(x.k)/Math.LN2;f(a);c(Math.pow(2,p.event.shiftKey?Math.ceil(A)-1:Math.floor(A)+1));d(e,k);g(a);h(a)}var r,w,v,u,y,z,aa,B,x={x:0,y:0,k:1},D=[960,500],C=$f,G="mousedown.zoom",E="mousemove.zoom",
H="mouseup.zoom",I="touchstart.zoom",K=F(a,"zoomstart","zoom","zoomend");return a.event=function(a){a.each(function(){var a=K.of(this,arguments),b=x;qb?p.select(this).transition().each("start.zoom",function(){x=this.__chart__||{x:0,y:0,k:1};f(a)}).tween("zoom:zoom",function(){var c=D[0],d=c/2,e=D[1]/2,f=p.interpolateZoom([(d-x.x)/x.k,(e-x.y)/x.k,c/x.k],[(d-b.x)/b.k,(e-b.y)/b.k,c/b.k]);return function(b){b=f(b);var h=c/b[2];this.__chart__=x={x:d-b[0]*h,y:e-b[1]*h,k:h};g(a)}}).each("end.zoom",function(){h(a)}):
(this.__chart__=x,f(a),g(a),h(a))})},a.translate=function(b){return arguments.length?(x={x:+b[0],y:+b[1],k:x.k},e(),a):[x.x,x.y]},a.scale=function(b){return arguments.length?(x={x:x.x,y:x.y,k:+b},e(),a):x.k},a.scaleExtent=function(b){return arguments.length?(C=null==b?$f:[+b[0],+b[1]],a):C},a.center=function(b){return arguments.length?(w=b&&[+b[0],+b[1]],a):w},a.size=function(b){return arguments.length?(D=b&&[+b[0],+b[1]],a):D},a.x=function(b){return arguments.length?(z=b,y=b.copy(),x={x:0,y:0,k:1},
a):z},a.y=function(b){return arguments.length?(B=b,aa=b.copy(),x={x:0,y:0,k:1},a):B},p.rebind(a,K,"on")};var Dc,$f=[0,1/0],ei="onwheel"in Na?(Dc=function(){return-p.event.deltaY*(p.event.deltaMode?120:1)},"wheel"):"onmousewheel"in Na?(Dc=function(){return p.event.wheelDelta},"mousewheel"):(Dc=function(){return-p.event.detail},"MozMousePixelScroll");la.prototype.toString=function(){return this.rgb()+""};p.hsl=function(a,b,c){return 1===arguments.length?a instanceof qa?X(a.h,a.s,a.l):Yd(""+a,Zd,X):
X(+a,+b,+c)};var Qd=qa.prototype=new la;Qd.brighter=function(a){return a=Math.pow(0.7,arguments.length?a:1),X(this.h,this.s,this.l/a)};Qd.darker=function(a){return a=Math.pow(0.7,arguments.length?a:1),X(this.h,this.s,a*this.l)};Qd.rgb=function(){return ra(this.h,this.s,this.l)};p.hcl=function(a,b,c){return 1===arguments.length?a instanceof na?ha(a.h,a.c,a.l):a instanceof r?Xd(a.l,a.a,a.b):Xd((a=$d((a=p.rgb(a)).r,a.g,a.b)).l,a.a,a.b):ha(+a,+b,+c)};var Rd=na.prototype=new la;Rd.brighter=function(a){return ha(this.h,
this.c,Math.min(100,this.l+Ec*(arguments.length?a:1)))};Rd.darker=function(a){return ha(this.h,this.c,Math.max(0,this.l-Ec*(arguments.length?a:1)))};Rd.rgb=function(){return Oa(this.h,this.c,this.l).rgb()};p.lab=function(a,b,c){return 1===arguments.length?a instanceof r?ya(a.l,a.a,a.b):a instanceof na?Oa(a.l,a.c,a.h):$d((a=p.rgb(a)).r,a.g,a.b):ya(+a,+b,+c)};var Ec=18,ce=0.95047,de=1,ee=1.08883,Sd=r.prototype=new la;Sd.brighter=function(a){return ya(Math.min(100,this.l+Ec*(arguments.length?a:1)),this.a,
this.b)};Sd.darker=function(a){return ya(Math.max(0,this.l-Ec*(arguments.length?a:1)),this.a,this.b)};Sd.rgb=function(){return Wd(this.l,this.a,this.b)};p.rgb=function(a,b,c){return 1===arguments.length?a instanceof Tc?Pa(a.r,a.g,a.b):Yd(""+a,Pa,ra):Pa(~~a,~~b,~~c)};var Fc=Tc.prototype=new la;Fc.brighter=function(a){a=Math.pow(0.7,arguments.length?a:1);var b=this.r,c=this.g,d=this.b;return b||c||d?(b&&30>b&&(b=30),c&&30>c&&(c=30),d&&30>d&&(d=30),Pa(Math.min(255,~~(b/a)),Math.min(255,~~(c/a)),Math.min(255,
~~(d/a)))):Pa(30,30,30)};Fc.darker=function(a){return a=Math.pow(0.7,arguments.length?a:1),Pa(~~(a*this.r),~~(a*this.g),~~(a*this.b))};Fc.hsl=function(){return Zd(this.r,this.g,this.b)};Fc.toString=function(){return"#"+rb(this.r)+rb(this.g)+rb(this.b)};var Vb=p.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});Vb.forEach(function(a,b){Vb.set(a,Pa(b>>16,255&b>>8,255&b))});p.functor=ka;p.xhr=$c(va);p.dsv=function(a,b){function c(a,f,g){3>arguments.length&&
(g=f,f=null);var h=Wb(a,b,null==f?d:e(f),g);return h.row=function(a){return arguments.length?h.response(null==(f=a)?d:e(a)):f},h}function d(a){return c.parse(a.responseText)}function e(a){return function(b){return c.parse(b.responseText,a)}}function f(b){return b.map(g).join(a)}function g(a){return h.test(a)?'"'+a.replace(/\"/g,'""')+'"':a}var h=RegExp('["'+a+"\n]"),l=a.charCodeAt(0);return c.parse=function(a,b){var d;return c.parseRows(a,function(a,c){if(d)return d(a,c-1);var e=new Function("d",
"return {"+a.map(function(a,b){return JSON.stringify(a)+": d["+b+"]"}).join(",")+"}");d=b?function(a,c){return b(e(a),c)}:e})},c.parseRows=function(a,b){function c(){if(A>=k)return g;if(e)return e=!1,f;var b=A;if(34===a.charCodeAt(b)){for(var d=b;d++<k;)if(34===a.charCodeAt(d)){if(34!==a.charCodeAt(d+1))break;++d}A=d+2;var h=a.charCodeAt(d+1);return 13===h?(e=!0,10===a.charCodeAt(d+2)&&++A):10===h&&(e=!0),a.substring(b+1,d).replace(/""/g,'"')}for(;k>A;){h=a.charCodeAt(A++);d=1;if(10===h)e=!0;else if(13===
h)e=!0,10===a.charCodeAt(A)&&(++A,++d);else if(h!==l)continue;return a.substring(b,A-d)}return a.substring(b)}for(var d,e,f={},g={},h=[],k=a.length,A=0,J=0;(d=c())!==g;){for(var m=[];d!==f&&d!==g;)m.push(d),d=c();(!b||(m=b(m,J++)))&&h.push(m)}return h},c.format=function(b){if(Array.isArray(b[0]))return c.formatRows(b);var d=new k,e=[];return b.forEach(function(a){for(var b in a)d.has(b)||e.push(d.add(b))}),[e.map(g).join(a)].concat(b.map(function(b){return e.map(function(a){return g(b[a])}).join(a)})).join("\n")},
c.formatRows=function(a){return a.map(f).join("\n")},c};p.csv=p.dsv(",","text/csv");p.tsv=p.dsv("\t","text/tab-separated-values");var Zb,$b,Yb,Xb,Ta,he=za[m(za,"requestAnimationFrame")]||function(a){setTimeout(a,17)};p.timer=function(a,b,c){var d=arguments.length;2>d&&(b=0);3>d&&(c=Date.now());d={c:a,t:c+b,f:!1,n:null};$b?$b.n=d:Zb=d;$b=d;Yb||(Xb=clearTimeout(Xb),Yb=1,he(ad))};p.timer.flush=function(){fe();ge()};p.round=function(a,b){return b?Math.round(a*(b=Math.pow(10,b)))/b:Math.round(a)};var fi=
"y z a f p n \u00b5 m  k M G T P E Z Y".split(" ").map(function(a,b){var c=Math.pow(10,3*$(8-b));return{scale:8<b?function(a){return a/c}:function(a){return a*c},symbol:a}});p.formatPrefix=function(a,b){var c=0;return a&&(0>a&&(a*=-1),b&&(a=p.round(a,bd(a,b))),c=1+Math.floor(1E-12+Math.log(a)/Math.LN10),c=Math.max(-24,Math.min(24,3*Math.floor((0>=c?c+1:c-1)/3)))),fi[8+c/3]};var ie=/(?:([^{])?([<>=^]))?([+\- ])?([$#])?(0)?(\d+)?(,)?(\.-?\d+)?([a-z%])?/i,sg=p.map({b:function(a){return a.toString(2)},
c:function(a){return String.fromCharCode(a)},o:function(a){return a.toString(8)},x:function(a){return a.toString(16)},X:function(a){return a.toString(16).toUpperCase()},g:function(a,b){return a.toPrecision(b)},e:function(a,b){return a.toExponential(b)},f:function(a,b){return a.toFixed(b)},r:function(a,b){return(a=p.round(a,bd(a,b))).toFixed(Math.max(0,Math.min(20,bd(a*(1+1E-15),b))))}}),P=p.time={},Aa=Date;Ua.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(){Za.setUTCDate.apply(this._,arguments)},
setDay:function(){Za.setUTCDay.apply(this._,arguments)},setFullYear:function(){Za.setUTCFullYear.apply(this._,arguments)},setHours:function(){Za.setUTCHours.apply(this._,arguments)},setMilliseconds:function(){Za.setUTCMilliseconds.apply(this._,arguments)},setMinutes:function(){Za.setUTCMinutes.apply(this._,arguments)},setMonth:function(){Za.setUTCMonth.apply(this._,arguments)},setSeconds:function(){Za.setUTCSeconds.apply(this._,arguments)},setTime:function(){Za.setTime.apply(this._,arguments)}};var Za=
Date.prototype;P.year=ib(function(a){return a=P.day(a),a.setMonth(0,1),a},function(a,b){a.setFullYear(a.getFullYear()+b)},function(a){return a.getFullYear()});P.years=P.year.range;P.years.utc=P.year.utc.range;P.day=ib(function(a){var b=new Aa(2E3,0);return b.setFullYear(a.getFullYear(),a.getMonth(),a.getDate()),b},function(a,b){a.setDate(a.getDate()+b)},function(a){return a.getDate()-1});P.days=P.day.range;P.days.utc=P.day.utc.range;P.dayOfYear=function(a){var b=P.year(a);return Math.floor((a-b-6E4*
(a.getTimezoneOffset()-b.getTimezoneOffset()))/864E5)};"sunday monday tuesday wednesday thursday friday saturday".split(" ").forEach(function(a,b){b=7-b;var c=P[a]=ib(function(a){return(a=P.day(a)).setDate(a.getDate()-(a.getDay()+b)%7),a},function(a,b){a.setDate(a.getDate()+7*Math.floor(b))},function(a){var c=P.year(a).getDay();return Math.floor((P.dayOfYear(a)+(c+b)%7)/7)-(c!==b)});P[a+"s"]=c.range;P[a+"s"].utc=c.utc.range;P[a+"OfYear"]=function(a){var c=P.year(a).getDay();return Math.floor((P.dayOfYear(a)+
(c+b)%7)/7)}});P.week=P.sunday;P.weeks=P.sunday.range;P.weeks.utc=P.sunday.utc.range;P.weekOfYear=P.sundayOfYear;var ke={"-":"",_:" ","0":"0"},sa=/^\s*\d+/,ne=/^%/;p.locale=function(a){return{numberFormat:rg(a),timeFormat:ug(a)}};var ag=p.locale({decimal:".",thousands:",",grouping:[3],currency:["$",""],dateTime:"%a %b %e %X %Y",date:"%m/%d/%Y",time:"%H:%M:%S",periods:["AM","PM"],days:"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),shortDays:"Sun Mon Tue Wed Thu Fri Sat".split(" "),
months:"January February March April May June July August September October November December".split(" "),shortMonths:"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" ")});p.format=ag.numberFormat;p.geo={};ed.prototype={s:0,t:0,add:function(a){oe(a,this.t,Gc);oe(Gc.s,this.s,this);this.s?this.t+=Gc.t:this.s=Gc.t},reset:function(){this.s=this.t=0},valueOf:function(){return this.s}};var Gc=new ed;p.geo.stream=function(a,b){a&&bg.hasOwnProperty(a.type)?bg[a.type](a,b):ec(a,b)};var bg={Feature:function(a,
b){ec(a.geometry,b)},FeatureCollection:function(a,b){for(var c=a.features,d=-1,e=c.length;++d<e;)ec(c[d].geometry,b)}},pe={Sphere:function(a,b){b.sphere()},Point:function(a,b){a=a.coordinates;b.point(a[0],a[1],a[2])},MultiPoint:function(a,b){for(var c=a.coordinates,d=-1,e=c.length;++d<e;)a=c[d],b.point(a[0],a[1],a[2])},LineString:function(a,b){fd(a.coordinates,b,0)},MultiLineString:function(a,b){for(var c=a.coordinates,d=-1,e=c.length;++d<e;)fd(c[d],b,0)},Polygon:function(a,b){qe(a.coordinates,b)},
MultiPolygon:function(a,b){for(var c=a.coordinates,d=-1,e=c.length;++d<e;)qe(c[d],b)},GeometryCollection:function(a,b){for(var c=a.geometries,d=-1,e=c.length;++d<e;)ec(c[d],b)}};p.geo.area=function(a){return Bb=0,p.geo.stream(a,Fa),Bb};var Bb,jb=new ed,Fa={sphere:function(){Bb+=4*W},point:n,lineStart:n,lineEnd:n,polygonStart:function(){jb.reset();Fa.lineStart=Jg},polygonEnd:function(){var a=2*jb;Bb+=0>a?4*W+a:a;Fa.lineStart=Fa.lineEnd=Fa.point=n}};p.geo.bounds=function(){function a(b,c){aa.push(x=
[m=b,q=b]);n>c&&(n=c);c>s&&(s=c)}function b(c,d){var e=kb([c*Y,d*Y]);if(v){var f=sb(v,e),f=sb([f[1],-f[0],0],f);hc(f);var f=ic(f),g=c-r,k=0<g?1:-1,l=f[0]*ma*k,g=180<$(g);g^(l>k*r&&k*c>l)?(f=f[1]*ma,f>s&&(s=f)):(l=(l+360)%360-180,g^(l>k*r&&k*c>l))?(f=-f[1]*ma,n>f&&(n=f)):(n>d&&(n=d),d>s&&(s=d));g?r>c?h(m,c)>h(m,q)&&(q=c):h(c,q)>h(m,q)&&(m=c):q>=m?(m>c&&(m=c),c>q&&(q=c)):c>r?h(m,c)>h(m,q)&&(q=c):h(c,q)>h(m,q)&&(m=c)}else a(c,d);v=e;r=c}function c(){y.point=b}function d(){x[0]=m;x[1]=q;y.point=a;v=null}
function e(a,c){if(v){var d=a-r;u+=180<$(d)?d+(0<d?360:-360):d}else t=a,w=c;Fa.point(a,c);b(a,c)}function f(){Fa.lineStart()}function g(){e(t,w);Fa.lineEnd();$(u)>N&&(m=-(q=180));x[0]=m;x[1]=q;v=null}function h(a,b){return 0>(b-=a)?b+360:b}function k(a,b){return a[0]-b[0]}function l(a,b){return b[0]<=b[1]?b[0]<=a&&a<=b[1]:a<b[0]||b[1]<a}var m,n,q,s,r,t,w,v,u,aa,x,y={point:a,lineStart:c,lineEnd:d,polygonStart:function(){y.point=e;y.lineStart=f;y.lineEnd=g;u=0;Fa.polygonStart()},polygonEnd:function(){Fa.polygonEnd();
y.point=a;y.lineStart=c;y.lineEnd=d;0>jb?(m=-(q=180),n=-(s=90)):u>N?s=90:-N>u&&(n=-90);x[0]=m;x[1]=q}};return function(a){s=q=-(m=n=1/0);aa=[];p.geo.stream(a,y);if(a=aa.length){aa.sort(k);for(var b,c=1,d=aa[0],e=[d];a>c;++c)b=aa[c],l(b[0],d)||l(b[1],d)?(h(d[0],b[1])>h(d[0],d[1])&&(d[1]=b[1]),h(b[0],d[1])>h(d[0],d[1])&&(d[0]=b[0])):e.push(d=b);var f,g=-1/0;a=e.length-1;c=0;for(d=e[a];a>=c;d=b,++c)b=e[c],(f=h(d[1],b[0]))>g&&(g=f,m=b[0],q=d[1])}return aa=x=null,1/0===m||1/0===n?[[0/0,0/0],[0/0,0/0]]:
[[m,n],[q,s]]}}();p.geo.centroid=function(a){Hb=tb=Va=Wa=Qa=Ia=Ja=Ea=bb=cb=Ra=0;p.geo.stream(a,La);a=bb;var b=cb,c=Ra,d=a*a+b*b+c*c;return rd>d&&(a=Ia,b=Ja,c=Ea,N>tb&&(a=Va,b=Wa,c=Qa),d=a*a+b*b+c*c,rd>d)?[0/0,0/0]:[Math.atan2(b,a)*ma,Z(c/Math.sqrt(d))*ma]};var Hb,tb,Va,Wa,Qa,Ia,Ja,Ea,bb,cb,Ra,La={sphere:n,point:hd,lineStart:re,lineEnd:se,polygonStart:function(){La.lineStart=Kg},polygonEnd:function(){La.lineStart=re}},Ie=ve(ub,function(a){var b,c=0/0,d=0/0,e=0/0;return{lineStart:function(){a.lineStart();
b=1},point:function(f,g){var h=0<f?W:-W,k=$(f-c);if($(k-W)<N)a.point(c,d=0<(d+g)/2?Ba:-Ba),a.point(e,d),a.lineEnd(),a.lineStart(),a.point(h,d),a.point(f,d),b=0;else if(e!==h&&k>=W){$(c-e)<N&&(c-=e*N);$(f-h)<N&&(f-=h*N);var k=c,l=d,m=f,p,n,q=Math.sin(k-m);d=$(q)>N?Math.atan((Math.sin(l)*(n=Math.cos(g))*Math.sin(m)-Math.sin(g)*(p=Math.cos(l))*Math.sin(k))/(p*n*q)):(l+g)/2;a.point(e,d);a.lineEnd();a.lineStart();a.point(h,d);b=0}a.point(c=f,d=g);e=h},lineEnd:function(){a.lineEnd();c=d=0/0},clean:function(){return 2-
b}}},function(a,b,c,d){null==a?(c*=Ba,d.point(-W,c),d.point(0,c),d.point(W,c),d.point(W,0),d.point(W,-c),d.point(0,-c),d.point(-W,-c),d.point(-W,0),d.point(-W,c)):$(a[0]-b[0])>N?(a=a[0]<b[0]?W:-W,c=c*a/2,d.point(-a,c),d.point(0,c),d.point(a,c)):d.point(b[0],b[1])},[-W,-W/2]),lc=1E9;p.geo.clipExtent=function(){var a,b,c,d,e,f,g={stream:function(a){return e&&(e.valid=!1),e=f(a),e.valid=!0,e},extent:function(h){return arguments.length?(f=ye(a=+h[0][0],b=+h[0][1],c=+h[1][0],d=+h[1][1]),e&&(e.valid=!1,
e=null),g):[[a,b],[c,d]]}};return g.extent([[0,0],[960,500]])};(p.geo.conicEqualArea=function(){return jd(Ae)}).raw=Ae;p.geo.albers=function(){return p.geo.conicEqualArea().rotate([96,0]).center([-0.6,38.7]).parallels([29.5,45.5]).scale(1070)};p.geo.albersUsa=function(){function a(f){var g=f[0];f=f[1];return b=null,c(g,f),b||(d(g,f),b)||e(g,f),b}var b,c,d,e,f=p.geo.albers(),g=p.geo.conicEqualArea().rotate([154,0]).center([-2,58.5]).parallels([55,65]),h=p.geo.conicEqualArea().rotate([157,0]).center([-3,
19.9]).parallels([8,18]),k={point:function(a,c){b=[a,c]}};return a.invert=function(a){var b=f.scale(),c=f.translate(),d=(a[0]-c[0])/b,b=(a[1]-c[1])/b;return(0.12<=b&&0.234>b&&-0.425<=d&&-0.214>d?g:0.166<=b&&0.234>b&&-0.214<=d&&-0.115>d?h:f).invert(a)},a.stream=function(a){var b=f.stream(a),c=g.stream(a),d=h.stream(a);return{point:function(a,e){b.point(a,e);c.point(a,e);d.point(a,e)},sphere:function(){b.sphere();c.sphere();d.sphere()},lineStart:function(){b.lineStart();c.lineStart();d.lineStart()},
lineEnd:function(){b.lineEnd();c.lineEnd();d.lineEnd()},polygonStart:function(){b.polygonStart();c.polygonStart();d.polygonStart()},polygonEnd:function(){b.polygonEnd();c.polygonEnd();d.polygonEnd()}}},a.precision=function(b){return arguments.length?(f.precision(b),g.precision(b),h.precision(b),a):f.precision()},a.scale=function(b){return arguments.length?(f.scale(b),g.scale(0.35*b),h.scale(b),a.translate(f.translate())):f.scale()},a.translate=function(b){if(!arguments.length)return f.translate();
var l=f.scale(),m=+b[0],J=+b[1];return c=f.translate(b).clipExtent([[m-0.455*l,J-0.238*l],[m+0.455*l,J+0.238*l]]).stream(k).point,d=g.translate([m-0.307*l,J+0.201*l]).clipExtent([[m-0.425*l+N,J+0.12*l+N],[m-0.214*l-N,J+0.234*l-N]]).stream(k).point,e=h.translate([m-0.205*l,J+0.212*l]).clipExtent([[m-0.214*l+N,J+0.166*l+N],[m-0.115*l-N,J+0.234*l-N]]).stream(k).point,a},a.scale(1070)};var Hc,mc,Ic,Jc,Kc,Lc,db={point:n,lineStart:n,lineEnd:n,polygonStart:function(){mc=0;db.lineStart=Og},polygonEnd:function(){db.lineStart=
db.lineEnd=db.point=n;Hc+=$(mc/2)}},gi={point:function(a,b){Ic>a&&(Ic=a);a>Kc&&(Kc=a);Jc>b&&(Jc=b);b>Lc&&(Lc=b)},lineStart:n,lineEnd:n,polygonStart:n,polygonEnd:n},Ma={point:lb,lineStart:Ce,lineEnd:De,polygonStart:function(){Ma.lineStart=Qg},polygonEnd:function(){Ma.point=lb;Ma.lineStart=Ce;Ma.lineEnd=De}};p.geo.path=function(){function a(b){return b&&("function"==typeof g&&e.pointRadius(+g.apply(this,arguments)),f&&f.valid||(f=d(e)),p.geo.stream(b,f)),e.result()}var b,c,d,e,f,g=4.5;return a.area=
function(a){return Hc=0,p.geo.stream(a,d(db)),Hc},a.centroid=function(a){return Va=Wa=Qa=Ia=Ja=Ea=bb=cb=Ra=0,p.geo.stream(a,d(Ma)),Ra?[bb/Ra,cb/Ra]:Ea?[Ia/Ea,Ja/Ea]:Qa?[Va/Qa,Wa/Qa]:[0/0,0/0]},a.bounds=function(a){return Kc=Lc=-(Ic=Jc=1/0),p.geo.stream(a,d(gi)),[[Ic,Jc],[Kc,Lc]]},a.projection=function(c){return arguments.length?(d=(b=c)?c.stream||Sg(c):va,f=null,a):b},a.context=function(b){return arguments.length?(e=null==(c=b)?new Pg:new Rg(b),"function"!=typeof g&&e.pointRadius(g),f=null,a):c},
a.pointRadius=function(b){return arguments.length?(g="function"==typeof b?b:(e.pointRadius(+b),+b),a):g},a.projection(p.geo.albersUsa()).context(null)};p.geo.transform=function(a){return{stream:function(b){b=new He(b);for(var c in a)b[c]=a[c];return b}}};He.prototype={point:function(a,b){this.stream.point(a,b)},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()}};
p.geo.projection=eb;p.geo.projectionMutator=kd;(p.geo.equirectangular=function(){return eb(Ib)}).raw=Ib.invert=Ib;p.geo.rotation=function(a){function b(c){return c=a(c[0]*Y,c[1]*Y),c[0]*=ma,c[1]*=ma,c}return a=ld(a[0]%360*Y,a[1]*Y,2<a.length?a[2]*Y:0),b.invert=function(b){return b=a.invert(b[0]*Y,b[1]*Y),b[0]*=ma,b[1]*=ma,b},b};Je.invert=Ib;p.geo.circle=function(){function a(){var b="function"==typeof d?d.apply(this,arguments):d,e=ld(-b[0]*Y,-b[1]*Y,0).invert,f=[];return c(null,null,1,{point:function(a,
b){f.push(a=e(a,b));a[0]*=ma;a[1]*=ma}}),{type:"Polygon",coordinates:[f]}}var b,c,d=[0,0],e=6;return a.origin=function(b){return arguments.length?(d=b,a):d},a.angle=function(d){return arguments.length?(c=id((b=+d)*Y,e*Y),a):b},a.precision=function(d){return arguments.length?(c=id(b*Y,(e=+d)*Y),a):e},a.angle(90)};p.geo.distance=function(a,b){var c,d=(b[0]-a[0])*Y,e=a[1]*Y,f=b[1]*Y,g=Math.sin(d),d=Math.cos(d),h=Math.sin(e),e=Math.cos(e),k=Math.sin(f),f=Math.cos(f);return Math.atan2(Math.sqrt((c=f*g)*
c+(c=e*k-h*f*d)*c),h*k+e*f*d)};p.geo.graticule=function(){function a(){return{type:"MultiLineString",coordinates:b()}}function b(){return p.range(Math.ceil(f/w)*w,e,w).map(q).concat(p.range(Math.ceil(l/v)*v,k,v).map(s)).concat(p.range(Math.ceil(d/r)*r,c,r).filter(function(a){return $(a%w)>N}).map(m)).concat(p.range(Math.ceil(h/t)*t,g,t).filter(function(a){return $(a%v)>N}).map(n))}var c,d,e,f,g,h,k,l,m,n,q,s,r=10,t=r,w=90,v=360,u=2.5;return a.lines=function(){return b().map(function(a){return{type:"LineString",
coordinates:a}})},a.outline=function(){return{type:"Polygon",coordinates:[q(f).concat(s(k).slice(1),q(e).reverse().slice(1),s(l).reverse().slice(1))]}},a.extent=function(b){return arguments.length?a.majorExtent(b).minorExtent(b):a.minorExtent()},a.majorExtent=function(b){return arguments.length?(f=+b[0][0],e=+b[1][0],l=+b[0][1],k=+b[1][1],f>e&&(b=f,f=e,e=b),l>k&&(b=l,l=k,k=b),a.precision(u)):[[f,l],[e,k]]},a.minorExtent=function(b){return arguments.length?(d=+b[0][0],c=+b[1][0],h=+b[0][1],g=+b[1][1],
d>c&&(b=d,d=c,c=b),h>g&&(b=h,h=g,g=b),a.precision(u)):[[d,h],[c,g]]},a.step=function(b){return arguments.length?a.majorStep(b).minorStep(b):a.minorStep()},a.majorStep=function(b){return arguments.length?(w=+b[0],v=+b[1],a):[w,v]},a.minorStep=function(b){return arguments.length?(r=+b[0],t=+b[1],a):[r,t]},a.precision=function(b){return arguments.length?(u=+b,m=Oe(h,g,90),n=Pe(d,c,u),q=Oe(l,k,90),s=Pe(f,e,u),a):u},a.majorExtent([[-180,-90+N],[180,90-N]]).minorExtent([[-180,-80-N],[180,80+N]])};p.geo.greatArc=
function(){function a(){return{type:"LineString",coordinates:[b||d.apply(this,arguments),c||e.apply(this,arguments)]}}var b,c,d=md,e=nd;return a.distance=function(){return p.geo.distance(b||d.apply(this,arguments),c||e.apply(this,arguments))},a.source=function(c){return arguments.length?(d=c,b="function"==typeof c?null:c,a):d},a.target=function(b){return arguments.length?(e=b,c="function"==typeof b?null:b,a):e},a.precision=function(){return arguments.length?a:0},a};p.geo.interpolate=function(a,b){return Tg(a[0]*
Y,a[1]*Y,b[0]*Y,b[1]*Y)};p.geo.length=function(a){return Mc=0,p.geo.stream(a,Cb),Mc};var Mc,Cb={sphere:n,point:n,lineStart:function(){function a(e,f){var g=Math.sin(f*=Y),h=Math.cos(f),k=$((e*=Y)-b),l=Math.cos(k);Mc+=Math.atan2(Math.sqrt((k=h*Math.sin(k))*k+(k=d*g-c*h*l)*k),c*g+d*h*l);b=e;c=g;d=h}var b,c,d;Cb.point=function(e,f){b=e*Y;c=Math.sin(f*=Y);d=Math.cos(f);Cb.point=a};Cb.lineEnd=function(){Cb.point=Cb.lineEnd=n}},lineEnd:n,polygonStart:n,polygonEnd:n},cg=Jb(function(a){return Math.sqrt(2/
(1+a))},function(a){return 2*Math.asin(a/2)});(p.geo.azimuthalEqualArea=function(){return eb(cg)}).raw=cg;var dg=Jb(function(a){return(a=Math.acos(a))&&a/Math.sin(a)},va);(p.geo.azimuthalEquidistant=function(){return eb(dg)}).raw=dg;(p.geo.conicConformal=function(){return jd(Qe)}).raw=Qe;(p.geo.conicEquidistant=function(){return jd(Re)}).raw=Re;var eg=Jb(function(a){return 1/a},Math.atan);(p.geo.gnomonic=function(){return eb(eg)}).raw=eg;nc.invert=function(a,b){return[a,2*Math.atan(Math.exp(b))-Ba]};
(p.geo.mercator=function(){return Se(nc)}).raw=nc;var fg=Jb(function(){return 1},Math.asin);(p.geo.orthographic=function(){return eb(fg)}).raw=fg;var gg=Jb(function(a){return 1/(1+a)},function(a){return 2*Math.atan(a)});(p.geo.stereographic=function(){return eb(gg)}).raw=gg;od.invert=function(a,b){return[-b,2*Math.atan(Math.exp(a))-Ba]};(p.geo.transverseMercator=function(){var a=Se(od),b=a.center,c=a.rotate;return a.center=function(a){return a?b([-a[1],a[0]]):(a=b(),[-a[1],a[0]])},a.rotate=function(a){return a?
c([a[0],a[1],2<a.length?a[2]+90:90]):(a=c(),[a[0],a[1],a[2]-90])},a.rotate([0,0])}).raw=od;p.geom={};p.geom.hull=function(a){function b(a){if(3>a.length)return[];var e,f=ka(c),g=ka(d),h=a.length,k=[],l=[];for(e=0;h>e;e++)k.push([+f.call(this,a[e],e),+g.call(this,a[e],e),e]);k.sort(Ug);for(e=0;h>e;e++)l.push([k[e][0],-k[e][1]]);var f=Te(k),l=Te(l),g=l[0]===f[0],h=l[l.length-1]===f[f.length-1],A=[];for(e=f.length-1;0<=e;--e)A.push(a[k[f[e]][2]]);for(e=+g;e<l.length-h;++e)A.push(a[k[l[e]][2]]);return A}
var c=vb,d=Kb;return arguments.length?b(a):(b.x=function(a){return arguments.length?(c=a,b):c},b.y=function(a){return arguments.length?(d=a,b):d},b)};p.geom.polygon=function(a){return Ub(a,Nc),a};var Nc=p.geom.polygon.prototype=[];Nc.area=function(){for(var a,b=-1,c=this.length,d=this[c-1],e=0;++b<c;)a=d,d=this[b],e+=a[1]*d[0]-a[0]*d[1];return 0.5*e};Nc.centroid=function(a){var b,c,d=-1,e=this.length,f=0,g=0,h=this[e-1];for(arguments.length||(a=-1/(6*this.area()));++d<e;)b=h,h=this[d],c=b[0]*h[1]-
h[0]*b[1],f+=(b[0]+h[0])*c,g+=(b[1]+h[1])*c;return[f*a,g*a]};Nc.clip=function(a){for(var b,c,d,e,f,g,h=Ve(a),k=-1,l=this.length-Ve(this),m=this[l-1];++k<l;){b=a.slice();a.length=0;e=this[k];f=b[(d=b.length-h)-1];for(c=-1;++c<d;)g=b[c],pd(g,m,e)?(pd(f,m,e)||a.push(Ue(f,g,m,e)),a.push(g)):pd(f,m,e)&&a.push(Ue(f,g,m,e)),f=g;h&&a.push(a[0]);m=e}return a};var zb,mb,xb,sd,Lb,Xe=[],af=[];Ze.prototype.prepare=function(){for(var a,b=this.edges,c=b.length;c--;)a=b[c].edge,a.b&&a.a||b.splice(c,1);return b.sort($e),
b.length};qc.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}};td.prototype={insert:function(a,b){var c,d,e;if(a){if(b.P=a,b.N=a.N,a.N&&(a.N.P=b),a.N=b,a.R){for(a=a.R;a.L;)a=a.L;a.L=b}else a.R=b;c=a}else this._?(a=cf(this._),b.P=null,b.N=a,a.P=a.L=b,c=a):(b.P=b.N=null,this._=b,c=null);b.L=b.R=null;b.U=c;b.C=!0;for(a=b;c&&c.C;)d=c.U,c===d.L?(e=d.R,e&&e.C?(c.C=e.C=!1,d.C=!0,a=d):(a===c.R&&(Nb(this,
c),a=c,c=a.U),c.C=!1,d.C=!0,Ob(this,d))):(e=d.L,e&&e.C?(c.C=e.C=!1,d.C=!0,a=d):(a===c.L&&(Ob(this,c),a=c,c=a.U),c.C=!1,d.C=!0,Nb(this,d))),c=a.U;this._.C=!1},remove:function(a){a.N&&(a.N.P=a.P);a.P&&(a.P.N=a.N);a.N=a.P=null;var b,c,d,e=a.U,f=a.L,g=a.R;if(c=f?g?cf(g):f:g,e?e.L===a?e.L=c:e.R=c:this._=c,f&&g?(d=c.C,c.C=a.C,c.L=f,f.U=c,c!==g?(e=c.U,c.U=a.U,a=c.R,e.L=a,c.R=g,g.U=c):(c.U=e,e=c,a=c.R)):(d=a.C,a=c),a&&(a.U=e),!d){if(a&&a.C)return a.C=!1,void 0;do{if(a===this._)break;if(a===e.L){if(b=e.R,
b.C&&(b.C=!1,e.C=!0,Nb(this,e),b=e.R),b.L&&b.L.C||b.R&&b.R.C){b.R&&b.R.C||(b.L.C=!1,b.C=!0,Ob(this,b),b=e.R);b.C=e.C;e.C=b.R.C=!1;Nb(this,e);a=this._;break}}else if(b=e.L,b.C&&(b.C=!1,e.C=!0,Ob(this,e),b=e.L),b.L&&b.L.C||b.R&&b.R.C){b.L&&b.L.C||(b.R.C=!1,b.C=!0,Nb(this,b),b=e.L);b.C=e.C;e.C=b.L.C=!1;Ob(this,e);a=this._;break}b.C=!0;a=e;e=e.U}while(!a.C);a&&(a.C=!1)}}};p.geom.voronoi=function(a){function b(a){var d=Array(a.length),e=h[0][0],f=h[0][1],g=h[1][0],k=h[1][1];return ud(c(a),h).cells.forEach(function(b,
c){var h=b.edges,l=b.site;(d[c]=h.length?h.map(function(a){a=a.start();return[a.x,a.y]}):l.x>=e&&l.x<=g&&l.y>=f&&l.y<=k?[[e,k],[g,k],[g,f],[e,f]]:[]).point=a[c]}),d}function c(a){return a.map(function(a,b){return{x:Math.round(f(a,b)/N)*N,y:Math.round(g(a,b)/N)*N,i:b}})}var d=vb,e=Kb,f=d,g=e,h=Oc;return a?b(a):(b.links=function(a){return ud(c(a)).edges.filter(function(a){return a.l&&a.r}).map(function(b){return{source:a[b.l.i],target:a[b.r.i]}})},b.triangles=function(a){var b=[];return ud(c(a)).cells.forEach(function(c,
d){for(var e,f=c.site,g=c.edges.sort($e),h=-1,k=g.length,l=g[k-1].edge,l=l.l===f?l.r:l.l;++h<k;)e=l,l=g[h].edge,l=l.l===f?l.r:l.l,d<e.i&&d<l.i&&0>(f.x-l.x)*(e.y-f.y)-(f.x-e.x)*(l.y-f.y)&&b.push([a[d],a[e.i],a[l.i]])}),b},b.x=function(a){return arguments.length?(f=ka(d=a),b):d},b.y=function(a){return arguments.length?(g=ka(e=a),b):e},b.clipExtent=function(a){return arguments.length?(h=null==a?Oc:a,b):h===Oc?null:h},b.size=function(a){return arguments.length?b.clipExtent(a&&[[0,0],a]):h===Oc?null:h&&
h[1]},b)};var Oc=[[-1E6,-1E6],[1E6,1E6]];p.geom.delaunay=function(a){return p.geom.voronoi().triangles(a)};p.geom.quadtree=function(a,b,c,d,e){function f(a){function l(a,b,c,d,e,f,g,h){if(!isNaN(c)&&!isNaN(d))if(a.leaf){var k=a.x,m=a.y;if(null!=k){if(!(0.01>$(k-c)+$(m-d))){var p=a.point;a.x=a.y=a.point=null;A(a,p,k,m,e,f,g,h)}A(a,b,c,d,e,f,g,h)}else a.x=c,a.y=d,a.point=b}else A(a,b,c,d,e,f,g,h)}function A(a,b,c,d,e,f,g,h){var k=0.5*(e+g),m=0.5*(f+h),p=c>=k,n=d>=m,q=(n<<1)+p;a.leaf=!1;a=a.nodes[q]||
(a.nodes[q]=df());p?e=k:g=k;n?f=m:h=m;l(a,b,c,d,e,f,g,h)}var m,p,n,q,s,r,ca,t,w,v=ka(h),u=ka(k);if(null!=b)r=b,ca=c,t=d,w=e;else if(t=w=-(r=ca=1/0),p=[],n=[],s=a.length,g)for(q=0;s>q;++q)m=a[q],m.x<r&&(r=m.x),m.y<ca&&(ca=m.y),m.x>t&&(t=m.x),m.y>w&&(w=m.y),p.push(m.x),n.push(m.y);else for(q=0;s>q;++q){var x=+v(m=a[q],q);m=+u(m,q);r>x&&(r=x);ca>m&&(ca=m);x>t&&(t=x);m>w&&(w=m);p.push(x);n.push(m)}x=t-r;m=w-ca;x>m?w=ca+x:t=r+m;var y=df();if(y.add=function(a){l(y,a,+v(a,++q),+u(a,q),r,ca,t,w)},y.visit=
function(a){Pb(a,y,r,ca,t,w)},q=-1,null==b){for(;++q<s;)l(y,a[q],p[q],n[q],r,ca,t,w);--q}else a.forEach(y.add);return p=n=a=m=null,y}var g,h=vb,k=Kb;return(g=arguments.length)?(h=$g,k=ah,3===g&&(e=c,d=b,c=b=0),f(a)):(f.x=function(a){return arguments.length?(h=a,f):h},f.y=function(a){return arguments.length?(k=a,f):k},f.extent=function(a){return arguments.length?(null==a?b=c=d=e=null:(b=+a[0][0],c=+a[0][1],d=+a[1][0],e=+a[1][1]),f):null==b?null:[[b,c],[d,e]]},f.size=function(a){return arguments.length?
(null==a?b=c=d=e=null:(b=c=0,d=+a[0],e=+a[1]),f):null==b?null:[d-b,e-c]},f)};p.interpolateRgb=vd;p.interpolateObject=ef;p.interpolateNumber=Xa;p.interpolateString=ff;var rc=/[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g;p.interpolate=nb;p.interpolators=[function(a,b){var c=typeof b;return("string"===c?Vb.has(b)||/^(#|rgb\(|hsl\()/.test(b)?vd:ff:b instanceof la?vd:"object"===c?Array.isArray(b)?sc:ef:Xa)(a,b)}];p.interpolateArray=sc;var hg=function(){return va},hi=p.map({linear:hg,poly:function(a){return function(b){return Math.pow(b,
a)}},quad:function(){return ch},cubic:function(){return dh},sin:function(){return fh},exp:function(){return gh},circle:function(){return hh},elastic:function(a,b){var c;return 2>arguments.length&&(b=0.45),arguments.length?c=b/Ga*Math.asin(1/a):(a=1,c=b/4),function(d){return 1+a*Math.pow(2,-10*d)*Math.sin((d-c)*Ga/b)}},back:function(a){return a||(a=1.70158),function(b){return b*b*((a+1)*b-a)}},bounce:function(){return ih}}),ii=p.map({"in":va,out:gf,"in-out":hf,"out-in":function(a){return hf(gf(a))}});
p.ease=function(a){var b=a.indexOf("-"),c=0<=b?a.substring(0,b):a,b=0<=b?a.substring(b+1):"in";return c=hi.get(c)||hg,b=ii.get(b)||va,bh(b(c.apply(null,Vf.call(arguments,1))))};p.interpolateHcl=function(a,b){a=p.hcl(a);b=p.hcl(b);var c=a.h,d=a.c,e=a.l,f=b.h-c,g=b.c-d,h=b.l-e;return isNaN(g)&&(g=0,d=isNaN(d)?b.c:d),isNaN(f)?(f=0,c=isNaN(c)?b.h:c):180<f?f-=360:-180>f&&(f+=360),function(a){return Oa(c+f*a,d+g*a,e+h*a)+""}};p.interpolateHsl=function(a,b){a=p.hsl(a);b=p.hsl(b);var c=a.h,d=a.s,e=a.l,f=
b.h-c,g=b.s-d,h=b.l-e;return isNaN(g)&&(g=0,d=isNaN(d)?b.s:d),isNaN(f)?(f=0,c=isNaN(c)?b.h:c):180<f?f-=360:-180>f&&(f+=360),function(a){return ra(c+f*a,d+g*a,e+h*a)+""}};p.interpolateLab=function(a,b){a=p.lab(a);b=p.lab(b);var c=a.l,d=a.a,e=a.b,f=b.l-c,g=b.a-d,h=b.b-e;return function(a){return Wd(c+f*a,d+g*a,e+h*a)+""}};p.interpolateRound=jf;p.transform=function(a){var b=Na.createElementNS(p.ns.prefix.svg,"g");return(p.transform=function(a){if(null!=a){b.setAttribute("transform",a);var c=b.transform.baseVal.consolidate()}return new kf(c?
c.matrix:ji)})(a)};kf.prototype.toString=function(){return"translate("+this.translate+")rotate("+this.rotate+")skewX("+this.skew+")scale("+this.scale+")"};var ji={a:1,b:0,c:0,d:1,e:0,f:0};p.interpolateTransform=mf;p.layout={};p.layout.bundle=function(){return function(a){for(var b=[],c=-1,d=a.length;++c<d;)b.push(lh(a[c]));return b}};p.layout.chord=function(){function a(){var l,A,n,q,s,r={},t=[],w=p.range(f),v=[];c=[];d=[];l=0;for(q=-1;++q<f;){A=0;for(s=-1;++s<f;)A+=e[q][s];t.push(A);v.push(p.range(f));
l+=A}g&&w.sort(function(a,b){return g(t[a],t[b])});h&&v.forEach(function(a,b){a.sort(function(a,c){return h(e[b][a],e[b][c])})});l=(Ga-m*f)/l;A=0;for(q=-1;++q<f;){n=A;for(s=-1;++s<f;){var u=w[q],x=v[u][s],y=e[u][x],z=A,B=A+=y*l;r[u+"-"+x]={index:u,subindex:x,startAngle:z,endAngle:B,value:y}}d[u]={index:u,startAngle:n,endAngle:A,value:(A-n)/l};A+=m}for(q=-1;++q<f;)for(s=q-1;++s<f;)l=r[q+"-"+s],A=r[s+"-"+q],(l.value||A.value)&&c.push(l.value<A.value?{source:A,target:l}:{source:l,target:A});k&&b()}function b(){c.sort(function(a,
b){return k((a.source.value+a.target.value)/2,(b.source.value+b.target.value)/2)})}var c,d,e,f,g,h,k,l={},m=0;return l.matrix=function(a){return arguments.length?(f=(e=a)&&e.length,c=d=null,l):e},l.padding=function(a){return arguments.length?(m=a,c=d=null,l):m},l.sortGroups=function(a){return arguments.length?(g=a,c=d=null,l):g},l.sortSubgroups=function(a){return arguments.length?(h=a,c=null,l):h},l.sortChords=function(a){return arguments.length?(k=a,c&&b(),l):k},l.chords=function(){return c||a(),
c},l.groups=function(){return d||a(),d},l};p.layout.force=function(){function a(b){return function(a,c,d,e){if(a.point!==b){d=a.cx-b.x;var f=a.cy-b.y;c=e-c;e=d*d+f*f;if(e>c*c/w)return r>e&&(c=a.charge/e,b.px-=d*c,b.py-=f*c),!0;a.point&&(e&&r>e)&&(c=a.pointCharge/e,b.px-=d*c,b.py-=f*c)}return!a.charge}}function b(a){a.px=p.event.x;a.py=p.event.y;h.resume()}var c,d,e,f,g,h={},k=p.dispatch("start","tick","end"),l=[1,1],m=0.9,n=ki,q=li,s=-30,r=mi,t=0.1,w=0.64,v=[],u=[];return h.tick=function(){if(0.005>
(d*=0.99))return k.end({type:"end",alpha:d=0}),!0;var b,c,h,n,q,r,J,w,R=v.length,x=u.length;for(c=0;x>c;++c)h=u[c],b=h.source,n=h.target,J=n.x-b.x,w=n.y-b.y,(q=J*J+w*w)&&(q=d*f[c]*((q=Math.sqrt(q))-e[c])/q,J*=q,w*=q,n.x-=J*(r=b.weight/(n.weight+b.weight)),n.y-=w*r,b.x+=J*(r=1-r),b.y+=w*r);if((r=d*t)&&(J=l[0]/2,w=l[1]/2,c=-1,r))for(;++c<R;)h=v[c],h.x+=(J-h.x)*r,h.y+=(w-h.y)*r;if(s){of(b=p.geom.quadtree(v),d,g);for(c=-1;++c<R;)(h=v[c]).fixed||b.visit(a(h))}for(c=-1;++c<R;)h=v[c],h.fixed?(h.x=h.px,h.y=
h.py):(h.x-=(h.px-(h.px=h.x))*m,h.y-=(h.py-(h.py=h.y))*m);k.tick({type:"tick",alpha:d})},h.nodes=function(a){return arguments.length?(v=a,h):v},h.links=function(a){return arguments.length?(u=a,h):u},h.size=function(a){return arguments.length?(l=a,h):l},h.linkDistance=function(a){return arguments.length?(n="function"==typeof a?a:+a,h):n},h.distance=h.linkDistance,h.linkStrength=function(a){return arguments.length?(q="function"==typeof a?a:+a,h):q},h.friction=function(a){return arguments.length?(m=
+a,h):m},h.charge=function(a){return arguments.length?(s="function"==typeof a?a:+a,h):s},h.chargeDistance=function(a){return arguments.length?(r=a*a,h):Math.sqrt(r)},h.gravity=function(a){return arguments.length?(t=+a,h):t},h.theta=function(a){return arguments.length?(w=a*a,h):Math.sqrt(w)},h.alpha=function(a){return arguments.length?(a=+a,d?d=0<a?a:0:0<a&&(k.start({type:"start",alpha:d=a}),p.timer(h.tick)),h):d},h.start=function(){function a(d,e){if(!c){c=Array(k);for(h=0;k>h;++h)c[h]=[];for(h=0;l>
h;++h){var f=u[h];c[f.source.index].push(f.target);c[f.target.index].push(f.source)}}for(var g=c[b],h=-1,l=g.length;++h<l;)if(!isNaN(f=g[h][d]))return f;return Math.random()*e}var b,c,d,k=v.length,m=u.length,A=l[0],p=l[1];for(b=0;k>b;++b)(d=v[b]).index=b,d.weight=0;for(b=0;m>b;++b)d=u[b],"number"==typeof d.source&&(d.source=v[d.source]),"number"==typeof d.target&&(d.target=v[d.target]),++d.source.weight,++d.target.weight;for(b=0;k>b;++b)d=v[b],isNaN(d.x)&&(d.x=a("x",A)),isNaN(d.y)&&(d.y=a("y",p)),
isNaN(d.px)&&(d.px=d.x),isNaN(d.py)&&(d.py=d.y);if(e=[],"function"==typeof n)for(b=0;m>b;++b)e[b]=+n.call(this,u[b],b);else for(b=0;m>b;++b)e[b]=n;if(f=[],"function"==typeof q)for(b=0;m>b;++b)f[b]=+q.call(this,u[b],b);else for(b=0;m>b;++b)f[b]=q;if(g=[],"function"==typeof s)for(b=0;k>b;++b)g[b]=+s.call(this,v[b],b);else for(b=0;k>b;++b)g[b]=s;return h.resume()},h.resume=function(){return h.alpha(0.1)},h.stop=function(){return h.alpha(0)},h.drag=function(){return c||(c=p.behavior.drag().origin(va).on("dragstart.force",
mh).on("drag.force",b).on("dragend.force",nh)),arguments.length?(this.on("mouseover.force",oh).on("mouseout.force",ph).call(c),void 0):c},p.rebind(h,k,"on")};var ki=20,li=1,mi=1/0;p.layout.hierarchy=function(){function a(b,g,h){var k=e.call(c,b,g);if(b.depth=g,h.push(b),k&&(l=k.length)){for(var l,m=-1,p=b.children=Array(l),n=0,q=g+1;++m<l;)g=p[m]=a(k[m],q,h),g.parent=b,n+=g.value;d&&p.sort(d);f&&(b.value=n)}else delete b.children,f&&(b.value=+f.call(c,b,g)||0);return b}function b(a,d){var e=a.children,
g=0;if(e&&(h=e.length))for(var h,k=-1,l=d+1;++k<h;)g+=b(e[k],l);else f&&(g=+f.call(c,a,d)||0);return f&&(a.value=g),g}function c(b){var d=[];return a(b,0,d),d}var d=th,e=rh,f=sh;return c.sort=function(a){return arguments.length?(d=a,c):d},c.children=function(a){return arguments.length?(e=a,c):e},c.value=function(a){return arguments.length?(f=a,c):f},c.revalue=function(a){return b(a,0),a},c};p.layout.partition=function(){function a(b,c,d,e){var f=b.children;if(b.x=c,b.y=b.depth*e,b.dx=d,b.dy=e,f&&
(g=f.length)){var g,h,k=-1;for(d=b.value?d/b.value:0;++k<g;)a(h=f[k],c,b=h.value*d,e),c+=b}}function b(a){a=a.children;var c=0;if(a&&(d=a.length))for(var d,e=-1;++e<d;)c=Math.max(c,b(a[e]));return 1+c}function c(f,g){var h=d.call(this,f,g);return a(h[0],0,e[0],e[1]/b(h[0])),h}var d=p.layout.hierarchy(),e=[1,1];return c.size=function(a){return arguments.length?(e=a,c):e},Qb(c,d)};p.layout.pie=function(){function a(f){var g=f.map(function(c,d){return+b.call(a,c,d)}),h=+("function"==typeof d?d.apply(this,
arguments):d),k=(("function"==typeof e?e.apply(this,arguments):e)-h)/p.sum(g),l=p.range(f.length);null!=c&&l.sort(c===ig?function(a,b){return g[b]-g[a]}:function(a,b){return c(f[a],f[b])});var m=[];return l.forEach(function(a){var b;m[a]={data:f[a],value:b=g[a],startAngle:h,endAngle:h+=b*k}}),m}var b=Number,c=ig,d=0,e=Ga;return a.value=function(c){return arguments.length?(b=c,a):b},a.sort=function(b){return arguments.length?(c=b,a):c},a.startAngle=function(b){return arguments.length?(d=b,a):d},a.endAngle=
function(b){return arguments.length?(e=b,a):e},a};var ig={};p.layout.stack=function(){function a(h,k){var l=h.map(function(c,d){return b.call(a,c,d)}),m=l.map(function(b){return b.map(function(b,c){return[f.call(a,b,c),g.call(a,b,c)]})}),n=c.call(a,m,k),l=p.permute(l,n),m=p.permute(m,n),q,s,r=d.call(a,m,k),t=l.length,w=l[0].length;for(q=0;w>q;++q){e.call(a,l[0][q],s=r[q],m[0][q][1]);for(n=1;t>n;++n)e.call(a,l[n][q],s+=m[n-1][q][1],m[n][q][1])}return h}var b=va,c=wd,d=xd,e=wh,f=uh,g=vh;return a.values=
function(c){return arguments.length?(b=c,a):b},a.order=function(b){return arguments.length?(c="function"==typeof b?b:ni.get(b)||wd,a):c},a.offset=function(b){return arguments.length?(d="function"==typeof b?b:oi.get(b)||xd,a):d},a.x=function(b){return arguments.length?(f=b,a):f},a.y=function(b){return arguments.length?(g=b,a):g},a.out=function(b){return arguments.length?(e=b,a):e},a};var ni=p.map({"inside-out":function(a){var b,c=a.length,d=a.map(xh),e=a.map(yh),f=p.range(c).sort(function(a,b){return d[a]-
d[b]}),g=0,h=0,k=[],l=[];for(a=0;c>a;++a)b=f[a],h>g?(g+=e[b],k.push(b)):(h+=e[b],l.push(b));return l.reverse().concat(k)},reverse:function(a){return p.range(a.length).reverse()},"default":wd}),oi=p.map({silhouette:function(a){var b,c,d,e=a.length,f=a[0].length,g=[],h=0,k=[];for(c=0;f>c;++c){for(d=b=0;e>b;b++)d+=a[b][c][1];d>h&&(h=d);g.push(d)}for(c=0;f>c;++c)k[c]=(h-g[c])/2;return k},wiggle:function(a){var b,c,d,e,f,g,h,k,l,m=a.length,n=a[0],p=n.length,q=[];q[0]=k=l=0;for(c=1;p>c;++c){for(e=b=0;m>
b;++b)e+=a[b][c][1];f=b=0;for(h=n[c][0]-n[c-1][0];m>b;++b){d=0;for(g=(a[b][c][1]-a[b][c-1][1])/(2*h);b>d;++d)g+=(a[d][c][1]-a[d][c-1][1])/h;f+=g*a[b][c][1]}q[c]=k-=e?f/e*h:0;l>k&&(l=k)}for(c=0;p>c;++c)q[c]-=l;return q},expand:function(a){var b,c,d,e=a.length,f=a[0].length,g=1/e,h=[];for(c=0;f>c;++c){for(d=b=0;e>b;b++)d+=a[b][c][1];if(d)for(b=0;e>b;b++)a[b][c][1]/=d;else for(b=0;e>b;b++)a[b][c][1]=g}for(c=0;f>c;++c)h[c]=0;return h},zero:xd});p.layout.histogram=function(){function a(f,g){var h,k,l=
[],m=f.map(c,this),A=d.call(this,m,g),n=e.call(this,A,m,g);g=-1;for(var q=m.length,s=n.length-1,r=b?1:1/q;++g<s;)h=l[g]=[],h.dx=n[g+1]-(h.x=n[g]),h.y=0;if(0<s)for(g=-1;++g<q;)k=m[g],k>=A[0]&&k<=A[1]&&(h=l[p.bisect(n,k,1,s)-1],h.y+=r,h.push(f[g]));return l}var b=!0,c=Number,d=Bh,e=Ah;return a.value=function(b){return arguments.length?(c=b,a):c},a.range=function(b){return arguments.length?(d=ka(b),a):d},a.bins=function(b){return arguments.length?(e="number"==typeof b?function(a){return pf(a,b)}:ka(b),
a):e},a.frequency=function(c){return arguments.length?(b=!!c,a):b},a};p.layout.tree=function(){function a(f,g){function h(a,b){var d=a.children,e=a._tree;if(d&&(f=d.length)){for(var f,g,k,l=d[0],m=l,A=-1;++A<f;){k=d[A];h(k,g);var n=k;if(g){for(var p=void 0,q=n,s=n,r=n.parent.children[0],t=q._tree.mod,w=s._tree.mod,v=g._tree.mod,u=r._tree.mod;g=zd(g),q=yd(q),g&&q;){r=yd(r);s=zd(s);s._tree.ancestor=n;p=g._tree.prelim+v-q._tree.prelim-t+c(g,q);if(0<p){var J=g._tree.ancestor.parent==n.parent?g._tree.ancestor:
m,x=n,y=p,J=J._tree,x=x._tree,z=y/(x.number-J.number);J.change+=z;x.change-=z;x.shift+=y;x.prelim+=y;x.mod+=y;t+=p;w+=p}v+=g._tree.mod;t+=q._tree.mod;u+=r._tree.mod;w+=s._tree.mod}g&&!zd(s)&&(s._tree.thread=g,s._tree.mod+=v-w);q&&!yd(r)&&(r._tree.thread=q,r._tree.mod+=t-u,m=n)}g=k}A=f=0;n=a.children;for(m=n.length;0<=--m;)d=n[m]._tree,d.prelim+=f,d.mod+=f,f+=d.shift+(A+=d.change);k=0.5*(l._tree.prelim+k._tree.prelim);b?(e.prelim=b._tree.prelim+c(a,b),e.mod=e.prelim-k):e.prelim=k}else b&&(e.prelim=
b._tree.prelim+c(a,b))}function k(a,b){a.x=a._tree.prelim+b;var c=a.children;if(c&&(d=c.length)){var d,e=-1;for(b+=a._tree.mod;++e<d;)k(c[e],b)}}var l=b.call(this,f,g),m=l[0];Ya(m,function(a,b){a._tree={ancestor:a,prelim:0,mod:0,change:0,shift:0,number:b?b._tree.number+1:0}});h(m);k(m,-m._tree.prelim);var A=tc(m,Dh),n=tc(m,Ch),p=tc(m,Eh),q=A.x-c(A,n)/2,s=n.x+c(n,A)/2,r=p.depth||1;return Ya(m,e?function(a){a.x*=d[0];a.y=a.depth*d[1];delete a._tree}:function(a){a.x=(a.x-q)/(s-q)*d[0];a.y=a.depth/r*
d[1];delete a._tree}),l}var b=p.layout.hierarchy().sort(null).value(null),c=qf,d=[1,1],e=!1;return a.separation=function(b){return arguments.length?(c=b,a):c},a.size=function(b){return arguments.length?(e=null==(d=b),a):e?null:d},a.nodeSize=function(b){return arguments.length?(e=null!=(d=b),a):e?d:null},Qb(a,b)};p.layout.pack=function(){function a(f,g){var h=c.call(this,f,g),k=h[0],l=e[0],m=e[1],A=null==b?Math.sqrt:"function"==typeof b?b:function(){return b};if(k.x=k.y=0,Ya(k,function(a){a.r=+A(a.value)}),
Ya(k,tf),d){var n=d*(b?1:Math.max(2*k.r/l,2*k.r/m))/2;Ya(k,function(a){a.r+=n});Ya(k,tf);Ya(k,function(a){a.r-=n})}return vf(k,l/2,m/2,b?1:1/Math.max(2*k.r/l,2*k.r/m)),h}var b,c=p.layout.hierarchy().sort(Fh),d=0,e=[1,1];return a.size=function(b){return arguments.length?(e=b,a):e},a.radius=function(c){return arguments.length?(b=null==c||"function"==typeof c?c:+c,a):b},a.padding=function(b){return arguments.length?(d=+b,a):d},Qb(a,c)};p.layout.cluster=function(){function a(f,g){var h,k=b.call(this,
f,g),l=k[0],m=0;Ya(l,function(a){var b=a.children;b&&b.length?(a.x=Jh(b),a.y=Ih(b)):(a.x=h?m+=c(a,h):0,a.y=0,h=a)});var A=wf(l),n=xf(l),p=A.x-c(A,n)/2,q=n.x+c(n,A)/2;return Ya(l,e?function(a){a.x=(a.x-l.x)*d[0];a.y=(l.y-a.y)*d[1]}:function(a){a.x=(a.x-p)/(q-p)*d[0];a.y=(1-(l.y?a.y/l.y:1))*d[1]}),k}var b=p.layout.hierarchy().sort(null).value(null),c=qf,d=[1,1],e=!1;return a.separation=function(b){return arguments.length?(c=b,a):c},a.size=function(b){return arguments.length?(e=null==(d=b),a):e?null:
d},a.nodeSize=function(b){return arguments.length?(e=null!=(d=b),a):e?d:null},Qb(a,b)};p.layout.treemap=function(){function a(b,c){for(var d,e,f=-1,g=b.length;++f<g;)e=(d=b[f]).value*(0>c?0:c),d.area=isNaN(e)||0>=e?0:e}function b(c){var e=c.children;if(e&&e.length){var f,g=m(c),h=[],k=e.slice(),l=1/0,n="slice"===q?g.dx:"dice"===q?g.dy:"slice-dice"===q?1&c.depth?g.dy:g.dx:Math.min(g.dx,g.dy);a(k,g.dx*g.dy/c.value);for(h.area=0;0<(c=k.length);){h.push(c=k[c-1]);h.area+=c.area;var p;if(!(p="squarify"!==
q)){c=n;f=void 0;var r=h.area;p=0;for(var t=1/0,w=-1,v=h.length;++w<v;)(f=h[w].area)&&(t>f&&(t=f),f>p&&(p=f));p=(f=(r*=r,c*=c,r?Math.max(c*p*s/r,r/(c*t*s)):1/0))<=l}p?(k.pop(),l=f):(h.area-=h.pop().area,d(h,n,g,!1),n=Math.min(g.dx,g.dy),h.length=h.area=0,l=1/0)}h.length&&(d(h,n,g,!0),h.length=h.area=0);e.forEach(b)}}function c(b){var e=b.children;if(e&&e.length){var f=m(b),g=e.slice(),h=[];a(g,f.dx*f.dy/b.value);for(h.area=0;b=g.pop();)h.push(b),h.area+=b.area,null!=b.z&&(d(h,b.z?f.dx:f.dy,f,!g.length),
h.length=h.area=0);e.forEach(c)}}function d(a,b,c,e){var f,g=-1,k=a.length,l=c.x,m=c.y,A=b?h(a.area/b):0;if(b==c.dx){for((e||A>c.dy)&&(A=c.dy);++g<k;)f=a[g],f.x=l,f.y=m,f.dy=A,l+=f.dx=Math.min(c.x+c.dx-l,A?h(f.area/A):0);f.z=!0;f.dx+=c.x+c.dx-l;c.y+=A;c.dy-=A}else{for((e||A>c.dx)&&(A=c.dx);++g<k;)f=a[g],f.x=l,f.y=m,f.dx=A,m+=f.dy=Math.min(c.y+c.dy-m,A?h(f.area/A):0);f.z=!1;f.dy+=c.y+c.dy-m;c.x+=A;c.dx-=A}}function e(d){d=f||g(d);var h=d[0];return h.x=0,h.y=0,h.dx=k[0],h.dy=k[1],f&&g.revalue(h),a([h],
h.dx*h.dy/h.value),(f?c:b)(h),n&&(f=d),d}var f,g=p.layout.hierarchy(),h=Math.round,k=[1,1],l=null,m=Bd,n=!1,q="squarify",s=0.5*(1+Math.sqrt(5));return e.size=function(a){return arguments.length?(k=a,e):k},e.padding=function(a){function b(c){var d=a.call(e,c,c.depth);return null==d?Bd(c):yf(c,"number"==typeof d?[d,d,d,d]:d)}function c(b){return yf(b,a)}if(!arguments.length)return l;var d;return m=null==(l=a)?Bd:"function"==(d=typeof a)?b:"number"===d?(a=[a,a,a,a],c):c,e},e.round=function(a){return arguments.length?
(h=a?Math.round:Number,e):h!=Number},e.sticky=function(a){return arguments.length?(n=a,f=null,e):n},e.ratio=function(a){return arguments.length?(s=a,e):s},e.mode=function(a){return arguments.length?(q=a+"",e):q},Qb(e,g)};p.random={normal:function(a,b){var c=arguments.length;return 2>c&&(b=1),1>c&&(a=0),function(){var c,d;do c=2*Math.random()-1,d=2*Math.random()-1,d=c*c+d*d;while(!d||1<d);return a+b*c*Math.sqrt(-2*Math.log(d)/d)}},logNormal:function(){var a=p.random.normal.apply(p,arguments);return function(){return Math.exp(a())}},
bates:function(a){var b=p.random.irwinHall(a);return function(){return b()/a}},irwinHall:function(a){return function(){for(var b=0,c=0;a>c;c++)b+=Math.random();return b}}};p.scale={};var Lh={floor:va,ceil:va};p.scale.linear=function(){return Af([0,1],[0,1],nb,!1)};var Oh={s:1,g:1,p:1,r:1,e:1};p.scale.log=function(){return Bf(p.scale.linear().domain([0,1]),10,!0,[1,10])};var Cf=p.format(".0e"),Ph={floor:function(a){return-Math.ceil(-a)},ceil:function(a){return-Math.floor(-a)}};p.scale.pow=function(){return Df(p.scale.linear(),
1,[0,1])};p.scale.sqrt=function(){return p.scale.pow().exponent(0.5)};p.scale.ordinal=function(){return Ef([],{t:"range",a:[[]]})};p.scale.category10=function(){return p.scale.ordinal().range(pi)};p.scale.category20=function(){return p.scale.ordinal().range(qi)};p.scale.category20b=function(){return p.scale.ordinal().range(ri)};p.scale.category20c=function(){return p.scale.ordinal().range(si)};var pi=[2062260,16744206,2924588,14034728,9725885,9197131,14907330,8355711,12369186,1556175].map(Sb),qi=
[2062260,11454440,16744206,16759672,2924588,10018698,14034728,16750742,9725885,12955861,9197131,12885140,14907330,16234194,8355711,13092807,12369186,14408589,1556175,10410725].map(Sb),ri=[3750777,5395619,7040719,10264286,6519097,9216594,11915115,13556636,9202993,12426809,15186514,15190932,8666169,11356490,14049643,15177372,8077683,10834324,13528509,14589654].map(Sb),si=[3244733,7057110,10406625,13032431,15095053,16616764,16625259,16634018,3253076,7652470,10607003,13101504,7695281,10394312,12369372,
14342891,6513507,9868950,12434877,14277081].map(Sb);p.scale.quantile=function(){return Ff([],[])};p.scale.quantize=function(){return Gf(0,1,[0,1])};p.scale.threshold=function(){return Hf([0.5],[0,1])};p.scale.identity=function(){return If([0,1])};p.svg={};p.svg.arc=function(){function a(){var f=b.apply(this,arguments),g=c.apply(this,arguments),h=d.apply(this,arguments)+ob,k=e.apply(this,arguments)+ob,l=(h>k&&(l=h,h=k,k=l),k-h),m=W>l?"0":"1",A=Math.cos(h),h=Math.sin(h),n=Math.cos(k),k=Math.sin(k);
return l>=ti?f?"M0,"+g+"A"+g+","+g+" 0 1,1 0,"+-g+"A"+g+","+g+" 0 1,1 0,"+g+"M0,"+f+"A"+f+","+f+" 0 1,0 0,"+-f+"A"+f+","+f+" 0 1,0 0,"+f+"Z":"M0,"+g+"A"+g+","+g+" 0 1,1 0,"+-g+"A"+g+","+g+" 0 1,1 0,"+g+"Z":f?"M"+g*A+","+g*h+"A"+g+","+g+" 0 "+m+",1 "+g*n+","+g*k+"L"+f*n+","+f*k+"A"+f+","+f+" 0 "+m+",0 "+f*A+","+f*h+"Z":"M"+g*A+","+g*h+"A"+g+","+g+" 0 "+m+",1 "+g*n+","+g*k+"L0,0Z"}var b=Qh,c=Rh,d=Jf,e=Kf;return a.innerRadius=function(c){return arguments.length?(b=ka(c),a):b},a.outerRadius=function(b){return arguments.length?
(c=ka(b),a):c},a.startAngle=function(b){return arguments.length?(d=ka(b),a):d},a.endAngle=function(b){return arguments.length?(e=ka(b),a):e},a.centroid=function(){var a=(b.apply(this,arguments)+c.apply(this,arguments))/2,f=(d.apply(this,arguments)+e.apply(this,arguments))/2+ob;return[Math.cos(f)*a,Math.sin(f)*a]},a};var ob=-Ba,ti=Ga-N;p.svg.line=function(){return Lf(va)};var Fd=p.map({linear:Ha,"linear-closed":function(a){return Ha(a)+"Z"},step:function(a){for(var b=0,c=a.length,d=a[0],e=[d[0],",",
d[1]];++b<c;)e.push("H",(d[0]+(d=a[b])[0])/2,"V",d[1]);return 1<c&&e.push("H",d[0]),e.join("")},"step-before":Gd,"step-after":Hd,basis:Mf,"basis-open":function(a){if(4>a.length)return Ha(a);for(var b,c=[],d=-1,e=a.length,f=[0],g=[0];3>++d;)b=a[d],f.push(b[0]),g.push(b[1]);c.push(Ka(gb,f)+","+Ka(gb,g));for(--d;++d<e;)b=a[d],f.shift(),f.push(b[0]),g.shift(),g.push(b[1]),Jd(c,f,g);return c.join("")},"basis-closed":function(a){for(var b,c,d=-1,e=a.length,f=e+4,g=[],h=[];4>++d;)c=a[d%e],g.push(c[0]),h.push(c[1]);
b=[Ka(gb,g),",",Ka(gb,h)];for(--d;++d<f;)c=a[d%e],g.shift(),g.push(c[0]),h.shift(),h.push(c[1]),Jd(b,g,h);return b.join("")},bundle:function(a,b){var c=a.length-1;if(c)for(var d,e,f=a[0][0],g=a[0][1],h=a[c][0]-f,k=a[c][1]-g,l=-1;++l<=c;)d=a[l],e=l/c,d[0]=b*d[0]+(1-b)*(f+e*h),d[1]=b*d[1]+(1-b)*(g+e*k);return Mf(a)},cardinal:function(a,b){return 3>a.length?Ha(a):a[0]+xc(a,Id(a,b))},"cardinal-open":function(a,b){return 4>a.length?Ha(a):a[1]+xc(a.slice(1,a.length-1),Id(a,b))},"cardinal-closed":function(a,
b){return 3>a.length?Ha(a):a[0]+xc((a.push(a[0]),a),Id([a[a.length-2]].concat(a,[a[1]]),b))},monotone:function(a){if(3>a.length)a=Ha(a);else{var b=a[0],c,d,e,f,g=[],h;c=0;h=a.length-1;for(var k=[],l=a[1],m=k[0]=Kd(a[0],l);++c<h;)k[c]=(m+(m=Kd(l,l=a[c+1])))/2;h=(k[c]=m,k);k=-1;for(l=a.length-1;++k<l;)c=Kd(a[k],a[k+1]),$(c)<N?h[k]=h[k+1]=0:(d=h[k]/c,e=h[k+1]/c,f=d*d+e*e,9<f&&(f=3*c/Math.sqrt(f),h[k]=f*d,h[k+1]=f*e));for(k=-1;++k<=l;)f=(a[Math.min(l,k+1)][0]-a[Math.max(0,k-1)][0])/(6*(1+h[k]*h[k])),
g.push([f||0,h[k]*f||0]);a=b+xc(a,g)}return a}});Fd.forEach(function(a,b){b.key=a;b.closed=/-closed$/.test(a)});var Nf=[0,2/3,1/3,0],Of=[0,1/3,2/3,0],gb=[0,1/6,2/3,1/6];p.svg.line.radial=function(){var a=Lf(Pf);return a.radius=a.x,delete a.x,a.angle=a.y,delete a.y,a};Gd.reverse=Hd;Hd.reverse=Gd;p.svg.area=function(){return Qf(va)};p.svg.area.radial=function(){var a=Qf(Pf);return a.radius=a.x,delete a.x,a.innerRadius=a.x0,delete a.x0,a.outerRadius=a.x1,delete a.x1,a.angle=a.y,delete a.y,a.startAngle=
a.y0,delete a.y0,a.endAngle=a.y1,delete a.y1,a};p.svg.chord=function(){function a(e,f){var g=b(this,c,e,f),h=b(this,d,e,f);return"M"+g.p0+("A"+g.r+","+g.r+" 0 "+ +(g.a1-g.a0>W)+",1 "+g.p1)+(g.a0==h.a0&&g.a1==h.a1?"Q 0,0 "+g.p0:"Q 0,0 "+h.p0+("A"+h.r+","+h.r+" 0 "+ +(h.a1-h.a0>W)+",1 "+h.p1)+("Q 0,0 "+g.p0))+"Z"}function b(a,c,d,h){var k=c.call(a,d,h);c=e.call(a,k,h);d=f.call(a,k,h)+ob;a=g.call(a,k,h)+ob;return{r:c,a0:d,a1:a,p0:[c*Math.cos(d),c*Math.sin(d)],p1:[c*Math.cos(a),c*Math.sin(a)]}}var c=
md,d=nd,e=Sh,f=Jf,g=Kf;return a.radius=function(b){return arguments.length?(e=ka(b),a):e},a.source=function(b){return arguments.length?(c=ka(b),a):c},a.target=function(b){return arguments.length?(d=ka(b),a):d},a.startAngle=function(b){return arguments.length?(f=ka(b),a):f},a.endAngle=function(b){return arguments.length?(g=ka(b),a):g},a};p.svg.diagonal=function(){function a(e,f){var g=b.call(this,e,f),h=c.call(this,e,f),k=(g.y+h.y)/2,g=[g,{x:g.x,y:k},{x:h.x,y:k},h];return g=g.map(d),"M"+g[0]+"C"+g[1]+
" "+g[2]+" "+g[3]}var b=md,c=nd,d=Rf;return a.source=function(c){return arguments.length?(b=ka(c),a):b},a.target=function(b){return arguments.length?(c=ka(b),a):c},a.projection=function(b){return arguments.length?(d=b,a):d},a};p.svg.diagonal.radial=function(){var a=p.svg.diagonal(),b=Rf,c=a.projection;return a.projection=function(a){return arguments.length?c(Th(b=a)):b},a};p.svg.symbol=function(){function a(d,e){return(jg.get(b.call(this,d,e))||Sf)(c.call(this,d,e))}var b=Vh,c=Uh;return a.type=function(c){return arguments.length?
(b=ka(c),a):b},a.size=function(b){return arguments.length?(c=ka(b),a):c},a};var jg=p.map({circle:Sf,cross:function(a){a=Math.sqrt(a/5)/2;return"M"+-3*a+","+-a+"H"+-a+"V"+-3*a+"H"+a+"V"+-a+"H"+3*a+"V"+a+"H"+a+"V"+3*a+"H"+-a+"V"+a+"H"+-3*a+"Z"},diamond:function(a){a=Math.sqrt(a/(2*kg));var b=a*kg;return"M0,"+-a+"L"+b+",0 0,"+a+" "+-b+",0Z"},square:function(a){a=Math.sqrt(a)/2;return"M"+-a+","+-a+"L"+a+","+-a+" "+a+","+a+" "+-a+","+a+"Z"},"triangle-down":function(a){a=Math.sqrt(a/Pc);var b=a*Pc/2;return"M0,"+
b+"L"+a+","+-b+" "+-a+","+-b+"Z"},"triangle-up":function(a){a=Math.sqrt(a/Pc);var b=a*Pc/2;return"M0,"+-b+"L"+a+","+b+" "+-a+","+b+"Z"}});p.svg.symbolTypes=jg.keys();var qb,Bc,Pc=Math.sqrt(3),kg=Math.tan(30*Y),ta=[],Zf=0;ta.call=ia.call;ta.empty=ia.empty;ta.node=ia.node;ta.size=ia.size;p.transition=function(a){return arguments.length?qb?a.transition():a:Yf.transition()};p.transition.prototype=ta;ta.select=function(a){var b,c,d,e=this.id,f=[];a=v(a);for(var g=-1,h=this.length;++g<h;){f.push(b=[]);
for(var k=this[g],l=-1,m=k.length;++l<m;)(d=k[l])&&(c=a.call(d,d.__data__,l,g))?("__data__"in d&&(c.__data__=d.__data__),yc(c,l,e,d.__transition__[e]),b.push(c)):b.push(null)}return Rb(f,e)};ta.selectAll=function(a){var b,c,d,e,f=this.id,g=[];a=y(a);for(var h=-1,k=this.length;++h<k;)for(var l=this[h],m=-1,n=l.length;++m<n;)if(b=l[m]){e=b.__transition__[f];c=a.call(b,b.__data__,m,h);g.push(b=[]);for(var p=-1,q=c.length;++p<q;)(d=c[p])&&yc(d,p,f,e),b.push(d)}return Rb(g,f)};ta.filter=function(a){var b,
c,d,e=[];"function"!=typeof a&&(a=O(a));for(var f=0,g=this.length;g>f;f++){e.push(b=[]);c=this[f];for(var h=0,k=c.length;k>h;h++)(d=c[h])&&a.call(d,d.__data__,h,f)&&b.push(d)}return Rb(e,this.id)};ta.tween=function(a,b){var c=this.id;return 2>arguments.length?this.node().__transition__[c].tween.get(a):U(this,null==b?function(b){b.__transition__[c].tween.remove(a)}:function(d){d.__transition__[c].tween.set(a,b)})};ta.attr=function(a,b){function c(){this.removeAttribute(h)}function d(){this.removeAttributeNS(h.space,
h.local)}function e(a){return null==a?c:(a+="",function(){var b,c=this.getAttribute(h);return c!==a&&(b=g(c,a),function(a){this.setAttribute(h,b(a))})})}function f(a){return null==a?d:(a+="",function(){var b,c=this.getAttributeNS(h.space,h.local);return c!==a&&(b=g(c,a),function(a){this.setAttributeNS(h.space,h.local,b(a))})})}if(2>arguments.length){for(b in a)this.attr(b,a[b]);return this}var g="transform"==a?mf:nb,h=p.ns.qualify(a);return Ld(this,"attr."+a,b,h.local?f:e)};ta.attrTween=function(a,
b){function c(a,d){var f=b.call(this,a,d,this.getAttribute(e));return f&&function(a){this.setAttribute(e,f(a))}}function d(a,c){var f=b.call(this,a,c,this.getAttributeNS(e.space,e.local));return f&&function(a){this.setAttributeNS(e.space,e.local,f(a))}}var e=p.ns.qualify(a);return this.tween("attr."+a,e.local?d:c)};ta.style=function(a,b,c){function d(){this.style.removeProperty(a)}var e=arguments.length;if(3>e){if("string"!=typeof a){2>e&&(b="");for(c in a)this.style(c,a[c],b);return this}c=""}return Ld(this,
"style."+a,b,function(b){return null==b?d:(b+="",function(){var d,e=za.getComputedStyle(this,null).getPropertyValue(a);return e!==b&&(d=nb(e,b),function(b){this.style.setProperty(a,d(b),c)})})})};ta.styleTween=function(a,b,c){return 3>arguments.length&&(c=""),this.tween("style."+a,function(d,e){var f=b.call(this,d,e,za.getComputedStyle(this,null).getPropertyValue(a));return f&&function(b){this.style.setProperty(a,f(b),c)}})};ta.text=function(a){return Ld(this,"text",a,Wh)};ta.remove=function(){return this.each("end.transition",
function(){var a;2>this.__transition__.count&&(a=this.parentNode)&&a.removeChild(this)})};ta.ease=function(a){var b=this.id;return 1>arguments.length?this.node().__transition__[b].ease:("function"!=typeof a&&(a=p.ease.apply(p,arguments)),U(this,function(c){c.__transition__[b].ease=a}))};ta.delay=function(a){var b=this.id;return U(this,"function"==typeof a?function(c,d,e){c.__transition__[b].delay=+a.call(c,c.__data__,d,e)}:(a=+a,function(c){c.__transition__[b].delay=a}))};ta.duration=function(a){var b=
this.id;return U(this,"function"==typeof a?function(c,d,e){c.__transition__[b].duration=Math.max(1,a.call(c,c.__data__,d,e))}:(a=Math.max(1,a),function(c){c.__transition__[b].duration=a}))};ta.each=function(a,b){var c=this.id;if(2>arguments.length){var d=Bc,e=qb;qb=c;U(this,function(b,d,e){Bc=b.__transition__[c];a.call(b,b.__data__,d,e)});Bc=d;qb=e}else U(this,function(d){d=d.__transition__[c];(d.event||(d.event=p.dispatch("start","end"))).on(a,b)});return this};ta.transition=function(){for(var a,
b,c,d,e=this.id,f=++Zf,g=[],h=0,k=this.length;k>h;h++){g.push(a=[]);b=this[h];for(var l=0,m=b.length;m>l;l++)(c=b[l])&&(d=Object.create(c.__transition__[e]),d.delay+=d.duration,yc(c,l,f,d)),a.push(c)}return Rb(g,f)};p.svg.axis=function(){function a(l){l.each(function(){var a,l=p.select(this),m=this.__chart__||c,n=this.__chart__=c.copy(),q=null==k?n.ticks?n.ticks.apply(n,h):n.domain():k,s=null==b?n.tickFormat?n.tickFormat.apply(n,h):va:b,r=l.selectAll(".tick").data(q,n),q=r.enter().insert("g",".domain").attr("class",
"tick").style("opacity",N),t=p.transition(r.exit()).style("opacity",N).remove(),A=p.transition(r).style("opacity",1),w=uc(n),l=l.selectAll(".domain").data([0]),l=(l.enter().append("path").attr("class","domain"),p.transition(l));q.append("line");q.append("text");var v=q.select("line"),u=A.select("line"),s=r.select("text").text(s),r=q.select("text"),x=A.select("text");switch(d){case "bottom":a=Tf;v.attr("y2",e);r.attr("y",Math.max(e,0)+g);u.attr("x2",0).attr("y2",e);x.attr("x",0).attr("y",Math.max(e,
0)+g);s.attr("dy",".71em").style("text-anchor","middle");l.attr("d","M"+w[0]+","+f+"V0H"+w[1]+"V"+f);break;case "top":a=Tf;v.attr("y2",-e);r.attr("y",-(Math.max(e,0)+g));u.attr("x2",0).attr("y2",-e);x.attr("x",0).attr("y",-(Math.max(e,0)+g));s.attr("dy","0em").style("text-anchor","middle");l.attr("d","M"+w[0]+","+-f+"V0H"+w[1]+"V"+-f);break;case "left":a=Uf;v.attr("x2",-e);r.attr("x",-(Math.max(e,0)+g));u.attr("x2",-e).attr("y2",0);x.attr("x",-(Math.max(e,0)+g)).attr("y",0);s.attr("dy",".32em").style("text-anchor",
"end");l.attr("d","M"+-f+","+w[0]+"H0V"+w[1]+"H"+-f);break;case "right":a=Uf,v.attr("x2",e),r.attr("x",Math.max(e,0)+g),u.attr("x2",e).attr("y2",0),x.attr("x",Math.max(e,0)+g).attr("y",0),s.attr("dy",".32em").style("text-anchor","start"),l.attr("d","M"+f+","+w[0]+"H0V"+w[1]+"H"+f)}if(n.rangeBand)var y=n,z=y.rangeBand()/2,m=n=function(a){return y(a)+z};else m.rangeBand?m=n:t.call(a,n);q.call(a,m);A.call(a,n)})}var b,c=p.scale.linear(),d=lg,e=6,f=6,g=3,h=[10],k=null;return a.scale=function(b){return arguments.length?
(c=b,a):c},a.orient=function(b){return arguments.length?(d=b in ui?b+"":lg,a):d},a.ticks=function(){return arguments.length?(h=arguments,a):h},a.tickValues=function(b){return arguments.length?(k=b,a):k},a.tickFormat=function(c){return arguments.length?(b=c,a):b},a.tickSize=function(b){var c=arguments.length;return c?(e=+b,f=+arguments[c-1],a):e},a.innerTickSize=function(b){return arguments.length?(e=+b,a):e},a.outerTickSize=function(b){return arguments.length?(f=+b,a):f},a.tickPadding=function(b){return arguments.length?
(g=+b,a):g},a.tickSubdivide=function(){return arguments.length&&a},a};var lg="bottom",ui={top:1,right:1,bottom:1,left:1};p.svg.brush=function(){function a(f){f.each(function(){var f=p.select(this).style("pointer-events","all").style("-webkit-tap-highlight-color","rgba(0,0,0,0)").on("mousedown.brush",e).on("touchstart.brush",e),g=f.selectAll(".background").data([0]);g.enter().append("rect").attr("class","background").style("visibility","hidden").style("cursor","crosshair");f.selectAll(".extent").data([0]).enter().append("rect").attr("class",
"extent").style("cursor","move");var h=f.selectAll(".resize").data(t,va);h.exit().remove();h.enter().append("g").attr("class",function(a){return"resize "+a}).style("cursor",function(a){return vi[a]}).append("rect").attr("x",function(a){return/[ew]$/.test(a)?-3:null}).attr("y",function(a){return/^[ns]/.test(a)?-3:null}).attr("width",6).attr("height",6).style("visibility","hidden");h.style("display",a.empty()?"none":null);var m,f=p.transition(f),g=p.transition(g);k&&(m=uc(k),g.attr("x",m[0]).attr("width",
m[1]-m[0]),c(f));l&&(m=uc(l),g.attr("y",m[0]).attr("height",m[1]-m[0]),d(f));b(f)})}function b(a){a.selectAll(".resize").attr("transform",function(a){return"translate("+m[+/e$/.test(a)]+","+n[+/^s/.test(a)]+")"})}function c(a){a.select(".extent").attr("x",m[0]);a.selectAll(".extent,.n>rect,.s>rect").attr("width",m[1]-m[0])}function d(a){a.select(".extent").attr("y",n[0]);a.selectAll(".extent,.e>rect,.w>rect").attr("height",n[1]-n[0])}function e(){function t(){var a=p.mouse(y),e=!1;x&&(a[0]+=x[0],
a[1]+=x[1]);E||(p.event.altKey?(u||(u=[(m[0]+m[1])/2,(n[0]+n[1])/2]),I[0]=m[+(a[0]<u[0])],I[1]=n[+(a[1]<u[1])]):u=null);F&&w(a,k,0)&&(c(D),e=!0);G&&w(a,l,1)&&(d(D),e=!0);e&&(b(D),B({type:"brush",mode:E?"move":"resize"}))}function w(a,b,c){var d,e,h=uc(b);b=h[0];var h=h[1],k=I[c],l=c?n:m,p=l[1]-l[0];return E&&(b-=k,h-=p+k),d=(c?r:q)?Math.max(b,Math.min(h,a[c])):a[c],E?e=(d+=k)+p:(u&&(k=Math.max(b,Math.min(h,2*u[c]-d))),d>k?(e=d,d=k):e=k),l[0]!=d||l[1]!=e?(c?g=null:f=null,l[0]=d,l[1]=e,!0):void 0}function v(){t();
D.style("pointer-events","all").selectAll(".resize").style("display",a.empty()?"none":null);p.select("body").style("cursor",null);K.on("mousemove.brush",null).on("mouseup.brush",null).on("touchmove.brush",null).on("touchend.brush",null).on("keydown.brush",null).on("keyup.brush",null);H();B({type:"brushend"})}var u,x,y=this,z=p.select(p.event.target),B=h.of(y,arguments),D=p.select(y),C=z.datum(),F=!/^(n|s)$/.test(C)&&k,G=!/^(e|w)$/.test(C)&&l,E=z.classed("extent"),H=ea(),I=p.mouse(y),K=p.select(za).on("keydown.brush",
function(){32==p.event.keyCode&&(E||(u=null,I[0]-=m[1],I[1]-=n[1],E=2),s())}).on("keyup.brush",function(){32==p.event.keyCode&&2==E&&(I[0]+=m[1],I[1]+=n[1],E=0,s())});if(p.event.changedTouches?K.on("touchmove.brush",t).on("touchend.brush",v):K.on("mousemove.brush",t).on("mouseup.brush",v),D.interrupt().selectAll("*").interrupt(),E)I[0]=m[0]-I[0],I[1]=n[0]-I[1];else if(C){var M=+/w$/.test(C),C=+/^n/.test(C);x=[m[1-M]-I[0],n[1-C]-I[1]];I[0]=m[M];I[1]=n[C]}else p.event.altKey&&(u=I.slice());D.style("pointer-events",
"none").selectAll(".resize").style("display",null);p.select("body").style("cursor",z.style("cursor"));B({type:"brushstart"});t()}var f,g,h=F(a,"brushstart","brush","brushend"),k=null,l=null,m=[0,0],n=[0,0],q=!0,r=!0,t=Td[0];return a.event=function(a){a.each(function(){var a=h.of(this,arguments),b={x:m,y:n,i:f,j:g},c=this.__chart__||b;this.__chart__=b;qb?p.select(this).transition().each("start.brush",function(){f=c.i;g=c.j;m=c.x;n=c.y;a({type:"brushstart"})}).tween("brush:brush",function(){var c=sc(m,
b.x),d=sc(n,b.y);return f=g=null,function(e){m=b.x=c(e);n=b.y=d(e);a({type:"brush",mode:"resize"})}}).each("end.brush",function(){f=b.i;g=b.j;a({type:"brush",mode:"resize"});a({type:"brushend"})}):(a({type:"brushstart"}),a({type:"brush",mode:"resize"}),a({type:"brushend"}))})},a.x=function(b){return arguments.length?(k=b,t=Td[!k<<1|!l],a):k},a.y=function(b){return arguments.length?(l=b,t=Td[!k<<1|!l],a):l},a.clamp=function(b){return arguments.length?(k&&l?(q=!!b[0],r=!!b[1]):k?q=!!b:l&&(r=!!b),a):
k&&l?[q,r]:k?q:l?r:null},a.extent=function(b){var c,d,e,h,q;return arguments.length?(k&&(c=b[0],d=b[1],l&&(c=c[0],d=d[0]),f=[c,d],k.invert&&(c=k(c),d=k(d)),c>d&&(q=c,c=d,d=q),(c!=m[0]||d!=m[1])&&(m=[c,d])),l&&(e=b[0],h=b[1],k&&(e=e[1],h=h[1]),g=[e,h],l.invert&&(e=l(e),h=l(h)),e>h&&(q=e,e=h,h=q),(e!=n[0]||h!=n[1])&&(n=[e,h])),a):(k&&(f?(c=f[0],d=f[1]):(c=m[0],d=m[1],k.invert&&(c=k.invert(c),d=k.invert(d)),c>d&&(q=c,c=d,d=q))),l&&(g?(e=g[0],h=g[1]):(e=n[0],h=n[1],l.invert&&(e=l.invert(e),h=l.invert(h)),
e>h&&(q=e,e=h,h=q))),k&&l?[[c,e],[d,h]]:k?[c,d]:l&&[e,h])},a.clear=function(){return a.empty()||(m=[0,0],n=[0,0],f=g=null),a},a.empty=function(){return!!k&&m[0]==m[1]||!!l&&n[0]==n[1]},p.rebind(a,h,"on")};var vi={n:"ns-resize",e:"ew-resize",s:"ns-resize",w:"ew-resize",nw:"nwse-resize",ne:"nesw-resize",se:"nwse-resize",sw:"nesw-resize"},Td=["n e s w nw ne se sw".split(" "),["e","w"],["n","s"],[]],Ud=P.format=ag.timeFormat,mg=Ud.utc,ng=mg("%Y-%m-%dT%H:%M:%S.%LZ");Ud.iso=Date.prototype.toISOString&&
+new Date("2000-01-01T00:00:00.000Z")?Md:ng;Md.parse=function(a){a=new Date(a);return isNaN(a)?null:a};Md.toString=ng.toString;P.second=ib(function(a){return new Aa(1E3*Math.floor(a/1E3))},function(a,b){a.setTime(a.getTime()+1E3*Math.floor(b))},function(a){return a.getSeconds()});P.seconds=P.second.range;P.seconds.utc=P.second.utc.range;P.minute=ib(function(a){return new Aa(6E4*Math.floor(a/6E4))},function(a,b){a.setTime(a.getTime()+6E4*Math.floor(b))},function(a){return a.getMinutes()});P.minutes=
P.minute.range;P.minutes.utc=P.minute.utc.range;P.hour=ib(function(a){var b=a.getTimezoneOffset()/60;return new Aa(36E5*(Math.floor(a/36E5-b)+b))},function(a,b){a.setTime(a.getTime()+36E5*Math.floor(b))},function(a){return a.getHours()});P.hours=P.hour.range;P.hours.utc=P.hour.utc.range;P.month=ib(function(a){return a=P.day(a),a.setDate(1),a},function(a,b){a.setMonth(a.getMonth()+b)},function(a){return a.getMonth()});P.months=P.month.range;P.months.utc=P.month.utc.range;var zc=[1E3,5E3,15E3,3E4,6E4,
3E5,9E5,18E5,36E5,108E5,216E5,432E5,864E5,1728E5,6048E5,2592E6,7776E6,31536E6],Vd=[[P.second,1],[P.second,5],[P.second,15],[P.second,30],[P.minute,1],[P.minute,5],[P.minute,15],[P.minute,30],[P.hour,1],[P.hour,3],[P.hour,6],[P.hour,12],[P.day,1],[P.day,2],[P.week,1],[P.month,1],[P.month,3],[P.year,1]],wi=Ud.multi([[".%L",function(a){return a.getMilliseconds()}],[":%S",function(a){return a.getSeconds()}],["%I:%M",function(a){return a.getMinutes()}],["%I %p",function(a){return a.getHours()}],["%a %d",
function(a){return a.getDay()&&1!=a.getDate()}],["%b %d",function(a){return 1!=a.getDate()}],["%B",function(a){return a.getMonth()}],["%Y",ub]]),Xh={range:function(a,b,c){return p.range(Math.ceil(a/c)*c,+b,c).map(pb)},floor:va,ceil:va};Vd.year=P.year;P.scale=function(){return Nd(p.scale.linear(),Vd,wi)};var og=Vd.map(function(a){return[a[0].utc,a[1]]}),xi=mg.multi([[".%L",function(a){return a.getUTCMilliseconds()}],[":%S",function(a){return a.getUTCSeconds()}],["%I:%M",function(a){return a.getUTCMinutes()}],
["%I %p",function(a){return a.getUTCHours()}],["%a %d",function(a){return a.getUTCDay()&&1!=a.getUTCDate()}],["%b %d",function(a){return 1!=a.getUTCDate()}],["%B",function(a){return a.getUTCMonth()}],["%Y",ub]]);og.year=P.year.utc;P.scale.utc=function(){return Nd(p.scale.linear(),og,xi)};p.text=$c(function(a){return a.responseText});p.json=function(a,b){return Wb(a,"application/json",Yh,b)};p.html=function(a,b){return Wb(a,"text/html",Zh,b)};p.xml=$c(function(a){return a.responseXML});"function"==
typeof define&&define.amd?define(p):"object"==typeof module&&module.exports?module.exports=p:this.d3=p}();"use strict";
tv.exportTo("tv.b.ui",function(){function e(a,c){var e=tv.b.ui.getColorIdForGeneralPurposeString(a);c&&(e+=b);return tv.b.ui.getColorPalette()[e]}var c=document.currentScript.ownerDocument,b=tv.b.ui.getColorPaletteHighlightIdBoost(),a=tv.b.ui.define("svg",void 0,"http://www.w3.org/2000/svg");a.prototype={__proto__:HTMLUnknownElement.prototype,decorate:function(){this.classList.add("chart-base");this.seriesKeys_=this.data_=this.chartTitle_=void 0;this.width_=400;this.height_=300;for(var a=c.querySelector("#chart-base-template").content.querySelector("svg"),
b=0;b<a.children.length;b++)this.appendChild(a.children[b].cloneNode(!0));Object.defineProperty(this,"width",{get:function(){return this.width_},set:function(a){this.width_=a;this.updateContents_()}});Object.defineProperty(this,"height",{get:function(){return this.height_},set:function(a){this.height_=a;this.updateContents_()}})},get chartTitle(){return chartTitle_},set chartTitle(a){this.chartTitle_=a;this.updateContents_()},get chartAreaElement(){return this.querySelector("#chart-area")},get data(){return this.data_},
setSize:function(a){this.width_=a.width;this.height_=a.height;this.updateContents_()},get margin(){var a={top:20,right:20,bottom:30,left:50};this.chartTitle_&&(a.top+=20);return a},get chartAreaSize(){var a=this.margin;return{width:this.width_-a.left-a.right,height:this.height_-a.top-a.bottom}},getLegendKeys_:function(){throw Error("Not implemented");},updateScales_:function(a,b){throw Error("Not implemented");},updateContents_:function(){var a=this.margin,b=this.chartAreaSize.width,c=this.chartAreaSize.height,
e=d3.select(this);e.attr("width",this.width_);e.attr("height",this.height_);e=d3.select(this.chartAreaElement);e.attr("transform","translate("+a.left+","+a.top+")");this.updateScales_(b,c);if(this.xScale_&&this.yScale_){var a=d3.svg.axis().scale(this.xScale_).orient("bottom"),k=d3.svg.axis().scale(this.yScale_).orient("left");e.select(".x.axis").attr("transform","translate(0,"+c+")").call(a);e.select(".y.axis").call(k)}c=e.select("#title");this.chartTitle_?c.attr("transform","translate("+0.5*b+",-5)").style("display",
void 0).style("text-anchor","middle").attr("class","title").attr("width",b).text(this.chartTitle_):c.style("display","none");this.updateLegend_()},updateLegend_:function(){var a=this.getLegendKeys_();if(void 0!==a){var b=d3.select(this.chartAreaElement),c=this.chartAreaSize,a=b.selectAll(".legend").data(a.slice().reverse());a.enter().append("g").attr("class","legend").attr("transform",function(a,b){return"translate(0,"+20*b+")"}).append("text").text(function(a){return a});a.exit().remove();a.attr("x",
c.width-18).attr("width",18).attr("height",18).style("fill",function(a){return e(a,this.currentHighlightedLegendKey===a)}.bind(this));a.selectAll("text").attr("x",c.width-24).attr("y",9).attr("dy",".35em").style("text-anchor","end").text(function(a){return a})}},get highlightedLegendKey(){return this.highlightedLegendKey_},set highlightedLegendKey(a){this.highlightedLegendKey_=a;this.updateHighlight_()},get currentHighlightedLegendKey(){return this.tempHighlightedLegendKey_?this.tempHighlightedLegendKey_:
this.highlightedLegendKey_},pushTempHighlightedLegendKey:function(a){if(this.tempHighlightedLegendKey_)throw Error("push cannot nest");this.tempHighlightedLegendKey_=a;this.updateHighlight_()},popTempHighlightedLegendKey:function(a){if(this.tempHighlightedLegendKey_!=a)throw Error("pop cannot happen");this.tempHighlightedLegendKey_=void 0;this.updateHighlight_()},updateHighlight_:function(){var a=this;d3.select(this.chartAreaElement).selectAll(".legend").each(function(b){var c=b==a.currentHighlightedLegendKey;
b=e(b,c);this.style.fill=b;this.style.fontWeight=c?"bold":""})}};return{getColorOfKey:e,ChartBase:a}});"use strict";
tv.exportTo("tv.b.ui",function(){function e(a,b,c){var e;c?(c=Math.max(b-1,0),e=b):(c=b,e=Math.min(b+1,a.length-1));return 0.5*(a[b].x-a[c].x)+0.5*(a[e].x-a[b].x)}var c=tv.b.ui.ChartBase,b=tv.b.ui.getColorOfKey,a=tv.b.ui.define("line-chart",c);a.prototype={__proto__:c.prototype,decorate:function(){c.prototype.decorate.call(this);this.classList.add("line-chart");this.brushedRange_=new tv.b.Range;this.xScale_=d3.scale.linear();this.yScale_=d3.scale.linear();d3.select(this.chartAreaElement).append("g").attr("id",
"brushes");d3.select(this.chartAreaElement).append("g").attr("id","series");this.addEventListener("mousedown",this.onMouseDown_.bind(this))},set data(a){if(0==a.length)throw Error("Data must be nonzero. Pass undefined.");var b;if(void 0!==a){if(void 0===a[0].x)throw Error('Elements must have "x" fields');b=d3.keys(a[0]);b.splice(b.indexOf("x"),1);if(0==b.length)throw Error("Elements must have at least one other field than X");}else b=void 0;this.data_=a;this.seriesKeys_=b;this.updateContents_()},
set brushedRange(a){this.brushedRange_.reset();this.brushedRange_.addRange(a);this.updateContents_()},computeBrushRangeFromIndices:function(a,b){var c=new tv.b.Range,g=Math.min(a,b),k=Math.max(a,b),g=Math.max(0,g),k=Math.min(this.data_.length-1,k);c.addValue(this.data_[g].x-e(this.data_,g,!0));c.addValue(this.data_[k].x+e(this.data_,k,!1));return c},getLegendKeys_:function(){return this.seriesKeys_&&1<this.seriesKeys_.length?this.seriesKeys_.slice():[]},updateScales_:function(a,b){if(void 0!==this.data_){this.xScale_.range([0,
a]);this.xScale_.domain(d3.extent(this.data_,function(a){return a.x}));var c=new tv.b.Range;this.data_.forEach(function(a){this.seriesKeys_.forEach(function(b){c.addValue(a[b])})},this);this.yScale_.range([b,0]);this.yScale_.domain([c.min,c.max])}},updateContents_:function(){c.prototype.updateContents_.call(this);if(this.data_){var a=d3.select(this.chartAreaElement),d=this.brushedRange_.isEmpty?[]:[this.brushedRange_],d=a.select("#brushes").selectAll("rect").data(d);d.enter().append("rect");d.exit().remove();
d.attr("x",function(a){return this.xScale_(a.min)}.bind(this)).attr("y",0).attr("width",function(a){return this.xScale_(a.max)-this.xScale_(a.min)}.bind(this)).attr("height",this.chartAreaSize.height);a=a.select("#series").selectAll("path").data(this.seriesKeys_);a.enter().append("path").attr("class","line").style("stroke",function(a){return b(a)}).attr("d",function(a){return d3.svg.line().x(function(a){return this.xScale_(a.x)}.bind(this)).y(function(b){return this.yScale_(b[a])}.bind(this))(this.data_)}.bind(this));
a.exit().remove()}},getDataIndexAtClientPoint_:function(a,b,c){var e=this.getBoundingClientRect(),k=this.margin,l=this.chartAreaSize;b=b-e.top-k.top;if(!c||!(0>b||b>=l.height)){a=this.xScale_.invert(a-e.left-k.left);var m;this.data_&&(m=d3.bisector(function(a){return a.x}).right,m=m(this.data_,a)-1);return m}},onMouseDown_:function(a){var b=this.getDataIndexAtClientPoint_(a.clientX,a.clientY,!0);void 0!==b&&tv.b.ui.trackMouseMovesUntilMouseUp(this.onMouseMove_.bind(this,a.button),this.onMouseUp_.bind(this,
a.button));a.preventDefault();a.stopPropagation();var c=new Event("item-mousedown");c.data=this.data_[b];c.index=b;c.buttons=a.buttons;this.dispatchEvent(c)},onMouseMove_:function(a,b){var c=this.getDataIndexAtClientPoint_(b.clientX,b.clientY,!1);void 0!==b.buttons&&(b.preventDefault(),b.stopPropagation());var e=new Event("item-mousemove");e.data=this.data_[c];e.index=c;e.button=a;this.dispatchEvent(e)},onMouseUp_:function(a,b){var c=this.getDataIndexAtClientPoint_(b.clientX,b.clientY,!1);b.preventDefault();
b.stopPropagation();var e=new Event("item-mouseup");e.data=this.data_[c];e.index=c;e.button=a;this.dispatchEvent(e)}};return{LineChart:a}});"use strict";
Polymer("tv-e-analysis-side-panel-alerts",{ready:function(){this.rangeOfInterest_=new tv.b.Range;this.selection_=void 0},get model(){return this.model_},set model(e){this.model_=e;this.updateContents_()},set selection(e){},set rangeOfInterest(e){},selectAlertsOfType:function(e){var c=this.model_.alerts.filter(function(a){return a.title===e}),b=new tv.c.RequestSelectionChangeEvent;b.selection=new tv.c.Selection(c);this.dispatchEvent(b)},alertsByType_:function(e){var c={};e.forEach(function(b){var a=
b.type.title;c[a]||(c[a]=[]);c[a].push(b)});return c},alertsTableRows_:function(e){return Object.keys(e).map(function(c){return{alertType:c,count:e[c].length}})},alertsTableColumns_:function(){return[{title:"Alert type",value:function(e){return e.alertType},width:"180px"},{title:"Count",width:"100%",value:function(e){return e.count}}]},createAlertsTable_:function(e){e=this.alertsByType_(e);var c=document.createElement("tracing-analysis-nested-table");c.tableColumns=this.alertsTableColumns_();c.tableRows=
this.alertsTableRows_(e);c.rowClickCallback=function(b){this.selectAlertsOfType(b.target.parentElement.firstChild.innerText)}.bind(this);return c},updateContents_:function(){this.$.result_area.textContent="";if(void 0!==this.model_){var e=this.createAlertsTable_(this.model_.alerts);this.$.result_area.appendChild(e)}},supportsModel:function(e){return void 0==e?{supported:!1,reason:"Unknown tracing model"}:{supported:!0}},textLabel:"Alerts"});"use strict";
tv.exportTo("tv.c.trace_model",function(){function e(b){tv.c.trace_model.TimedEvent.call(this);this.threadTimeRanges=b;this.start=c.min(b,function(a){return a.start});this.end=c.max(b,function(a){return a.end});this.totalDuration=c.sum(b,function(a){return a.end-a.start})}var c=tv.b.Statistics;e.prototype={__proto__:tv.c.trace_model.Event.prototype,shiftTimestampsForward:function(b){this.start+=b;this.end+=b;for(var a=1;a<this.threadTimeRanges.length;a++)this.threadTimeRanges[a].start+=b,this.threadTimeRanges[a].end+=
b},addBoundsToRange:function(b){b.addValue(this.start);b.addValue(this.end)}};return{Frame:e}});"use strict";
tv.exportTo("tv.e.audits",function(){return{mergeEvents:function(e,c,b,a,f){function d(){n.push(l[0]);l.splice(0,1);q=k(n[0])}function h(){0!=n.length&&(m.push(b(n)),n=[],0!=l.length&&d())}var g=a,k=f;g||(g=function(a){return a.start});k||(k=function(a){return a.end});var l=e.slice();l.sort(function(a,b){return g(a)-g(b)});if(1>=l.length)return c=[],1==l.length&&c.push(b(l)),c;var m=[],n=[],q;for(d();l.length;)e=l[0],g(e)-q<c?(q=Math.max(q,k(e)),l.splice(0,1),n.push(e)):h();h();return m}}});"use strict";
tv.exportTo("tv.e.audits",function(){function e(a){if(!a)return[];var b=[];a.sliceGroup.slices.forEach(function(a){("obtainView"==a.title||"setupListItem"==a.title||"deliverInputEvent"==a.title)&&b.push(a)});a.asyncSliceGroup.slices.forEach(function(a){"deliverInputEvent"==a.title&&b.push(a)});return tv.e.audits.mergeEvents(b,3,function(a){return{start:a[0].start,end:a[a.length-1].end}})}function c(a,b){var c=tv.b.findClosestIntervalInSortedIntervals(b,function(a){return a.start},function(a){return a.end},
a,3);return c?c.start:a}function b(a){if(!a.uiThread)return[];var b=e(a.uiThread),d=[];a.uiThread.sliceGroup.getSlicesOfName(k).forEach(function(e){var f=[],h={thread:a.uiThread,start:c(e.start,b),end:e.end};f.push(h);a:{var k=a.renderThread;e=e.end;if(k)for(var k=k.sliceGroup.slices,m=0;m<k.length;m++){var B=k[m];if(B.title==l&&B.start<=e&&e<=B.end){e=B;break a}}e=void 0}if(e){if(k=e.findDescendentSlice(n))h.end=Math.min(h.end,k.start);f.push({thread:a.renderThread,start:e.start,end:e.end})}d.push(new g(f))});
return d}function a(a){if(!a.renderThread)return[];var b=[];a.renderThread.sliceGroup.getSlicesOfName(m).forEach(function(c){b.push(new g([{thread:a.renderThread,start:c.start,end:c.end}]))});return b}function f(a){var b=void 0,c;for(c in a.counters)if(/^android\.aq\:pending/.test(c)&&1==a.counters[c].numSeries){b=a.counters[c].series[0].samples;break}if(!b)return[];var d=[],e=0;b.forEach(function(a){a.value>e&&d.push(a);e=a.value});return d}function d(a){if(!a)return[];var b=[];a.asyncSliceGroup.iterateAllEvents(function(a){/^animator\:/.test(a.title)&&
b.push(a)});return b}function h(a,b,c){this.process=a;this.uiThread=b;this.renderThread=c;this.inputs_=this.frames_=void 0}var g=tv.c.trace_model.Frame,k="performTraversals",l="DrawFrame",m="doFrame",n="syncFrameState";h.createForProcessIfPossible=function(a){var b=a.getThread(a.pid),c;if(c=b){a:{c=b.sliceGroup.slices;for(var d=0;d<c.length;d++)if(c[d].title==k){c=b;break a}c=void 0}c=!c}c&&(b=void 0);c=a.findAllThreadsNamed("RenderThread");c=1==c.length?c[0]:void 0;if(b||c)return new h(a,b,c)};h.prototype=
{getFrames:function(){if(!this.frames_){var c=b(this),d=a(this);this.frames_=c.concat(d);this.frames_.sort(function(a,b){a.end-b.end})}return this.frames_},getInputSamples:function(){this.inputs_||(this.inputs_=f(this.process));return this.inputs_},getAnimationAsyncSlices:function(){this.animations_||(this.animations_=d(this.uiThread));return this.animations_}};return{AndroidApp:h}});"use strict";
tv.exportTo("tv.e.audits",function(){function e(a,b){var c=a.counters[b];c||(c=a.counters[d]);if(c&&1==c.numSeries&&1<c.numSamples)return c.series[0].timestamps}function c(b,c){this.process=b;this.thread=c;this.sfVsync_=this.appVsync_=void 0;this.appVsyncTimestamps_=e(b,f);this.sfVsyncTimestamps_=e(b,a)}var b=tv.b.findLowIndexInSortedArray,a="android.VSYNC-sf",f="android.VSYNC-app",d="android.VSYNC";c.createForProcessIfPossible=function(a){var b=a.getThread(a.pid);if(b&&b.name&&/surfaceflinger/.test(b.name))return new c(a,
b);b=a.findAllThreadsNamed("SurfaceFlinger");if(1==b.length)return new c(a,b[0])};c.prototype={get hasVsyncs(){return!!this.appVsyncTimestamps_&&!!this.sfVsyncTimestamps_},getFrameKickoff:function(a){if(!this.hasVsyncs)throw Error("cannot query vsync info without vsyncs");a=b(this.appVsyncTimestamps_,function(a){return a},a);return 1>a?void 0:this.appVsyncTimestamps_[a-1]},getFrameDeadline:function(a){if(!this.hasVsyncs)throw Error("cannot query vsync info without vsyncs");a=b(this.sfVsyncTimestamps_,
function(a){return a},a);return a>=this.sfVsyncTimestamps_.length?void 0:this.sfVsyncTimestamps_[a]}};return{AndroidSurfaceFlinger:c}});"use strict";
tv.exportTo("tv.e.audits",function(){function e(a,b,c){a&&a.sliceGroup.slices.forEach(function(a){a.title in b&&c(a)})}function c(c){this.model=c;this.apps=[];this.surfaceFlinger=void 0;c.getAllProcesses().forEach(function(c){var d=b.createForProcessIfPossible(c);if(d)this.apps.push(d);else if(c=a.createForProcessIfPossible(c))this.surfaceFlinger=c},this)}var b=tv.e.audits.AndroidApp,a=tv.e.audits.AndroidSurfaceFlinger,f={doComposition:!0,updateTexImage:!0,postFramebuffer:!0},d={performTraversals:!0,
deliverInputEvent:!0},h={doFrame:!0};c.prototype={iterateImportantSlices:function(a){this.surfaceFlinger&&e(this.surfaceFlinger.thread,f,a);this.apps.forEach(function(b){e(b.uiThread,d,a);e(b.renderThread,h,a)})}};return{AndroidModelHelper:c}});"use strict";
tv.exportTo("tv.e.audits",function(){function e(a){this.model=a;a=new b(a);if(a.apps.length||a.surfaceFlinger)this.helper=a}var c=tv.c.Auditor,b=tv.e.audits.AndroidModelHelper;e.prototype={__proto__:c.prototype,renameAndSort_:function(){this.model.getAllProcesses().forEach(function(a){if(this.helper.surfaceFlinger&&a==this.helper.surfaceFlinger.process)a.name||(a.name="SurfaceFlinger"),a.sortIndex=Number.NEGATIVE_INFINITY;else{var b=a.getThread(a.pid);!a.name&&(b&&b.name)&&(/^ndroid\./.test(b.name)&&
(b.name="a"+b.name),a.name=b.name);a.sortIndex=0;for(var c in a.threads)a.sortIndex-=a.threads[c].sliceGroup.slices.length}},this);this.model.getAllThreads().forEach(function(a){a.tid==a.parent.pid&&(a.sortIndex=-3);"RenderThread"==a.name&&(a.sortIndex=-2);/^hwuiTask/.test(a.name)&&(a.sortIndex=-1)})},pushFramesAndJudgeJank_:function(){var a=0,b=0;this.helper.apps.forEach(function(c){c.process.frames=c.getFrames();c.process.frames.forEach(function(b){16.67<b.totalDuration&&a++});b+=c.process.frames.length});
if(b){var c=a/b;this.model.faviconHue=0.3<c?"red":0.05<c?"yellow":"green"}},runAnnotate:function(){this.helper&&(this.renameAndSort_(),this.pushFramesAndJudgeJank_(),this.helper.iterateImportantSlices(function(a){a.important=!0}))},runAudit:function(){this.helper&&(this.helper.apps.forEach(function(a){a.getFrames().forEach(this.getFrameTimingAlerts,this);this.addSaveLayerAlerts(a.renderThread)},this),this.addRenderingInteractionRecords(),this.addInputInteractionRecords())},getFrameTimingAlerts:function(a){if(16.67<
a.totalDuration){var b=new tv.c.trace_model.AlertType("Long frame","Frames should take fewer than16.67ms to ensure smooth performance.",tv.c.trace_model.ALERT_SEVERITY.WARNING);a=new tv.c.trace_model.Alert(b,a.start,{totalDuration:a.totalDuration});this.model.alerts.push(a)}},addSaveLayerAlerts:function(a){if(a){var b=/caused (unclipped )?saveLayer (\d+)x(\d+)/;a.sliceGroup.slices.forEach(function(a){var c=b.exec(a.title);if(c){var e=new tv.c.trace_model.AlertType("Inefficient Alpha","http://developer.android.com/reference/android/view/View.html#setAlpha(float)",
tv.c.trace_model.ALERT_SEVERITY.CRITICAL),c={width:parseInt(c[2]),height:parseInt(c[3])};a=new tv.c.trace_model.Alert(e,a.start,c);this.model.alerts.push(a)}},this)}},addRenderingInteractionRecords:function(){var a=[];this.helper.apps.forEach(function(b){a.push.apply(a,b.getAnimationAsyncSlices());a.push.apply(a,b.getFrames())});var b=function(a){a=new tv.c.trace_model.InteractionRecord("Rendering",tv.b.ui.getColorIdForGeneralPurposeString("mt_rendering"),a[0].start,a[a.length-1].end-a[0].start);
this.model.addInteractionRecord(a)}.bind(this);tv.e.audits.mergeEvents(a,30,b)},addInputInteractionRecords:function(){var a=[];this.helper.apps.forEach(function(b){a.push.apply(a,b.getInputSamples())});var b=function(a){a=new tv.c.trace_model.InteractionRecord("Input",tv.b.ui.getColorIdForGeneralPurposeString("mt_input"),a[0].timestamp,a[a.length-1].timestamp-a[0].timestamp);this.model.addInteractionRecord(a)}.bind(this),c=function(a){return a.timestamp};tv.e.audits.mergeEvents(a,30,b,c,c)}};c.register(e);
return{AndroidAuditor:e}});

</script>
