(function(tree) {

tree.URL = function URL(val, paths) {
    if (val.data) {
        this.attrs = val;
    } else {
        // Add the base path if the URL is relative and we are in the browser
        if (!/^(?:https?:\/|file:\/)?\//.test(val.value) && paths.length > 0 && typeof(window) !== 'undefined') {
            val.value = paths[0] + (val.value.charAt(0) === '/' ? val.value.slice(1) : val.value);
        }
        this.value = val;
        this.paths = paths;
        this.is = 'uri';
    }
};
tree.URL.prototype = {
    toString: function() {
        return this.value.toString();
    },
    eval: function(ctx) {
        if (/^https?:/.test(this.value.toString())) {
            var External = require('../External'),
                path = require('path');
            var eventual_location = path.join(
                ctx.data_dir,
                External.destinations['default'](this.value.toString()));
            ctx.deferred_externals.push(this.value.toString());
            return this.attrs ? this : new tree.URL(eventual_location, this.paths);
        } else {
            return this.attrs ? this : new tree.URL(this.value.eval(ctx), this.paths);
        }
    }
};

})(require('mess/tree'));

@@ -689,24 +689,22 @@
     var 
-External
+crypto
  = requi
@@ -711,19 +711,14 @@
 re('
-../External
+crypto
 '),%0A
@@ -757,16 +757,61 @@
 path');%0A
+            var uri = this.value.toString();%0A
         
@@ -899,62 +899,77 @@
     
-External.destinations%5B'default'%5D(this.value.toString()
+crypto.createHash('md5').update(uri).digest('hex') + path.extname(uri
 ));%0A

Remove external dependency