<html>
  <head>
    <title>Results of Cluster Telemetry Tryserver Run</title>
    {% include "column_threshold_css.html" %}
  </head>

  <body>
    <h2>Results of Cluster Telemetry Tryserver Run</h2>
    Run requester: {{ requester_email }}
    <br/>
    Run description: {{ description }}
    <br/>
    This report was created on {{ html_report_date }}
    <br/>
    <br/>
    The run was done on {{ target_platform }} workers using the {{ pageset_type }} page set
    <br/>
    The run was done using Chromium commit hash <a href='https://chromium.googlesource.com/chromium/src/+show/{{ chromium_hash }}'>{{ chromium_hash|slice:":7" }}</a> and Skia commit hash <a href='https://skia.googlesource.com/skia/+show/{{ skia_hash }}'>{{ skia_hash|slice:":7" }}</a>
    <br/>
    The specified patch(es) are: <a href='{{ chromium_patch_link }}'>Chromium</a>/<a href='{{ skia_patch_link }}'>Skia</a> (if no patch is specified the page will be empty)
    <br/>
    Browser arguments for the nopatch run: "{{ browser_args_nopatch }}"
    <br/>
    Browser arguments for the withpatch run: "{{ browser_args_withpatch }}"
    <br/>
    <br/>
    The raw CSVs used to create the below tables are here: <a href='{{ raw_csv_nopatch }}'>nopatch</a>/<a href='{{ raw_csv_withpatch }}'>withpatch</a>
    <br/>
    Read <a href="https://docs.google.com/a/chromium.org/document/d/1GhqosQcwsy6F-eBAmFn_ITDF7_Iv_rY9FhCKwAnk9qQ/edit?pli=1#heading=h.lgvqzgu7bc4d">this</a> for an explanation of CT's accuracy of results.
    <br/>
    {% if crashed_instances %}
      <br/><b>Note:</b> The following workers are down and their results are missing from the report: <b>{{ crashed_instances }}</b><br/>
    {% endif %}
    {% if missing_devices %}
      <br/><b>Note:</b> Android devices in the following workers are down and their results are missing from the report: <b>{{ missing_devices }}</b><br/>
    {% endif %}
    {% if missing_output_workers %}
      <br/><b>Note:</b> The following workers failed to report their results:
          {% for missing_output_worker in missing_output_workers %}
            <a href="{{ logs_link_prefix }}{{ missing_output_worker }}">task{{ missing_output_worker }}</a>
          {% endfor %}
      <br/>
    {% endif %}
    <br/>
    Each pageset was repeated: {{ num_repeated }} time{% if num_repeated > 1 %}s{% endif %}
    <br/>
    Percentage difference threshold used: {{ threshold }}%
    <br/>
    Outliers discarded from top and bottom: {{ discard_outliers }}%
    <br/>
    Fieldnames displayed only if they were outputted by minimum {{ min_webpages }} webpages.
    <br/><br/>
    Click on a fieldname to see the webpages breakdown.
    <br/><br/><br/>

    {% if sorted_fieldnames_totals_items %}
    <table border="1" cellpadding="5">
      <tr bgcolor="#CCCCFF">
        <th>Fieldname</th>
        <th>#Webpages</th>
        <th>Total</th>
        <th>Total with Patch</th>
        <th>Percentage Change</th>
        <th>Percentage Difference</th>
      </tr>
      {% for fieldname, fieldname_values in sorted_fieldnames_totals_items %}
        <tr>
          <td><a href='{{ absolute_url }}fieldname{{ forloop.counter }}.html'>{{ fieldname }}</a></td>
          <td>{{ fieldname_values.total_webpages_reported }}</td>
          <td>{{ fieldname_values.value1|floatformat:"-3" }}</td>
          <td>{{ fieldname_values.value2|floatformat:"-3" }}</td>
          <td {% if fieldname_values.perc_diff <= 0 %}class="belowthreshold"{% else %}class="abovethreshold"{% endif %} >{{ fieldname_values.perc_change|floatformat:"-3" }}%</td>
          <td {% if fieldname_values.perc_diff <= 0 %}class="belowthreshold"{% else %}class="abovethreshold"{% endif %} >{{ fieldname_values.perc_diff|floatformat:"-3" }}%</td>
        </tr>
      {% endfor %}
    </table>
    {% else %}
      <h4>No results. It is very likely something went wrong with this run. Please contact rmistry@.</h4>
    {% endif %}
  </body>
</html>
