<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[242961] trunk/PerformanceTests</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/242961">242961</a></dd>
<dt>Author</dt> <dd>jond@apple.com</dd>
<dt>Date</dt> <dd>2019-03-14 13:46:04 -0700 (Thu, 14 Mar 2019)</dd>
</dl>

<h3>Log Message</h3>
<pre>Implement a new design for JetStream2
https://bugs.webkit.org/show_bug.cgi?id=195492

Reviewed by Saam Barati.

* JetStream2/JetStream.css:
(html):
(body):
(::selection):
(main):
(.logo):
(.logo .logo-image):
(#jetstreams):
(#jetstreams svg):
(.summary):
(.summary + .summary):
(.summary:empty):
(article, .summary):
(h1):
(h2, h3, h4, h5, h6):
(h4, h5, h6):
(p):
(h5, h6):
(h6):
(a:link,):
(a:hover,):
(#status):
(#status label,):
(a.button):
(#status.loading):
(#status.error):
(.error h2, .error p):
(.error h2):
(#result-summary):
(#result-summary label):
(#result-summary .score):
(#result-summary .score .interval):
(#results):
(.benchmark):
(.benchmark h3, .benchmark h4, .benchmark .result, .benchmark label):
(.benchmark-running h4, .benchmark-running .result, .benchmark-running label):
(.benchmark-done h3, .benchmark-done h4, .benchmark-done .result, .benchmark-done label):
(.benchmark h3):
(.benchmark-running h3):
(.benchmark-done h3):
(.benchmark h3 a,):
(.benchmark-done h3 a:hover):
(.benchmark h4):
(.benchmark-done h4):
(.benchmark p,):
(.benchmark .result):
(.benchmark-done .result):
(.benchmark label):
(.benchmark-done label):
(@keyframes fadein):
(to):
(@keyframes scaledown):
(@keyframes shine):
(100%):
(@keyframes swingin):
(@media (max-width: 415px)):
(#logo): Deleted.
(p.summary): Deleted.
(p.summary + p.summary): Deleted.
(p.summary:empty): Deleted.
(p:first-of-type): Deleted.
(#status a:link): Deleted.
(.interval): Deleted.
(a:link, a:visited): Deleted.
(a:link:hover): Deleted.
(table): Deleted.
(td, th): Deleted.
(th): Deleted.
(tr:first-child > th:nth-child(even)): Deleted.
(tr:nth-child(even):not(:first-child, .benchmark-running)): Deleted.
(.result): Deleted.
(.benchmark-running): Deleted.
(:not(.benchmark-running) .result): Deleted.
(.benchmark-running .result): Deleted.
(.benchmark-name): Deleted.
(.result.category,): Deleted.
(.benchmark-name:not(.category):not(.geometric-mean)): Deleted.
(.geometric-mean): Deleted.
(.benchmark-name:not(:first-child)): Deleted.
(.benchmark-name a:link,): Deleted.
(.highlighted-result): Deleted.
* JetStream2/JetStream2Logo.svg: Added.
* JetStream2/JetStreamDriver.js:
(updateUI):
(Driver.prototype.async.start):
(Driver.prototype.prepareToRun.text.div.id.string_appeared_here.h3):
(Driver.prototype.prepareToRun.text.span):
(Driver.prototype.prepareToRun.a.h3.h4):
(Driver.prototype.prepareToRun.text.div):
(Driver.prototype.async.initialize):
(Driver.prototype.async.fetchResources.prototype.statusElement.onclick):
(prototype.fetchResources):
(prototype.updateUIBeforeRun):
(prototype.updateUIAfterRun):
(Driver.prototype.async.fetchResources.statusElement.innerHTML.a.href.string_appeared_here):
(Driver.prototype.async.fetchResources):
(Driver.prototype.prepareToRun.text.tr.id.string_appeared_here.FIXME.link.to.benchmark.explanation.td): Deleted.
* JetStream2/clouds.svg: Added.
* JetStream2/in-depth.html:
* JetStream2/index.html:
* JetStream2/jetstreams.svg: Added.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkPerformanceTestsChangeLog">trunk/PerformanceTests/ChangeLog</a></li>
<li><a href="#trunkPerformanceTestsJetStream2JetStreamcss">trunk/PerformanceTests/JetStream2/JetStream.css</a></li>
<li><a href="#trunkPerformanceTestsJetStream2JetStreamDriverjs">trunk/PerformanceTests/JetStream2/JetStreamDriver.js</a></li>
<li><a href="#trunkPerformanceTestsJetStream2indepthhtml">trunk/PerformanceTests/JetStream2/in-depth.html</a></li>
<li><a href="#trunkPerformanceTestsJetStream2indexhtml">trunk/PerformanceTests/JetStream2/index.html</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkPerformanceTestsJetStream2JetStream2Logosvg">trunk/PerformanceTests/JetStream2/JetStream2Logo.svg</a></li>
<li><a href="#trunkPerformanceTestsJetStream2cloudssvg">trunk/PerformanceTests/JetStream2/clouds.svg</a></li>
<li><a href="#trunkPerformanceTestsJetStream2jetstreamssvg">trunk/PerformanceTests/JetStream2/jetstreams.svg</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkPerformanceTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/PerformanceTests/ChangeLog (242960 => 242961)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/ChangeLog 2019-03-14 20:40:09 UTC (rev 242960)
+++ trunk/PerformanceTests/ChangeLog    2019-03-14 20:46:04 UTC (rev 242961)
</span><span class="lines">@@ -1,3 +1,112 @@
</span><ins>+2019-03-14  Jon Davis  <jond@apple.com>
+
+        Implement a new design for JetStream2
+        https://bugs.webkit.org/show_bug.cgi?id=195492
+
+        Reviewed by Saam Barati.
+
+        * JetStream2/JetStream.css:
+        (html):
+        (body):
+        (::selection):
+        (main):
+        (.logo):
+        (.logo .logo-image):
+        (#jetstreams):
+        (#jetstreams svg):
+        (.summary):
+        (.summary + .summary):
+        (.summary:empty):
+        (article, .summary):
+        (h1):
+        (h2, h3, h4, h5, h6):
+        (h4, h5, h6):
+        (p):
+        (h5, h6):
+        (h6):
+        (a:link,):
+        (a:hover,):
+        (#status):
+        (#status label,):
+        (a.button):
+        (#status.loading):
+        (#status.error):
+        (.error h2, .error p):
+        (.error h2):
+        (#result-summary):
+        (#result-summary label):
+        (#result-summary .score):
+        (#result-summary .score .interval):
+        (#results):
+        (.benchmark):
+        (.benchmark h3, .benchmark h4, .benchmark .result, .benchmark label):
+        (.benchmark-running h4, .benchmark-running .result, .benchmark-running label):
+        (.benchmark-done h3, .benchmark-done h4, .benchmark-done .result, .benchmark-done label):
+        (.benchmark h3):
+        (.benchmark-running h3):
+        (.benchmark-done h3):
+        (.benchmark h3 a,):
+        (.benchmark-done h3 a:hover):
+        (.benchmark h4):
+        (.benchmark-done h4):
+        (.benchmark p,):
+        (.benchmark .result):
+        (.benchmark-done .result):
+        (.benchmark label):
+        (.benchmark-done label):
+        (@keyframes fadein):
+        (to):
+        (@keyframes scaledown):
+        (@keyframes shine):
+        (100%):
+        (@keyframes swingin):
+        (@media (max-width: 415px)):
+        (#logo): Deleted.
+        (p.summary): Deleted.
+        (p.summary + p.summary): Deleted.
+        (p.summary:empty): Deleted.
+        (p:first-of-type): Deleted.
+        (#status a:link): Deleted.
+        (.interval): Deleted.
+        (a:link, a:visited): Deleted.
+        (a:link:hover): Deleted.
+        (table): Deleted.
+        (td, th): Deleted.
+        (th): Deleted.
+        (tr:first-child > th:nth-child(even)): Deleted.
+        (tr:nth-child(even):not(:first-child, .benchmark-running)): Deleted.
+        (.result): Deleted.
+        (.benchmark-running): Deleted.
+        (:not(.benchmark-running) .result): Deleted.
+        (.benchmark-running .result): Deleted.
+        (.benchmark-name): Deleted.
+        (.result.category,): Deleted.
+        (.benchmark-name:not(.category):not(.geometric-mean)): Deleted.
+        (.geometric-mean): Deleted.
+        (.benchmark-name:not(:first-child)): Deleted.
+        (.benchmark-name a:link,): Deleted.
+        (.highlighted-result): Deleted.
+        * JetStream2/JetStream2Logo.svg: Added.
+        * JetStream2/JetStreamDriver.js:
+        (updateUI):
+        (Driver.prototype.async.start):
+        (Driver.prototype.prepareToRun.text.div.id.string_appeared_here.h3):
+        (Driver.prototype.prepareToRun.text.span):
+        (Driver.prototype.prepareToRun.a.h3.h4):
+        (Driver.prototype.prepareToRun.text.div):
+        (Driver.prototype.async.initialize):
+        (Driver.prototype.async.fetchResources.prototype.statusElement.onclick):
+        (prototype.fetchResources):
+        (prototype.updateUIBeforeRun):
+        (prototype.updateUIAfterRun):
+        (Driver.prototype.async.fetchResources.statusElement.innerHTML.a.href.string_appeared_here):
+        (Driver.prototype.async.fetchResources):
+        (Driver.prototype.prepareToRun.text.tr.id.string_appeared_here.FIXME.link.to.benchmark.explanation.td): Deleted.
+        * JetStream2/clouds.svg: Added.
+        * JetStream2/in-depth.html:
+        * JetStream2/index.html:
+        * JetStream2/jetstreams.svg: Added.
+
</ins><span class="cx"> 2019-03-11  Caio Lima  <ticaiolima@gmail.com>
</span><span class="cx"> 
</span><span class="cx">         [ESNext][BigInt] Implement "~" unary operation
</span></span></pre></div>
<a id="trunkPerformanceTestsJetStream2JetStreamcss"></a>
<div class="modfile"><h4>Modified: trunk/PerformanceTests/JetStream2/JetStream.css (242960 => 242961)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/JetStream2/JetStream.css  2019-03-14 20:40:09 UTC (rev 242960)
+++ trunk/PerformanceTests/JetStream2/JetStream.css     2019-03-14 20:46:04 UTC (rev 242961)
</span><span class="lines">@@ -23,28 +23,34 @@
</span><span class="cx">  * THE POSSIBILITY OF SUCH DAMAGE.
</span><span class="cx"> */
</span><span class="cx"> 
</span><ins>+html {
+    font-family: "Helvetica Neue", Helvetica, Verdana, sans-serif;
+    font-size: 62.5%;
+    font-synthesis: none;
+}
+
</ins><span class="cx"> body {
</span><del>-    font-family: "Helvetica Neue", Helvetica, Verdana, sans-serif;
-    font-size: 14px;
-    line-height: 19px;
-    /* background-image: url(Swoosh.png); */
</del><ins>+    margin: 0;
+    font-size: 1.6rem;
+    font-weight: 400;
+    line-height: 1.4;
</ins><span class="cx">     background-repeat: no-repeat;
</span><del>-    background-position: center -40px;
-    background-size: 3000px auto;
-    padding-bottom: 00px;
</del><ins>+    background-position: center -5vw;
+    background-size: 100vw;
+    padding-bottom: 0px;
+    background-image: url('clouds.svg');
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> ::selection {
</span><del>-    background-color: black;
</del><ins>+    background-color: #34AADC;
</ins><span class="cx">     color: white;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> main {
</span><del>-    display: block; /* For IE11 */
-    width: 800px;
</del><ins>+    display: block;
+    max-width: 1180px;
</ins><span class="cx">     margin: auto;
</span><span class="cx">     text-align: center;
</span><del>-    padding: 10px;
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> img {
</span><span class="lines">@@ -52,12 +58,43 @@
</span><span class="cx">     -webkit-user-drag: none;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-#logo {
-    width: 621px;
-    height: 96px;
-    margin-top: 40px;
</del><ins>+.logo {
+    box-sizing: border-box;
+    width: 100%;
+    -webkit-touch-callout: none;
+    -webkit-user-select: none;
+    -moz-user-select: none;
+    -ms-user-select: none;
+    user-select: none;
+    perspective: 600;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+.logo .logo-image {
+    display: block;
+    box-sizing: border-box;
+    background-repeat: no-repeat;
+    background-position: center;
+    background-image: url('JetStream2Logo.svg');
+    color: transparent;
+    animation: swingin 350ms ease-out forwards;
+    will-change: transform, opacity;
+    height: 75px;
+}
+
+#jetstreams {
+    background-image: url('jetstreams.svg');
+    background-repeat: no-repeat;
+    background-size: contain;
+    background-position: center;
+    padding: 2rem 0;
+    margin: -2rem 0;
+}
+
+#jetstreams svg {
+    width: 100%;
+    max-height: 120px;
+}
+
</ins><span class="cx"> #magic {
</span><span class="cx">     position: absolute;
</span><span class="cx">     top: -900px;
</span><span class="lines">@@ -67,51 +104,57 @@
</span><span class="cx">     display: none;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-/*
-@media (-webkit-min-device-pixel-ratio: 2), (min--moz-device-pixel-ratio: 2), (min-resolution: 2dppx), (min-resolution: 192dpi) {
-    #logo {
-        content: url(JetStream-Logo@2x.png);
-    }
-
-    body {
-        background-image: url(Swoosh@2x.png);
-    }
-}
-*/
-
-p.summary {
-    margin: 18px auto 5px;
-    background-image: -webkit-linear-gradient(right, white 70%, rgba(255, 255, 255, 0));
-    background-image: -moz-linear-gradient(right, white 70%, rgba(255, 255, 255, 0));
-    background-image: linear-gradient(to right, white 70%, rgba(255, 255, 255, 0));
-    padding: 15px 125px 0;
</del><ins>+.summary {
</ins><span class="cx">     text-align: center;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-p.summary + p.summary {
</del><ins>+.summary + .summary {
</ins><span class="cx">     padding-top: 5px;
</span><span class="cx">     margin-top: 5px;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-p.summary:empty {
</del><ins>+.summary:empty {
</ins><span class="cx">     display: none;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+article, .summary {
+    max-width: 70rem;
+    margin: 0 auto 1rem;
+    opacity: 0;
+    animation: fadein 0.5s ease-in-out forwards;
+    animation-delay: 200ms;
+}
+
</ins><span class="cx"> h1 {
</span><span class="cx">     color: black;
</span><span class="cx">     text-align: center;
</span><del>-    font-size: 54px;
</del><span class="cx"> }
</span><span class="cx"> 
</span><ins>+
+h2, h3, h4, h5, h6 {
+     color: #2C98D1;
+     text-align: left;
+}
+
+
+h4, h5, h6 {
+    margin-bottom: 0;
+}
+
</ins><span class="cx"> p {
</span><span class="cx">     text-align: left;
</span><del>-    text-indent: 20px;
</del><ins>+    color: #555555;
+    margin: 0 0 3rem 0;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-p:first-of-type {
-    text-indent: 0;
</del><ins>+h5, h6 {
+    font-size: 1.6rem;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+h6 {
+    color: #444444;
+}
+
</ins><span class="cx"> dt {
</span><span class="cx">     margin-top: 10px;
</span><span class="cx">     font-weight: bold;
</span><span class="lines">@@ -124,132 +167,285 @@
</span><span class="cx">     margin: 0;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-#status {
-    margin-top: 20px;
</del><ins>+a:link,
+a:visited {
+    color: #34AADC;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+a:hover,
+a:active {
+    color: #0086BF;
+}
+
</ins><span class="cx"> #status {
</span><del>-    height: 20px;
</del><ins>+    margin: 2rem 0rem;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-#status a:link {
-    font-weight: bold;
</del><ins>+#status label,
+a.button {
+    display: inline-block;
+    font-weight: 500;
+    text-decoration: none;
+    font-size: 2rem;
+    background-color: rgb(52,170,220);
+    background-image: linear-gradient(180deg, rgba(134,217,255,1) -80%, rgba(52,170,220,1) 100%);
+    color: rgb(255,255,255);
+    border: 1px solid rgb(52,170,220);
+    border-radius: 2px;
+    padding: 0.3rem 9rem 0.5rem;
+    -webkit-touch-callout: none;
+    -webkit-user-select: none;
+    -moz-user-select: none;
+    -ms-user-select: none;
+    user-select: none;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+a.button {
+    animation: fadein 500ms ease-in forwards, scaledown 500ms ease-in forwards;
+    opacity: 0;
+}
+
+#status label,
+.button:hover {
+    background-image: none;
+}
+
+#status.loading {
+    position: absolute;
+    top: 0;
+    left: 0;
+    margin: 48vh 0 0;
+    width: 100%;
+    line-height: 1.2;
+    font-size: 4rem;
+    font-style: italic;
+    font-weight: 500;
+    letter-spacing: -0.10rem;
+    color: transparent;
+    background-image: linear-gradient(132deg, #FFFFFF 0%, #FFFFFF 2%, #86D9FF 42%, #8BDAFF 84%, #FFFFFF 98%, #FFFFFF 100%);
+    -webkit-background-clip: text;
+    animation: shine 2s ease-in-out infinite;
+    animation-delay: 2s;
+    background-size: 1200px 100%;
+    background-repeat: no-repeat;
+    -webkit-touch-callout: none;
+    -webkit-user-select: none;
+    -moz-user-select: none;
+    -ms-user-select: none;
+    user-select: none;
+}
+
+#status.error {
+    max-width: 70rem;
+    margin: 0 auto 1rem;
+}
+
+.error h2, .error p {
+    color: #d24a59;
+    margin-bottom: 0;
+    text-align: center;
+    font-weight: 500;
+}
+
+.error h2 {
+    font-size: 5rem;
+    letter-spacing: -0.1rem;
+    line-height: 1;
+}
+
</ins><span class="cx"> #result-summary:empty {
</span><span class="cx">     display: none;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #result-summary {
</span><del>-       margin-top: 20px;
</del><ins>+    margin-top: 20px;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #result-summary label {
</span><del>-    font-weight: bold;
</del><ins>+    color: #6c6c71;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #result-summary .score {
</span><del>-       font-weight: bold;
-    font-size: 40px;
-       line-height: 40px;
-    color: black;
</del><ins>+    font-weight: bold;
+    font-size: 4rem;
+    line-height: 1;
+    color: #34AADC;
+    font-weight: 500;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #result-summary .score .interval {
</span><del>-       display: block;
-       font-size: 16px;
-       line-height: 16px;
-       font-weight: normal;
</del><ins>+    display: block;
+    font-weight: normal;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-.interval {
-    opacity: 0.75;
</del><ins>+#results {
+    display: flex;
+    flex-wrap: wrap;
+    justify-content: space-around;
+    animation: fadein 500ms ease-out forwards;
+    opacity: 0;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-a:link, a:visited {
-    color: blue;
-    text-decoration: none;
-}
</del><ins>+.benchmark {
+    position: relative;
+    flex: 1;
+    max-width: 20%;
+    min-width: 200px;
+    text-align: left;
+    color: #8E8E93;
+    font-size: 1.6rem;
+    margin: 0 1.6rem 3rem 0;
</ins><span class="cx"> 
</span><del>-a:link:hover {
-    text-decoration: underline;
</del><span class="cx"> }
</span><span class="cx"> 
</span><del>-table {
-    border-spacing: 0;
-    border-collapse: collapse;
-    margin-top: 15px;
-    width: 100%;
-    table-layout: fixed;
</del><ins>+.benchmark h3, .benchmark h4, .benchmark .result, .benchmark label {
+    color: transparent;
+    background: linear-gradient(160deg, rgba(249,249,249,1) 0%, rgba(238,238,238,1) 100%);
+    border-radius: 3px;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-td, th {
-    padding: 4px 8px;
</del><ins>+.benchmark-running h4, .benchmark-running .result, .benchmark-running label {
+    color: #86D9FF;
+    background-color: #86D9FF;
+    background-image: none;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-th {
-    font-size: 12px;
</del><ins>+.benchmark-done h3, .benchmark-done h4, .benchmark-done .result, .benchmark-done label {
+    background-color: transparent;
+    background-image: none;
+    -webkit-touch-callout: revert;
+    -webkit-user-select: text;
+    -moz-user-select: text;
+    -ms-user-select: text;
+    user-select: text;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-tr:first-child > th:nth-child(even) {
-    width: px;
</del><ins>+.benchmark h3 {
+    font-weight: 400;
+    font-size: 1.6rem;
+    margin: 0;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-tr:nth-child(even):not(:first-child, .benchmark-running) {
-    background-color: rgb(237, 237, 237);
</del><ins>+.benchmark-running h3 {
+    background-color: transparent;
+    background-image: none;
+    color: #34AADC;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-.result {
-    white-space: nowrap;
</del><ins>+.benchmark-done h3 {
+    color: #6c6c71;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-.benchmark-running {
-    background-color: black;
-    color: white;
</del><ins>+.benchmark h3 a,
+.benchmark h3 a:link,
+.benchmark h3 a:active,
+.benchmark h3 a:hover,
+.benchmark h3 a:visited {
+    color: inherit;
+    text-decoration: none;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-:not(.benchmark-running) .result {
-    color: black;
</del><ins>+.benchmark-done h3 a:hover {
+    color: #34AADC;
+    text-decoration: underline;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-.benchmark-running .result {
-    color: white;
</del><ins>+.benchmark h4 {
+    margin: 0.3rem 0;
+    line-height: 1;
+    font-weight: 400;
+    font-size: 2.4rem;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-/*
-.result .benchmark-running {
-    color: red;
</del><ins>+.benchmark-done h4 {
+    color: #34AADC;
+    background-color: none;
</ins><span class="cx"> }
</span><del>-*/
</del><span class="cx"> 
</span><del>-.benchmark-name {
-    white-space: nowrap;
-    text-align: left;
</del><ins>+.benchmark p,
+.benchmark-done p {
+    margin: 0;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-.result.category,
-.benchmark-name.category {
</del><ins>+.benchmark .result {
+    display: inline-block;
+    margin-right: 1.6rem;
+    line-height: 1.3;
+    font-size: 1.3rem;
</ins><span class="cx">     font-weight: bold;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-.benchmark-name:not(.category):not(.geometric-mean) {
-    text-indent: 0.5em;
</del><ins>+.benchmark-done .result {
+    color: #4A4A4A;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-.geometric-mean {
-    font-weight: bold;
</del><ins>+.benchmark label {
+    display: block;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-.benchmark-name:not(:first-child) {
-    border-left: 15px solid white;
</del><ins>+.benchmark-done label {
+    color: #8E8E93;
+    font-weight: 400;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-.benchmark-name a:link,
-.benchmark-name a:visited {
-    color: black;
</del><ins>+@keyframes fadein {
+    from {
+        opacity: 0;
+    }
+    to {
+        opacity: 1;
+    }
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-.highlighted-result {
-    background-color: black;
-    color: white;
</del><ins>+@keyframes scaledown {
+    from {
+        transform: scale(1.3,1.3);
+    }
+    to {
+        transform: scale(1,1);
+    }
</ins><span class="cx"> }
</span><ins>+
+@keyframes shine {
+    0% {
+        background-position: -1200px center;
+    }
+    100% {
+        background-position: 100vw center;
+    }
+}
+
+@keyframes swingin {
+    from {
+        opacity: 0;
+        transform: rotateY(-85deg) translateZ(200px);
+    }
+    to {
+        opacity: 1;
+        transform: rotateY(0deg) translateZ(0px);
+    }
+}
+
+@media (max-width: 415px) {
+    body {
+        background-position: center 4rem;
+    }
+
+    .logo .logo-image {
+        height: 60px;
+    }
+
+    #jetstreams {
+        background-size: 200%;
+    }
+
+
+    article, .summary {
+        padding-top: 10rem;
+        margin: 0 1rem;
+    }
+
+    a.button {
+        padding: 0.3rem 6rem 0.5rem;
+    }
+}
</ins><span class="cx">\ No newline at end of file
</span></span></pre></div>
<a id="trunkPerformanceTestsJetStream2JetStream2Logosvg"></a>
<div class="addfile"><h4>Added: trunk/PerformanceTests/JetStream2/JetStream2Logo.svg (0 => 242961)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/JetStream2/JetStream2Logo.svg                             (rev 0)
+++ trunk/PerformanceTests/JetStream2/JetStream2Logo.svg        2019-03-14 20:46:04 UTC (rev 242961)
</span><span class="lines">@@ -0,0 +1,12 @@
</span><ins>+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 436 94">
+    <!-- Copyright © 2019 Apple Inc. All rights reserved. -->
+    <defs>
+        <radialGradient id="a" cy="44.467%" r="222.449%" fx="50%" fy="44.467%" gradientTransform="matrix(.22477 0 0 .18868 .388 .36)">
+            <stop stop-color="#FFFFFF" offset="0%"/>
+            <stop stop-color="#FFFFFF" stop-opacity=".962" offset="53.383%"/>
+            <stop stop-color="#FFFFFF" stop-opacity="0" offset="100%"/>
+        </radialGradient>
+    </defs>
+    <ellipse cx="218" cy="53" fill="url(#a)" rx="218" ry="49"/>
+    <path fill="rgb(52, 169, 218)" d="M 80.4277 41.9199C 80.4277 39.2959 80.0587 37.3279 79.3237 36.0159 78.5877 34.7049 77.3867 34.0479 75.7237 34.0479 73.4827 34.0479 71.6587 35.1369 70.2517 37.3119 68.8437 39.4879 67.7557 42.2729 66.9877 45.6639L 80.2357 45.6639C 80.3637 43.8089 80.4277 42.5609 80.4277 41.9199M 59.0677 34.8639C 62.4277 28.1119 68.2027 24.7349 76.3957 24.7349 86.8267 24.7349 92.0437 30.4639 92.0437 41.9199 92.0437 46.2729 91.6917 50.3049 90.9877 54.0159L 65.7397 54.0159C 65.6107 55.3589 65.5477 56.8329 65.5477 58.4319 65.5477 61.7609 65.9637 64.2249 66.7957 65.8239 67.6267 67.4239 68.9707 68.2239 70.8277 68.2239 72.6187 68.2239 74.1397 67.3589 75.3877 65.6319 76.6357 63.9029 77.5477 61.6639 78.1237 58.9119L 89.9317 58.9119C 87.1147 71.3289 80.5867 77.5359 70.3477 77.5359 64.8427 77.5359 60.7477 76.0809 58.0597 73.1679 55.3717 70.2559 54.0277 65.8239 54.0277 59.8719 54.0277 49.9519 55.7077 41.6169 59.0677 34.8639M 100.4912 52.9121C 101.7062 44.433
 1 102.5382 38.6561 102.9872 35.5841L 97.8992 35.5841 99.2432 25.8881 104.3312 25.8881 106.2512 11.6801 118.2512 11.6801 115.6592 25.8881 122.9552 25.8881 121.6112 35.5841 114.4112 35.5841C 113.9632 38.5281 113.1782 44.0161 112.0592 52.0481 110.9392 60.0801 110.3792 64.2881 110.3792 64.6721 110.3792 66.7841 111.5312 67.8401 113.8352 67.8401L 117.0032 67.8401 115.8512 76.3841C 115.0182 76.7031 113.9142 76.9741 112.5392 77.2001 111.1622 77.4231 109.9302 77.5361 108.8432 77.5361 105.2582 77.5361 102.6662 76.5761 101.0672 74.6561 99.4672 72.7351 98.6672 70.2401 98.6672 67.1681 98.6672 66.1441 99.2752 61.3921 100.4912 52.9121M 124.2988 54.0156L 136.9708 54.0156C 136.6498 55.2966 136.4908 56.8326 136.4908 58.6236 136.4908 60.8656 137.2108 62.8166 138.6508 64.4796 140.0908 66.1446 142.6978 66.9756 146.4748 66.9756 149.7388 66.9756 152.2978 66.1446 154.1548 64.4796 156.0098 62.8166 156.9388 60.7996 156.9388 58.4316 156.9388 56.5116 156.4108 54.8656 155.3548 53.4876 154.2988 52.1126 152.9858 
 50.9766 151.4188 50.0796 149.8498 49.1846 147.6578 48.0966 144.8428 46.8156 141.4498 45.2806 138.7138 43.8726 136.6348 42.5916 134.5538 41.3126 132.7778 39.5836 131.3068 37.4086 129.8338 35.2326 129.0988 32.5116 129.0988 29.2476 129.0988 25.7916 129.8498 22.5606 131.3548 19.5516 132.8578 16.5436 135.2748 14.0966 138.6028 12.2076 141.9298 10.3206 146.1868 9.3756 151.3708 9.3756 159.0508 9.3756 164.3938 11.2326 167.4028 14.9436 170.4098 18.6566 171.9148 23.6486 171.9148 29.9196L 159.5308 29.9196C 159.5308 26.9766 158.7948 24.5916 157.3228 22.7676 155.8498 20.9436 153.6418 20.0326 150.6988 20.0326 148.7148 20.0326 146.7628 20.4966 144.8428 21.4236 142.9228 22.3526 141.9628 24.1606 141.9628 26.8476 141.9628 29.1516 142.8418 30.9606 144.6028 32.2716 146.3618 33.5836 149.0978 35.0076 152.8108 36.5436 156.3938 38.0796 159.3058 39.5196 161.5468 40.8646 163.7858 42.2076 165.7058 44.1126 167.3068 46.5766 168.9058 49.0396 169.7068 52.1606 169.7068 55.9356 169.7068 60.4156 168.6658 64.2876 166.
 5868 67.5516 164.5068 70.8156 161.6428 73.2966 157.9948 74.9926 154.3468 76.6866 150.2508 77.5366 145.7068 77.5366 142.1858 77.5366 138.7468 76.9266 135.3868 75.7116 132.0268 74.4966 129.2578 72.5606 127.0828 69.9036 124.9058 67.2486 123.8188 63.9036 123.8188 59.8716 123.8188 57.5676 123.9778 55.6166 124.2988 54.0156M 179.2104 52.9121C 180.4254 44.4331 181.2574 38.6561 181.7064 35.5841L 176.6184 35.5841 177.9624 25.8881 183.0504 25.8881 184.9704 11.6801 196.9704 11.6801 194.3784 25.8881 201.6744 25.8881 200.3304 35.5841 193.1304 35.5841C 192.6824 38.5281 191.8974 44.0161 190.7784 52.0481 189.6584 60.0801 189.0984 64.2881 189.0984 64.6721 189.0984 66.7841 190.2504 67.8401 192.5544 67.8401L 195.7224 67.8401 194.5704 76.3841C 193.7374 76.7031 192.6334 76.9741 191.2584 77.2001 189.8814 77.4231 188.6494 77.5361 187.5624 77.5361 183.9774 77.5361 181.3854 76.5761 179.7864 74.6561 178.1864 72.7351 177.3864 70.2401 177.3864 67.1681 177.3864 66.1441 177.9944 61.3921 179.2104 52.9121M 218.0898
  33.5674C 219.3698 30.9444 220.8258 28.8154 222.4578 27.1834 224.0898 25.5514 226.0898 24.7354 228.4578 24.7354 229.6728 24.7354 230.6978 24.8484 231.5298 25.0724 232.3608 25.2964 232.8738 25.4404 233.0658 25.5044L 231.6258 36.6394 227.9778 36.6394C 225.1608 36.6394 222.7768 37.5374 220.8258 39.3284 218.8728 41.1204 217.6098 44.0964 217.0338 48.2554L 213.0978 76.3834 201.7698 76.3834 208.7778 25.8874 218.0898 25.8874 218.0898 33.5674zM 259.7524 41.9199C 259.7524 39.2959 259.3834 37.3279 258.6484 36.0159 257.9124 34.7049 256.7114 34.0479 255.0484 34.0479 252.8074 34.0479 250.9834 35.1369 249.5764 37.3119 248.1684 39.4879 247.0804 42.2729 246.3124 45.6639L 259.5604 45.6639C 259.6884 43.8089 259.7524 42.5609 259.7524 41.9199M 238.3924 34.8639C 241.7524 28.1119 247.5274 24.7349 255.7204 24.7349 266.1514 24.7349 271.3684 30.4639 271.3684 41.9199 271.3684 46.2729 271.0164 50.3049 270.3124 54.0159L 245.0644 54.0159C 244.9354 55.3589 244.8724 56.8329 244.8724 58.4319 244.8724 61.7609 245.28
 84 64.2249 246.1204 65.8239 246.9514 67.4239 248.2954 68.2239 250.1524 68.2239 251.9434 68.2239 253.4644 67.3589 254.7124 65.6319 255.9604 63.9029 256.8724 61.6639 257.4484 58.9119L 269.2564 58.9119C 266.4394 71.3289 259.9114 77.5359 249.6724 77.5359 244.1674 77.5359 240.0724 76.0809 237.3844 73.1679 234.6964 70.2559 233.3524 65.8239 233.3524 59.8719 233.3524 49.9519 235.0324 41.6169 238.3924 34.8639M 298.5361 63.5674C 300.0071 60.8484 301.0321 57.6644 301.6081 54.0154 302.1841 50.3684 302.4721 47.0074 302.4721 43.9354 302.4721 40.8004 302.0881 38.4634 301.3201 36.9274 300.5521 35.3914 299.2391 34.6244 297.3841 34.6244 294.9511 34.6244 292.9991 36.0634 291.5281 38.9434 290.0551 41.8244 289.0151 45.1044 288.4081 48.7844 287.7991 52.4644 287.4961 55.5854 287.4961 58.1434 287.4961 64.4794 289.2241 67.6474 292.6801 67.6474 295.1111 67.6474 297.0631 66.2894 298.5361 63.5674M 305.7361 31.9354L 307.6561 25.8874 316.5841 25.8874C 315.9441 29.8564 314.7911 37.2804 313.1271 48.1604 311.4631 5
 9.0414 310.6311 64.7054 310.6311 65.1514 310.6311 66.9444 311.4011 67.8394 312.9361 67.8394L 314.6641 67.8394 313.5121 76.0004C 311.7841 77.0224 309.8951 77.5364 307.8481 77.5364 305.7361 77.5364 304.0081 76.9434 302.6641 75.7594 301.3201 74.5764 300.3911 72.9274 299.8801 70.8154 298.7281 73.0564 297.2071 74.7364 295.3201 75.8554 293.4321 76.9744 291.5591 77.5364 289.7041 77.5364 285.3511 77.5364 281.9911 76.0334 279.6241 73.0234 277.2551 70.0164 276.0721 65.5684 276.0721 59.6794 276.0721 51.9364 276.9671 45.4404 278.7601 40.1914 280.5511 34.9444 282.9031 31.0564 285.8161 28.5274 288.7271 26.0004 291.8481 24.7354 295.1761 24.7354 300.2951 24.7354 303.8161 27.1354 305.7361 31.9354M 336.4546 32.416C 339.7816 27.296 344.0066 24.735 349.1266 24.735 352.0076 24.735 354.3426 25.456 356.1356 26.895 357.9266 28.336 359.1416 30.368 359.7826 32.992 361.4466 30.433 363.3346 28.417 365.4466 26.943 367.5586 25.473 370.0866 24.735 373.0306 24.735 376.6796 24.735 379.4626 25.873 381.3836 28.144 38
 3.3036 30.416 384.2636 33.601 384.2636 37.695 384.2636 38.593 384.1186 40.177 383.8306 42.448 383.5426 44.721 383.0156 48.544 382.2466 53.92 381.8626 57.057 381.3976 60.513 380.8546 64.288 380.3096 68.064 379.7506 72.097 379.1756 76.384L 367.7506 76.384 370.9186 53.632C 371.5586 49.345 371.9896 46.288 372.2156 44.464 372.4376 42.64 372.5516 41.408 372.5516 40.768 372.5516 37.057 370.9816 35.2 367.8476 35.2 365.8626 35.2 364.0696 36.16 362.4716 38.08 360.8706 40 359.8466 42.656 359.3986 46.048L 355.3666 76.384 343.9426 76.384 347.1106 53.344C 347.6866 49.185 348.0856 46.208 348.3106 44.416 348.5346 42.625 348.6466 41.408 348.6466 40.768 348.6466 37.057 347.1106 35.2 344.0386 35.2 341.9896 35.2 340.1826 36.145 338.6146 38.032 337.0456 39.92 336.0376 42.592 335.5916 46.048L 331.4626 76.384 320.0386 76.384 327.1426 25.888 336.4546 25.888 336.4546 32.416z"/><mask id="b" fill="white"><use/></mask><path fill="rgb(134, 217, 255)" d=
 "M 390.393 62.019 C 392.409 58.419 394.641 55.234 397.089 52.461 C 399.537 49.69 402.741 46.396 406.702 42.58 C 410.229 39.196 413.0 36.388 415.018 34.156 C 417.032 31.924 418.706 29.495 420.039 26.866 C 421.372 24.238 422.038 21.484 422.038 18.603 C 422.038 16.804 421.551 15.274 420.58 14.013 C 419.608 12.754 418.112 12.123 416.098 12.123 C 413.577 12.123 411.579 13.186 410.104 15.309 C 408.627 17.434 407.673 20.116 407.242 23.355 L 406.702 27.784 L 393.633 27.784 C 393.633 22.96 394.551 18.496 396.387 14.391 C 398.223 10.288 400.923 7.031 404.488 4.618 C 408.051 2.206 412.317 0.999 417.286 0.999 C 422.756 0.999 427.149 2.314 430.461 4.941 C 433.772 7.571 435.5 11.583 435.645 16.983 C 435.645 22.024 434.528 26.776 432.297 31.24 C 430.065 35.705 427.438 39.627 424.414 43.011 C 421.389 46.396 417.61 50.248 413.074 54.567 C 411.2 56.368 409.418 58.131 407.727 59.859 C 406.036 61.587 404.793 63.064 404.001 64.288 L 429.49 64.288 L 427.762 76.383 L 385.858 76.383 L 386.289 73.791 C
  387.008 69.543 388.377 65.621 390.393 62.019"/><mask id="d" fill="white"><use/></mask><path fill="rgb(52, 169, 218)" d="M 44.054 72.415 L 52.885 9.999 L 39.856 9.999 L 31.22 71.534 C 29.982 79.967 25.236 81.735 21.472 81.735 C 15.725 81.735 12.688 78.782 12.688 73.195 C 12.688 72.419 12.906 70.498 13.354 67.34 L 1.063 67.34 C 0.189 73.715 -0.0 75.973 -0.0 76.733 C -0.0 81.987 1.756 85.858 5.368 88.567 C 9.038 91.32 14.456 92.715 21.472 92.715 C 27.879 92.715 33.064 90.973 36.882 87.538 C 40.711 84.092 43.124 79.004 44.054 72.415"/>
+</svg>
</ins><span class="cx">\ No newline at end of file
</span></span></pre></div>
<a id="trunkPerformanceTestsJetStream2JetStreamDriverjs"></a>
<div class="modfile"><h4>Modified: trunk/PerformanceTests/JetStream2/JetStreamDriver.js (242960 => 242961)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/JetStream2/JetStreamDriver.js     2019-03-14 20:40:09 UTC (rev 242960)
+++ trunk/PerformanceTests/JetStream2/JetStreamDriver.js        2019-03-14 20:46:04 UTC (rev 242961)
</span><span class="lines">@@ -83,7 +83,7 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> function updateUI() {
</span><del>-    return new Promise((resolve) => { 
</del><ins>+    return new Promise((resolve) => {
</ins><span class="cx">         if (isInBrowser)
</span><span class="cx">             requestAnimationFrame(() => setTimeout(resolve, 0));
</span><span class="cx">         else
</span><span class="lines">@@ -151,10 +151,13 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     async start() {
</span><del>-        if (isInBrowser)
-            document.getElementById("status").innerHTML = `Running...`;
-        else
</del><ins>+        if (isInBrowser) {
+            let statusElement = document.getElementById("status");
+            let summaryElement = document.getElementById("result-summary");
+            statusElement.innerHTML = `<label>Running...</label>`;
+        } else {
</ins><span class="cx">             console.log("Starting JetStream2");
</span><ins>+        }
</ins><span class="cx"> 
</span><span class="cx">         await updateUI();
</span><span class="cx"> 
</span><span class="lines">@@ -188,8 +191,9 @@
</span><span class="cx">             allScores.push(benchmark.score);
</span><span class="cx"> 
</span><span class="cx">         if (isInBrowser) {
</span><del>-            document.getElementById("result-summary").innerHTML = "<label>Score</label><br><span class=\"score\">" + uiFriendlyNumber(geomean(allScores)) + "</span>";
-            document.getElementById("status").innerHTML = `Done`;
</del><ins>+            summaryElement.classList.add('done');
+            summaryElement.innerHTML = "<div class=\"score\">" + uiFriendlyNumber(geomean(allScores)) + "</div><label>Score</label>";
+            statusElement.innerHTML = '';
</ins><span class="cx">         } else
</span><span class="cx">             console.log("\nTotal Score: ", uiFriendlyNumber(geomean(allScores)), "\n");
</span><span class="cx"> 
</span><span class="lines">@@ -226,59 +230,46 @@
</span><span class="cx">     {
</span><span class="cx">         this.benchmarks.sort((a, b) => a.plan.name.toLowerCase() < b.plan.name.toLowerCase() ? 1 : -1);
</span><span class="cx"> 
</span><del>-        let groups = new Map;
-        let names = new Set;
-        for (let benchmark of this.benchmarks) {
-            names.add(benchmark.name);
-            let identifier = JSON.stringify(benchmark.constructor.scoreDescription());
-            if (!groups.has(identifier))
-                groups.set(identifier, []);
-            groups.get(identifier).push(benchmark);
-        }
-
-        if (names.size !== this.benchmarks.length)
-            throw new Error("Names of benchmarks must be unique");
-
</del><span class="cx">         let text = "";
</span><span class="cx">         let newBenchmarks = [];
</span><del>-        for (let [id, benchmarks] of groups) {
</del><ins>+        for (let benchmark of this.benchmarks) {
+            let id = JSON.stringify(benchmark.constructor.scoreDescription());
</ins><span class="cx">             let description = JSON.parse(id);
</span><del>-            if (isInBrowser) {
-                text += `<tr> <th> Benchmark </th>`;
-                for (let score of description)
-                    text += `<th> ${score} </th>`;
-            }
-            for (let benchmark of benchmarks) {
-                newBenchmarks.push(benchmark);
</del><span class="cx"> 
</span><del>-                if (isInBrowser) {
-                    text +=
-                        `<tr id="row-for-${benchmark.name}">
-                        <!-- FIXME: link to benchmark explanation -->
-                        <td class="benchmark-name"> ${benchmark.name} </td>`;
-                    for (let id of benchmark.scoreIdentifiers())
-                        text += `<td class="result" id="${id}">&mdash;</td>`
-                    text += `</tr>`;
-                }
-            }
-        }
</del><ins>+            newBenchmarks.push(benchmark);
+            let scoreIds = benchmark.scoreIdentifiers()
+            let overallScoreId = scoreIds.pop();
</ins><span class="cx"> 
</span><del>-        if (measureTotalTimeAsSubtest) {
</del><span class="cx">             if (isInBrowser) {
</span><del>-                text += 
-                    `<tr>
-                        <td class="benchmark-name"> Total time </td>
-                        <td class="result" id="benchmark-total-time-score">&mdash;</td>
-                    </tr>`;
</del><ins>+                text +=
+                    `<div class="benchmark" id="benchmark-${benchmark.name}">
+                    <h3 class="benchmark-name"><a href="about.html#${benchmark.name}">${benchmark.name}</a></h3>
+                    <h4 class="score" id="${overallScoreId}">___</h4><p>`;
+                for (let i = 0; i < scoreIds.length; i++) {
+                    let id = scoreIds[i];
+                    let label = description[i];
+                    text += `<span class="result"><span id="${id}">___</span><label>${label}</label></span>`
+                }
+                text += `</p></div>`;
</ins><span class="cx">             }
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        if (isInBrowser) {
-            let resultsTable = document.getElementById("results");
-            resultsTable.innerHTML = text;
</del><ins>+        if (!isInBrowser)
+            return;
</ins><span class="cx"> 
</span><del>-            document.getElementById("magic").textContent = "";
-        }
</del><ins>+        for (let f = 0; f < 5; f++)
+            text += `<div class="benchmark fill"></div>`;
+
+        let timestamp = Date.now();
+        document.getElementById('jetstreams').style.backgroundImage = `url('jetstreams.svg?${timestamp}')`;
+        let resultsTable = document.getElementById("results");
+        resultsTable.innerHTML = text;
+
+        document.getElementById("magic").textContent = "";
+        document.addEventListener('keypress', function (e) {
+            if (e.which === 13)
+                JetStream.start();
+        });
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     reportError(benchmark)
</span><span class="lines">@@ -291,7 +282,7 @@
</span><span class="cx">         await this.fetchResources();
</span><span class="cx">         this.prepareToRun();
</span><span class="cx">         if (isInBrowser && window.location.search == '?report=true') {
</span><del>-            setTimeout(() => this.start(), 1000);
</del><ins>+            setTimeout(() => this.start(), 2000);
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -302,10 +293,11 @@
</span><span class="cx">         if (!isInBrowser)
</span><span class="cx">             return;
</span><span class="cx"> 
</span><del>-        let status = document.getElementById("status");
-        status.innerHTML = `<a href="javascript:JetStream.start()">Start Test</a>`;
-        status.onclick = () => {
-            status.onclick = null;
</del><ins>+        let statusElement = document.getElementById("status");
+        statusElement.classList.remove('loading');
+        statusElement.innerHTML = `<a href="javascript:JetStream.start()" class="button">Start Test</a>`;
+        statusElement.onclick = () => {
+            statusElement.onclick = null;
</ins><span class="cx">             JetStream.start();
</span><span class="cx">             return false;
</span><span class="cx">         }
</span><span class="lines">@@ -351,7 +343,7 @@
</span><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> class Benchmark {
</span><del>-    constructor(plan) 
</del><ins>+    constructor(plan)
</ins><span class="cx">     {
</span><span class="cx">         this.plan = plan;
</span><span class="cx">         this.iterations = testIterationCount || plan.iterations || defaultIterationCount;
</span><span class="lines">@@ -536,7 +528,7 @@
</span><span class="cx">                     blob = new Blob([item], {type : 'application/octet-stream'});
</span><span class="cx">                 } else
</span><span class="cx">                     throw new Error("Unexpected item!");
</span><del>-                
</del><ins>+
</ins><span class="cx">                 this.blobs.push(blob);
</span><span class="cx">                 this.preloads.push([preloadVariableNames[i], URL.createObjectURL(blob)]);
</span><span class="cx">             }
</span><span class="lines">@@ -555,7 +547,10 @@
</span><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        document.getElementById(`row-for-${this.name}`).classList.add("benchmark-running");
</del><ins>+        let containerUI = document.getElementById("results");
+        let resultsBenchmarkUI = document.getElementById(`benchmark-${this.name}`);
+        containerUI.insertBefore(resultsBenchmarkUI, containerUI.firstChild);
+        resultsBenchmarkUI.classList.add("benchmark-running");
</ins><span class="cx"> 
</span><span class="cx">         for (let id of this.scoreIdentifiers())
</span><span class="cx">             document.getElementById(id).innerHTML = "...";
</span><span class="lines">@@ -565,7 +560,10 @@
</span><span class="cx">         if (!isInBrowser)
</span><span class="cx">             return;
</span><span class="cx"> 
</span><del>-        document.getElementById(`row-for-${this.name}`).classList.remove("benchmark-running");
</del><ins>+        let benchmarkResultsUI = document.getElementById(`benchmark-${this.name}`);
+        benchmarkResultsUI.classList.remove("benchmark-running");
+        benchmarkResultsUI.classList.add("benchmark-done");
+
</ins><span class="cx">     }
</span><span class="cx"> };
</span><span class="cx"> 
</span><span class="lines">@@ -812,7 +810,7 @@
</span><span class="cx">         return str;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    get runnerCode() { 
</del><ins>+    get runnerCode() {
</ins><span class="cx">         let str = "";
</span><span class="cx">         if (isInBrowser) {
</span><span class="cx">             str += `
</span><span class="lines">@@ -1294,7 +1292,7 @@
</span><span class="cx">             "./wasm/tsf.js"
</span><span class="cx">         ],
</span><span class="cx">         preload: {
</span><del>-            wasmBlobURL: "./wasm/tsf.wasm" 
</del><ins>+            wasmBlobURL: "./wasm/tsf.wasm"
</ins><span class="cx">         },
</span><span class="cx">         benchmarkClass: WasmBenchmark,
</span><span class="cx">         testGroup: WasmGroup
</span><span class="lines">@@ -1591,4 +1589,4 @@
</span><span class="cx"> 
</span><span class="cx">     if (runWTB)
</span><span class="cx">         addTestsByGroup(WTBGroup);
</span><del>-}
</del><ins>+}
</ins><span class="cx">\ No newline at end of file
</span></span></pre></div>
<a id="trunkPerformanceTestsJetStream2cloudssvg"></a>
<div class="addfile"><h4>Added: trunk/PerformanceTests/JetStream2/clouds.svg (0 => 242961)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/JetStream2/clouds.svg                             (rev 0)
+++ trunk/PerformanceTests/JetStream2/clouds.svg        2019-03-14 20:46:04 UTC (rev 242961)
</span><span class="lines">@@ -0,0 +1,15 @@
</span><ins>+<svg xmlns="http://www.w3.org/2000/svg" width="1582" height="400" viewBox="0 0 1582 400" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <!-- Copyright © 2019 Apple Inc. All rights reserved. -->
+    <defs>
+        <path id="b" d="M1581.5351,399.898438 L1581.5351,358.005601 C1581.5351,312.268183 1541.19277,275.1917 1491.43042,275.1917 C1450.64807,275.1917 1416.21078,300.099758 1405.10264,334.260413 C1400.43887,333.385508 1395.61073,332.926025 1390.66617,332.926025 C1388.37195,332.926025 1386.10341,333.036175 1383.86398,333.229724 C1376.13724,267.399376 1315.50132,216.14187 1241.82258,216.14187 C1199.31271,216.14187 1161.16187,233.219838 1134.9872,260.299423 C1113.40269,263.202662 1094.87257,274.711761 1083.62404,290.913249 C1073.08089,286.962012 1061.57383,284.746424 1049.51034,284.658304 C1044.8089,230.165536 995.241732,187.282576 934.742775,187.282576 C879.5873,187.282576 833.514544,222.927109 822.238618,270.513473 C806.788579,260.746317 788.255038,254.823396 768.250798,254.201835 C768.855171,251.032663 769.18732,247.780091 769.18732,244.451989 C769.18732,213.446343 741.83986,188.311692 708.104535,188.311692 C696.749852,188.311692 686.126238,191.167723 677.017838,19
 6.127619 C663.949337,174.58071 638.921781,160 610.177243,160 C568.537128,160 534.69394,190.587075 533.736873,228.645467 C507.409829,230.16711 484.936733,244.705333 473.845714,265.347439 C452.004386,227.565997 408.768588,201.827094 358.973715,201.827094 C322.127494,201.827094 288.886968,215.937306 265.229096,238.56998 C261.739825,237.690353 258.069071,237.211988 254.276757,237.211988 C236.873206,237.211988 221.99501,247.101882 215.903339,261.097224 C210.077045,258.211294 203.411818,256.571633 196.328838,256.571633 C173.761577,256.571633 155.431776,273.199559 155.024295,293.851107 C140.462839,286.979322 123.970128,283.078439 106.475835,283.078439 C47.6701506,283.078439 4.8316906e-13,326.89138 4.8316906e-13,380.938827 L0,399.898438"/>
+        <filter id="a" width="120.5%" height="235.5%" x="-10.3%" y="-78.2%" filterUnits="objectBoundingBox">
+            <feOffset dy="-25" in="SourceAlpha" result="shadowOffsetOuter1"/>
+            <feGaussianBlur stdDeviation="50" in="shadowOffsetOuter1" result="shadowBlurOuter1"/>
+            <feColorMatrix values="0 0 0 0 0.807429766 0 0 0 0 0.94268743 0 0 0 0 1 0 0 0 1 0" in="shadowBlurOuter1"/>
+        </filter>
+    </defs>
+    <g fill="none" fill-rule="evenodd">
+        <use fill="black" filter="url(#a)" xlink:href="#b"/>
+        <use fill="white" xlink:href="#b"/>
+    </g>
+</svg>
</ins><span class="cx">\ No newline at end of file
</span></span></pre></div>
<a id="trunkPerformanceTestsJetStream2indepthhtml"></a>
<div class="modfile"><h4>Modified: trunk/PerformanceTests/JetStream2/in-depth.html (242960 => 242961)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/JetStream2/in-depth.html  2019-03-14 20:40:09 UTC (rev 242960)
+++ trunk/PerformanceTests/JetStream2/in-depth.html     2019-03-14 20:46:04 UTC (rev 242961)
</span><span class="lines">@@ -1,688 +1,658 @@
</span><ins>+<!--
+ Copyright (C) 2019 Apple Inc. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+    notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+    notice, this list of conditions and the following disclaimer in the
+    documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ THE POSSIBILITY OF SUCH DAMAGE.
+-->
+<!DOCTYPE html>
</ins><span class="cx"> <html>
</span><span class="cx"> <head>
</span><del>-    <title>JetStream 2 &mdash; In Depth Analysis</title>
</del><ins>+    <meta charset="utf-8" />
+
+    <title>JetStream 2 In-Depth Analysis</title>
+
</ins><span class="cx">     <link rel="stylesheet" href="JetStream.css">
</span><ins>+
</ins><span class="cx"> </head>
</span><span class="cx"> <body>
</span><ins>+<h1 class="logo">
+    <div id="jetstreams">
+        <a href="index.html" class="logo-image">JetStream 2</a>
+    </div>
+</h1>
</ins><span class="cx"> <main>
</span><del>-    <a href="index.html">
-        <h1> JetStream 2 </h1>
-    </a>
</del><ins>+    <article>
+        <h2>In-Depth Analysis</h2>
</ins><span class="cx"> 
</span><del>-    <h1>In Depth Analysis</h1>
</del><ins>+        <p>
+        JetStream 2 combines together a variety of JavaScript and Web Assembly benchmarks, covering a variety of
+        advanced workloads and programming techniques, and reports a single score that
+        balances them using a geometric mean.
+        </p>
</ins><span class="cx"> 
</span><del>-    <p>
-    JetStream 2 combines together a variety of JavaScript and Web Assembly benchmarks, covering a variety of
-    advanced workloads and programming techniques, and reports a single score that
-    balances them using a geometric mean.
-    </p>
</del><ins>+        <p>
+        Each benchmark measures a distinct workload, and no single optimization
+        technique is sufficient to speed up all benchmarks. Some benchmarks demonstrate tradeoffs, and
+        aggressive or specialized optimizations for one benchmark might make another benchmark slower.
+        JetStream 2 rewards browsers that start up quickly, execute code quickly, and continue running smoothly.
+        </p>
</ins><span class="cx"> 
</span><del>-    <p>
-    Each benchmark measures a distinct workload, and no single optimization
-    technique is sufficient to speed up all benchmarks. Some benchmarks demonstrate tradeoffs, and
-    aggressive or specialized optimizations for one benchmark might make another benchmark slower.
-    JetStream 2 rewards browsers that start up quickly, execute code quickly, and continue running smoothly.
-    </p>
-    
-    <p>
-    Each benchmark in JetStream 2 computes its own individual score. JetStream 2 weighs each
-    benchmark equally, taking the geometric mean over each individual benchmark's score to compute
-    the overall JetStream 2 score.
-    </p>
</del><ins>+        <p>
+        Each benchmark in JetStream 2 computes its own individual score. JetStream 2 weighs each
+        benchmark equally, taking the geometric mean over each individual benchmark's score to compute
+        the overall JetStream 2 score.
+        </p>
</ins><span class="cx"> 
</span><del>-    <p>
-    It's not enough to just measure the total running time of a workload.
-    Browsers may perform differently for the same JavaScript workload depending on how many times it
-    has run. For example, garbage collection runs periodically, making some iterations take longer than
-    others. Code that runs repeatedly gets optimized by the browser, so the first iteration
-    of any workload is usually more expensive than the rest.
-    </p>
</del><ins>+        <p>
+        It's not enough to just measure the total running time of a workload.
+        Browsers may perform differently for the same JavaScript workload depending on how many times it
+        has run. For example, garbage collection runs periodically, making some iterations take longer than
+        others. Code that runs repeatedly gets optimized by the browser, so the first iteration
+        of any workload is usually more expensive than the rest.
+        </p>
</ins><span class="cx"> 
</span><del>-    <p>
-    For most of the JavaScript benchmarks in JetStream 2, individual scores
-    equally weigh startup performance, worst case performance, and average case
-    performance. These three metrics are crucial to running performant JavaScript
-    in the browser. Fast startup times lead browsers to loading pages more quickly. Good
-    worst case performance ensures web applications can run without hiccups. Fast average
-    case performance makes it so that the most advanced web applications can run at all.
-    </p>
-    
-    <p>
-    For JetStream 2's Web Assembly benchmarks, individual scores equally weigh startup time and
-    total execution time. An important component of JetStream 1 were the asm.js subset of benchmarks. With the release
-    of Web Assembly, the importance of asm.js has lessened since many users of asm.js are
-    now using Web Assembly. JetStream 2 has converted many of the asm.js benchmarks from
-    JetStream 1 into Web Assembly.
-    </p>
-    
-    <p>
-    All but one of JetStream'2 JavaScript benchmarks run for N iterations, where
-    N is usually 120. JetStream 2 reports the startup score as the time it takes to run the first iteration.
-    The worst case score is the average of the worst M iterations, excluding the first iteration.
-    M is always less than N, and is usually 4. The average case score is the average
-    of all but the first iteration. These three scores are weighed equally using the geometric
-    mean.
-    </p>
</del><ins>+        <p>
+        For most of the JavaScript benchmarks in JetStream 2, individual scores
+        equally weigh startup performance, worst case performance, and average case
+        performance. These three metrics are crucial to running performant JavaScript
+        in the browser. Fast startup times lead browsers to loading pages more quickly. Good
+        worst case performance ensures web applications can run without hiccups. Fast average
+        case performance makes it so that the most advanced web applications can run at all.
+        </p>
</ins><span class="cx"> 
</span><del>-    <p>
-    JetStream 2 also includes a JavaScript benchmark named WSL. WSL is an implementation of a
-    GPU shading language written in JavaScript. WSL does not use the above mechanism for scoring
-    because it has a long running time. Instead, the WSL benchmark computes its score as the
-    geometric mean over two metrics: the time it takes to compile the WSL standard library, and the time
-    it takes to run through the WSL specification test suite.
-    </p>
</del><ins>+        <p>
+        For JetStream 2's Web Assembly benchmarks, individual scores equally weigh startup time and
+        total execution time. An important component of JetStream 1 were the asm.js subset of benchmarks. With the release
+        of Web Assembly, the importance of asm.js has lessened since many users of asm.js are
+        now using Web Assembly. JetStream 2 has converted many of the asm.js benchmarks from
+        JetStream 1 into Web Assembly.
+        </p>
</ins><span class="cx"> 
</span><del>-    <p>
-    JetStream 2 includes parts of these benchmark suites that came before it: <a href="https://webkit.org/perf/sunspider/sunspider.html">SunSpider</a>,
-    <a href="https://developers.google.com/octane/">Octane 2</a>, <a href="https://browserbench.org/JetStream/">JetStream 1</a>,
-    <a href="https://browserbench.org/ARES-6/">ARES-6</a>, and <a href="https://v8.github.io/web-tooling-benchmark/">Web Tooling Benchmark</a>.
-    JetStream 2 also includes new benchmarks inspired by <a href="https://krakenbenchmark.mozilla.org">Kraken</a>.
-    JetStream 2 also includes a new set of benchmarks that measure the performance of Web Assembly, Web Workers,
-    Promises, async iteration, unicode regular expressions, and JavaScript parsing.
-    </p>
-    
-    <p>
-    Note that scores from JetStream 2 are not comparable to scores to other versions
-    of any JetStream benchmark.
-    </p>
</del><ins>+        <p>
+        All but one of JetStream'2 JavaScript benchmarks run for N iterations, where
+        N is usually 120. JetStream 2 reports the startup score as the time it takes to run the first iteration.
+        The worst case score is the average of the worst M iterations, excluding the first iteration.
+        M is always less than N, and is usually 4. The average case score is the average
+        of all but the first iteration. These three scores are weighed equally using the geometric
+        mean.
+        </p>
</ins><span class="cx"> 
</span><del>-    <h3>
-    JetStream 2 has 64 subtests:
-    </h3>
-    
-    <dl>
</del><ins>+        <p>
+        JetStream 2 also includes a JavaScript benchmark named WSL. WSL is an implementation of a
+        GPU shading language written in JavaScript. WSL does not use the above mechanism for scoring
+        because it has a long running time. Instead, the WSL benchmark computes its score as the
+        geometric mean over two metrics: the time it takes to compile the WSL standard library, and the time
+        it takes to run through the WSL specification test suite.
+        </p>
</ins><span class="cx"> 
</span><del>-    <a name="WSL">
-    <dt>WSL</dt>
-    <dd>
-     WSL is an implementation of a GPU shading language written in JavaScript. 
-     WSL measures the time it takes to compile the WSL standard library and the time
-     it takes to run through the WSL specification test suite.
-     Source code: <a href="WSL">WSL</a>
-    </dd>
</del><ins>+        <p>
+        JetStream 2 includes parts of these benchmark suites that came before it: <a href="https://webkit.org/perf/sunspider/sunspider.html">SunSpider</a>,
+        <a href="https://developers.google.com/octane/">Octane 2</a>, <a href="https://browserbench.org/JetStream/">JetStream 1</a>,
+        <a href="https://browserbench.org/ARES-6/">ARES-6</a>, and <a href="https://v8.github.io/web-tooling-benchmark/">Web Tooling Benchmark</a>.
+        JetStream 2 also includes new benchmarks inspired by <a href="https://krakenbenchmark.mozilla.org">Kraken</a>.
+        JetStream 2 also includes a new set of benchmarks that measure the performance of Web Assembly, Web Workers,
+        Promises, async iteration, unicode regular expressions, and JavaScript parsing.
+        </p>
</ins><span class="cx"> 
</span><del>-    <a name="UniPoker">
-    <dt>UniPoker</dt>
-    <dd>
-     UniPoker is a 5 card stud poker simulation using the Unicode playing card code points, U+1F0A1..U+1F0DE,
-     as the card representation in code. Scoring of hands is done with three regular expressions, one to check
-     for a flush, one to check for straights, and one to check for pairs, three of a kind, and four of a kind.
-     Source code: <a href="RexBench/UniPoker/poker.js">poker.js</a>
-    </dd>
</del><ins>+        <p>
+        Note that scores from JetStream 2 are not comparable to scores to other versions
+        of any JetStream benchmark.
+        </p>
</ins><span class="cx"> 
</span><del>-    <a name="uglify-js-wtb">
-    <dt>uglify-js-wtb</dt>
-    <dd>
-     <a href="https://github.com/mishoo/UglifyJS2">UglifyJS</a> is a JavaScript parser, minifier, compressor, and beautifier toolkit. It is commonly
-     used to minimize JavaScript bundles.
-     This benchmark runs UglifyJS on test JavaScript programs.
-     This benchmark stresses string manipulation and regular expression performance.
-     A similar version of this benchmark was previously published in the Web Tooling Benchmark.
-     Source code: <a href="web-tooling-benchmark/browser.js">uglify.js</a>
-    </dd>
</del><ins>+        <h3>
+        JetStream 2 has 64 subtests:
+        </h3>
</ins><span class="cx"> 
</span><del>-    <a name="typescript">
-    <dt>typescript</dt>
-    <dd>
-     Tests how quickly Microsoft's <a href="http://www.typescriptlang.org">TypeScript</a> compiler can
-     compile itself. More than anything else, this tests how quickly a JavaScript runtime can optimize
-     a large pile of code.
-     A similar version of this benchmark was previously published in Octane version 2.
-     Source code: <a href="Octane/typescript.js">typescript.js</a>
-    </dd>
</del><ins>+        <dl>
</ins><span class="cx"> 
</span><del>-    <a name="tsf-wasm">
-    <dt>tsf-wasm</dt>
-    <dd>
-     Runs Filip Pizlo's &mdash; of the WebKit team &mdash; implementation of a <a href="http://www.filpizlo.com/tsf/"> Typed Stream Format </a>
-     in Web Assembly. The original code is compiled from C to Web Assembly using <a href="https://emscripten.org">Emscripten</a>.
-     Source code: <a href="wasm/TSF">TSF</a>
-    </dd>
-    
-    <a name="tagcloud-SP">
-    <dt>tagcloud-SP</dt>
-    <dd>
-     Parses JSON and generates markup for a <a href="http://en.wikipedia.org/wiki/Tag_cloud">tag
-     cloud</a> view of the data. Written by Maciej Stachowiak of the WebKit team. Exercises string
-     parsing and manipulation. A similar version of this benchmark was originally published in SunSpider.
-     Source code: <a href="SunSpider/tagcloud.js">tagcloud.js</a>
-    </dd>
</del><ins>+        <dt id="WSL">WSL</dt>
+        <dd>
+         WSL is an implementation of a GPU shading language written in JavaScript.
+         WSL measures the time it takes to compile the WSL standard library and the time
+         it takes to run through the WSL specification test suite.
+         Source code: <a href="WSL">WSL</a>
+        </dd>
</ins><span class="cx"> 
</span><del>-    <a name="string-unpack-code-SP">
-    <dt>string-unpack-code-SP</dt>
-    <dd>
-     This benchmark unpacks various minified JavaScript libraries. It stresses the speed of various string manipulation
-     operations.
-     A similar version of this benchmark was previously published in SunSpider.
-     Source code: <a href="SunSpider/string-unpack-code.js">string-unpack-code.js</a>
-    </dd>
</del><ins>+        <dt id="UniPoker">UniPoker</dt>
+        <dd>
+         UniPoker is a 5 card stud poker simulation using the Unicode playing card code points, U+1F0A1..U+1F0DE,
+         as the card representation in code. Scoring of hands is done with three regular expressions, one to check
+         for a flush, one to check for straights, and one to check for pairs, three of a kind, and four of a kind.
+         Source code: <a href="RexBench/UniPoker/poker.js">poker.js</a>
+        </dd>
</ins><span class="cx"> 
</span><del>-    <a name="stanford-crypto-sha256">
-    <dt>stanford-crypto-sha256</dt>
-    <dd>
-     Measures the performance of the <a href="https://en.wikipedia.org/wiki/SHA-2">SHA256</a> hashing algorithm as implemented by the <a href="https://crypto.stanford.edu/sjcl/">Stanford JavaScript Crypto Library</a>. This benchmark stresses numeric analysis and array access.
-     This benchmark was inspired by a similar benchmark in the Kraken benchmark suite.
-     Source code: <a href="SeaMonster/stanford-crypto-sha256.js">stanford-crypto-sha256.js</a>
-    </dd>
</del><ins>+        <dt id="uglify-js-wtb">uglify-js-wtb</dt>
+        <dd>
+         <a href="https://github.com/mishoo/UglifyJS2">UglifyJS</a> is a JavaScript parser, minifier, compressor, and beautifier toolkit. It is commonly
+         used to minimize JavaScript bundles.
+         This benchmark runs UglifyJS on test JavaScript programs.
+         This benchmark stresses string manipulation and regular expression performance.
+         A similar version of this benchmark was previously published in the Web Tooling Benchmark.
+         Source code: <a href="web-tooling-benchmark/browser.js">uglify.js</a>
+        </dd>
</ins><span class="cx"> 
</span><del>-    <a name="stanford-crypto-pbkdf2">
-    <dt>stanford-crypto-pbkdf2</dt>
-    <dd>
-     Measures the performance of the <a href="https://en.wikipedia.org/wiki/PBKDF2">PBKDF2</a> hashing algorithm as implemented by the <a href="https://crypto.stanford.edu/sjcl/">Stanford JavaScript Crypto Library</a>. This benchmark stresses numeric analysis and array access.
-     This benchmark was inspired by a similar benchmark in the Kraken benchmark suite.
-     Source code: <a href="SeaMonster/stanford-crypto-pbkdf2.js">stanford-crypto-pbkdf2.js</a>
-    </dd>
</del><ins>+        <dt id="typescript">typescript</dt>
+        <dd>
+         Tests how quickly Microsoft's <a href="http://www.typescriptlang.org">TypeScript</a> compiler can
+         compile itself. More than anything else, this tests how quickly a JavaScript runtime can optimize
+         a large pile of code.
+         A similar version of this benchmark was previously published in Octane version 2.
+         Source code: <a href="Octane/typescript.js">typescript.js</a>
+        </dd>
</ins><span class="cx"> 
</span><del>-    <a name="stanford-crypto-aes">
-    <dt>stanford-crypto-aes</dt>
-    <dd>
-    Measures the performance of the <a href="https://en.wikipedia.org/wiki/Advanced_Encryption_Standard">AES</a> hashing algorithm as implemented by the <a href="https://crypto.stanford.edu/sjcl/">Stanford JavaScript Crypto Library</a>. This benchmark stresses numeric analysis and array access.
-     This benchmark was inspired by a similar benchmark in the Kraken benchmark suite.
-     Source code: <a href="SeaMonster/stanford-crypto-aes.js">stanford-crypto-aes.js</a>
-    </dd>
</del><ins>+        <dt id="tsf-wasm">tsf-wasm</dt>
+        <dd>
+         Runs Filip Pizlo's &mdash; of the WebKit team &mdash; implementation of a <a href="http://www.filpizlo.com/tsf/"> Typed Stream Format </a>
+         in Web Assembly. The original code is compiled from C to Web Assembly using <a href="https://emscripten.org">Emscripten</a>.
+         Source code: <a href="wasm/TSF">TSF</a>
+        </dd>
</ins><span class="cx"> 
</span><del>-    <a name="splay">
-    <dt>splay</dt>
-    <dd>
-      Tests the manipulation of <a href="http://en.wikipedia.org/wiki/Splay_tree">splay trees</a>
-      represented using plain JavaScript objects. This benchmark stresses the performance of the garbage collector.
-      A similar version of this benchmark was previously published in Octane version 2.
-      Source code: <a href="Octane/splay.js">splay.js</a>
-    </dd>
-    
-    <a name="segmentation">
-    <dt>segmentation</dt>
-    <dd>
-     Uses Web Workers to parallelize the computation of a <a href="https://en.wikipedia.org/wiki/Time-series_segmentation">
-     time series segmentation</a> algorithm over a sample data set. This code is adapted from an algorithm used in the <a href="https://perf.webkit.org/v3/">
-     WebKit performance dashboard.</a>
-     Source code: <a href="worker/segmentation.js">segmentation.js</a>
-    </dd>
</del><ins>+        <dt id="tagcloud-SP">tagcloud-SP</dt>
+        <dd>
+         Parses JSON and generates markup for a <a href="http://en.wikipedia.org/wiki/Tag_cloud">tag
+         cloud</a> view of the data. Written by Maciej Stachowiak of the WebKit team. Exercises string
+         parsing and manipulation. A similar version of this benchmark was originally published in SunSpider.
+         Source code: <a href="SunSpider/tagcloud.js">tagcloud.js</a>
+        </dd>
</ins><span class="cx"> 
</span><del>-    <a name="richards">
-    <dt>richards</dt>
-    <dd>
-     Martin Richard's <a href="http://www.cl.cam.ac.uk/~mr10/Bench.html">system language
-     benchmark</a> ported to JavaScript. Tests object property access performance.
-     A similar version of this benchmark was previously published in Octane version 2.
-     Source code: <a href="Octane/richards.js">richards.js</a>
-    </dd>
</del><ins>+        <dt id="string-unpack-code-SP">string-unpack-code-SP</dt>
+        <dd>
+         This benchmark unpacks various minified JavaScript libraries. It stresses the speed of various string manipulation
+         operations.
+         A similar version of this benchmark was previously published in SunSpider.
+         Source code: <a href="SunSpider/string-unpack-code.js">string-unpack-code.js</a>
+        </dd>
</ins><span class="cx"> 
</span><del>-    <a name="richards-wasm">
-    <dt>richards-wasm</dt>
-    <dd>
-     Martin Richard's <a href="http://www.cl.cam.ac.uk/~mr10/Bench.html">system language
-     benchmark</a> compiled to a hybrid of Web Assembly and JavaScript. It stresses how quickly
-     JavaScript can call into Web Assembly code.
-     Source code: <a href="wasm/richards.c">richards.c</a>, <a href="wasm/richards.js">richards.js</a>
-    </dd>
</del><ins>+        <dt id="stanford-crypto-sha256">stanford-crypto-sha256</dt>
+        <dd>
+         Measures the performance of the <a href="https://en.wikipedia.org/wiki/SHA-2">SHA256</a> hashing algorithm as implemented by the <a href="https://crypto.stanford.edu/sjcl/">Stanford JavaScript Crypto Library</a>. This benchmark stresses numeric analysis and array access.
+         This benchmark was inspired by a similar benchmark in the Kraken benchmark suite.
+         Source code: <a href="SeaMonster/stanford-crypto-sha256.js">stanford-crypto-sha256.js</a>
+        </dd>
</ins><span class="cx"> 
</span><del>-    <a name="regexp">
-    <dt>regexp</dt>
-    <dd>
-     Collection of regular expressions found by the V8 team in 2010, curated into a benchmark.
-     A similar version of this benchmark was previously published in Octane version 2.
-     Source code: <a href="Octane/regexp.js">regexp.js</a>
-    </dd>
</del><ins>+        <dt id="stanford-crypto-pbkdf2">stanford-crypto-pbkdf2</dt>
+        <dd>
+         Measures the performance of the <a href="https://en.wikipedia.org/wiki/PBKDF2">PBKDF2</a> hashing algorithm as implemented by the <a href="https://crypto.stanford.edu/sjcl/">Stanford JavaScript Crypto Library</a>. This benchmark stresses numeric analysis and array access.
+         This benchmark was inspired by a similar benchmark in the Kraken benchmark suite.
+         Source code: <a href="SeaMonster/stanford-crypto-pbkdf2.js">stanford-crypto-pbkdf2.js</a>
+        </dd>
</ins><span class="cx"> 
</span><del>-    <a name="regex-dna-SP">
-    <dt>regex-dna-SP</dt>
-    <dd>
-     Regular-expression-based solution to DNA manipulation from
-     <a href="https://en.wikipedia.org/wiki/The_Computer_Language_Benchmarks_Game">The Great Computer Language Shootout</a>,
-     contributed by Jesse Millikan.
-     A similar version of this benchmark was previously published in SunSpider.
-     Source code: <a href="SunSpider/regex-dna.js">regex-dna.js</a>
-    </dd>
</del><ins>+        <dt id="stanford-crypto-aes">stanford-crypto-aes</dt>
+        <dd>
+        Measures the performance of the <a href="https://en.wikipedia.org/wiki/Advanced_Encryption_Standard">AES</a> hashing algorithm as implemented by the <a href="https://crypto.stanford.edu/sjcl/">Stanford JavaScript Crypto Library</a>. This benchmark stresses numeric analysis and array access.
+         This benchmark was inspired by a similar benchmark in the Kraken benchmark suite.
+         Source code: <a href="SeaMonster/stanford-crypto-aes.js">stanford-crypto-aes.js</a>
+        </dd>
</ins><span class="cx"> 
</span><del>-    <a name="raytrace">
-    <dt>raytrace</dt>
-    <dd>
-    <a href="https://en.wikipedia.org/wiki/Ray_tracing_(graphics)">Ray tracer</a> written in JavaScript using prototype.js. Tests object construction performance
-     and floating point math.
-     A similar version of this benchmark was previously published in Octane version 2.
-     Source code: <a href="Octane/raytrace.js">raytrace.js</a>
-    </dd>
</del><ins>+        <dt id="splay">splay</dt>
+        <dd>
+          Tests the manipulation of <a href="http://en.wikipedia.org/wiki/Splay_tree">splay trees</a>
+          represented using plain JavaScript objects. This benchmark stresses the performance of the garbage collector.
+          A similar version of this benchmark was previously published in Octane version 2.
+          Source code: <a href="Octane/splay.js">splay.js</a>
+        </dd>
</ins><span class="cx"> 
</span><del>-    <a name="quicksort-wasm">
-    <dt>quicksort-wasm</dt>
-    <dd>
-     Quicksort benchmark, compiled to Web Assembly with <a href="https://emscripten.org">Emscripten</a>.
-     The original C version of this benchmark was previously published in the LLVM test suite.
-     Source code: <a href="wasm/quicksort.c">quicksort.c</a>, <a href="wasm/quicksort.js">quicksort.js</a>
-    </dd>
-    
-    <a name="prepack-wtb">
-    <dt>prepack-wtb</dt>
-    <dd>
-    <a href="https://prepack.io">Prepack</a> is a tool that optimizes JavaScript source code by performing computations at compile
-     time instead of run time where possible.
-     This benchmark runs Prepack on test JavaScript programs.
-     This benchmark stresses string manipulation and regular expression performance.
-     A similar version of this benchmark was previously published in the Web Tooling Benchmark.
-     Source code: <a href="web-tooling-benchmark/browser.js">prepack.js</a>
-    </dd>
</del><ins>+        <dt id="segmentation">segmentation</dt>
+        <dd>
+         Uses Web Workers to parallelize the computation of a <a href="https://en.wikipedia.org/wiki/Time-series_segmentation">
+         time series segmentation</a> algorithm over a sample data set. This code is adapted from an algorithm used in the <a href="https://perf.webkit.org/v3/">
+         WebKit performance dashboard.</a>
+         Source code: <a href="worker/segmentation.js">segmentation.js</a>
+        </dd>
</ins><span class="cx"> 
</span><del>-    <a name="pdfjs">
-    <dt>pdfjs</dt>
-    <dd>
-     Mozilla's <a href="http://mozilla.github.io/pdf.js/">PDF reader written in JavaScript</a>.
-     This benchmark emphasizes array manipulation and bit operations.
-     A similar version of this benchmark was previously published in Octane version 2.
-     Source code: <a href="Octane/pdfjs.js">pdfjs.js</a>
-    </dd>
</del><ins>+        <dt id="richards">richards</dt>
+        <dd>
+         Martin Richard's <a href="http://www.cl.cam.ac.uk/~mr10/Bench.html">system language
+         benchmark</a> ported to JavaScript. Tests object property access performance.
+         A similar version of this benchmark was previously published in Octane version 2.
+         Source code: <a href="Octane/richards.js">richards.js</a>
+        </dd>
</ins><span class="cx"> 
</span><del>-    <a name="OfflineAssembler">
-    <dt>OfflineAssembler</dt>
-    <dd>
-    Offline Assembler is the lexer, parser, and AST layer of the offline assembler for <a href="https://trac.webkit.org/wiki/JavaScriptCore">JavaScriptCore</a>. 
-     It has been ported to JavaScript from the original Ruby implementation. This test stresses regular expression
-     performance.
-     Source code: <a href="RexBench/OfflineAssembler/parser.js">OfflineAssembler.js</a>
-    </dd>
-    
-    <a name="octane-zlib">
-    <dt>octane-zlib</dt>
-    <dd>
-     A benchmark based on compiling <a href="http://zlib.net">zlib</a> to JavaScript using
-     <a href="https://emscripten.org">Emscripten</a>. Based on the
-     <a href="https://github.com/kripken/emscripten/tree/master/tests/zlib">zlib emscripten test</a>
-     but modified to restrict code caching opportunities. 
-     A similar version of this benchmark was previously published in Octane version 2.
-     Source code: <a href="Octane/zlib.js">zlib.js</a>
-    </dd>
</del><ins>+        <dt id="richards-wasm">richards-wasm</dt>
+        <dd>
+         Martin Richard's <a href="http://www.cl.cam.ac.uk/~mr10/Bench.html">system language
+         benchmark</a> compiled to a hybrid of Web Assembly and JavaScript. It stresses how quickly
+         JavaScript can call into Web Assembly code.
+         Source code: <a href="wasm/richards.c">richards.c</a>, <a href="wasm/richards.js">richards.js</a>
+        </dd>
</ins><span class="cx"> 
</span><del>-    <a name="octane-code-load">
-    <dt>octane-code-load</dt>
-    <dd>
-     Test of code load speed of the jQuery and Closure libraries. Because this test allows
-     caching, this is representative of revisiting the same website. 
-     A similar version of this benchmark was previously published in Octane version 2.
-     Source code: <a href="Octane/code-first-load.js">code-load.js</a>
-    </dd>
-    
-    <a name="navier-stokes">
-    <dt>navier-stokes</dt>
-    <dd>
-     Fluid simulation written by <a href="https://nerget.com">Oliver Hunt</a>. Emphasizes floating point array performance.
-     A similar version of this benchmark was previously published in Octane version 2.
-     Source code: <a href="Octane/navier-stokes.js">navier-stokes.js</a>
-    </dd>
</del><ins>+        <dt id="regexp">regexp</dt>
+        <dd>
+         Collection of regular expressions found by the V8 team in 2010, curated into a benchmark.
+         A similar version of this benchmark was previously published in Octane version 2.
+         Source code: <a href="Octane/regexp.js">regexp.js</a>
+        </dd>
</ins><span class="cx"> 
</span><del>-    <a name="n-body-SP">
-    <dt>n-body-SP</dt>
-    <dd>
-     Classic solar system simulation benchmark from
-     <a href="https://en.wikipedia.org/wiki/The_Computer_Language_Benchmarks_Game">The Great Computer Language Shootout</a>,
-     contributed by Isaac Guy. Tests math and object access performance. 
-     A similar version of this benchmark was previously published in SunSpider.
-     Source code: <a href="SunSpider/n-body.js">n-body.js</a>
-    </dd>
-    
-    <a name="multi-inspector-code-load">
-    <dt>multi-inspector-code-load</dt>
-    <dd>
-     Measures the repeated parsing of a modern JavaScript code base: WebKit's Web Inspector.
-     Because this test allows caching, this is representative of revisiting the same website.
-     Source code: <a href="code-load/code-multi-load.js">code-multi-load.js</a>
-    </dd>
</del><ins>+        <dt id="regex-dna-SP">regex-dna-SP</dt>
+        <dd>
+         Regular-expression-based solution to DNA manipulation from
+         <a href="https://en.wikipedia.org/wiki/The_Computer_Language_Benchmarks_Game">The Great Computer Language Shootout</a>,
+         contributed by Jesse Millikan.
+         A similar version of this benchmark was previously published in SunSpider.
+         Source code: <a href="SunSpider/regex-dna.js">regex-dna.js</a>
+        </dd>
</ins><span class="cx"> 
</span><del>-    <a name="ML">
-    <dt>ML</dt>
-    <dd>
-     ML is an implementation of a <a href="https://en.wikipedia.org/wiki/Feedforward_neural_network"> feedforward neural network.</a>
-     The benchmark trains several networks using different <a href="https://en.wikipedia.org/wiki/Activation_function">activation functions</a>
-     and several sample data sets. ML makes heavy use of classes. It relies on the ml-matrix library and does non-trivial matrix math.
-     This benchmark was previously published in ARES-6.
-     Source code: <a href="ARES-6/ml">ML</a>
-    </dd>
-    
-    <a name="mandreel">
-    <dt>mandreel</dt>
-    <dd>
-     Tests the <a href="http://bulletphysics.org/">Bullet</a> physics engine.
-     The physics engine is compiled to JavaScript with <a href="http://www.mandreel.com">Mandreel</a>.
-     A similar version of this benchmark was previously published in Octane version 2.
-     Source code: <a href="Octane/mandreel.js">mandreel.js</a>
-    </dd>
</del><ins>+        <dt id="raytrace">raytrace</dt>
+        <dd>
+        <a href="https://en.wikipedia.org/wiki/Ray_tracing_(graphics)">Ray tracer</a> written in JavaScript using prototype.js. Tests object construction performance
+         and floating point math.
+         A similar version of this benchmark was previously published in Octane version 2.
+         Source code: <a href="Octane/raytrace.js">raytrace.js</a>
+        </dd>
</ins><span class="cx"> 
</span><del>-    <a name="lebab-wtb">
-    <dt>lebab-wtb</dt>
-    <dd>
-     <a href="https://github.com/lebab/lebab">Lebab</a> transpiles ES5 code into ES6/ES7.
-     This benchmark runs Lebab on test JavaScript programs.
-     This benchmark stresses string manipulation and regular expression performance.
-     A similar version of this benchmark was previously published in the Web Tooling Benchmark.
-     Source code: <a href="web-tooling-benchmark/browser.js">lebab.js</a>
-    </dd>
</del><ins>+        <dt id="quicksort-wasm">quicksort-wasm</dt>
+        <dd>
+         Quicksort benchmark, compiled to Web Assembly with <a href="https://emscripten.org">Emscripten</a>.
+         The original C version of this benchmark was previously published in the LLVM test suite.
+         Source code: <a href="wasm/quicksort.c">quicksort.c</a>, <a href="wasm/quicksort.js">quicksort.js</a>
+        </dd>
</ins><span class="cx"> 
</span><del>-    <a name="json-stringify-inspector">
-    <dt>json-stringify-inspector</dt>
-    <dd>
-     Measures JSON.stringify performance on a set of objects that WebKit's Web Inspector
-     stringifies when communicating between the UI and web pages.
-     This benchmark was inspired by a similar benchmark in the Kraken benchmark suite.
-     Source code: <a href="SeaMonster/json-stringify-inspector.js">json-stringify-inspector.js</a>
-    </dd>
</del><ins>+        <dt id="prepack-wtb">prepack-wtb</dt>
+        <dd>
+        <a href="https://prepack.io">Prepack</a> is a tool that optimizes JavaScript source code by performing computations at compile
+         time instead of run time where possible.
+         This benchmark runs Prepack on test JavaScript programs.
+         This benchmark stresses string manipulation and regular expression performance.
+         A similar version of this benchmark was previously published in the Web Tooling Benchmark.
+         Source code: <a href="web-tooling-benchmark/browser.js">prepack.js</a>
+        </dd>
</ins><span class="cx"> 
</span><del>-    <a name="json-parse-inspector">
-    <dt>json-parse-inspector</dt>
-    <dd>
-     Measures JSON.parse performance on a set of objects that WebKit's Web Inspector
-     parses when communicating between the UI and web pages.
-     This benchmark was inspired by a similar benchmark in the Kraken benchmark suite.
-     Source code: <a href="SeaMonster/json-parse-inspector.js">json-parse-inspector.js</a>
-    </dd>
</del><ins>+        <dt id="pdfjs">pdfjs</dt>
+        <dd>
+         Mozilla's <a href="http://mozilla.github.io/pdf.js/">PDF reader written in JavaScript</a>.
+         This benchmark emphasizes array manipulation and bit operations.
+         A similar version of this benchmark was previously published in Octane version 2.
+         Source code: <a href="Octane/pdfjs.js">pdfjs.js</a>
+        </dd>
</ins><span class="cx"> 
</span><del>-    <a name="jshint-wtb">
-    <dt>jshint-wtb</dt>
-    <dd>
-     <a href="https://jshint.com">JSHint</a> is a static analysis tool that warns about errors
-    and potential problems in JavaScript programs.
-     This benchmark runs JSHint on test JavaScript programs.
-     This benchmark stresses string manipulation and regular expression performance.
-     A similar version of this benchmark was previously published in the Web Tooling Benchmark.
-     Source code: <a href="web-tooling-benchmark/browser.js">jshint.js</a>
-    </dd>
</del><ins>+        <dt id="OfflineAssembler">OfflineAssembler</dt>
+        <dd>
+        Offline Assembler is the lexer, parser, and AST layer of the offline assembler for <a href="https://trac.webkit.org/wiki/JavaScriptCore">JavaScriptCore</a>.
+         It has been ported to JavaScript from the original Ruby implementation. This test stresses regular expression
+         performance.
+         Source code: <a href="RexBench/OfflineAssembler/parser.js">OfflineAssembler.js</a>
+        </dd>
</ins><span class="cx"> 
</span><del>-    <a name="HashSet-wasm">
-    <dt>HashSet-wasm</dt>
-    <dd>
-     A Web Assembly benchmark replaying a set of hash table operations performed in WebKit when loading
-     a web page. This benchmark was compiled from C++ to Web Assembly using <a href="https://emscripten.org">Emscripten</a>.
-     Source code: <a href="wasm/HashSet.cpp">HashSet.cpp</a>, <a href="wasm/HashSet.js">HashSet.js</a>
-    </dd>
</del><ins>+        <dt id="octane-zlib">octane-zlib</dt>
+        <dd>
+         A benchmark based on compiling <a href="http://zlib.net">zlib</a> to JavaScript using
+         <a href="https://emscripten.org">Emscripten</a>. Based on the
+         <a href="https://github.com/kripken/emscripten/tree/master/tests/zlib">zlib emscripten test</a>
+         but modified to restrict code caching opportunities.
+         A similar version of this benchmark was previously published in Octane version 2.
+         Source code: <a href="Octane/zlib.js">zlib.js</a>
+        </dd>
</ins><span class="cx"> 
</span><del>-    <a name="hash-map">
-    <dt>hash-map</dt>
-    <dd>
-     Apache Harmony java.util.HashMap implementation ported to JavaScript and benchmarked by
-     doing hash table insertions, queries, and then iterating the associated entrySet. Tests
-     object-oriented JavaScript idioms and object construction. A similar JavaScript version
-     of this benchmark was originally published as part of the WebKit test suite.
-     Source code: <a href="simple/hash-map.js">hash-map.js</a>
-    </dd>
-    
-    <a name="gcc-loops-wasm">
-    <dt>gcc-loops-wasm</dt>
-    <dd>
-     Example loops used to tune the GCC and LLVM vectorizers, compiled to Web Assembly with
-     <a href="https://emscripten.org">Emscripten</a>. The original C++ version of this benchmark was previously published in the LLVM test suite.
-     Source code: <a href="wasm/gcc-loops.cpp">gcc-loops.cpp</a>, <a href="wasm/gcc-loops.js">gcc-loops.js</a>
-    </dd>
-    
-    <a name="gbemu">
-    <dt>gbemu</dt>
-    <dd>
-     Gameboy emulator written in JavaScript. Tests typed array and
-     property access performance. 
-     A similar version of this benchmark was previously published in Octane version 2.
-     Source code: <a href="Octane/gbemu-part1.js">gbemu-part1.js</a>, <a href="Octane/gbemu-part2.js">gbemu-part2.js</a>
-    </dd>
-    
-    <a name="gaussian-blur">
-    <dt>gaussian-blur</dt>
-    <dd>
-     Tests the performance of a JavaScript implementation of <a href="https://en.wikipedia.org/wiki/Gaussian_blur">gaussian
-     blur</a> on a test image. Tests numeric analysis speed and uses typed arrays.
-     This benchmark was inspired by a similar benchmark in the Kraken benchmark suite.
-     Source code: <a href="SeaMonster/gaussian-blur.js">gaussian-blur.js</a>
-    </dd>
</del><ins>+        <dt id="octane-code-load">octane-code-load</dt>
+        <dd>
+         Test of code load speed of the jQuery and Closure libraries. Because this test allows
+         caching, this is representative of revisiting the same website.
+         A similar version of this benchmark was previously published in Octane version 2.
+         Source code: <a href="Octane/code-first-load.js">code-load.js</a>
+        </dd>
</ins><span class="cx"> 
</span><del>-    <a name="float-mm.c">
-    <dt>float-mm.c</dt>
-    <dd>
-     Floating point matrix multiply benchmark, compiled to JavaScript with <a href="https://emscripten.org">Emscripten</a>.
-     The original C version of this benchmark was previously published in the LLVM test suite.
-     Source code: <a href="simple/float-mm.c">float-mm.c</a>, <a href="simple/float-mm.c.js">float-mm.c.js</a>
-    </dd>
</del><ins>+        <dt id="navier-stokes">navier-stokes</dt>
+        <dd>
+         Fluid simulation written by <a href="https://nerget.com">Oliver Hunt</a>. Emphasizes floating point array performance.
+         A similar version of this benchmark was previously published in Octane version 2.
+         Source code: <a href="Octane/navier-stokes.js">navier-stokes.js</a>
+        </dd>
</ins><span class="cx"> 
</span><del>-    <a name="FlightPlanner">
-    <dt>FlightPlanner</dt>
-    <dd>
-      Flight Planner is a benchmark taken from a flight management web application.
-      Flight Planner parses aircraft flight plans and computes distance, courses, and elapsed times for legs of flight plans.
-      It uses FAA data for airports, navigation aids, and airways. The flight management app was originally written to help
-      compete in a flying proficiency event. It stresses regular expression performance.
-     Source code: <a href="RexBench/FlightPlanner/flight_planner.js">flight_planner.js</a>
-    </dd>
</del><ins>+        <dt id="n-body-SP">n-body-SP</dt>
+        <dd>
+         Classic solar system simulation benchmark from
+         <a href="https://en.wikipedia.org/wiki/The_Computer_Language_Benchmarks_Game">The Great Computer Language Shootout</a>,
+         contributed by Isaac Guy. Tests math and object access performance.
+         A similar version of this benchmark was previously published in SunSpider.
+         Source code: <a href="SunSpider/n-body.js">n-body.js</a>
+        </dd>
</ins><span class="cx"> 
</span><del>-    <a name="first-inspector-code-load">
-    <dt>first-inspector-code-load</dt>
-    <dd>
-     Measures the first-time parsing of a modern JavaScript code base: WebKit's Web Inspector.
-     This models the parsing time of visiting a web site for the first time.
-     Source code: <a href="code-load/code-first-load.js">code-first-load.js</a>
-    </dd>
</del><ins>+        <dt id="multi-inspector-code-load">multi-inspector-code-load</dt>
+        <dd>
+         Measures the repeated parsing of a modern JavaScript code base: WebKit's Web Inspector.
+         Because this test allows caching, this is representative of revisiting the same website.
+         Source code: <a href="code-load/code-multi-load.js">code-multi-load.js</a>
+        </dd>
</ins><span class="cx"> 
</span><del>-    <a name="espree-wtb">
-    <dt>espree-wtb</dt>
-    <dd>
-    <a href="https://github.com/eslint/espree">Espree</a> is a JavaScript parser written in JavaScript.
-     This benchmark runs Espree on test JavaScript programs.
-     This benchmark stresses string manipulation and regular expression performance.
-     A similar version of this benchmark was previously published in the Web Tooling Benchmark.
-     Source code: <a href="web-tooling-benchmark/browser.js">espree.js</a>
-    </dd>
</del><ins>+        <dt id="ML">ML</dt>
+        <dd>
+         ML is an implementation of a <a href="https://en.wikipedia.org/wiki/Feedforward_neural_network"> feedforward neural network.</a>
+         The benchmark trains several networks using different <a href="https://en.wikipedia.org/wiki/Activation_function">activation functions</a>
+         and several sample data sets. ML makes heavy use of classes. It relies on the ml-matrix library and does non-trivial matrix math.
+         This benchmark was previously published in ARES-6.
+         Source code: <a href="ARES-6/ml">ML</a>
+        </dd>
</ins><span class="cx"> 
</span><del>-    <a name="earley-boyer">
-    <dt>earley-boyer</dt>
-    <dd>
-     Tests two classic Scheme benchmarks translated to JavaScript using scheme2js. The first
-     benchmark is Earley, is a chart parser algorithm created by Jay Earley. The second is
-     Boyer, a logic programming benchmark by Bob Boyer. Measures variadic functions and object
-     construction.
-     A similar version of this benchmark was previously published in Octane version 2.
-     Source code: <a href="Octane/earley-boyer.js">earley-boyer.js</a>
-    </dd>
-    
-    <a name="delta-blue">
-    <dt>delta-blue</dt>
-    <dd>
-     The classic DeltaBlue benchmark derived from a Smalltalk implementation by Maloney and
-     Wolczko. Tests devirtualization of JavaScript code that uses an idiomatic class hierarchy
-     construction.
-     A similar version of this benchmark was previously published in Octane version 2.
-     Source code: <a href="Octane/deltablue.js">deltablue.js</a>
-    </dd>
</del><ins>+        <dt id="mandreel">mandreel</dt>
+        <dd>
+         Tests the <a href="http://bulletphysics.org/">Bullet</a> physics engine.
+         The physics engine is compiled to JavaScript with <a href="http://www.mandreel.com">Mandreel</a>.
+         A similar version of this benchmark was previously published in Octane version 2.
+         Source code: <a href="Octane/mandreel.js">mandreel.js</a>
+        </dd>
</ins><span class="cx"> 
</span><del>-    <a name="date-format-xparb-SP">
-    <dt>date-format-xparb-SP</dt>
-    <dd>
-     Sophisticated date formatting and parsing library test, based on code by Barin Schwartz.
-     A similar version of this benchmark was previously published in SunSpider.
-     Source code: <a href="SunSpider/date-format-xparb.js">date-format-xparb.js</a>
-    </dd>
-    
-    <a name="date-format-tofte-SP">
-    <dt>date-format-tofte-SP</dt>
-    <dd>
-     Date and time formatting test, based on code by Svend Tofte. Involves an interesting use
-     of <code>eval</code> and also covers string manipulation and JavaScript library functions.
-     A similar version of this benchmark was previously published in SunSpider.
-     Source code: <a href="SunSpider/date-format-tofte.js">date-format-tofte.js</a>
-    </dd>
-    
-    <a name="crypto-sha1-SP">
-    <dt>crypto-sha1-SP</dt>
-    <dd>
-     <a href="http://en.wikipedia.org/wiki/Sha1">SHA-1</a> implementation in JavaScript by
-     Paul Johnston and others. Tests interesting integer math idioms. 
-     A similar version of this benchmark was previously published in SunSpider.
-     Source code: <a href="SunSpider/crypto-sha1.js">crypto-sha1.js</a>
-    </dd>
-    
-    <a name="crypto-md5-SP">
-    <dt>crypto-md5-SP</dt>
-    <dd>
-     <a href="http://en.wikipedia.org/wiki/Md5">MD5</a> implementation in JavaScript by
-     Paul Johnston and others. Tests interesting integer math idioms. 
-     A similar version of this benchmark was previously published in SunSpider.
-     Source code: <a href="SunSpider/crypto-md5.js">crypto-md5.js</a>
-    </dd>
-    
-    <a name="crypto-aes-SP">
-    <dt>crypto-aes-SP</dt>
-    <dd>
-     <a href="http://en.wikipedia.org/wiki/Advanced_Encryption_Standard"> AES</a> implementation
-     in JavaScript by Chris Veness. A newer version can be
-     found <a href="http://www.movable-type.co.uk/scripts/aes.html">here</a>. Tests integer math.
-     A similar version of this benchmark was previously published in SunSpider.
-     Source code: <a href="SunSpider/crypto-aes.js">crypto-aes.js</a>
-    </dd>
-    
-    <a name="crypto">
-    <dt>crypto</dt>
-    <dd>
-     RSA cypher implemented in JavaScript by Tom Wu. Tests integer math and arrays.
-     A similar version of this benchmark was previously published in Octane version 2.
-     Source code: <a href="Octane/crypto.js">crypto.js</a>
-    </dd>
-    
-    <a name="coffeescript-wtb">
-    <dt>coffeescript-wtb</dt>
-    <dd>
-     <a href="http://coffeescript.org/">CoffeeScript</a> is a programming language that attempts to expose the
-     good parts of JavaScript in a simple way.
-     This benchmark tests the CoffeeScript compiler on test programs.
-     This benchmark stresses string manipulation and regular expression performance.
-     A similar version of this benchmark was previously published in the Web Tooling Benchmark.
-     Source code: <a href="web-tooling-benchmark/browser.js">coffeescript.js</a>
-    </dd>
</del><ins>+        <dt id="lebab-wtb">lebab-wtb</dt>
+        <dd>
+         <a href="https://github.com/lebab/lebab">Lebab</a> transpiles ES5 code into ES6/ES7.
+         This benchmark runs Lebab on test JavaScript programs.
+         This benchmark stresses string manipulation and regular expression performance.
+         A similar version of this benchmark was previously published in the Web Tooling Benchmark.
+         Source code: <a href="web-tooling-benchmark/browser.js">lebab.js</a>
+        </dd>
</ins><span class="cx"> 
</span><del>-    <a name="chai-wtb">
-    <dt>chai-wtb</dt>
-    <dd>
-     <a href="http://chaijs.com/">Chai</a> is a <a href="https://codeutopia.net/blog/2015/03/01/unit-testing-tdd-and-bdd/">BDD / TDD</a> assertion library for
-     node.js and the browser. It is commonly used to write unit and integration tests.
-     A similar version of this benchmark was previously published in the Web Tooling Benchmark.
-     Source code: <a href="web-tooling-benchmark/browser.js">chai.js</a>
-    </dd>
-    
-    <a name="cdjs">
-    <dt>cdjs</dt>
-    <dd>
-     JavaScript implementation of the <a href="https://www.cs.purdue.edu/sss/projects/cdx/">CDx collision detection
-     benchmark</a>. Measures the performance of over 200 collision detection runs.
-     Source code: <a href="cdjs">cdjs</a>
-    </dd>
-    
-    <a name="box2d">
-    <dt>box2d</dt>
-    <dd>
-     The Box2D physics engine <a href="https://code.google.com/p/box2dweb/">ported to JavaScript</a>. Tests floating
-     point math and data structures. 
-     A similar version of this benchmark was previously published in Octane version 2.
-     Source code: <a href="Octane/box2d.js">box2d.js</a>
-    </dd>
</del><ins>+        <dt id="json-stringify-inspector">json-stringify-inspector</dt>
+        <dd>
+         Measures JSON.stringify performance on a set of objects that WebKit's Web Inspector
+         stringifies when communicating between the UI and web pages.
+         This benchmark was inspired by a similar benchmark in the Kraken benchmark suite.
+         Source code: <a href="SeaMonster/json-stringify-inspector.js">json-stringify-inspector.js</a>
+        </dd>
</ins><span class="cx"> 
</span><del>-    <a name="bomb-workers">
-    <dt>bomb-workers</dt>
-    <dd>
-     Tests running various subtests of the SunSpider benchmark in parallel using Web Workers.
-     Stresses the browser's ability to run JavaScript code in parallel.
-     Source code: <a href="worker/bomb.js">bomb.js</a>
-    </dd>
</del><ins>+        <dt id="json-parse-inspector">json-parse-inspector</dt>
+        <dd>
+         Measures JSON.parse performance on a set of objects that WebKit's Web Inspector
+         parses when communicating between the UI and web pages.
+         This benchmark was inspired by a similar benchmark in the Kraken benchmark suite.
+         Source code: <a href="SeaMonster/json-parse-inspector.js">json-parse-inspector.js</a>
+        </dd>
</ins><span class="cx"> 
</span><del>-    <a name="Basic">
-    <dt>Basic</dt>
-    <dd>
-     Basic is an ES2015 implementation of the <a href="http://www.ecma-international.org/publications/files/ECMA-ST-WITHDRAWN/ECMA-55,%201st%20Edition,%20January%201978.pdf">ECMA-55 BASIC standard</a>. 
-     Basic stresses performance of generator functions, classes, Map, and WeakMap.
-     The benchmark runs a handful of simple programs, the most complex of which finds prime numbers.
-     This benchmark was previously published in ARES-6.
-     Source code: <a href="ARES-6/Basic">Basic</a>
-    </dd>
</del><ins>+        <dt id="jshint-wtb">jshint-wtb</dt>
+        <dd>
+         <a href="https://jshint.com">JSHint</a> is a static analysis tool that warns about errors
+        and potential problems in JavaScript programs.
+         This benchmark runs JSHint on test JavaScript programs.
+         This benchmark stresses string manipulation and regular expression performance.
+         A similar version of this benchmark was previously published in the Web Tooling Benchmark.
+         Source code: <a href="web-tooling-benchmark/browser.js">jshint.js</a>
+        </dd>
</ins><span class="cx"> 
</span><del>-    <a name="base64-SP">
-    <dt>base64-SP</dt>
-    <dd>
-     Base64 encoder/decoder written in JavaScript, originally from the Mozilla XML-RPC client component.
-     Tests string manipulation. 
-     A similar version of this benchmark was previously published in SunSpider.
-     Source code: <a href="SunSpider/base64.js">base64.js</a>
-    </dd>
</del><ins>+        <dt id="HashSet-wasm">HashSet-wasm</dt>
+        <dd>
+         A Web Assembly benchmark replaying a set of hash table operations performed in WebKit when loading
+         a web page. This benchmark was compiled from C++ to Web Assembly using <a href="https://emscripten.org">Emscripten</a>.
+         Source code: <a href="wasm/HashSet.cpp">HashSet.cpp</a>, <a href="wasm/HashSet.js">HashSet.js</a>
+        </dd>
</ins><span class="cx"> 
</span><del>-    <a name="babylon-wtb">
-    <dt>babylon-wtb</dt>
-    <dd>
-     <a href="https://github.com/babel/babel/tree/master/packages/babel-parser">Babylon</a> is the frontend for the Babel transpiler.
-     It is a JavaScript parser written in JavaScript. It computes the Abstract Syntax Tree of the input JavaScript program.
-     This benchmark runs Babylon on test JavaScript programs.
-     This benchmark stresses string manipulation and regular expression performance.
-     A similar version of this benchmark was previously published in the Web Tooling Benchmark.
-     Source code: <a href="web-tooling-benchmark/browser.js">babylon.js</a>
-    </dd>
</del><ins>+        <dt id="hash-map">hash-map</dt>
+        <dd>
+         Apache Harmony java.util.HashMap implementation ported to JavaScript and benchmarked by
+         doing hash table insertions, queries, and then iterating the associated entrySet. Tests
+         object-oriented JavaScript idioms and object construction. A similar JavaScript version
+         of this benchmark was originally published as part of the WebKit test suite.
+         Source code: <a href="simple/hash-map.js">hash-map.js</a>
+        </dd>
</ins><span class="cx"> 
</span><del>-    <a name="Babylon">
-    <dt>Babylon</dt>
-    <dd>
-     <a href="https://github.com/babel/babylon">Babylon</a> is an implementation of a parser for the JavaScript language.
-     Babylon is the parser used in the <a href="https://babeljs.io/">Babel</a> JavaScript transpiler. The benchmark runs the
-     Babylon parser on four different JavaScript sources. Babylon makes heavy use of classes, does non trivial string processing,
-     and creates non-trivial object graphs.
-     This benchmark was previously published in ARES-6.
-     Source code: <a href="ARES-6/Babylon">Babylon</a>
-    </dd>
-    
-    <a name="async-fs">
-    <dt>async-fs</dt>
-    <dd>
-     This is an implementation of a mock file system that stresses the performance of DataView, Promises, and async
-     iteration. The benchmark simulates adding and removing files, and swapping the byte order of existing files.
-     Source code: <a href="simple/file-system.js">async-fs.js</a>
-    </dd>
</del><ins>+        <dt id="gcc-loops-wasm">gcc-loops-wasm</dt>
+        <dd>
+         Example loops used to tune the GCC and LLVM vectorizers, compiled to Web Assembly with
+         <a href="https://emscripten.org">Emscripten</a>. The original C++ version of this benchmark was previously published in the LLVM test suite.
+         Source code: <a href="wasm/gcc-loops.cpp">gcc-loops.cpp</a>, <a href="wasm/gcc-loops.js">gcc-loops.js</a>
+        </dd>
</ins><span class="cx"> 
</span><del>-    <a name="Air">
-    <dt>Air</dt>
-    <dd>
-     Air is an ES2015 port of the <a href="https://webkit.org/blog/5852/introducing-the-b3-jit-compiler/">WebKit B3 JIT</a>'s <a href="https://trac.webkit.org/changeset/201783">Air::allocateStack phase</a>.
-     This code is a heavy user of Map, Set, classes, spread, and for-of. The benchmark runs allocateStack on hot function
-     bodies from other popular JavaScript benchmarks. This benchmark was previously published in ARES-6.
-     Source code: <a href="ARES-6/Air">Air</a>
-    </dd>
</del><ins>+        <dt id="gbemu">gbemu</dt>
+        <dd>
+         Gameboy emulator written in JavaScript. Tests typed array and
+         property access performance.
+         A similar version of this benchmark was previously published in Octane version 2.
+         Source code: <a href="Octane/gbemu-part1.js">gbemu-part1.js</a>, <a href="Octane/gbemu-part2.js">gbemu-part2.js</a>
+        </dd>
</ins><span class="cx"> 
</span><del>-    <a name="ai-astar">
-    <dt>ai-astar</dt>
-    <dd>
-     This benchmark runs a JavaScript implementation of the <a href="https://en.wikipedia.org/wiki/A*_search_algorithm">A*</a> search algorithm
-     written by <a href="https://briangrinstead.com/blog/">Brian Grinstead</a>.
-     This benchmark was inspired by a similar benchmark in the Kraken benchmark suite.
-     Source code: <a href="SeaMonster/ai-astar.js">ai-astar.js</a>
-    </dd>
</del><ins>+        <dt id="gaussian-blur">gaussian-blur</dt>
+        <dd>
+         Tests the performance of a JavaScript implementation of <a href="https://en.wikipedia.org/wiki/Gaussian_blur">gaussian
+         blur</a> on a test image. Tests numeric analysis speed and uses typed arrays.
+         This benchmark was inspired by a similar benchmark in the Kraken benchmark suite.
+         Source code: <a href="SeaMonster/gaussian-blur.js">gaussian-blur.js</a>
+        </dd>
</ins><span class="cx"> 
</span><del>-    <a name="acorn-wtb">
-    <dt>acorn-wtb</dt>
-    <dd>
-     <a href="https://github.com/ternjs/acorn">Acorn</a> is a JavaScript parser written in JavaScript.
-     This benchmark runs Acorn on test JavaScript programs.
-     This benchmark stresses string manipulation and regular expression performance.
-     A similar version of this benchmark was previously published in the Web Tooling Benchmark.
-     Source code: <a href="web-tooling-benchmark/browser.js">acorn.js</a>
-    </dd>
-    
-    <a name="3d-raytrace-SP">
-    <dt>3d-raytrace-SP</dt>
-    <dd>
-    Simple raytracer written by <a href="https://nerget.com">Oliver Hunt</a>. 
-     Tests arrays and floating-point math in relatively short-running code.
-     A similar version of this benchmark was previously published in SunSpider.
-     Source code: <a href="SunSpider/3d-raytrace.js">3d-raytrace.js</a>
-    </dd>
-    
-    <a name="3d-cube-SP">
-    <dt>3d-cube-SP</dt>
-    <dd>
-     3D cube rotation benchmark by Simon Speich. The original can be found
-     on <a href="http://www.speich.net/computer/moztesting/3d.htm">Simon's
-     web page</a>. Tests arrays and floating-point math in relatively
-     short-running code.
-     A similar version of this benchmark was previously published in SunSpider.
-     Source code: <a href="SunSpider/3d-cube.js">3d-cube.js</a>
-    </dd>
</del><ins>+        <dt id="float-mm.c">float-mm.c</dt>
+        <dd>
+         Floating point matrix multiply benchmark, compiled to JavaScript with <a href="https://emscripten.org">Emscripten</a>.
+         The original C version of this benchmark was previously published in the LLVM test suite.
+         Source code: <a href="simple/float-mm.c">float-mm.c</a>, <a href="simple/float-mm.c.js">float-mm.c.js</a>
+        </dd>
</ins><span class="cx"> 
</span><del>-    </dl>
</del><ins>+        <dt id="FlightPlanner">FlightPlanner</dt>
+        <dd>
+          Flight Planner is a benchmark taken from a flight management web application.
+          Flight Planner parses aircraft flight plans and computes distance, courses, and elapsed times for legs of flight plans.
+          It uses FAA data for airports, navigation aids, and airways. The flight management app was originally written to help
+          compete in a flying proficiency event. It stresses regular expression performance.
+         Source code: <a href="RexBench/FlightPlanner/flight_planner.js">flight_planner.js</a>
+        </dd>
+
+        <dt id="first-inspector-code-load">first-inspector-code-load</dt>
+        <dd>
+         Measures the first-time parsing of a modern JavaScript code base: WebKit's Web Inspector.
+         This models the parsing time of visiting a web site for the first time.
+         Source code: <a href="code-load/code-first-load.js">code-first-load.js</a>
+        </dd>
+
+        <dt id="espree-wtb">espree-wtb</dt>
+        <dd>
+        <a href="https://github.com/eslint/espree">Espree</a> is a JavaScript parser written in JavaScript.
+         This benchmark runs Espree on test JavaScript programs.
+         This benchmark stresses string manipulation and regular expression performance.
+         A similar version of this benchmark was previously published in the Web Tooling Benchmark.
+         Source code: <a href="web-tooling-benchmark/browser.js">espree.js</a>
+        </dd>
+
+        <dt id="earley-boyer">earley-boyer</dt>
+        <dd>
+         Tests two classic Scheme benchmarks translated to JavaScript using scheme2js. The first
+         benchmark is Earley, is a chart parser algorithm created by Jay Earley. The second is
+         Boyer, a logic programming benchmark by Bob Boyer. Measures variadic functions and object
+         construction.
+         A similar version of this benchmark was previously published in Octane version 2.
+         Source code: <a href="Octane/earley-boyer.js">earley-boyer.js</a>
+        </dd>
+
+        <dt id="delta-blue">delta-blue</dt>
+        <dd>
+         The classic DeltaBlue benchmark derived from a Smalltalk implementation by Maloney and
+         Wolczko. Tests devirtualization of JavaScript code that uses an idiomatic class hierarchy
+         construction.
+         A similar version of this benchmark was previously published in Octane version 2.
+         Source code: <a href="Octane/deltablue.js">deltablue.js</a>
+        </dd>
+
+        <dt id="date-format-xparb-SP">date-format-xparb-SP</dt>
+        <dd>
+         Sophisticated date formatting and parsing library test, based on code by Barin Schwartz.
+         A similar version of this benchmark was previously published in SunSpider.
+         Source code: <a href="SunSpider/date-format-xparb.js">date-format-xparb.js</a>
+        </dd>
+
+        <dt id="date-format-tofte-SP">date-format-tofte-SP</dt>
+        <dd>
+         Date and time formatting test, based on code by Svend Tofte. Involves an interesting use
+         of <code>eval</code> and also covers string manipulation and JavaScript library functions.
+         A similar version of this benchmark was previously published in SunSpider.
+         Source code: <a href="SunSpider/date-format-tofte.js">date-format-tofte.js</a>
+        </dd>
+
+        <dt id="crypto-sha1-SP">crypto-sha1-SP</dt>
+        <dd>
+         <a href="http://en.wikipedia.org/wiki/Sha1">SHA-1</a> implementation in JavaScript by
+         Paul Johnston and others. Tests interesting integer math idioms.
+         A similar version of this benchmark was previously published in SunSpider.
+         Source code: <a href="SunSpider/crypto-sha1.js">crypto-sha1.js</a>
+        </dd>
+
+        <dt id="crypto-md5-SP">crypto-md5-SP</dt>
+        <dd>
+         <a href="http://en.wikipedia.org/wiki/Md5">MD5</a> implementation in JavaScript by
+         Paul Johnston and others. Tests interesting integer math idioms.
+         A similar version of this benchmark was previously published in SunSpider.
+         Source code: <a href="SunSpider/crypto-md5.js">crypto-md5.js</a>
+        </dd>
+
+        <dt id="crypto-aes-SP">crypto-aes-SP</dt>
+        <dd>
+         <a href="http://en.wikipedia.org/wiki/Advanced_Encryption_Standard"> AES</a> implementation
+         in JavaScript by Chris Veness. A newer version can be
+         found <a href="http://www.movable-type.co.uk/scripts/aes.html">here</a>. Tests integer math.
+         A similar version of this benchmark was previously published in SunSpider.
+         Source code: <a href="SunSpider/crypto-aes.js">crypto-aes.js</a>
+        </dd>
+
+        <dt id="crypto">crypto</dt>
+        <dd>
+         RSA cypher implemented in JavaScript by Tom Wu. Tests integer math and arrays.
+         A similar version of this benchmark was previously published in Octane version 2.
+         Source code: <a href="Octane/crypto.js">crypto.js</a>
+        </dd>
+
+        <dt id="coffeescript-wtb">coffeescript-wtb</dt>
+        <dd>
+         <a href="http://coffeescript.org/">CoffeeScript</a> is a programming language that attempts to expose the
+         good parts of JavaScript in a simple way.
+         This benchmark tests the CoffeeScript compiler on test programs.
+         This benchmark stresses string manipulation and regular expression performance.
+         A similar version of this benchmark was previously published in the Web Tooling Benchmark.
+         Source code: <a href="web-tooling-benchmark/browser.js">coffeescript.js</a>
+        </dd>
+
+        <dt id="chai-wtb">chai-wtb</dt>
+        <dd>
+         <a href="http://chaijs.com/">Chai</a> is a <a href="https://codeutopia.net/blog/2015/03/01/unit-testing-tdd-and-bdd/">BDD / TDD</a> assertion library for
+         node.js and the browser. It is commonly used to write unit and integration tests.
+         A similar version of this benchmark was previously published in the Web Tooling Benchmark.
+         Source code: <a href="web-tooling-benchmark/browser.js">chai.js</a>
+        </dd>
+
+        <dt id="cdjs">cdjs</dt>
+        <dd>
+         JavaScript implementation of the <a href="https://www.cs.purdue.edu/sss/projects/cdx/">CDx collision detection
+         benchmark</a>. Measures the performance of over 200 collision detection runs.
+         Source code: <a href="cdjs">cdjs</a>
+        </dd>
+
+        <dt id="box2d">box2d</dt>
+        <dd>
+         The Box2D physics engine <a href="https://code.google.com/p/box2dweb/">ported to JavaScript</a>. Tests floating
+         point math and data structures.
+         A similar version of this benchmark was previously published in Octane version 2.
+         Source code: <a href="Octane/box2d.js">box2d.js</a>
+        </dd>
+
+        <dt id="bomb-workers">bomb-workers</dt>
+        <dd>
+         Tests running various subtests of the SunSpider benchmark in parallel using Web Workers.
+         Stresses the browser's ability to run JavaScript code in parallel.
+         Source code: <a href="worker/bomb.js">bomb.js</a>
+        </dd>
+
+        <dt id="Basic">Basic</dt>
+        <dd>
+         Basic is an ES2015 implementation of the <a href="http://www.ecma-international.org/publications/files/ECMA-ST-WITHDRAWN/ECMA-55,%201st%20Edition,%20January%201978.pdf">ECMA-55 BASIC standard</a>.
+         Basic stresses performance of generator functions, classes, Map, and WeakMap.
+         The benchmark runs a handful of simple programs, the most complex of which finds prime numbers.
+         This benchmark was previously published in ARES-6.
+         Source code: <a href="ARES-6/Basic">Basic</a>
+        </dd>
+
+        <dt id="base64-SP">base64-SP</dt>
+        <dd>
+         Base64 encoder/decoder written in JavaScript, originally from the Mozilla XML-RPC client component.
+         Tests string manipulation.
+         A similar version of this benchmark was previously published in SunSpider.
+         Source code: <a href="SunSpider/base64.js">base64.js</a>
+        </dd>
+
+        <dt id="babylon-wtb">babylon-wtb</dt>
+        <dd>
+         <a href="https://github.com/babel/babel/tree/master/packages/babel-parser">Babylon</a> is the frontend for the Babel transpiler.
+         It is a JavaScript parser written in JavaScript. It computes the Abstract Syntax Tree of the input JavaScript program.
+         This benchmark runs Babylon on test JavaScript programs.
+         This benchmark stresses string manipulation and regular expression performance.
+         A similar version of this benchmark was previously published in the Web Tooling Benchmark.
+         Source code: <a href="web-tooling-benchmark/browser.js">babylon.js</a>
+        </dd>
+
+        <dt id="Babylon">Babylon</dt>
+        <dd>
+         <a href="https://github.com/babel/babylon">Babylon</a> is an implementation of a parser for the JavaScript language.
+         Babylon is the parser used in the <a href="https://babeljs.io/">Babel</a> JavaScript transpiler. The benchmark runs the
+         Babylon parser on four different JavaScript sources. Babylon makes heavy use of classes, does non trivial string processing,
+         and creates non-trivial object graphs.
+         This benchmark was previously published in ARES-6.
+         Source code: <a href="ARES-6/Babylon">Babylon</a>
+        </dd>
+
+        <dt id="async-fs">async-fs</dt>
+        <dd>
+         This is an implementation of a mock file system that stresses the performance of DataView, Promises, and async
+         iteration. The benchmark simulates adding and removing files, and swapping the byte order of existing files.
+         Source code: <a href="simple/file-system.js">async-fs.js</a>
+        </dd>
+
+        <dt id="Air">Air</dt>
+        <dd>
+         Air is an ES2015 port of the <a href="https://webkit.org/blog/5852/introducing-the-b3-jit-compiler/">WebKit B3 JIT</a>'s <a href="https://trac.webkit.org/changeset/201783">Air::allocateStack phase</a>.
+         This code is a heavy user of Map, Set, classes, spread, and for-of. The benchmark runs allocateStack on hot function
+         bodies from other popular JavaScript benchmarks. This benchmark was previously published in ARES-6.
+         Source code: <a href="ARES-6/Air">Air</a>
+        </dd>
+
+        <dt id="ai-astar">ai-astar</dt>
+        <dd>
+         This benchmark runs a JavaScript implementation of the <a href="https://en.wikipedia.org/wiki/A*_search_algorithm">A*</a> search algorithm
+         written by <a href="https://briangrinstead.com/blog/">Brian Grinstead</a>.
+         This benchmark was inspired by a similar benchmark in the Kraken benchmark suite.
+         Source code: <a href="SeaMonster/ai-astar.js">ai-astar.js</a>
+        </dd>
+
+        <dt id="acorn-wtb">acorn-wtb</dt>
+        <dd>
+         <a href="https://github.com/ternjs/acorn">Acorn</a> is a JavaScript parser written in JavaScript.
+         This benchmark runs Acorn on test JavaScript programs.
+         This benchmark stresses string manipulation and regular expression performance.
+         A similar version of this benchmark was previously published in the Web Tooling Benchmark.
+         Source code: <a href="web-tooling-benchmark/browser.js">acorn.js</a>
+        </dd>
+
+        <dt id="3d-raytrace-SP">3d-raytrace-SP</dt>
+        <dd>
+        Simple raytracer written by <a href="https://nerget.com">Oliver Hunt</a>.
+         Tests arrays and floating-point math in relatively short-running code.
+         A similar version of this benchmark was previously published in SunSpider.
+         Source code: <a href="SunSpider/3d-raytrace.js">3d-raytrace.js</a>
+        </dd>
+
+        <dt id="3d-cube-SP">3d-cube-SP</dt>
+        <dd>
+         3D cube rotation benchmark by Simon Speich. The original can be found
+         on <a href="http://www.speich.net/computer/moztesting/3d.htm">Simon's
+         web page</a>. Tests arrays and floating-point math in relatively
+         short-running code.
+         A similar version of this benchmark was previously published in SunSpider.
+         Source code: <a href="SunSpider/3d-cube.js">3d-cube.js</a>
+        </dd>
+
+        </dl>
+
+        <p><a href="index.html" class="button">&larr; Return to Tests</a></p>
+    </article>
+
</ins><span class="cx"> </main>
</span><span class="cx"> </body>
</span><del>-</html>
-
</del><ins>+</html>
</ins><span class="cx">\ No newline at end of file
</span></span></pre></div>
<a id="trunkPerformanceTestsJetStream2indexhtml"></a>
<div class="modfile"><h4>Modified: trunk/PerformanceTests/JetStream2/index.html (242960 => 242961)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/JetStream2/index.html     2019-03-14 20:40:09 UTC (rev 242960)
+++ trunk/PerformanceTests/JetStream2/index.html        2019-03-14 20:46:04 UTC (rev 242961)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> <!--
</span><del>- Copyright (C) 2018 Apple Inc. All rights reserved.
</del><ins>+ Copyright (C) 2019 Apple Inc. All rights reserved.
</ins><span class="cx"> 
</span><span class="cx">  Redistribution and use in source and binary forms, with or without
</span><span class="cx">  modification, are permitted provided that the following conditions
</span><span class="lines">@@ -30,6 +30,7 @@
</span><span class="cx">     <title>JetStream 2</title>
</span><span class="cx"> 
</span><span class="cx">     <link rel="stylesheet" href="JetStream.css">
</span><ins>+    <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=yes, viewport-fit=cover">
</ins><span class="cx"> 
</span><span class="cx">     <script>
</span><span class="cx">     const isInBrowser = true;
</span><span class="lines">@@ -39,8 +40,12 @@
</span><span class="cx">     async function initialize() {
</span><span class="cx">         if (allIsGood)
</span><span class="cx">             await JetStream.initialize();
</span><del>-        else
-            document.getElementById("body").innerHTML = "<h1>ERROR</h1><p>Encountered errors during page load. Refusing to run a partial benchmark suite.</p>";
</del><ins>+        else {
+            let statusElement = document.getElementById("status");
+            statusElement.classList.remove('loading');
+            statusElement.classList.add('error');
+            statusElement.innerHTML = "<h2>ERROR</h2><p>Errors were encountered during page load. Refusing to run a partial benchmark suite.</p>";
+        }
</ins><span class="cx">     }
</span><span class="cx">     </script>
</span><span class="cx"> 
</span><span class="lines">@@ -48,18 +53,21 @@
</span><span class="cx"> 
</span><span class="cx"> </head>
</span><span class="cx"> <body onload="initialize()">
</span><ins>+<h1 class="logo">
+    <div id="jetstreams">
+        <a href="index.html" class="logo-image">JetStream 2</a>
+    </div>
+</h1>
+
</ins><span class="cx"> <main>
</span><del>-<!-- <a href="index.html"><img id="logo" src="JetStream-Logo.png" alt="JetStream"></a> -->
-
-    <h1>JetStream 2</h1>
</del><span class="cx">     <p class="summary">JetStream 2 is a JavaScript benchmark suite focused on the most advanced web applications. For more information, read the <a href="in-depth.html">in-depth analysis</a>. Higher scores are better.</p>
</span><span class="cx">     <p class="summary" id="mode-description"></p>
</span><span class="cx"> 
</span><span class="cx">     <div id="result-summary"></div>
</span><del>-    <div id="status">Loading Benchmark...</div>
</del><ins>+    <div id="status" class="loading">Loading Benchmark...</div>
</ins><span class="cx"> 
</span><del>-    <table id="results"></table>
</del><ins>+    <div id="results"></div>
</ins><span class="cx"> </main>
</span><span class="cx"> <iframe id="magic"></iframe>
</span><span class="cx"> </body>
</span><del>-</html>
</del><ins>+</html>
</ins><span class="cx">\ No newline at end of file
</span></span></pre></div>
<a id="trunkPerformanceTestsJetStream2jetstreamssvg"></a>
<div class="addfile"><h4>Added: trunk/PerformanceTests/JetStream2/jetstreams.svg (0 => 242961)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/PerformanceTests/JetStream2/jetstreams.svg                         (rev 0)
+++ trunk/PerformanceTests/JetStream2/jetstreams.svg    2019-03-14 20:46:04 UTC (rev 242961)
</span><span class="lines">@@ -0,0 +1,46 @@
</span><ins>+<svg xmlns="http://www.w3.org/2000/svg" width="2647" height="120" viewBox="0 0 2647 120">
+    <!-- Copyright © 2019 Apple Inc. All rights reserved. -->
+    <style>
+        .line {
+            mix-blend-mode: multiply;
+            stroke-dasharray: 2680;
+            stroke-dashoffset: 2680;
+            animation: dash 1.1s ease-in forwards;
+            animation-delay: 400ms;
+        }
+
+        .line.second {
+            animation-delay: 500ms;
+            animation-duration: 900ms;
+        }
+
+        .line.third {
+            animation-delay: 600ms;
+            animation-duration: 800ms;
+        }
+
+        .line.fourth {
+            animation-delay: 700ms;
+            animation-duration: 700ms;
+        }
+
+        .line.fifth {
+            animation-delay: 800ms;
+            animation-duration: 600ms;
+        }
+
+        @keyframes dash {
+            to {
+                stroke-dashoffset: 0;
+            }
+        }
+    </style>
+    <g fill="none" fill-rule="evenodd" opacity=".8" stroke-dasharray="2680" stroke-linecap="square" stroke="#B9EAFF" stroke-width="5">
+        <path class="line" d="M0.381287582,77.2851563 C45.5977594,100.205019 115.707877,111.66495 210.71164,111.66495 C353.217284,111.66495 433.15655,50.4282334 626.183452,50.4282334 C819.210355,50.4282334 1003.20257,83.2313059 1085.21867,84.6042334 C1167.23478,85.977161 1231.04683,71 1322.53193,71 C1414.01704,71 1405.89836,77.9769045 1469.70623,77.9769045 C1533.51411,77.9769045 1858.0854,41.1147334 1982.42221,41.1152334 C2106.759,41.1157334 2336.34112,96.9169334 2457.44102,96.9169334 C2538.17429,96.9169334 2612.48771,90.6035905 2680.38129,77.9769045"/>
+        <path class="line second" d="M0.381287582,77.2851563 C52.8221181,59.380541 115.923899,50.4282334 189.68663,50.4282334 C300.330726,50.4282334 463.775156,77.2851563 587.977497,77.2851563 C712.179836,77.2851563 841.854221,41.1162334 960.608924,41.1157334 C1079.36363,41.1152334 1175.54909,71 1267.0342,71 C1358.5193,71 1486.92586,84.8073502 1579.31596,84.8073502 C1671.70606,84.8073502 1951.64553,37.773825 2091.51218,38.3793587 C2231.37883,38.9848924 2309.70347,76.3864611 2465.75572,78.8007813 C2569.79056,80.410328 2641.3324,76.8419454 2680.38129,68.0956334"/>
+        <path class="line third" d="M0.381287582,68.0956334 C46.104713,82.5628758 116.468307,89.796497 211.472071,89.796497 C353.977713,89.796497 569.766201,41.1157334 695.40436,41.1157334 C821.042519,41.1157334 1029.874,71.5221545 1121.3591,71.5221545 C1212.84421,71.5221545 1231.04683,71 1322.53193,71 C1414.01704,71 1470.55153,86.8321594 1614.81651,89.796497 C1759.08149,92.7608346 1917.33862,49.8226997 2057.20527,50.4282334 C2197.07192,51.0337671 2372.16992,114.838073 2475.15354,114.838073 C2543.8093,114.838073 2612.21853,107.48016 2680.38129,92.7643334"/>
+        <path class="line fourth" d="M0.381287582,50.4282334 C39.5600335,20.8094111 105.603499,5.66666667 198.511683,5 C337.873959,4 411.779393,89.7993958 588.034245,89.7993958 C764.289095,89.7993958 886.574266,57.2387752 996.542944,57.2387752 C1106.51162,57.2387752 1231.16568,71 1322.65962,71 C1414.15356,71 1447.8544,56.1829752 1541.98759,57.2387752 C1636.12078,58.2945752 1817.26413,89.8073502 1971.66487,89.8073502 C2126.06561,89.8073502 2305.87367,16.3803334 2455.48134,17.3806334 C2555.2198,18.0475001 2629.51978,33.3807334 2678.38129,63.3803334"/>
+        <path class="line fifth" d="M0.381287582,50.4282334 C100.711815,28.2065001 198.37896,17.0956334 293.382723,17.0956334 C435.888367,17.0956334 531.07636,67.2833421 716.990501,71.5221545 C902.904641,75.7609669 1020.95162,46.3806334 1100.3489,46.3806334 C1179.74619,46.3806334 1250.52195,71 1342.00705,71 C1433.49216,71 1503.60201,41.3248334 1597.7261,42.3806334 C1691.8502,43.4364334 1891.84425,89.1938621 2031.7109,89.7993958 C2171.57755,90.4049295 2341.72526,52.2362334 2469.03608,52.2362334 C2553.90996,52.2362334 2624.35836,59.7595397 2680.38129,74.8061523"/>
+        <path class="line third" d="M0.381287582,63.3803334 C29.9004627,42.0463503 86.1138292,31.3793587 169.021387,31.3793587 C293.382723,31.3793587 530.433313,103.701906 703.857385,103.731049 C877.281458,103.760193 1001.04857,58.6844334 1102.10823,59.8364334 C1203.1679,60.9884334 1231.04683,71 1322.53193,71 C1414.01704,71 1625.37248,44.1157334 1733.57121,44.1157334 C1841.76995,44.1157334 1984.50341,75.8774804 2102.06815,76.3864611 C2219.6329,76.8954417 2348.05336,31.3793587 2475.36419,31.3793587 C2531.94676,31.3793587 2600.2858,43.232817 2680.38129,66.9397334"/>
+    </g>
+</svg>
</ins><span class="cx">\ No newline at end of file
</span></span></pre>
</div>
</div>

</body>
</html>