Index: frontend/node_modules/jsonpath/Gruntfile.js
===================================================================
--- frontend/node_modules/jsonpath/Gruntfile.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/jsonpath/Gruntfile.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,83 @@
+var Browserify = require('browserify');
+var bresolve = require('browser-resolve');
+patchResolve();
+
+module.exports = function (grunt) {
+    grunt.initConfig({
+        pkg: grunt.file.readJSON('package.json'),
+        outputFolder: ".",
+
+        browserify: {
+            main: {
+                src: ['index.js'],
+                dest: '<%= outputFolder %>/<%= pkg.name %>.js',
+                options: {
+                    browserifyOptions: { standalone: '<%= pkg.name %>' },
+                    banner: '/*! <%= pkg.name %> <%= pkg.version %> */\n',
+                    alias: {
+                        "jsonpath": "./index.js"
+                    },
+                    require: [
+                        /**
+                         * When running in Node, we require('./aesprim') and that module takes care of monkey-patching esprima
+                         * using resolve, path finding, etc...
+                         * Anyways, Browserify doesn't support "resolve", so we need to trick the module. We'll actually be
+                         * returning a verbatim, non-modified "esprima" when the code runs require('./aesprim').
+                         * That is ok because we will modify the "esprima" source code right after the bundle process, via
+                         * the postBundleCB callback.
+                         */
+                        ["esprima", {expose: "./aesprim"}]
+                    ],
+                    ignore: [
+                        'file',
+                        'system',
+                        'source-map',
+                        'estraverse',
+                        'escodegen',
+                        'underscore',
+                        'reflect',
+                        'JSONSelect',
+                        './lib/aesprim.js'
+                        //'assert' //can't remove because of lib/index.js,
+                    ],
+                    postBundleCB: function(err, src, next) {
+                        /**
+                         * This is ugly, but we need to make "esprima" understand '@' as a valid character.
+                         * It's either this or bundle a copy of the library with those few bytes of changes.
+                         */
+                        src = src.toString("utf8").replace(/(function isIdentifierStart\(ch\) {\s+return)/m, '$1 (ch == 0x40) || ');
+                        next(err, new Buffer(src, "utf8"));
+                    }
+                }
+            }
+        },
+
+        uglify: {
+            options: {
+                banner: '/*! <%= pkg.name %> <%= pkg.version %> */\n'
+            },
+            build: {
+                src: '<%= outputFolder %>/<%= pkg.name %>.js',
+                dest: '<%= outputFolder %>/<%= pkg.name %>.min.js'
+            }
+        }
+
+    });
+
+    grunt.loadNpmTasks('grunt-browserify');
+    grunt.loadNpmTasks('grunt-contrib-uglify')
+    grunt.registerTask('default', ['browserify', 'uglify']);
+
+};
+
+function patchResolve() {
+  var _createDeps = Browserify.prototype._createDeps;
+  Browserify.prototype._createDeps = function() {
+    var returnValue = _createDeps.apply(this, arguments);
+    this._bresolve = function(id, opts, cb) {
+      opts.browser = 'alias';
+      return bresolve(id, opts, cb);
+    };
+    return returnValue;
+  }
+}
