| Index: appengine/swarming/elements/build/js/common.js | 
| diff --git a/appengine/swarming/elements/build/js/common.js b/appengine/swarming/elements/build/js/common.js | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..0222686f2ceec2ad6e2b6d2fdc7c04ae1b7ff7a3 | 
| --- /dev/null | 
| +++ b/appengine/swarming/elements/build/js/common.js | 
| @@ -0,0 +1,53 @@ | 
| +// Copyright 2016 The LUCI Authors. All rights reserved. | 
| +// Use of this source code is governed under the Apache License, Version 2.0 | 
| +// that can be found in the LICENSE file. | 
| + | 
| +window.swarming = window.swarming || function() { | 
| +  var swarming = {}; | 
| + | 
| +  swarming.stableSort = function(arr, comp) { | 
| +    if (!arr || !comp) { | 
| +      console.log("missing arguments to stableSort", arr, comp); | 
| +      return; | 
| +    } | 
| +    // We can guarantee a potential non-stable sort (like V8's | 
| +    // Array.prototype.sort()) to be stable by first storing the index in the | 
| +    // original sorting and using that if the original compare was 0. | 
| +    arr.forEach(function(e, i){ | 
| +      if (e !== undefined && e !== null) { | 
| +        e.__sortIdx = i; | 
| +      } | 
| +    }); | 
| + | 
| +    arr.sort(function(a, b){ | 
| +      // undefined and null elements always go last. | 
| +      if (a === undefined || a === null) { | 
| +        if (b === undefined || b === null) { | 
| +          return 0; | 
| +        } | 
| +        return 1; | 
| +      } | 
| +      if (b === undefined || b === null) { | 
| +        return -1; | 
| +      } | 
| +      var c = comp(a, b); | 
| +      if (c === 0) { | 
| +        return a.__sortIdx - b.__sortIdx; | 
| +      } | 
| +      return c; | 
| +    }); | 
| +  } | 
| + | 
| +  // naturalCompare tries to use natural sorting (e.g. sort ints by value). | 
| +  swarming.naturalCompare = function(a, b) { | 
| +    // Try numeric, aka "natural" sort and use it if ns is not NaN. | 
| +    // Javascript will try to corece these to numbers or return NaN. | 
| +    var ns = a - b; | 
| +    if (ns) { | 
| +      return ns; | 
| +    } | 
| +    return a.localeCompare(b); | 
| +  } | 
| + | 
| +  return swarming; | 
| +}(); | 
|  |