var require, __loaded;
var global = (function () { return this; })();

(function () {
  var LOADED = {};
  var moduleWaiters = {};
  function require(modules, callback) {
    modules = Array.prototype.slice.call(modules, 0);
    var html = [];
    var status = { count: 0, callback: callback };
    for (var i = 0, n = modules.length; i < n; ++i) {
      var moduleName = '' + modules[i];
      if (!/^[\w-\/]+$/.test(moduleName)) {
        throw new Error('Bad module name ' + moduleName);
      }
      if (moduleWaiters.hasOwnProperty(moduleName)) {
        if (moduleWaiters[moduleName] === LOADED) { continue; }
      } else {
        moduleWaiters[moduleName] = [];
      }
      moduleWaiters[moduleName].push(status);
      ++status.count;

      var group = typeof console !== 'undefined' && !!console.group;
      if (group) {
        html.push(
            '<script>console.group("', moduleName, ' requested");<\/script>');
      }
      html.push('<script type="text/javascript" src="', moduleName,
                '.js"><\/script>');
      if (group) {
        html.push('<script>console.groupEnd();<\/script>');
      }
      html.push('<script>__loaded("', moduleName, '");<\/script>');
    }
    if (html.length) { document.write(html.join('')); }
    if (status.count === 0 && callback) { callback.call({}); }
  }
  function loaded(module) {
    var waiters = moduleWaiters[module];
    moduleWaiters[module] = LOADED;
    for (var i = waiters.length; --i >= 0;) {
      var waiter = waiters[i];
      if (0 === --waiter.count && waiter.callback) {
        var name = console.group ? waiter.callback.name : null;
        setTimeout(
            function () {
              if (name) { console.group(name + ' loading'); }
              try {
                waiter.callback.call({});
              } finally {
                if (name) { console.groupEnd(); }
              }
            }, 0);
      }
    }
  }
  global.require = require;
  global.__loaded = loaded;
})();
