(function(app) {
  'use strict';

  var helper = {};

  helper.randomString = function(len) {
    var s = [];
    for (var i = 0, n = Math.floor(len / 7); i < n; i++) {
      s.push(Math.random().toString(36).slice(-7));
    }
    var rem = len % 7;
    if (rem)
      s.push(Math.random().toString(36).slice(-rem));
    return s.join('');
  };

  helper.clamp = function(number, lower, upper) {
    return Math.min(Math.max(number, lower), upper);
  };

  helper.inherits = function(ctor, superCtor) {
    ctor.super_ = superCtor;
    ctor.prototype = Object.create(superCtor.prototype, {
      constructor: {
        value: ctor,
        enumerable: false,
        writable: true,
        configurable: true
      }
    });
    return ctor;
  };

  helper.identity = function(value) {
    return value;
  };

  helper.clone = function(obj) {
    var ret = {};
    for (var key in obj) {
      ret[key] = obj[key];
    }
    return ret;
  };

  helper.extend = function(obj) {
    for (var i = 1, len = arguments.length; i < len; i++) {
      var src = arguments[i];
      for (var key in src) {
        obj[key] = src[key];
      }
    }
    return obj;
  };

  helper.pick = function(obj, keys) {
    var ret = {};
    if (!obj)
      return ret;
    keys.forEach(function(key) {
      if (key in obj)
        ret[key] = obj[key];
    });
    return ret;
  };

  helper.dig = function() {
    var args = Array.prototype.slice.call(arguments);
    return args.reduce(function(prev, curr) {
      return (typeof prev === 'object') ? prev[curr] : null;
    });
  };

  helper.sortBy = function(array, key) {
    return array.slice().sort(function(a, b) {
      if (a[key] > b[key])
        return 1;
      else if (a[key] < b[key])
        return -1;
      return 0;
    });
  };

  helper.remove = function(array, item) {
    array.splice(array.indexOf(item), 1);
  };

  helper.moveToBack = function(array, item) {
    var index = array.indexOf(item);

    if (index === -1)
      return;

    array.splice(index, 1);
    array.push(item);
  };

  helper.Set = (function() {
    var Set = function() {
      this.data = [];
    };

    Set.prototype.add = function(item) {
      if (!this.has(item))
        this.data.push(item);
    };

    Set.prototype.delete = function(item) {
      var data = this.data;
      for (var i = data.length - 1; i >= 0; i--) {
        if (data[i].equal(item)) {
          data.splice(i, 1);
          break;
        }
      }
    };

    Set.prototype.has = function(item) {
      return this.data.some(function(dataItem) {
        return dataItem.equal(item);
      });
    };

    Set.prototype.toArray = function() {
      return this.data.slice();
    };

    return Set;
  })();

  if (typeof module !== 'undefined' && module.exports)
    module.exports = helper;
  else
    app.helper = helper;
})(this.app || (this.app = {}));

@@ -2714,16 +2714,1024 @@
  %7D)();%0A%0A
+  helper.Map = (function() %7B%0A    var Map = function() %7B%0A      this.data = %5B%5D;%0A    %7D;%0A%0A    Map.prototype.set = function(key, value) %7B%0A      var data = this.data;%0A      if (!this.has(key)) %7B%0A        data.push(%5Bkey, value%5D);%0A        return;%0A      %7D%0A      for (var i = data.length - 1; i %3E= 0; i--) %7B%0A        var item = data%5Bi%5D;%0A        if (item%5B0%5D.equal(key)) %7B%0A          item%5B1%5D = value;%0A          break;%0A        %7D%0A      %7D%0A    %7D;%0A%0A    Map.prototype.get = function(key) %7B%0A      var item = this.data.filter(function(item) %7B%0A        return item%5B0%5D.equal(key);%0A      %7D)%5B0%5D;%0A      return (item ? item%5B1%5D : null);%0A    %7D;%0A%0A    Map.prototype.delete = function(key) %7B%0A      var data = this.data;%0A      for (var i = data.length - 1; i %3E= 0; i--) %7B%0A        if (data%5Bi%5D%5B0%5D.equal(key)) %7B%0A          data.splice(i, 1);%0A          break;%0A        %7D%0A      %7D%0A    %7D;%0A%0A    Map.prototype.has = function(key) %7B%0A      return this.data.some(function(item) %7B%0A        return item%5B0%5D.equal(key);%0A      %7D);%0A    %7D;%0A%0A    return Map;%0A  %7D)();%0A%0A
   if (ty

Add a simple key/value map