diff --git a/gulpfile.js b/gulpfile.js
index 148740c4958178863f7ec91b68504e888c1049fd..b0a61542ed19a092f6fb5f8bfc4c38055f33811e 100644
--- a/gulpfile.js
+++ b/gulpfile.js
@@ -1,13 +1,13 @@
 'use strict';
 
 const gulp = require('gulp'),
+  debug = require('gulp-debug'),
   sass = require('gulp-sass'),
   cleanCss = require('gulp-clean-css'),
   base64 = require('gulp-base64-v2'),
   rename = require('gulp-rename'),
   ngConstant = require('gulp-ng-constant'),
   fs = require("fs"),
-  argv = require('yargs').argv,
   header = require('gulp-header'),
   footer = require('gulp-footer'),
   removeCode = require('gulp-remove-code'),
@@ -19,6 +19,7 @@ const gulp = require('gulp'),
   zip = require('gulp-zip'),
   del = require('del'),
   useref = require('gulp-useref'),
+  hash_src = require("gulp-hash-src"),
   filter = require('gulp-filter'),
   uglify = require('gulp-uglify-es').default,
   csso = require('gulp-csso'),
@@ -30,8 +31,8 @@ const gulp = require('gulp'),
   jshint = require('gulp-jshint'),
   markdown = require('gulp-markdown'),
   log = require('fancy-log'),
-  colors = require('ansi-colors');
-
+  colors = require('ansi-colors'),
+  argv = require('yargs').argv;
 const paths = {
   license_md: ['./www/license/*.md'],
   sass: ['./scss/ionic.app.scss'],
@@ -350,8 +351,8 @@ function webCopyFiles() {
     //gulp.src('./www/feed*.json')
     //  .pipe(gulp.dest(tmpPath)),
 
-    // Copy lib
-    gulp.src('./www/lib/**/*.*')
+    // Copy lib (JS, CSS and fonts)
+    gulp.src(['./www/lib/**/*.js', './www/lib/**/*.css', './www/lib/**/fonts/**/*.*'])
       .pipe(gulp.dest(tmpPath + '/lib')),
 
     // Copy license into HTML
@@ -445,48 +446,68 @@ function webDebugFile() {
 }
 
 function webUglify() {
-  log(colors.green('Optimizing JS and CSS files...'));
-
-  const wwwPath = './dist/web/www';
-  const jsFilter = filter(["**/*.js", '!**/config.js'], { restore: true });
-  const cssFilter = filter("**/*.css", { restore: true });
-  const revFilesFilter = filter(['**/*', '!**/index.html', '!**/config.js'], { restore: true });
-  const uglifyOptions = {
-    toplevel: true,
-    warnings: true,
-    compress: {
-      global_defs: {
-        "@console.log": "alert"
+  const wwwPath = './dist/web/www';
+  const enableUglify = argv.release || argv.useref || argv.uglify || false;
+  if (enableUglify) {
+
+    log(colors.green('Uglify JS and CSS files...'));
+
+    const jsFilter = filter(["**/*.js", '!**/config.js'], {restore: true});
+    const cssFilter = filter("**/*.css", {restore: true});
+    const revFilesFilter = filter(['**/*', '!**/index.html', '!**/config.js'], { restore: true });
+    const uglifyOptions = {
+      toplevel: true,
+      warnings: true,
+      compress: {
+        global_defs: {
+          "@console.log": "alert"
+        },
+        passes: 2
       },
-      passes: 2
-    },
-    output: {
-      beautify: false,
-      preamble: "/* minified */",
-      max_line_len: 120000
-    }
-  };
+      output: {
+        beautify: false,
+        preamble: "/* minified */",
+        max_line_len: 120000
+      }
+    };
+
+    // Process index.html
+    return gulp.src(wwwPath + '/index.html')
+      .pipe(useref())             // Concatenate with gulp-useref
+
+      // Process JS
+      .pipe(jsFilter)
+      .pipe(uglify(uglifyOptions)) // Minify javascript files
+      .pipe(jsFilter.restore)
+
+      // Process CSS
+      .pipe(cssFilter)
+      .pipe(csso())               // Minify any CSS sources
+      .pipe(cssFilter.restore)
+
+      // Add revision to filename  (but not index.html and config.js)
+      .pipe(revFilesFilter)
+      .pipe(rev())                // Rename the concatenated files
+      .pipe(revFilesFilter.restore)
+
+      .pipe(revReplace())         // Substitute in new filenames
+      .pipe(gulp.dest(wwwPath));
+  }
+}
 
-  // Process index.html
-  return gulp.src(wwwPath + '/index.html')
-    .pipe(useref())             // Concatenate with gulp-useref
+function webIntegrity() {
+  const wwwPath = './dist/web/www';
 
-    // Process JS
-    .pipe(jsFilter)
-    .pipe(uglify(uglifyOptions)) // Minify javascript files
-    .pipe(jsFilter.restore)
+  log(colors.green('Add integrity hash to <script src> tag...'));
 
-    // Process CSS
-    .pipe(cssFilter)
-    .pipe(csso())               // Minify any CSS sources
-    .pipe(cssFilter.restore)
+  // Process index.html
+  return gulp.src(wwwPath + '/index.html')
 
-    // Add revision to filename  (but not index.html and config.js)
-    .pipe(revFilesFilter)
-    .pipe(rev())                // Rename the concatenated files
-    .pipe(revFilesFilter.restore)
+    // Add an integrity hash
+    .pipe(hash_src({build_dir: wwwPath, src_path: wwwPath, hash: 'sha256', enc: 'base64'}))
+    .pipe(replace(/"config\.js\?cbh=[^"]+"/g, '"config.js"'))
+    .pipe(replace('.js?cbh=', '.js" integrity="sha256-'))
 
-    .pipe(revReplace())         // Substitute in new filenames
     .pipe(gulp.dest(wwwPath));
 }
 
@@ -509,56 +530,83 @@ function webApiDebugFile() {
 }
 
 function webApiUglify() {
-  log(colors.green('API: Optimizing JS and CSS files...'));
   const tmpPath = './dist/web/www';
-  const jsFilter = filter(["**/*.js", '!**/config.js'], { restore: true });
-  const cssFilter = filter("**/*.css", { restore: true });
-  const revFilesFilter = filter(['**/*', '!**/index.html', '!**/config.js'], { restore: true });
-  const indexFilter = filter('**/index.html', { restore: true });
-  const uglifyOptions = {
-    toplevel: true,
-    warnings: true,
-    compress: {
-      global_defs: {
-        "@console.log": "alert"
+  const jsFilter = filter(["**/*.js", '!**/config.js'], {restore: true});
+  const cssFilter = filter("**/*.css", {restore: true});
+  const indexFilter = filter('**/index.html', {restore: true});
+
+  // Skip if not required
+  const enableUglify = argv.release || argv.useref || argv.uglify || false;
+  if (enableUglify) {
+    log(colors.green('API: Optimizing JS and CSS files...'));
+    const revFilesFilter = filter(['**/*', '!**/index.html', '!**/config.js'], {restore: true});
+    const uglifyOptions = {
+      toplevel: true,
+      warnings: true,
+      compress: {
+        global_defs: {
+          "@console.log": "alert"
+        },
+        passes: 2
       },
-      passes: 2
-    },
-    output: {
-      beautify: false,
-      preamble: "/* minified */",
-      max_line_len: 120000
-    }
-  };
-
-  // Process api/index.html
-  return gulp.src(tmpPath + '/*/index.html')
-    .pipe(useref())             // Concatenate with gulp-useref
-
-    // Process JS
-    .pipe(jsFilter)
-    .pipe(uglify(uglifyOptions)) // Minify any javascript sources
-    .pipe(jsFilter.restore)
+      output: {
+        beautify: false,
+        preamble: "/* minified */",
+        max_line_len: 120000
+      }
+    };
+
+    // Process api/index.html
+    return gulp.src(tmpPath + '/*/index.html')
+      //.pipe(refHash())            // Generate hashed filenames for the build blocks
+      .pipe(useref())             // Concatenate with gulp-useref
+
+      // Process JS
+      .pipe(jsFilter)
+      .pipe(uglify(uglifyOptions)) // Minify any javascript sources
+      .pipe(jsFilter.restore)
+
+      // Process CSS
+      .pipe(cssFilter)
+      .pipe(csso())               // Minify any CSS sources
+      .pipe(cssFilter.restore)
+
+      // Add revision to filename  (but not index.html and config.js)
+      .pipe(revFilesFilter)
+      .pipe(rev())                // Rename the concatenated files
+      .pipe(revFilesFilter.restore)
+
+      .pipe(revReplace())         // Substitute in new filenames
+
+      .pipe(indexFilter)
+      .pipe(replace("dist_js", "../dist_js"))
+      .pipe(replace("dist_css", "../dist_css"))
+      .pipe(replace("config.js", "../config.js"))
+      .pipe(indexFilter.restore)
+
+      .pipe(gulp.dest(tmpPath));
+  }
 
-    // Process CSS
-    .pipe(cssFilter)
-    .pipe(csso())               // Minify any CSS sources
-    .pipe(cssFilter.restore)
+  else {
+    log(colors.red('API: Uglify JS and CSS files. Skip') + colors.grey(' (missing options --release or --uglify)'));
 
-    // Add revision to filename  (but not index.html and config.js)
-    .pipe(revFilesFilter)
-    .pipe(rev())                // Rename the concatenated files
-    .pipe(revFilesFilter.restore)
+    return gulp.src(tmpPath + '/*/index.html')
+      //.pipe(refHash())            // Generate hashed filenames for the build blocks
+      .pipe(useref())             // Concatenate with gulp-useref
 
-    .pipe(revReplace())         // Substitute in new filenames
+      // Process CSS
+      .pipe(cssFilter)
+      .pipe(csso())               // Minify any CSS sources
+      .pipe(cssFilter.restore)
 
-    .pipe(indexFilter)
-    .pipe(replace("dist_js", "../dist_js"))
-    .pipe(replace("dist_css", "../dist_css"))
-    .pipe(replace("config.js", "../config.js"))
-    .pipe(indexFilter.restore)
+      .pipe(indexFilter)
+      .pipe(replace("dist_js", "../dist_js"))
+      .pipe(replace("dist_css", "../dist_css"))
+      .pipe(replace("config.js", "../config.js"))
+      .pipe(indexFilter.restore)
 
-    .pipe(gulp.dest(tmpPath));
+      .pipe(gulp.dest(tmpPath));
+  }
 }
 
 function webCleanUnusedFiles() {
@@ -587,20 +635,28 @@ function webCleanUnusedDirectories() {
 
   // Clean dir
   const wwwPath = './dist/web/www';
-  return del.sync([
-      wwwPath + '/css',
-      wwwPath + '/templates',
-      wwwPath + '/js',
-      wwwPath + '/plugins',
-      wwwPath + '/dist',
-      wwwPath + '/lib/*',
-      '!' + wwwPath + '/lib/ionic',
-      '!' + wwwPath + '/lib/robotodraft',
-      wwwPath + '/lib/ionic/*',
-      '!' + wwwPath + '/lib/ionic/fonts',
-      wwwPath + '/lib/robotodraft/*',
-      '!' + wwwPath + '/lib/robotodraft/fonts'
-    ]);
+  const patterns = [
+    wwwPath + '/css',
+    wwwPath + '/templates',
+    wwwPath + '/js',
+    wwwPath + '/plugins',
+    wwwPath + '/dist',
+    wwwPath + '/lib/*',
+
+    //  Keep IonIcons font
+    '!' + wwwPath + '/lib/ionic',
+    wwwPath + '/lib/ionic/*',
+    '!' + wwwPath + '/lib/ionic/fonts',
+
+    //  Keep RobotoDraft font
+    '!' + wwwPath + '/lib/robotodraft',
+    wwwPath + '/lib/robotodraft/*',
+    '!' + wwwPath + '/lib/robotodraft/fonts'
+  ]
+
+  return gulp.src(patterns, {read: false})
+    //.pipe(debug({title: 'deleting '}))
+    .pipe(clean());
 }
 
 function webZip() {
@@ -639,22 +695,8 @@ function webExtensionCopyFiles() {
   return gulp.src([
     wwwPath + '/**/*',
 
-    // Remove API
+    // Skip API and debug.html
     '!' + wwwPath + '/api',
-
-    // Remove JS debug files
-    wwwPath + '/dist_js/*.*',
-    '!' + wwwPath + '/dist_js/cesium.js',
-    '!' + wwwPath + '/dist_js/vendor.js',
-    '!' + wwwPath + '/dist_js/cesium-api*.js',
-    '!' + wwwPath + '/dist_js/vendor-api*.js',
-
-    // Remove CSS debug files
-    wwwPath + '/dist_css/*.*',
-    '!' + wwwPath + '/dist_css/cesium.css',
-    '!' + wwwPath + '/dist_css/cesium-api*.css',
-
-    // Remove HTML debug files
     wwwPath + '/api/*',
     '!' + wwwPath + '/api/debug.html',
     '!' + wwwPath + '/debug.html',
@@ -662,8 +704,10 @@ function webExtensionCopyFiles() {
     // Remove unused files (feed.json) in extension
     '!' + wwwPath + '/feed*.json',
 
-    // Add specific resource (and overwrite the default 'manifest.json')
+    // Skip web manifest
     '!' + wwwPath + '/manifest.json',
+
+    // Add specific resource (and overwrite the default 'manifest.json')
     resourcesPath + '/**/*.*'
    ])
 
@@ -742,7 +786,9 @@ gulp.task('webPluginNgAnnotate', ['webPluginNgTemplate'],  webPluginNgAnnotate);
 
 gulp.task('webDebugFile', ['webPluginNgAnnotate'], webDebugFile);
 gulp.task('webUglify', ['webDebugFile'], webUglify);
-gulp.task('webApiDebugFile', ['webUglify'], webApiDebugFile);
+gulp.task('webIntegrity', ['webUglify'], webIntegrity);
+
+gulp.task('webApiDebugFile', ['webIntegrity'], webApiDebugFile);
 gulp.task('webApiUglify', ['webApiDebugFile'], webApiUglify);
 
 gulp.task('webCleanUnusedFiles', ['webApiUglify'], webCleanUnusedFiles);
@@ -756,3 +802,19 @@ gulp.task('webExtensionZip', ['webExtensionCopyFiles'], webExtensionZip);
 gulp.task('webBuild', ['webZip', 'webExtensionZip'], webBuildSuccess);
 gulp.task('build:web', ['webBuild']); // = webBuild
 
+gulp.task('webExtBuild', ['webExtensionZip']);
+
+gulp.task('help', function() {
+  log(colors.green("Usage: gulp {config|webBuild|webExtBuild} OPTIONS"));
+  log(colors.green(""));
+  log(colors.green("NAME"));
+  log(colors.green(""));
+  log(colors.green("  config --env <config_name>  Configure Cesium. "));
+  log(colors.green("  webBuild                    Build Cesium has a web ZIP"));
+  log(colors.green("  webExtBuild                 Build Cesium has a webExtension"));
+  log(colors.green(""));
+  log(colors.green("OPTIONS"));
+  //log(colors.green(""));
+  //log(colors.green("  --release                   Release build"));
+  //log(colors.green("  --useref                    Build with uglify and useref plugins"));
+})
diff --git a/package.json b/package.json
index e08b31269ddc78d3f13053bf11c4351b41c8a04d..01d339a42ef030331cbdfb3df19152e72b403ae5 100644
--- a/package.json
+++ b/package.json
@@ -69,13 +69,13 @@
     "@bower_components/ng-idle": "HackedByChinese/ng-idle#^1.3.2",
     "@bower_components/ngCordova": "driftyco/ng-cordova#0.1.27-alpha",
     "@bower_components/numeral": "adamwdraper/Numeral-js#^1.5.6",
+    "@bower_components/qrcode-generator": "kazuhikoarase/qrcode-generator#js1.4.4",
     "@bower_components/robotodraft": "raibutera/robotodraft#1.1.0",
     "@bower_components/socket.io": "socketio/socket.io#^1.7.4",
     "@bower_components/socket.io-client": "socketio/socket.io-client#^1.7.4",
     "@bower_components/ui-leaflet": "angular-ui/ui-leaflet#^2.0.0",
     "@bower_components/underscore": "jashkenas/underscore#^1.8.3",
     "@bower_components/waves": "fians/Waves#0.6",
-    "@bower_components/qrcode-generator": "kazuhikoarase/qrcode-generator#js1.4.4",
     "cordova": "^9.0.0",
     "cordova-android": "^8.1.0",
     "cordova-clipboard": "^1.3.0",
@@ -110,6 +110,8 @@
     "gulp": "^3.9.1",
     "gulp-angular-templatecache": "^2.2.7",
     "gulp-angular-translate": "^0.1.4",
+    "gulp-debug": "^4.0.0",
+    "gulp-hash-src": "^0.1.6",
     "gulp-base64": "^0.1.3",
     "gulp-base64-v2": "^1.0.4",
     "gulp-bump": "^2.1.0",
@@ -214,4 +216,4 @@
   "engines": {
     "yarn": ">= 1.0.0"
   }
-}
\ No newline at end of file
+}
diff --git a/www/js/config.js b/www/js/config.js
index 539e0ce973c6f43dc5ccd1263efee9aec36b2edd..1d39cee12e82827137416a8cea154e93985749b2 100644
--- a/www/js/config.js
+++ b/www/js/config.js
@@ -98,7 +98,7 @@ angular.module("cesium.config", [])
 		}
 	},
 	"version": "1.5.11",
-	"build": "2020-03-13T17:20:00.591Z",
+	"build": "2020-03-13T18:57:05.777Z",
 	"newIssueUrl": "https://git.duniter.org/clients/cesium-grp/cesium/issues/new"
 })
 
diff --git a/yarn.lock b/yarn.lock
index bba3018109fe6e938f094cac01fccb0b8650ee5f..a58e75a59d05be2f5f1d5dab7a6e57657308e85f 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2363,6 +2363,19 @@ degenerator@^1.0.4:
     escodegen "1.x.x"
     esprima "3.x.x"
 
+del@^2.1.0:
+  version "2.2.2"
+  resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8"
+  integrity sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=
+  dependencies:
+    globby "^5.0.0"
+    is-path-cwd "^1.0.0"
+    is-path-in-cwd "^1.0.0"
+    object-assign "^4.0.1"
+    pify "^2.0.0"
+    pinkie-promise "^2.0.0"
+    rimraf "^2.2.8"
+
 del@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/del/-/del-3.0.0.tgz#53ecf699ffcbcb39637691ab13baf160819766e5"
@@ -3024,7 +3037,7 @@ extsprintf@^1.2.0:
   resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f"
   integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8=
 
-fancy-log@^1.1.0:
+fancy-log@^1.1.0, fancy-log@^1.3.2:
   version "1.3.3"
   resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.3.tgz#dbc19154f558690150a23953a0adbd035be45fc7"
   integrity sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==
@@ -3345,6 +3358,13 @@ fs@0.0.2:
   resolved "https://registry.yarnpkg.com/fs/-/fs-0.0.2.tgz#e1f244ef3933c1b2a64bd4799136060d0f5914f8"
   integrity sha1-4fJE7zkzwbKmS9R5kTYGDQ9ZFPg=
 
+fs_helper@=0.1.11:
+  version "0.1.11"
+  resolved "https://registry.yarnpkg.com/fs_helper/-/fs_helper-0.1.11.tgz#c76f466c3af6f3f3bef0ee9b4093fd39369f8faa"
+  integrity sha1-x29GbDr28/O+8O6bQJP9OTafj6o=
+  dependencies:
+    girdle "=0.1.15"
+
 fsevents@~2.1.2:
   version "2.1.2"
   resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.2.tgz#4c0a1fb34bc68e543b4b82a9ec392bfbda840805"
@@ -3428,6 +3448,11 @@ get-caller-file@^1.0.1:
   resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a"
   integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==
 
+get-own-enumerable-property-symbols@^3.0.0:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664"
+  integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==
+
 get-stdin@^4.0.1:
   version "4.0.1"
   resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe"
@@ -3469,6 +3494,16 @@ getpass@^0.1.1:
   dependencies:
     assert-plus "^1.0.0"
 
+girdle@=0.1.15:
+  version "0.1.15"
+  resolved "https://registry.yarnpkg.com/girdle/-/girdle-0.1.15.tgz#f808819e3092aa2370982cc3ec4df19a83605848"
+  integrity sha1-+AiBnjCSqiNwmCzD7E3xmoNgWEg=
+
+girdle@=0.2.3:
+  version "0.2.3"
+  resolved "https://registry.yarnpkg.com/girdle/-/girdle-0.2.3.tgz#8ba29189adfc7fc5e08efa731d5b5563e86c24be"
+  integrity sha1-i6KRia38f8XgjvpzHVtVY+hsJL4=
+
 glob-parent@^3.1.0:
   version "3.1.0"
   resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae"
@@ -3629,6 +3664,18 @@ global-prefix@^1.0.1:
     is-windows "^1.0.1"
     which "^1.2.14"
 
+globby@^5.0.0:
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d"
+  integrity sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=
+  dependencies:
+    array-union "^1.0.1"
+    arrify "^1.0.0"
+    glob "^7.0.3"
+    object-assign "^4.0.1"
+    pify "^2.0.0"
+    pinkie-promise "^2.0.0"
+
 globby@^6.1.0:
   version "6.1.0"
   resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c"
@@ -3875,6 +3922,30 @@ gulp-csso@^2.0.0:
     gulp-util "^3.0.6"
     vinyl-sourcemaps-apply "^0.2.1"
 
+gulp-debug@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/gulp-debug/-/gulp-debug-4.0.0.tgz#036f9539c3fb6af720e01a9ea5c195fc73f29d5b"
+  integrity sha512-cn/GhMD2nVZCVxAl5vWao4/dcoZ8wUJ8w3oqTvQaGDmC1vT7swNOEbhQTWJp+/otKePT64aENcqAQXDcdj5H1g==
+  dependencies:
+    chalk "^2.3.0"
+    fancy-log "^1.3.2"
+    plur "^3.0.0"
+    stringify-object "^3.0.0"
+    through2 "^2.0.0"
+    tildify "^1.1.2"
+
+gulp-dest-clean@^0.5.0:
+  version "0.5.0"
+  resolved "https://registry.yarnpkg.com/gulp-dest-clean/-/gulp-dest-clean-0.5.0.tgz#92a156f74952f1ccc4c0f1d440a192a5ad5f413c"
+  integrity sha1-kqFW90lS8czEwPHUQKGSpa1fQTw=
+  dependencies:
+    chalk "^1.1.1"
+    del "^2.1.0"
+    gulp-util "^3.0.7"
+    lie "^3.0.1"
+    object-assign "^4.0.1"
+    through2 "^2.0.0"
+
 gulp-filter@^4.0.0:
   version "4.0.0"
   resolved "https://registry.yarnpkg.com/gulp-filter/-/gulp-filter-4.0.0.tgz#395f58a256c559cdb9e0d157f1caaf5248a38dcb"
@@ -3905,6 +3976,15 @@ gulp-git@^1.2.4:
     require-dir "^0.1.0"
     through2 "^0.6.5"
 
+gulp-hash-src@^0.1.6:
+  version "0.1.6"
+  resolved "https://registry.yarnpkg.com/gulp-hash-src/-/gulp-hash-src-0.1.6.tgz#ff1d31660bcc6b13bb6be9fca562ee0c3c034423"
+  integrity sha1-/x0xZgvMaxO7a+n8pWLuDDwDRCM=
+  dependencies:
+    fs_helper "=0.1.11"
+    girdle "=0.2.3"
+    through2 "=0.4.2"
+
 gulp-header@2.0.7:
   version "2.0.7"
   resolved "https://registry.yarnpkg.com/gulp-header/-/gulp-header-2.0.7.tgz#07505740eb432e8d2bb2af68744858dabaaf491b"
@@ -4031,6 +4111,15 @@ gulp-ng-constant@^1.1.0:
     through2 "^2.0.0"
     vinyl "^2.1.0"
 
+gulp-ref-hash@^0.0.2:
+  version "0.0.2"
+  resolved "https://registry.yarnpkg.com/gulp-ref-hash/-/gulp-ref-hash-0.0.2.tgz#7099efea0847532d36124de25f0280990b5c4744"
+  integrity sha1-cJnv6ghHUy02Ek3iXwKAmQtcR0Q=
+  dependencies:
+    gulp-util "^2.2.17"
+    through2 "^0.5.1"
+    underscore "^1.6.0"
+
 gulp-remove-code@^1.0.2:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/gulp-remove-code/-/gulp-remove-code-1.0.2.tgz#a05df4d87af6bc0821aa5fa6e24ceb4fd59d0256"
@@ -4164,7 +4253,7 @@ gulp-util@3.0.3:
     through2 "^0.6.3"
     vinyl "^0.4.3"
 
-gulp-util@^2.2.14, gulp-util@~2.2.14:
+gulp-util@^2.2.14, gulp-util@^2.2.17, gulp-util@~2.2.14:
   version "2.2.20"
   resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-2.2.20.tgz#d7146e5728910bd8f047a6b0b1e549bc22dbd64c"
   integrity sha1-1xRuVyiRC9jwR6awseVJvCLb1kw=
@@ -4562,6 +4651,11 @@ ignore@^4.0.3:
   resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc"
   integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==
 
+immediate@~3.0.5:
+  version "3.0.6"
+  resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b"
+  integrity sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=
+
 import-fresh@^3.0.0:
   version "3.2.1"
   resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66"
@@ -4780,6 +4874,11 @@ ipaddr.js@1.9.0:
   resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.0.tgz#37df74e430a0e47550fe54a2defe30d8acd95f65"
   integrity sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==
 
+irregular-plurals@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/irregular-plurals/-/irregular-plurals-2.0.0.tgz#39d40f05b00f656d0b7fa471230dd3b714af2872"
+  integrity sha512-Y75zBYLkh0lJ9qxeHlMjQ7bSbyiSqNW/UOPWDmzC7cXskL1hekSITh1Oc6JV0XCWWZ9DE8VYSB71xocLk3gmGw==
+
 is-absolute-url@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-1.0.0.tgz#2d7ef0fd0bb2a88dac7e92253c6808a0ace24bfb"
@@ -4998,7 +5097,7 @@ is-number@^7.0.0:
   resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
   integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
 
-is-obj@^1.0.0:
+is-obj@^1.0.0, is-obj@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f"
   integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8=
@@ -5061,6 +5160,11 @@ is-regex@^1.0.4, is-regex@^1.0.5, is-regex@~1.0.5:
   dependencies:
     has "^1.0.3"
 
+is-regexp@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069"
+  integrity sha1-/S2INUXEa6xaYz57mgnof6LLUGk=
+
 is-relative-url@1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/is-relative-url/-/is-relative-url-1.0.0.tgz#87a9d35e8a789b49e079b4d7d69d64612e8e0e1f"
@@ -5410,6 +5514,13 @@ levn@~0.3.0:
     prelude-ls "~1.1.2"
     type-check "~0.3.2"
 
+lie@^3.0.1:
+  version "3.3.0"
+  resolved "https://registry.yarnpkg.com/lie/-/lie-3.3.0.tgz#dcf82dee545f46074daf200c7c1c5a08e0f40f6a"
+  integrity sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==
+  dependencies:
+    immediate "~3.0.5"
+
 liftoff@^2.1.0:
   version "2.5.0"
   resolved "https://registry.yarnpkg.com/liftoff/-/liftoff-2.5.0.tgz#2009291bb31cea861bbf10a7c15a28caf75c31ec"
@@ -7171,6 +7282,13 @@ plugin-log@^0.1.0:
     chalk "^1.1.1"
     dateformat "^1.0.11"
 
+plur@^3.0.0:
+  version "3.1.1"
+  resolved "https://registry.yarnpkg.com/plur/-/plur-3.1.1.tgz#60267967866a8d811504fe58f2faaba237546a5b"
+  integrity sha512-t1Ax8KUvV3FFII8ltczPn2tJdjqbd1sIzu6t4JL7nQ3EyeL/lTrj5PWKb06ic5/6XYDr65rQ4uzQEGN70/6X5w==
+  dependencies:
+    irregular-plurals "^2.0.0"
+
 posix-character-classes@^0.1.0:
   version "0.1.1"
   resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab"
@@ -8563,6 +8681,15 @@ string_decoder@~1.1.1:
   dependencies:
     safe-buffer "~5.1.0"
 
+stringify-object@^3.0.0:
+  version "3.3.0"
+  resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629"
+  integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==
+  dependencies:
+    get-own-enumerable-property-symbols "^3.0.0"
+    is-obj "^1.0.1"
+    is-regexp "^1.0.0"
+
 stringmap@~0.2.2:
   version "0.2.2"
   resolved "https://registry.yarnpkg.com/stringmap/-/stringmap-0.2.2.tgz#556c137b258f942b8776f5b2ef582aa069d7d1b1"
@@ -8827,7 +8954,7 @@ through2@3.0.1, through2@^3.0.0:
   dependencies:
     readable-stream "2 || 3"
 
-through2@^0.4.2, through2@~0.4.0, through2@~0.4.1:
+through2@=0.4.2, through2@^0.4.2, through2@~0.4.0, through2@~0.4.1:
   version "0.4.2"
   resolved "https://registry.yarnpkg.com/through2/-/through2-0.4.2.tgz#dbf5866031151ec8352bb6c4db64a2292a840b9b"
   integrity sha1-2/WGYDEVHsg1K7bE22SiKSqEC5s=
@@ -8835,7 +8962,7 @@ through2@^0.4.2, through2@~0.4.0, through2@~0.4.1:
     readable-stream "~1.0.17"
     xtend "~2.1.1"
 
-through2@^0.5.0:
+through2@^0.5.0, through2@^0.5.1:
   version "0.5.1"
   resolved "https://registry.yarnpkg.com/through2/-/through2-0.5.1.tgz#dfdd012eb9c700e2323fd334f38ac622ab372da7"
   integrity sha1-390BLrnHAOIyP9M084rGIqs3Lac=
@@ -8869,7 +8996,7 @@ thunkify@^2.1.2:
   resolved "https://registry.yarnpkg.com/thunkify/-/thunkify-2.1.2.tgz#faa0e9d230c51acc95ca13a361ac05ca7e04553d"
   integrity sha1-+qDp0jDFGsyVyhOjYawFyn4EVT0=
 
-tildify@^1.0.0:
+tildify@^1.0.0, tildify@^1.1.2:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/tildify/-/tildify-1.2.0.tgz#dcec03f55dca9b7aa3e5b04f21817eb56e63588a"
   integrity sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo=
@@ -9133,6 +9260,11 @@ underscore@1.2.1:
   resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.2.1.tgz#fc5c6b0765673d92a2d4ac8b4dc0aa88702e2bd4"
   integrity sha1-/FxrB2VnPZKi1KyLTcCqiHAuK9Q=
 
+underscore@^1.6.0:
+  version "1.9.2"
+  resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.2.tgz#0c8d6f536d6f378a5af264a72f7bec50feb7cf2f"
+  integrity sha512-D39qtimx0c1fI3ya1Lnhk3E9nONswSKhnffBI0gME9C99fYOkNi04xs8K6pePLhvl1frbDemkaBQ5ikWllR2HQ==
+
 underscore@^1.8.3, underscore@^1.9.1:
   version "1.9.1"
   resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.1.tgz#06dce34a0e68a7babc29b365b8e74b8925203961"