diff --git a/libraries.txt b/libraries.txt
index ecba0e96..7107779b 100644
--- a/libraries.txt
+++ b/libraries.txt
@@ -115,7 +115,6 @@ Name                                                             Version
 @babel/plugin-transform-template-literals                        7.4.4            MIT                                  https://github.com/babel/babel/tree/master/packages/babel-plugin-transform-template-literals
 @babel/plugin-transform-typeof-symbol                            7.2.0            MIT                                  https://github.com/babel/babel/tree/master/packages/babel-plugin-transform-typeof-symbol
 @babel/plugin-transform-unicode-regex                            7.4.4            MIT                                  https://github.com/babel/babel/tree/master/packages/babel-plugin-transform-unicode-regex
-@babel/polyfill                                                  7.4.4            MIT                                  https://github.com/babel/babel/tree/master/packages/babel-polyfill
 @babel/preset-env                                                7.3.4            MIT                                  https://github.com/babel/babel/tree/master/packages/babel-preset-env
 @babel/template                                                  7.4.4            MIT                                  https://github.com/babel/babel/tree/master/packages/babel-template
 @babel/traverse                                                  7.5.5            MIT                                  https://github.com/babel/babel/tree/master/packages/babel-traverse
@@ -199,6 +198,7 @@ aws4                                                             1.8.0
 axios                                                            0.18.1           MIT                                  https://github.com/axios/axios.git
 axios-mock-adapter                                               1.17.0           MIT                                  git+https://github.com/ctimmerm/axios-mock-adapter.git
 babel-code-frame                                                 6.26.0           MIT                                  https://github.com/babel/babel/tree/master/packages/babel-code-frame
+babel-eslint                                                     10.0.3           MIT                                  https://github.com/babel/babel-eslint
 babel-helper-call-delegate                                       6.24.1           MIT                                  https://github.com/babel/babel/tree/master/packages/babel-helper-call-delegate
 babel-helper-define-map                                          6.26.0           MIT                                  https://github.com/babel/babel/tree/master/packages/babel-helper-define-map
 babel-helper-function-name                                       6.24.1           MIT                                  https://github.com/babel/babel/tree/master/packages/babel-helper-function-name
@@ -364,8 +364,7 @@ convert-source-map                                               1.6.0
 convert-source-map                                               1.1.3            MIT                                  git://github.com/thlorenz/convert-source-map.git
 cookie                                                           0.3.1            MIT                                  https://github.com/jshttp/cookie.git
 copy-descriptor                                                  0.1.1            MIT                                  https://github.com/jonschlinkert/copy-descriptor.git
-core-js                                                          3.1.4            MIT                                  https://github.com/zloirock/core-js.git
-core-js                                                          2.6.9            MIT                                  https://github.com/zloirock/core-js.git
+core-js                                                          3.2.1            MIT                                  https://github.com/zloirock/core-js.git
 core-util-is                                                     1.0.2            MIT                                  git://github.com/isaacs/core-util-is
 cosmiconfig                                                      5.2.1            MIT                                  git+https://github.com/davidtheclark/cosmiconfig.git
 create-ecdh                                                      4.0.3            MIT                                  https://github.com/crypto-browserify/createECDH.git
@@ -1099,7 +1098,6 @@ umd                                                              3.0.3
 unbzip2-stream                                                   1.3.3            MIT                                  https://github.com/regular/unbzip2-stream.git
 unc-path-regex                                                   0.1.2            MIT                                  https://github.com/regexhq/unc-path-regex.git
 underscore                                                       1.9.1            MIT                                  git://github.com/jashkenas/underscore.git
-underscore.string                                                3.3.5            MIT                                  https://github.com/epeli/underscore.string.git
 unicode-canonical-property-names-ecmascript                      1.0.4            MIT                                  https://github.com/mathiasbynens/unicode-canonical-property-names-ecmascript.git
 unicode-match-property-ecmascript                                1.0.4            MIT                                  https://github.com/mathiasbynens/unicode-match-property-ecmascript.git
 unicode-match-property-value-ecmascript                          1.1.0            MIT                                  https://github.com/mathiasbynens/unicode-match-property-value-ecmascript.git
@@ -1316,7 +1314,7 @@ cyclist                                                          0.2.2
 indexof                                                          0.0.1            MIT*                                 Unknown
 object-component                                                 0.0.3            MIT*                                 Unknown
 precond                                                          0.2.3            MIT*                                 https://github.com/MathieuTurcotte/node-precond.git
-webcabin-docker                                                  2.2.4-dev        MIT*                                 Unknown
+webcabin-docker                                                  CommitID         MIT*                                 https://github.com/EnterpriseDB/wcDocker/#c95d295382ac61159e571af9c3b8f4f8ae81746d
 atob                                                             2.1.2            (MIT OR Apache-2.0)                  git://git.coolaj86.com/coolaj86/atob.js.git
 JSONStream                                                       1.3.5            (MIT OR Apache-2.0)                  git://github.com/dominictarr/JSONStream.git
 caniuse-lite                                                     1.0.30000988     CC-BY-4.0                            https://github.com/ben-eb/caniuse-lite.git
diff --git a/requirements.txt b/requirements.txt
index 5bd5d726..fd59094e 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -16,28 +16,25 @@
 ##############################################################################
 blinker==1.4
 Flask==1.0.2
+Flask-Compress>=1.4.0
 Flask-Gravatar==0.5.0
 Flask-Login==0.4.1
 Flask-Mail==0.9.1
 Flask-Migrate==2.4.0
+Flask-Paranoid==0.2.0
 Flask-Principal==0.4.0
+Flask-Security>=3.0.0
 Flask-SQLAlchemy==2.3.2
 Flask-WTF==0.14.2
 passlib==1.7.1
+psutil==5.5.1
+psycopg2>=2.8
+python-dateutil>=2.8.0
 pytz==2018.9
 simplejson==3.16.0
 six>=1.12.0
 speaklater==1.3
-sqlparse==0.2.4
-WTForms==2.2.1
-Flask-Paranoid==0.2.0
-psutil==5.5.1
-psycopg2>=2.8
-python-dateutil>=2.8.0
-htmlmin==0.1.12
-Flask-HTMLmin==1.5.0
 SQLAlchemy>=1.2.18
-Flask-Security>=3.0.0
+sqlparse==0.2.4
 sshtunnel>=0.1.4
-
-
+WTForms==2.2.1
diff --git a/web/.eslintrc.js b/web/.eslintrc.js
index a9d7437f..dd24f02b 100644
--- a/web/.eslintrc.js
+++ b/web/.eslintrc.js
@@ -17,9 +17,11 @@ module.exports = {
   'extends': [
     'eslint:recommended',
   ],
+  'parser': 'babel-eslint',
   'parserOptions': {
     'ecmaVersion': 2018,
     'sourceType': 'module',
+    'allowImportExportEverywhere': true
   },
   'plugins': [
   ],
diff --git a/web/config.py b/web/config.py
index 76ea7ef8..e93cb3ed 100644
--- a/web/config.py
+++ b/web/config.py
@@ -159,10 +159,13 @@ SECURITY_PASSWORD_HASH = 'pbkdf2_sha512'
 #       longer part of the main configuration, but are stored in the
 #       configuration databases 'keys' table and are auto-generated.
 
-# Should HTML be minified on the fly when not in debug mode?
-# NOTE: The HTMLMIN module doesn't work with Python 2.6, so this option
-#       has no effect on <= Python 2.7.
-MINIFY_PAGE = True
+# COMPRESSION
+COMPRESS_MIMETYPES = [
+    'text/html', 'text/css', 'text/xml', 'application/json',
+    'application/javascript'
+]
+COMPRESS_LEVEL = 9
+COMPRESS_MIN_SIZE = 500
 
 # Set the cache control max age for static files in flask to 1 year
 SEND_FILE_MAX_AGE_DEFAULT = 31556952
diff --git a/web/package.json b/web/package.json
index 27954a44..256d4314 100644
--- a/web/package.json
+++ b/web/package.json
@@ -7,11 +7,14 @@
   ],
   "license": "PostgreSQL",
   "devDependencies": {
-    "@babel/core": "~7.3.4",
-    "@babel/preset-env": "~7.3.4",
+    "@babel/core": "~7.6.0",
+    "@babel/plugin-syntax-dynamic-import": "^7.2.0",
+    "@babel/preset-env": "~7.6.0",
     "axios-mock-adapter": "^1.16.0",
+    "babel-eslint": "^10.0.3",
     "babel-loader": "~8.0.5",
     "babel-plugin-transform-object-rest-spread": "^7.0.0-beta.3",
+    "core-js": "^3.2.1",
     "cross-env": "^5.2.0",
     "eclint": "^2.8.1",
     "eslint": "5.15.1",
@@ -40,11 +43,11 @@
     "uglifyjs-webpack-plugin": "^2.1.2",
     "url-loader": "^1.1.2",
     "webpack": "^4.29.6",
+    "webpack-bundle-analyzer": "^3.4.1",
     "webpack-cli": "^3.2.3",
     "yarn-audit-html": "^1.1.0"
   },
   "dependencies": {
-    "@babel/polyfill": "^7.2.5",
     "acitree": "git+https://github.com/imsurinder90/jquery-aciTree.git#rc.7",
     "alertifyjs": "1.7.1",
     "axios": "^0.18.1",
@@ -53,7 +56,6 @@
     "babelify": "~10.0.0",
     "backbone": "1.4.0",
     "backform": "^0.2.0",
-    "backgrid": "^0.3.8",
     "backgrid-filter": "^0.3.7",
     "backgrid-select-all": "^0.3.5",
     "backgrid-sizeable-columns": "^0.1.1",
@@ -88,12 +90,10 @@
     "snapsvg": "^0.5.1",
     "spectrum-colorpicker": "^1.8.0",
     "split.js": "^1.5.10",
-    "sprintf-js": "^1.1.2",
     "tablesorter": "^2.31.1",
     "tempusdominus-bootstrap-4": "^5.1.2",
     "tempusdominus-core": "^5.0.3",
     "underscore": "^1.9.1",
-    "underscore.string": "^3.3.5",
     "watchify": "~3.11.1",
     "webcabin-docker": "git+https://github.com/EnterpriseDB/wcDocker/#c95d295382ac61159e571af9c3b8f4f8ae81746d",
     "wkx": "^0.4.6"
diff --git a/web/pgadmin/__init__.py b/web/pgadmin/__init__.py
index 28bb51c7..dacc6bce 100644
--- a/web/pgadmin/__init__.py
+++ b/web/pgadmin/__init__.py
@@ -708,8 +708,8 @@ def create_app(app_name=None):
     # Minify output
     ##########################################################################
     if not config.DEBUG:
-        from flask_htmlmin import HTMLMIN
-        HTMLMIN(app)
+        from flask_compress import Compress
+        Compress(app)
 
     @app.context_processor
     def inject_blueprint():
diff --git a/web/pgadmin/about/static/js/about.js b/web/pgadmin/about/static/js/about.js
index 64bc356d..9186f65c 100644
--- a/web/pgadmin/about/static/js/about.js
+++ b/web/pgadmin/about/static/js/about.js
@@ -8,10 +8,10 @@
 //////////////////////////////////////////////////////////////
 
 define(
-  ['jquery', 'alertify', 'sources/pgadmin', 'underscore.string', 'sources/gettext',
+  ['jquery', 'alertify', 'sources/pgadmin', 'sources/gettext',
     'sources/url_for',
   ],
-  function($, alertify, pgAdmin, S, gettext, url_for) {
+  function($, alertify, pgAdmin, gettext, url_for) {
     pgAdmin = pgAdmin || window.pgAdmin || {};
 
     /* Return back, this has been called more than once */
@@ -53,7 +53,7 @@ define(
         $.get(url_for('about.index'),
           function(data) {
             alertify.aboutDialog(
-              S(gettext('About %s')).sprintf(pgAdmin.Browser.utils.app_name).value(), data
+              gettext('About %s', pgAdmin.Browser.utils.app_name), data
             ).resizeTo(pgAdmin.Browser.stdW.md, pgAdmin.Browser.stdH.md);
           });
       },
diff --git a/web/pgadmin/browser/server_groups/servers/databases/casts/static/js/cast.js b/web/pgadmin/browser/server_groups/servers/databases/casts/static/js/cast.js
index c3b8e080..711d3ad3 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/casts/static/js/cast.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/casts/static/js/cast.js
@@ -9,9 +9,9 @@
 
 define('pgadmin.node.cast', [
   'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
-  'underscore.string', 'sources/pgadmin', 'pgadmin.browser',
+  'sources/pgadmin', 'pgadmin.browser',
   'pgadmin.alertifyjs', 'pgadmin.backform', 'pgadmin.browser.collection',
-], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, alertify, Backform) {
+], function(gettext, url_for, $, _, pgAdmin, pgBrowser, alertify, Backform) {
   // Extend the collection class for cast
   if (!pgBrowser.Nodes['coll-cast']) {
     pgAdmin.Browser.Nodes['coll-cast'] =
diff --git a/web/pgadmin/browser/server_groups/servers/databases/event_triggers/static/js/event_trigger.js b/web/pgadmin/browser/server_groups/servers/databases/event_triggers/static/js/event_trigger.js
index fc78e602..8f8c2ad8 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/event_triggers/static/js/event_trigger.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/event_triggers/static/js/event_trigger.js
@@ -9,9 +9,9 @@
 
 define('pgadmin.node.event_trigger', [
   'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
-  'underscore.string', 'sources/pgadmin', 'pgadmin.browser',
+  'sources/pgadmin', 'pgadmin.browser',
   'pgadmin.backform', 'pgadmin.browser.collection',
-], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, Backform) {
+], function(gettext, url_for, $, _, pgAdmin, pgBrowser, Backform) {
 
   // Extend the browser's collection class for event trigger collection
   if (!pgBrowser.Nodes['coll-event_trigger']) {
diff --git a/web/pgadmin/browser/server_groups/servers/databases/extensions/static/js/extension.js b/web/pgadmin/browser/server_groups/servers/databases/extensions/static/js/extension.js
index 64ab3e4e..8fcb442f 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/extensions/static/js/extension.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/extensions/static/js/extension.js
@@ -9,9 +9,9 @@
 
 define('pgadmin.node.extension', [
   'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
-  'underscore.string', 'sources/pgadmin', 'pgadmin.browser',
+  'sources/pgadmin', 'pgadmin.browser',
   'pgadmin.backform', 'pgadmin.browser.collection',
-], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, Backform) {
+], function(gettext, url_for, $, _, pgAdmin, pgBrowser, Backform) {
 
   /*
    * Create and Add an Extension Collection into nodes
diff --git a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/static/js/foreign_server.js b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/static/js/foreign_server.js
index 1c82513f..e392cc41 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/static/js/foreign_server.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/static/js/foreign_server.js
@@ -8,10 +8,10 @@
 //////////////////////////////////////////////////////////////
 
 define('pgadmin.node.foreign_server', [
-  'sources/gettext', 'jquery', 'underscore', 'underscore.string', 'sources/pgadmin',
+  'sources/gettext', 'jquery', 'underscore', 'sources/pgadmin',
   'pgadmin.browser', 'pgadmin.backform', 'pgadmin.browser.collection',
   'pgadmin.browser.server.privilege',
-], function(gettext, $, _, S, pgAdmin, pgBrowser, Backform) {
+], function(gettext, $, _, pgAdmin, pgBrowser, Backform) {
 
   // Extend the browser's node model class to create a Options model
   var OptionsModel = pgAdmin.Browser.Node.Model.extend({
diff --git a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/user_mappings/static/js/user_mapping.js b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/user_mappings/static/js/user_mapping.js
index 3d75f673..b3b66f71 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/user_mappings/static/js/user_mapping.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/foreign_servers/user_mappings/static/js/user_mapping.js
@@ -9,9 +9,9 @@
 
 define('pgadmin.node.user_mapping', [
   'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
-  'underscore.string', 'sources/pgadmin', 'pgadmin.browser',
+  'sources/pgadmin', 'pgadmin.browser',
   'pgadmin.backform', 'pgadmin.browser.collection',
-], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, Backform) {
+], function(gettext, url_for, $, _, pgAdmin, pgBrowser, Backform) {
 
   // Extend the browser's node model class to create a Options model
   var OptionsModel = pgAdmin.Browser.Node.Model.extend({
diff --git a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/static/js/foreign_data_wrapper.js b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/static/js/foreign_data_wrapper.js
index c5ee0b3c..2fd5c915 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/static/js/foreign_data_wrapper.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/foreign_data_wrappers/static/js/foreign_data_wrapper.js
@@ -9,9 +9,9 @@
 
 define('pgadmin.node.foreign_data_wrapper', [
   'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
-  'underscore.string', 'sources/pgadmin', 'pgadmin.browser', 'pgadmin.backform',
+  'sources/pgadmin', 'pgadmin.browser', 'pgadmin.backform',
   'pgadmin.browser.collection', 'pgadmin.browser.server.privilege',
-], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, Backform) {
+], function(gettext, url_for, $, _, pgAdmin, pgBrowser, Backform) {
 
   // Extend the browser's node model class to create a Options model
   var OptionsModel = pgBrowser.Node.Model.extend({
diff --git a/web/pgadmin/browser/server_groups/servers/databases/languages/static/js/language.js b/web/pgadmin/browser/server_groups/servers/databases/languages/static/js/language.js
index 8c2ec0b7..0d7cea19 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/languages/static/js/language.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/languages/static/js/language.js
@@ -9,9 +9,9 @@
 
 define('pgadmin.node.language', [
   'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
-  'underscore.string', 'sources/pgadmin', 'pgadmin.browser', 'pgadmin.backform',
+  'sources/pgadmin', 'pgadmin.browser', 'pgadmin.backform',
   'pgadmin.browser.collection', 'pgadmin.browser.server.privilege',
-], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, Backform) {
+], function(gettext, url_for, $, _, pgAdmin, pgBrowser, Backform) {
 
   // Extend the browser's collection class for languages collection
   if (!pgBrowser.Nodes['coll-language']) {
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/catalog_objects/columns/static/js/catalog_object_column.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/catalog_objects/columns/static/js/catalog_object_column.js
index d01e9a2d..1682b04d 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/catalog_objects/columns/static/js/catalog_object_column.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/catalog_objects/columns/static/js/catalog_object_column.js
@@ -8,9 +8,9 @@
 //////////////////////////////////////////////////////////////
 
 define('pgadmin.node.catalog_object_column', [
-  'sources/gettext', 'jquery', 'underscore', 'underscore.string', 'sources/pgadmin',
+  'sources/gettext', 'jquery', 'underscore', 'sources/pgadmin',
   'pgadmin.browser', 'pgadmin.browser.collection',
-], function(gettext, $, _, S, pgAdmin, pgBrowser) {
+], function(gettext, $, _, pgAdmin, pgBrowser) {
 
   if (!pgBrowser.Nodes['coll-catalog_object_column']) {
     pgAdmin.Browser.Nodes['coll-catalog_object_column'] =
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/catalog_objects/static/js/catalog_object.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/catalog_objects/static/js/catalog_object.js
index a21e2064..efdafbb9 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/catalog_objects/static/js/catalog_object.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/catalog_objects/static/js/catalog_object.js
@@ -8,9 +8,9 @@
 //////////////////////////////////////////////////////////////
 
 define('pgadmin.node.catalog_object', [
-  'sources/gettext', 'jquery', 'underscore', 'underscore.string', 'sources/pgadmin',
+  'sources/gettext', 'jquery', 'underscore', 'sources/pgadmin',
   'pgadmin.browser', 'pgadmin.browser.collection',
-], function(gettext, $, _, S, pgAdmin, pgBrowser) {
+], function(gettext, $, _, pgAdmin, pgBrowser) {
 
   if (!pgBrowser.Nodes['coll-catalog_object']) {
     pgAdmin.Browser.Nodes['coll-catalog_object'] =
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/static/js/collation.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/static/js/collation.js
index e3b60303..407f82f0 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/static/js/collation.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/collations/static/js/collation.js
@@ -9,10 +9,10 @@
 
 define('pgadmin.node.collation', [
   'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
-  'underscore.string', 'sources/pgadmin', 'pgadmin.browser',
+  'sources/pgadmin', 'pgadmin.browser',
   'pgadmin.node.schema.dir/child', 'pgadmin.node.schema.dir/schema_child_tree_node',
   'pgadmin.browser.collection',
-], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, schemaChild,
+], function(gettext, url_for, $, _, pgAdmin, pgBrowser, schemaChild,
   schemaChildTreeNode) {
 
   if (!pgBrowser.Nodes['coll-collation']) {
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/domain_constraints/static/js/domain_constraints.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/domain_constraints/static/js/domain_constraints.js
index f916ae54..a7f0a91d 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/domain_constraints/static/js/domain_constraints.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/domains/domain_constraints/static/js/domain_constraints.js
@@ -10,9 +10,9 @@
 // Domain Constraint Module: Collection and Node
 define('pgadmin.node.domain_constraints', [
   'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
-  'underscore.string', 'sources/pgadmin', 'pgadmin.browser',
+  'sources/pgadmin', 'pgadmin.browser',
   'pgadmin.node.schema.dir/schema_child_tree_node', 'pgadmin.browser.collection',
-], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, schemaChildTreeNode) {
+], function(gettext, url_for, $, _, pgAdmin, pgBrowser, schemaChildTreeNode) {
 
   // Define Domain Constraint Collection Node
   if (!pgBrowser.Nodes['coll-domain_constraints']) {
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/static/js/fts_dictionary.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/static/js/fts_dictionary.js
index c7b2a56b..1fbdf8e2 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/static/js/fts_dictionary.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/fts_dictionaries/static/js/fts_dictionary.js
@@ -9,11 +9,11 @@
 
 define('pgadmin.node.fts_dictionary', [
   'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
-  'underscore.string', 'sources/pgadmin', 'pgadmin.browser', 'pgadmin.backform',
+  'sources/pgadmin', 'pgadmin.browser', 'pgadmin.backform',
   'pgadmin.node.schema.dir/child', 'pgadmin.node.schema.dir/schema_child_tree_node',
   'pgadmin.browser.collection',
 ], function(
-  gettext, url_for, $, _, S, pgAdmin, pgBrowser, Backform, schemaChild,
+  gettext, url_for, $, _, pgAdmin, pgBrowser, Backform, schemaChild,
   schemaChildTreeNode
 ) {
 
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/procedure.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/procedure.js
index 7b26b238..1dc8988f 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/procedure.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/static/js/procedure.js
@@ -10,11 +10,11 @@
 /* Create and Register Procedure Collection and Node. */
 define('pgadmin.node.procedure', [
   'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
-  'underscore.string', 'sources/pgadmin', 'pgadmin.browser', 'alertify',
+  'sources/pgadmin', 'pgadmin.browser', 'alertify',
   'pgadmin.node.function', 'pgadmin.node.schema.dir/child',
   'pgadmin.node.schema.dir/schema_child_tree_node',
   'pgadmin.browser.collection', 'pgadmin.browser.server.privilege',
-], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, alertify, Function,
+], function(gettext, url_for, $, _, pgAdmin, pgBrowser, alertify, Function,
   schemaChild, schemaChildTreeNode) {
 
   if (!pgBrowser.Nodes['coll-procedure']) {
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/static/js/sequence.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/static/js/sequence.js
index 170ba982..abe88aaa 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/static/js/sequence.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/sequences/static/js/sequence.js
@@ -9,11 +9,11 @@
 
 define('pgadmin.node.sequence', [
   'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
-  'underscore.string', 'sources/pgadmin', 'pgadmin.browser', 'pgadmin.backform',
+  'sources/pgadmin', 'pgadmin.browser', 'pgadmin.backform',
   'pgadmin.node.schema.dir/child', 'pgadmin.node.schema.dir/schema_child_tree_node',
   'pgadmin.browser.collection',
 ], function(
-  gettext, url_for, $, _, S, pgAdmin, pgBrowser, Backform, schemaChild,
+  gettext, url_for, $, _, pgAdmin, pgBrowser, Backform, schemaChild,
   schemaChildTreeNode
 ) {
 
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/synonyms/static/js/synonym.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/synonyms/static/js/synonym.js
index e42eca4c..0104ce75 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/synonyms/static/js/synonym.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/synonyms/static/js/synonym.js
@@ -9,10 +9,10 @@
 
 define('pgadmin.node.synonym', [
   'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
-  'underscore.string', 'sources/pgadmin', 'pgadmin.browser', 'pgadmin.alertifyjs',
+  'sources/pgadmin', 'pgadmin.browser', 'pgadmin.alertifyjs',
   'pgadmin.node.schema.dir/child', 'pgadmin.node.schema.dir/schema_child_tree_node',
   'pgadmin.browser.collection',
-], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, alertify,
+], function(gettext, url_for, $, _, pgAdmin, pgBrowser, alertify,
   schemaChild, schemaChildTreeNode) {
 
   if (!pgBrowser.Nodes['coll-synonym']) {
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js
index 2c30d1bc..592f08a8 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/compound_triggers/static/js/compound_trigger.js
@@ -9,12 +9,12 @@
 
 define('pgadmin.node.compound_trigger', [
   'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
-  'underscore.string', 'sources/pgadmin', 'pgadmin.browser',
+  'sources/pgadmin', 'pgadmin.browser',
   'pgadmin.backform', 'pgadmin.alertifyjs',
   'pgadmin.node.schema.dir/schema_child_tree_node',
   'pgadmin.browser.collection',
 ], function(
-  gettext, url_for, $, _, S, pgAdmin, pgBrowser, Backform, alertify,
+  gettext, url_for, $, _, pgAdmin, pgBrowser, Backform, alertify,
   SchemaChildTreeNode
 ) {
 
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js
index 8258b3cb..65a002e1 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/check_constraint/static/js/check_constraint.js
@@ -10,9 +10,9 @@
 // Check Constraint Module: Node
 define('pgadmin.node.check_constraint', [
   'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
-  'underscore.string', 'sources/pgadmin', 'pgadmin.browser', 'pgadmin.alertifyjs',
+  'sources/pgadmin', 'pgadmin.browser', 'pgadmin.alertifyjs',
   'pgadmin.node.schema.dir/schema_child_tree_node', 'pgadmin.browser.collection',
-], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, alertify, schemaChildTreeNode) {
+], function(gettext, url_for, $, _, pgAdmin, pgBrowser, alertify, schemaChildTreeNode) {
 
   // Check Constraint Node
   if (!pgBrowser.Nodes['check_constraint']) {
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js
index 29211865..8ecd1dae 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/primary_key.js
@@ -640,7 +640,7 @@ define('pgadmin.node.primary_key', [
 
           if ((_.isUndefined(index) || String(index).replace(/^\s+|\s+$/g, '') == '') &&
             (_.isUndefined(columns) || _.isNull(columns) || columns.length < 1)) {
-            var msg = gettext('Please specify columns for %(node)s', {node: gettext('Primary key')});
+            var msg = gettext('Please specify columns for %s', gettext('Primary key'));
             this.errorModel.set('columns', msg);
             return msg;
           }
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js
index 41a524b1..9dac2202 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/constraints/index_constraint/static/js/unique_constraint.js
@@ -629,7 +629,7 @@ define('pgadmin.node.unique_constraint', [
 
           if ((_.isUndefined(index) || String(index).replace(/^\s+|\s+$/g, '') == '') &&
             (_.isUndefined(columns) || _.isNull(columns) || columns.length < 1)) {
-            var msg = gettext('Please specify columns for %(node)s', {node: gettext('Unique constraint')});
+            var msg = gettext('Please specify columns for %s', gettext('Unique constraint'));
             this.errorModel.set('columns', msg);
             return msg;
           }
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js
index 493deae0..a10b3976 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/partitions/static/js/partition.js
@@ -9,14 +9,14 @@
 
 define([
   'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
-  'underscore.string', 'sources/pgadmin', 'pgadmin.browser',
+  'sources/pgadmin', 'pgadmin.browser',
   'pgadmin.alertifyjs', 'pgadmin.backform', 'pgadmin.backgrid',
-  'pgadmin.node.schema.dir/schema_child_tree_node',
+  'pgadmin.node.schema.dir/schema_child_tree_node', 'sources/utils',
   'pgadmin.browser.collection', 'pgadmin.browser.table.partition.utils',
 ],
 function(
-  gettext, url_for, $, _, S, pgAdmin, pgBrowser, Alertify, Backform, Backgrid,
-  SchemaChildTreeNode
+  gettext, url_for, $, _, pgAdmin, pgBrowser, Alertify, Backform, Backgrid,
+  SchemaChildTreeNode, pgadminUtils
 ) {
 
   if (!pgBrowser.Nodes['coll-partition']) {
@@ -107,13 +107,13 @@ function(
         info = (_.isUndefined(item) || _.isNull(item)) ?
           info || {} : this.getTreeNodeHierarchy(item);
 
-        return S('table/%s/%s/%s/%s/%s/%s').sprintf(
+        return pgadminUtils.sprintf('table/%s/%s/%s/%s/%s/%s',
           encodeURIComponent(type), encodeURIComponent(info['server_group']._id),
           encodeURIComponent(info['server']._id),
           encodeURIComponent(info['database']._id),
           encodeURIComponent(info['partition'].schema_id),
           encodeURIComponent(info['partition']._id)
-        ).value();
+        );
       },
       canDrop: SchemaChildTreeNode.isTreeItemOfChildOfSchema,
       canDropCascade: SchemaChildTreeNode.isTreeItemOfChildOfSchema,
@@ -184,7 +184,7 @@ function(
 
           Alertify.confirm(
             gettext('Truncate Table'),
-            S(gettext('Are you sure you want to truncate table %s?')).sprintf(d.label).value(),
+            gettext('Are you sure you want to truncate table %s?', d.label),
             function (e) {
               if (e) {
                 var data = d;
@@ -229,7 +229,7 @@ function(
 
           Alertify.confirm(
             gettext('Reset statistics'),
-            S(gettext('Are you sure you want to reset the statistics for table "%s"?')).sprintf(d._label).value(),
+            gettext('Are you sure you want to reset the statistics for table "%s"?', d._label),
             function (e) {
               if (e) {
                 var data = d;
@@ -273,7 +273,7 @@ function(
 
           Alertify.confirm(
             gettext('Detach Partition'),
-            S(gettext('Are you sure you want to detach the partition %s?')).sprintf(d._label).value(),
+            gettext('Are you sure you want to detach the partition %s?', d._label),
             function (e) {
               if (e) {
                 $.ajax({
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js
index da3738a7..fe733df0 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/static/js/table.js
@@ -10,7 +10,7 @@
 define('pgadmin.node.table', [
   'pgadmin.tables.js/enable_disable_triggers',
   'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
-  'underscore.string', 'sources/pgadmin', 'pgadmin.browser',
+  'sources/pgadmin', 'pgadmin.browser',
   'pgadmin.alertifyjs', 'pgadmin.backform', 'pgadmin.backgrid',
   'pgadmin.tables.js/show_advanced_tab',
   'pgadmin.node.schema.dir/child','pgadmin.node.schema.dir/schema_child_tree_node',
@@ -18,7 +18,7 @@ define('pgadmin.node.table', [
   'pgadmin.node.constraints', 'pgadmin.browser.table.partition.utils',
 ], function(
   tableFunctions,
-  gettext, url_for, $, _, S, pgAdmin, pgBrowser, Alertify, Backform, Backgrid,
+  gettext, url_for, $, _, pgAdmin, pgBrowser, Alertify, Backform, Backgrid,
   ShowAdvancedTab, SchemaChild, SchemaChildTreeNode
 ) {
 
@@ -165,7 +165,7 @@ define('pgadmin.node.table', [
 
           Alertify.confirm(
             gettext('Truncate Table'),
-            S(gettext('Are you sure you want to truncate table %s?')).sprintf(d.label).value(),
+            gettext('Are you sure you want to truncate table %s?', d.label),
             function (e) {
               if (e) {
                 var data = d;
@@ -210,7 +210,7 @@ define('pgadmin.node.table', [
 
           Alertify.confirm(
             gettext('Reset statistics'),
-            S(gettext('Are you sure you want to reset the statistics for table "%s"?')).sprintf(d._label).value(),
+            gettext('Are you sure you want to reset the statistics for table "%s"?', d._label),
             function (e) {
               if (e) {
                 var data = d;
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js
index 1a01268a..a38894f6 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js
@@ -9,12 +9,12 @@
 
 define('pgadmin.node.trigger', [
   'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
-  'underscore.string', 'sources/pgadmin', 'pgadmin.browser',
+  'sources/pgadmin', 'pgadmin.browser',
   'pgadmin.backform', 'pgadmin.alertifyjs',
   'pgadmin.node.schema.dir/schema_child_tree_node',
   'pgadmin.browser.collection',
 ], function(
-  gettext, url_for, $, _, S, pgAdmin, pgBrowser, Backform, alertify,
+  gettext, url_for, $, _, pgAdmin, pgBrowser, Backform, alertify,
   SchemaChildTreeNode
 ) {
 
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js
index 21ef722c..b34d845f 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/types/static/js/type.js
@@ -218,9 +218,9 @@ define('pgadmin.node.type', [
       else if (this.get('is_tlength')
         && !_.isUndefined(this.get('tlength'))) {
         if (this.get('tlength') < this.get('min_val'))
-          errmsg = gettext('Length/precision should not be less than %(value)s', {value: this.get('min_val')});
+          errmsg = gettext('Length/precision should not be less than %s', this.get('min_val'));
         if (this.get('tlength') > this.get('max_val') )
-          errmsg = gettext('Length/precision should not be greater than %(value)s', {value: this.get('max_val')});
+          errmsg = gettext('Length/precision should not be greater than %s', this.get('max_val'));
           // If we have any error set then throw it to user
         if(errmsg) {
           this.errorModel.set('tlength', errmsg);
@@ -231,9 +231,9 @@ define('pgadmin.node.type', [
       else if (this.get('is_precision')
         && !_.isUndefined(this.get('precision'))) {
         if (this.get('precision') < this.get('min_val'))
-          errmsg = gettext('Scale should not be less than %(value)s', {value: this.get('min_val')});
+          errmsg = gettext('Scale should not be less than %s', this.get('min_val'));
         if (this.get('precision') > this.get('max_val'))
-          errmsg = gettext('Scale should not be greater than %(value)s', {value: this.get('max_val')});
+          errmsg = gettext('Scale should not be greater than %s', this.get('max_val'));
           // If we have any error set then throw it to user
         if(errmsg) {
           this.errorModel.set('precision', errmsg);
diff --git a/web/pgadmin/browser/server_groups/servers/databases/static/js/database.js b/web/pgadmin/browser/server_groups/servers/databases/static/js/database.js
index 9bd93276..ab0df693 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/static/js/database.js
+++ b/web/pgadmin/browser/server_groups/servers/databases/static/js/database.js
@@ -9,10 +9,10 @@
 
 define('pgadmin.node.database', [
   'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
-  'underscore.string', 'sources/pgadmin', 'pgadmin.browser.utils',
+  'sources/utils', 'sources/pgadmin', 'pgadmin.browser.utils',
   'pgadmin.alertifyjs', 'pgadmin.backform', 'pgadmin.browser.collection',
   'pgadmin.browser.server.privilege', 'pgadmin.browser.server.variable',
-], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, Alertify, Backform) {
+], function(gettext, url_for, $, _, pgadminUtils, pgAdmin, pgBrowser, Alertify, Backform) {
 
   if (!pgBrowser.Nodes['coll-database']) {
     pgBrowser.Nodes['coll-database'] =
@@ -190,7 +190,7 @@ define('pgadmin.node.database', [
 
           Alertify.confirm(
             gettext('Disconnect the database'),
-            S(gettext('Are you sure you want to disconnect the database - %s?')).sprintf(d.label).value(),
+            pgadminUtils.sprintf(gettext('Are you sure you want to disconnect the database - %s?'), d.label),
             function() {
               var data = d;
               $.ajax({
diff --git a/web/pgadmin/browser/server_groups/servers/pgagent/schedules/static/js/pga_schedule.js b/web/pgadmin/browser/server_groups/servers/pgagent/schedules/static/js/pga_schedule.js
index 8f6cd285..f1af97e9 100644
--- a/web/pgadmin/browser/server_groups/servers/pgagent/schedules/static/js/pga_schedule.js
+++ b/web/pgadmin/browser/server_groups/servers/pgagent/schedules/static/js/pga_schedule.js
@@ -9,10 +9,10 @@
 
 define('pgadmin.node.pga_schedule', [
   'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
-  'underscore.string', 'sources/pgadmin', 'moment', 'pgadmin.browser', 'alertify',
+  'sources/pgadmin', 'moment', 'pgadmin.browser', 'alertify',
   'pgadmin.backform', 'pgadmin.backgrid',
 ], function(
-  gettext, url_for, $, _, S, pgAdmin, moment, pgBrowser, Alertify, Backform,
+  gettext, url_for, $, _, pgAdmin, moment, pgBrowser, Alertify, Backform,
   Backgrid
 ) {
 
diff --git a/web/pgadmin/browser/server_groups/servers/pgagent/static/js/pga_job.js b/web/pgadmin/browser/server_groups/servers/pgagent/static/js/pga_job.js
index 8cc7a91a..4f719043 100644
--- a/web/pgadmin/browser/server_groups/servers/pgagent/static/js/pga_job.js
+++ b/web/pgadmin/browser/server_groups/servers/pgagent/static/js/pga_job.js
@@ -9,9 +9,9 @@
 
 define('pgadmin.node.pga_job', [
   'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
-  'underscore.string', 'sources/pgadmin', 'pgadmin.browser', 'pgadmin.alertifyjs',
+  'sources/pgadmin', 'pgadmin.browser', 'pgadmin.alertifyjs',
   'pgadmin.node.pga_jobstep', 'pgadmin.node.pga_schedule',
-], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, alertify) {
+], function(gettext, url_for, $, _, pgAdmin, pgBrowser, alertify) {
 
   if (!pgBrowser.Nodes['coll-pga_job']) {
     pgBrowser.Nodes['coll-pga_job'] =
diff --git a/web/pgadmin/browser/server_groups/servers/pgagent/steps/static/js/pga_jobstep.js b/web/pgadmin/browser/server_groups/servers/pgagent/steps/static/js/pga_jobstep.js
index 74787bcb..39ded81b 100644
--- a/web/pgadmin/browser/server_groups/servers/pgagent/steps/static/js/pga_jobstep.js
+++ b/web/pgadmin/browser/server_groups/servers/pgagent/steps/static/js/pga_jobstep.js
@@ -9,9 +9,9 @@
 
 define('pgadmin.node.pga_jobstep', [
   'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
-  'underscore.string', 'sources/pgadmin', 'pgadmin.browser', 'alertify', 'backform',
+  'sources/pgadmin', 'pgadmin.browser', 'alertify', 'backform',
   'backgrid', 'pgadmin.backform', 'pgadmin.backgrid',
-], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, Alertify, Backform, Backgrid) {
+], function(gettext, url_for, $, _, pgAdmin, pgBrowser, Alertify, Backform, Backgrid) {
 
   if (!pgBrowser.Nodes['coll-pga_jobstep']) {
     pgBrowser.Nodes['coll-pga_jobstep'] =
@@ -190,11 +190,9 @@ define('pgadmin.node.pga_jobstep', [
           id: 'jstconnstr', label: gettext('Connection string'), type: 'text',
           deps: ['jstkind', 'jstconntype'], disabled: function(m) {
             return !m.get('jstkind') || m.get('jstconntype');
-          }, helpMessage: S(
-            gettext('Please specify the connection string for the remote database server. Each parameter setting is in the form keyword = value. Spaces around the equal sign are optional. To write an empty value, or a value containing spaces, surround it with single quotes, e.g., keyword = \'a value\'. Single quotes and backslashes within the value must be escaped with a backslash, i.e., \' and \\.<br>For more information, please see the documentation on %s')
-          ).sprintf(
+          }, helpMessage: gettext('Please specify the connection string for the remote database server. Each parameter setting is in the form keyword = value. Spaces around the equal sign are optional. To write an empty value, or a value containing spaces, surround it with single quotes, e.g., keyword = \'a value\'. Single quotes and backslashes within the value must be escaped with a backslash, i.e., \' and \\.<br>For more information, please see the documentation on %s',
             '<a href="https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-CONNSTRING" target="_blank">libpq connection strings</a>'
-          ).value(), mode: ['create', 'edit'],
+          ), mode: ['create', 'edit'],
         },{
           id: 'jstonerror', label: gettext('On error'), cell: 'select2',
           control: 'select2', options: [
@@ -273,9 +271,7 @@ define('pgadmin.node.pga_jobstep', [
                     break;
                   }
 
-                  msg = S(
-                    gettext('Invalid parameter in the connection string - %s.')
-                  ).sprintf(m[1]).value();
+                  msg = gettext('Invalid parameter in the connection string - %s.', m[1]);
                   break;
                 }
               }
diff --git a/web/pgadmin/browser/server_groups/servers/roles/static/js/role.js b/web/pgadmin/browser/server_groups/servers/roles/static/js/role.js
index 94aad6d1..93253280 100644
--- a/web/pgadmin/browser/server_groups/servers/roles/static/js/role.js
+++ b/web/pgadmin/browser/server_groups/servers/roles/static/js/role.js
@@ -9,10 +9,10 @@
 
 define('pgadmin.node.role', [
   'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
-  'underscore.string', 'sources/pgadmin', 'pgadmin.browser', 'alertify',
+  'sources/pgadmin', 'pgadmin.browser', 'alertify',
   'pgadmin.backform', 'select2', 'pgadmin.browser.collection',
   'pgadmin.browser.node.ui', 'pgadmin.browser.server.variable',
-], function(gettext, url_for, $, _, S, pgAdmin, pgBrowser, alertify, Backform) {
+], function(gettext, url_for, $, _, pgAdmin, pgBrowser, alertify, Backform) {
 
   if (!pgBrowser.Nodes['coll-role']) {
     pgAdmin.Browser.Nodes['coll-role'] =
diff --git a/web/pgadmin/browser/server_groups/servers/static/js/server.js b/web/pgadmin/browser/server_groups/servers/static/js/server.js
index 29419243..99fed949 100644
--- a/web/pgadmin/browser/server_groups/servers/static/js/server.js
+++ b/web/pgadmin/browser/server_groups/servers/static/js/server.js
@@ -9,13 +9,13 @@
 
 define('pgadmin.node.server', [
   'sources/gettext', 'sources/url_for', 'jquery', 'underscore', 'backbone',
-  'underscore.string', 'sources/pgadmin', 'pgadmin.browser',
+  'sources/pgadmin', 'pgadmin.browser',
   'pgadmin.server.supported_servers', 'pgadmin.user_management.current_user',
   'pgadmin.alertifyjs', 'pgadmin.backform',
   'sources/browser/server_groups/servers/model_validation',
   'pgadmin.browser.server.privilege',
 ], function(
-  gettext, url_for, $, _, Backbone, S, pgAdmin, pgBrowser,
+  gettext, url_for, $, _, Backbone, pgAdmin, pgBrowser,
   supported_servers, current_user, Alertify, Backform,
   modelValidation
 ) {
@@ -260,10 +260,7 @@ define('pgadmin.node.server', [
           if (notify) {
             Alertify.confirm(
               gettext('Disconnect server'),
-              gettext(
-                'Are you sure you want to disconnect the server %(server)s?',
-                {server: d.label}
-              ),
+              gettext('Are you sure you want to disconnect the server %s?', d.label),
               function() { disconnect(); },
               function() { return true;}
             );
@@ -310,9 +307,7 @@ define('pgadmin.node.server', [
 
           Alertify.confirm(
             gettext('Reload server configuration'),
-            S(
-              gettext('Are you sure you want to reload the server configuration on %s?')
-            ).sprintf(d.label).value(),
+            gettext('Are you sure you want to reload the server configuration on %s?', d.label),
             function() {
               $.ajax({
                 url: obj.generate_url(i, 'reload', d, true),
@@ -643,9 +638,7 @@ define('pgadmin.node.server', [
 
           Alertify.confirm(
             gettext('Clear saved password'),
-            S(
-              gettext('Are you sure you want to clear the saved password for server %s?')
-            ).sprintf(d.label).value(),
+            gettext('Are you sure you want to clear the saved password for server %s?', d.label),
             function() {
               $.ajax({
                 url: obj.generate_url(i, 'clear_saved_password', d, true),
@@ -683,9 +676,7 @@ define('pgadmin.node.server', [
 
           Alertify.confirm(
             gettext('Clear SSH Tunnel password'),
-            S(
-              gettext('Are you sure you want to clear the saved password of SSH Tunnel for server %s?')
-            ).sprintf(d.label).value(),
+            gettext('Are you sure you want to clear the saved password of SSH Tunnel for server %s?', d.label),
             function() {
               $.ajax({
                 url: obj.generate_url(i, 'clear_sshtunnel_password', d, true),
diff --git a/web/pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js b/web/pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js
index 82b7ba5a..5ba3682b 100644
--- a/web/pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js
+++ b/web/pgadmin/browser/server_groups/servers/tablespaces/static/js/tablespace.js
@@ -281,8 +281,8 @@ define('pgadmin.node.tablespace', [
                     Alertify.confirm(
                       gettext('Move objects...'),
                       gettext(
-                        'Are you sure you wish to move the objects from %(old_tablespace)s to %(new_tablespace)s?',
-                        {old_tablespace: args.old_tblspc, new_tablespace: args.tblspc}
+                        'Are you sure you wish to move the objects from %s to %s?',
+                        args.old_tblspc, args.tblspc
                       ),
                       function() {
                         $.ajax({
diff --git a/web/pgadmin/browser/static/js/browser.js b/web/pgadmin/browser/static/js/browser.js
index 38252887..bd6b0b94 100644
--- a/web/pgadmin/browser/static/js/browser.js
+++ b/web/pgadmin/browser/static/js/browser.js
@@ -9,7 +9,7 @@
 
 define('pgadmin.browser', [
   'sources/tree/tree',
-  'sources/gettext', 'sources/url_for', 'require', 'jquery', 'underscore', 'underscore.string',
+  'sources/gettext', 'sources/url_for', 'require', 'jquery', 'underscore',
   'bootstrap', 'sources/pgadmin', 'pgadmin.alertifyjs', 'bundled_codemirror',
   'sources/check_node_visibility', './toolbar', 'pgadmin.help',
   'sources/csrf', 'sources/utils', 'pgadmin.browser.utils',
@@ -22,7 +22,7 @@ define('pgadmin.browser', [
   'pgadmin.browser.keyboard', 'sources/tree/pgadmin_tree_save_state',
 ], function(
   tree,
-  gettext, url_for, require, $, _, S,
+  gettext, url_for, require, $, _,
   Bootstrap, pgAdmin, Alertify, codemirror,
   checkNodeVisibility, toolBar, help, csrfToken, pgadminUtils,
 ) {
@@ -725,7 +725,7 @@ define('pgadmin.browser', [
 
         if(!_.isUndefined(confirm_on_refresh_close) && confirm_on_refresh_close.value) {
           /* This message will not be displayed in Chrome, Firefox, Safari as they have disabled it*/
-          let msg = S(gettext('Are you sure you want to close the %s browser?')).sprintf(pgBrowser.utils.app_name).value();
+          let msg = gettext('Are you sure you want to close the %s browser?', pgBrowser.utils.app_name);
           e.originalEvent.returnValue = msg;
           return msg;
         }
diff --git a/web/pgadmin/browser/static/js/collection.js b/web/pgadmin/browser/static/js/collection.js
index c19b0f27..1b4d1959 100644
--- a/web/pgadmin/browser/static/js/collection.js
+++ b/web/pgadmin/browser/static/js/collection.js
@@ -11,11 +11,11 @@
 //import Mousetrap from 'mousetrap';
 
 define([
-  'sources/gettext', 'jquery', 'underscore', 'underscore.string', 'sources/pgadmin',
+  'sources/gettext', 'jquery', 'underscore', 'sources/pgadmin',
   'backbone', 'alertify', 'backform', 'backgrid', 'sources/browser/generate_url',
   'pgadmin.backform', 'pgadmin.backgrid',
   'pgadmin.browser.node', 'backgrid.select.all',
-], function(gettext, $, _, S, pgAdmin, Backbone, Alertify, Backform, Backgrid, generateUrl) {
+], function(gettext, $, _, pgAdmin, Backbone, Alertify, Backform, Backgrid, generateUrl) {
 
   var pgBrowser = pgAdmin.Browser = pgAdmin.Browser || {};
 
@@ -315,8 +315,7 @@ define([
               info: info,
             })) {
               Alertify.pgNotifier(
-                error, xhr, S(gettext('Error retrieving properties - %s')).sprintf(
-                  error.message || that.label).value(),
+                error, xhr, gettext('Error retrieving properties - %s', error.message || that.label),
                 function(msg) {
                   if(msg === 'CRYPTKEY_SET') {
                     getAjaxHook();
@@ -383,8 +382,8 @@ define([
             }).fail(function(xhr, error) {
               Alertify.pgNotifier(
                 error, xhr,
-                S(gettext('Error dropping %s'))
-                  .sprintf(d._label.toLowerCase()).value(), function(msg) {
+                gettext('Error dropping %s', d._label.toLowerCase()),
+                function(msg) {
                   if (msg == 'CRYPTKEY_SET') {
                     onDrop(type, false);
                   } else {
diff --git a/web/pgadmin/browser/static/js/datamodel.js b/web/pgadmin/browser/static/js/datamodel.js
index ac4f84ae..ed663547 100644
--- a/web/pgadmin/browser/static/js/datamodel.js
+++ b/web/pgadmin/browser/static/js/datamodel.js
@@ -8,8 +8,8 @@
 //////////////////////////////////////////////////////////////
 
 define([
-  'underscore', 'underscore.string', 'sources/pgadmin', 'jquery', 'backbone',
-], function(_, S, pgAdmin, $, Backbone) {
+  'underscore', 'sources/pgadmin', 'jquery', 'backbone', 'sources/utils',
+], function(_, pgAdmin, $, Backbone, pgadminUtils) {
   var pgBrowser = pgAdmin.Browser = pgAdmin.Browser || {};
 
   pgBrowser.DataModel = Backbone.Model.extend({
@@ -777,23 +777,23 @@ define([
         max_value = field.max;
 
       if (!_.isUndefined(min_value) && value < min_value) {
-        return S(pgAdmin.Browser.messages.MUST_GR_EQ).sprintf(label, min_value).value();
+        return pgadminUtils.sprintf(pgAdmin.Browser.messages.MUST_GR_EQ, label, min_value);
       } else if (!_.isUndefined(max_value) && value > max_value) {
-        return S(pgAdmin.Browser.messages.MUST_LESS_EQ).sprintf(label, max_value).value();
+        return pgadminUtils.sprintf(pgAdmin.Browser.messages.MUST_LESS_EQ, label, max_value);
       }
       return null;
     },
     number_validate: function(value, field) {
       var pattern = new RegExp('^-?[0-9]+(\.?[0-9]*)?$');
       if (!pattern.test(value)) {
-        return S(pgAdmin.Browser.messages.MUST_BE_NUM).sprintf(field.label).value();
+        return pgadminUtils.sprintf(pgAdmin.Browser.messages.MUST_BE_NUM, field.label);
       }
       return this.check_min_max(value, field);
     },
     integer_validate: function(value, field) {
       var pattern = new RegExp('^-?[0-9]*$');
       if (!pattern.test(value)) {
-        return S(pgAdmin.Browser.messages.MUST_BE_INT).sprintf(field.label).value();
+        return pgadminUtils.sprintf(pgAdmin.Browser.messages.MUST_BE_INT, field.label);
       }
       return this.check_min_max(value, field);
     },
diff --git a/web/pgadmin/browser/static/js/menu.js b/web/pgadmin/browser/static/js/menu.js
index e76c9ed2..de95490b 100644
--- a/web/pgadmin/browser/static/js/menu.js
+++ b/web/pgadmin/browser/static/js/menu.js
@@ -8,8 +8,8 @@
 //////////////////////////////////////////////////////////////
 
 define([
-  'underscore', 'underscore.string', 'sources/pgadmin', 'jquery',
-], function(_, S, pgAdmin, $) {
+  'underscore', 'sources/pgadmin', 'jquery', 'sources/utils',
+], function(_, pgAdmin, $, pgadminUtils) {
   'use strict';
 
   pgAdmin.Browser = pgAdmin.Browser || {};
@@ -141,7 +141,7 @@ define([
         cb.apply(o.module, [o.data, item]);
       } else {
         pgAdmin.Browser.report_error(
-          S('Developer Warning: Callback - "%s" not found!').sprintf(o.cb).value()
+          pgadminUtils.sprintf('Developer Warning: Callback - "%s" not found!', o.cb)
         );
       }
     },
diff --git a/web/pgadmin/browser/static/js/node.js b/web/pgadmin/browser/static/js/node.js
index 1a9d3c91..00d5b44a 100644
--- a/web/pgadmin/browser/static/js/node.js
+++ b/web/pgadmin/browser/static/js/node.js
@@ -9,13 +9,13 @@
 
 define('pgadmin.browser.node', [
   'sources/tree/pgadmin_tree_node', 'sources/url_for',
-  'sources/gettext', 'jquery', 'underscore', 'underscore.string', 'sources/pgadmin',
+  'sources/gettext', 'jquery', 'underscore', 'sources/pgadmin',
   'pgadmin.browser.menu', 'backbone', 'pgadmin.alertifyjs', 'pgadmin.browser.datamodel',
   'backform', 'sources/browser/generate_url', 'pgadmin.help', 'sources/utils',
   'pgadmin.browser.utils', 'pgadmin.backform',
 ], function(
   pgadminTreeNode, url_for,
-  gettext, $, _, S, pgAdmin,
+  gettext, $, _, pgAdmin,
   Menu, Backbone, Alertify, pgBrowser,
   Backform, generateUrl, help,
   commonUtils
@@ -203,9 +203,7 @@ define('pgadmin.browser.node', [
         // For each script type create menu
         _.each(self.hasScriptTypes, function(stype) {
 
-          var type_label = S(
-            gettext('%s Script')
-          ).sprintf(stype.toUpperCase()).value();
+          var type_label = gettext('%s Script',stype.toUpperCase());
 
           stype = stype.toLowerCase();
 
@@ -435,9 +433,8 @@ define('pgadmin.browser.node', [
                   )) {
                     Alertify.pgNotifier(
                       options.textStatus, xhr,
-                      S(
-                        gettext('Error retrieving properties - %s')
-                      ).sprintf(options.errorThrown || _label).value(), function(msg) {
+                      gettext('Error retrieving properties - %s', options.errorThrown || _label),
+                      function(msg) {
                         if(msg === 'CRYPTKEY_SET') {
                           fetchAjaxHook();
                         } else {
@@ -672,8 +669,7 @@ define('pgadmin.browser.node', [
           if (!d)
             return;
 
-          l = S(gettext('Create - %s')).sprintf(
-            [this.label]).value();
+          l = gettext('Create - %s', this.label);
           p = addPanel();
 
           setTimeout(function() {
@@ -696,7 +692,7 @@ define('pgadmin.browser.node', [
 
               Alertify.confirm(
                 gettext('Edit in progress?'),
-                S(msg).sprintf(o.label.toLowerCase(), d.label).value(),
+                commonUtils.sprintf(msg, o.label.toLowerCase(), d.label),
                 function() {
                   setTimeout(function() {
                     o.showProperties(i, d, p, args.action);
@@ -746,29 +742,26 @@ define('pgadmin.browser.node', [
         var msg, title;
         if (input.url == 'delete') {
 
-          msg = S(gettext('Are you sure you want to drop %s "%s" and all the objects that depend on it?'))
-            .sprintf(obj.label.toLowerCase(), d.label).value();
-          title = S(gettext('DROP CASCADE %s?')).sprintf(obj.label).value();
+          msg = gettext('Are you sure you want to drop %s "%s" and all the objects that depend on it?',
+            obj.label.toLowerCase(), d.label);
+          title = gettext('DROP CASCADE %s?', obj.label);
 
           if (!(_.isFunction(obj.canDropCascade) ?
             obj.canDropCascade.apply(obj, [d, i]) : obj.canDropCascade)) {
             Alertify.error(
-              S(gettext('The %s "%s" cannot be dropped.'))
-                .sprintf(obj.label, d.label).value(),
+              gettext('The %s "%s" cannot be dropped.', obj.label, d.label),
               10
             );
             return;
           }
         } else {
-          msg = S(gettext('Are you sure you want to drop %s "%s"?'))
-            .sprintf(obj.label.toLowerCase(), d.label).value();
-          title = S(gettext('DROP %s?')).sprintf(obj.label).value();
+          msg = gettext('Are you sure you want to drop %s "%s"?', obj.label.toLowerCase(), d.label);
+          title = gettext('DROP %s?', obj.label);
 
           if (!(_.isFunction(obj.canDrop) ?
             obj.canDrop.apply(obj, [d, i]) : obj.canDrop)) {
             Alertify.error(
-              S(gettext('The %s "%s" cannot be dropped.'))
-                .sprintf(obj.label, d.label).value(),
+              gettext('The %s "%s" cannot be dropped.', obj.label, d.label),
               10
             );
             return;
@@ -800,9 +793,7 @@ define('pgadmin.browser.node', [
                   }
                 }
                 pgBrowser.report_error(
-                  S(gettext('Error dropping %s: "%s"'))
-                    .sprintf(obj.label, objName)
-                    .value(), msg);
+                  gettext('Error dropping %s: "%s"', obj.label, objName), msg);
               });
           },
           null).show();
@@ -1659,7 +1650,7 @@ define('pgadmin.browser.node', [
         )), function(o) {
           return o.priority;
         }), function(o) {
-          hash = S('%s/%s').sprintf(hash, encodeURI(o._id)).value();
+          hash = commonUtils.sprintf('%s/%s', hash, encodeURI(o._id));
         });
       }
 
diff --git a/web/pgadmin/browser/templates/browser/index.html b/web/pgadmin/browser/templates/browser/index.html
index 8b3866c2..76e222f5 100644
--- a/web/pgadmin/browser/templates/browser/index.html
+++ b/web/pgadmin/browser/templates/browser/index.html
@@ -11,7 +11,7 @@
 {% block init_script %}
 try {
 require(
-['sources/generated/app.bundle'],
+['sources/generated/app.bundle', 'sources/generated/codemirror', 'sources/generated/browser_nodes'],
 function() {
 },
 function() {
diff --git a/web/pgadmin/dashboard/static/js/charting.js b/web/pgadmin/dashboard/static/js/charting.js
index b60a02ad..408586e7 100644
--- a/web/pgadmin/dashboard/static/js/charting.js
+++ b/web/pgadmin/dashboard/static/js/charting.js
@@ -7,11 +7,16 @@
 //
 //////////////////////////////////////////////////////////////
 
-import Flotr from 'flotr2';
-
 export class Chart {
   constructor(container, options) {
-    this.chartApi = Flotr;
+    let self = this;
+    import('flotr2')
+      .then((module) => {
+        self.chartApi = module.default;
+      })
+      .catch((error) =>{
+        throw(error);
+      });
     /* Html Node where the graph goes */
     this._container = container;
     /* Graph library options */
@@ -104,7 +109,7 @@ export class Chart {
   draw(dataset) {
     this._dataset = dataset;
     if(this._container) {
-      Flotr.draw(this._container, this._dataset, this._options);
+      this.chartApi.draw(this._container, this._dataset, this._options);
     }
   }
 }
diff --git a/web/pgadmin/misc/bgprocess/static/js/bgprocess.js b/web/pgadmin/misc/bgprocess/static/js/bgprocess.js
index fa69d978..01301cc6 100644
--- a/web/pgadmin/misc/bgprocess/static/js/bgprocess.js
+++ b/web/pgadmin/misc/bgprocess/static/js/bgprocess.js
@@ -9,9 +9,9 @@
 
 define('misc.bgprocess', [
   'sources/pgadmin', 'sources/gettext', 'sources/url_for', 'underscore',
-  'underscore.string', 'jquery', 'pgadmin.browser', 'alertify',
+  'jquery', 'pgadmin.browser', 'alertify',
 ], function(
-  pgAdmin, gettext, url_for, _, S, $, pgBrowser, Alertify
+  pgAdmin, gettext, url_for, _, $, pgBrowser, Alertify
 ) {
 
   pgBrowser.BackgroundProcessObsorver = pgBrowser.BackgroundProcessObsorver || {};
@@ -226,7 +226,7 @@ define('misc.bgprocess', [
               self.curr_status = self.success_status_tpl({status_text:gettext('Successfully completed.')});
             } else {
               self.curr_status = self.failed_status_tpl(
-                {status_text:S(gettext('Failed (exit code: %s).')).sprintf(String(self.exit_code)).value()}
+                {status_text:gettext('Failed (exit code: %s).', String(self.exit_code))}
               );
             }
           }
diff --git a/web/pgadmin/misc/dependencies/static/js/dependencies.js b/web/pgadmin/misc/dependencies/static/js/dependencies.js
index 59c3cbaf..09dbd691 100644
--- a/web/pgadmin/misc/dependencies/static/js/dependencies.js
+++ b/web/pgadmin/misc/dependencies/static/js/dependencies.js
@@ -8,9 +8,10 @@
 //////////////////////////////////////////////////////////////
 
 define('misc.dependencies', [
-  'sources/gettext', 'underscore', 'underscore.string', 'jquery', 'backbone',
+  'sources/gettext', 'underscore', 'jquery', 'backbone',
   'pgadmin', 'pgadmin.browser', 'pgadmin.alertifyjs', 'pgadmin.backgrid',
-], function(gettext, _, S, $, Backbone, pgAdmin, pgBrowser, Alertify, Backgrid) {
+  'sources/utils',
+], function(gettext, _, $, Backbone, pgAdmin, pgBrowser, Alertify, Backgrid, pgadminUtils) {
 
   if (pgBrowser.NodeDependencies)
     return pgBrowser.NodeDependencies;
@@ -52,7 +53,7 @@ define('misc.dependencies', [
               (node['node_image'] || ('icon-' + res.type))) :
               ('icon-' + res.type);
           }
-          res.type = S.titleize(res.type.replace(/_/g, ' '), true);
+          res.type = pgadminUtils.titleize(res.type.replace(/_/g, ' '), true);
           return res;
         },
       });
@@ -216,8 +217,7 @@ define('misc.dependencies', [
               })) {
                 Alertify.pgNotifier(
                   error, xhr,
-                  S(gettext('Error retrieving data from the server: %s')).sprintf(
-                    message || _label).value(),
+                  gettext('Error retrieving data from the server: %s', message || _label),
                   function(msg) {
                     if(msg === 'CRYPTKEY_SET') {
                       self.showDependencies(item, data, node);
diff --git a/web/pgadmin/misc/dependents/static/js/dependents.js b/web/pgadmin/misc/dependents/static/js/dependents.js
index 1b16305a..ec00d618 100644
--- a/web/pgadmin/misc/dependents/static/js/dependents.js
+++ b/web/pgadmin/misc/dependents/static/js/dependents.js
@@ -8,9 +8,10 @@
 //////////////////////////////////////////////////////////////
 
 define('misc.dependents', [
-  'sources/gettext', 'underscore', 'underscore.string', 'jquery', 'backbone',
+  'sources/gettext', 'underscore', 'jquery', 'backbone',
   'sources/pgadmin', 'pgadmin.browser', 'pgadmin.alertifyjs', 'pgadmin.backgrid',
-], function(gettext, _, S, $, Backbone, pgAdmin, pgBrowser, Alertify, Backgrid) {
+  'sources/utils',
+], function(gettext, _, $, Backbone, pgAdmin, pgBrowser, Alertify, Backgrid, pgadminUtils) {
 
   if (pgBrowser.NodeDependents)
     return pgBrowser.NodeDependents;
@@ -52,7 +53,7 @@ define('misc.dependents', [
               (node['node_image'] || ('icon-' + res.type))) :
               ('icon-' + res.type);
           }
-          res.type = S.titleize(res.type.replace(/_/g, ' '), true);
+          res.type = pgadminUtils.titleize(res.type.replace(/_/g, ' '), true);
           return res;
         },
       });
@@ -222,8 +223,7 @@ define('misc.dependents', [
               })) {
                 Alertify.pgNotifier(
                   error, xhr,
-                  S(gettext('Error retrieving data from the server: %s')).sprintf(
-                    message || _label).value(),
+                  gettext('Error retrieving data from the server: %s', message || _label),
                   function(msg) {
                     if(msg === 'CRYPTKEY_SET') {
                       self.showDependents(item, data, node);
diff --git a/web/pgadmin/misc/file_manager/static/js/utility.js b/web/pgadmin/misc/file_manager/static/js/utility.js
index 98cbc41c..77acc5be 100644
--- a/web/pgadmin/misc/file_manager/static/js/utility.js
+++ b/web/pgadmin/misc/file_manager/static/js/utility.js
@@ -18,10 +18,10 @@
  *  @copyright  Authors
  */
 define([
-  'jquery', 'underscore', 'underscore.string', 'pgadmin.alertifyjs',
+  'jquery', 'underscore', 'pgadmin.alertifyjs',
   'sources/gettext', 'sources/url_for', 'dropzone', 'sources/pgadmin',
   'sources/csrf', 'tablesorter',
-], function($, _, S, Alertify, gettext, url_for, Dropzone, pgAdmin, csrfToken) {
+], function($, _, Alertify, gettext, url_for, Dropzone, pgAdmin, csrfToken) {
 
   /*---------------------------------------------------------
     Define functions used for various operations
@@ -1394,7 +1394,7 @@ define([
                 path = path.replace(/\//g, '\\');
               } else {
                 path = path.replace(/\\/g, '/');
-                if (!S.startsWith(path, '/')) {
+                if (!path.startsWith('/')) {
                   path = '/' + path;
                 }
               }
@@ -1554,7 +1554,7 @@ define([
           $('.storage_dialog #uploader .input-path').val(path);
         }
       } else if (!(config.options.platform_type === 'win32') &&
-        (path == '' || !S.startsWith(path, '/'))) {
+        (path == '' || !path.startsWith('/'))) {
         path = '/' + path;
         $('.storage_dialog #uploader .input-path').val(path);
       } else {
diff --git a/web/pgadmin/misc/sql/static/js/sql.js b/web/pgadmin/misc/sql/static/js/sql.js
index 47ca67e2..a5167d36 100644
--- a/web/pgadmin/misc/sql/static/js/sql.js
+++ b/web/pgadmin/misc/sql/static/js/sql.js
@@ -8,9 +8,9 @@
 //////////////////////////////////////////////////////////////
 
 define('misc.sql', [
-  'sources/gettext', 'underscore', 'underscore.string', 'jquery',
+  'sources/gettext', 'underscore', 'jquery',
   'sources/pgadmin', 'pgadmin.browser', 'pgadmin.alertifyjs',
-], function(gettext, _, S, $, pgAdmin, pgBrowser, Alertify) {
+], function(gettext, _, $, pgAdmin, pgBrowser, Alertify) {
 
   pgBrowser.ShowNodeSQL = pgBrowser.ShowNodeSQL || {};
 
@@ -151,9 +151,8 @@ define('misc.sql', [
                   })) {
                     Alertify.pgNotifier(
                       error, xhr,
-                      S(gettext('Error retrieving the information - %s')).sprintf(
-                        message || _label
-                      ).value(), function(msg) {
+                      gettext('Error retrieving the information - %s', message || _label),
+                      function(msg) {
                         if(msg === 'CRYPTKEY_SET') {
                           ajaxHook();
                         } else {
diff --git a/web/pgadmin/misc/static/explain/js/explain.js b/web/pgadmin/misc/static/explain/js/explain.js
index 2f7983c5..cd3ffbcc 100644
--- a/web/pgadmin/misc/static/explain/js/explain.js
+++ b/web/pgadmin/misc/static/explain/js/explain.js
@@ -8,90 +8,94 @@
 //////////////////////////////////////////////////////////////
 
 define('pgadmin.misc.explain', [
-  'sources/url_for', 'jquery', 'underscore', 'underscore.string',
-  'sources/pgadmin', 'backbone', 'snapsvg', 'explain_statistics',
+  'sources/url_for', 'jquery', 'underscore',
+  'sources/pgadmin', 'backbone', 'explain_statistics',
   'svg_downloader', 'image_maper',
-], function(url_for, $, _, S, pgAdmin, Backbone, Snap, StatisticsModel,
+], function(url_for, $, _, pgAdmin, Backbone, StatisticsModel,
   svgDownloader, imageMapper) {
 
   pgAdmin = pgAdmin || window.pgAdmin || {};
   svgDownloader = svgDownloader.default;
   var pgBrowser = pgAdmin.Browser;
+  var Snap = null;
 
-  // Snap.svg plug-in to write multitext as image name
-  Snap.plugin(function(Snap, Element, Paper) {
-    Paper.prototype.multitext = function(x, y, txt, max_width, attributes) {
-      var svg = Snap(),
-        abc = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',
-        temp = svg.text(0, 0, abc);
+  var initSnap = function(snapModule) {
+    Snap = snapModule;
+    // Snap.svg plug-in to write multitext as image name
+    Snap.plugin(function(Snap, Element, Paper) {
+      Paper.prototype.multitext = function(x, y, txt, max_width, attributes) {
+        var svg = Snap(),
+          abc = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',
+          temp = svg.text(0, 0, abc);
 
-      temp.attr(attributes);
+        temp.attr(attributes);
 
-      /*
-       * Find letter width in pixels and
-       * index from where the text should be broken
-       */
-      var letter_width = temp.getBBox().width / abc.length,
-        word_break_index = Math.round((max_width / letter_width)) - 1;
-
-      svg.remove();
-
-      var words = txt.split(' '),
-        width_so_far = 0,
-        lines = [],
-        curr_line = '',
         /*
-         * Function to divide string into multiple lines
-         * and store them in an array if it size crosses
-         * the max-width boundary.
+         * Find letter width in pixels and
+         * index from where the text should be broken
          */
-        splitTextInMultiLine = function(leading, so_far, line) {
-          var l = line.length,
-            res = [];
-
-          if (l == 0)
-            return res;
-
-          if (so_far && (so_far + (l * letter_width) > max_width)) {
-            res.push(leading);
-            res = res.concat(splitTextInMultiLine('', 0, line));
-          } else if (so_far) {
-            res.push(leading + ' ' + line);
-          } else {
-            if (leading)
+        var letter_width = temp.getBBox().width / abc.length,
+          word_break_index = Math.round((max_width / letter_width)) - 1;
+
+        svg.remove();
+
+        var words = txt.split(' '),
+          width_so_far = 0,
+          lines = [],
+          curr_line = '',
+          /*
+           * Function to divide string into multiple lines
+           * and store them in an array if it size crosses
+           * the max-width boundary.
+           */
+          splitTextInMultiLine = function(leading, so_far, line) {
+            var l = line.length,
+              res = [];
+
+            if (l == 0)
+              return res;
+
+            if (so_far && (so_far + (l * letter_width) > max_width)) {
               res.push(leading);
-            if (line.length > word_break_index + 1)
-              res.push(line.slice(0, word_break_index) + '-');
-            else
-              res.push(line);
-            res = res.concat(splitTextInMultiLine('', 0, line.slice(word_break_index)));
-          }
+              res = res.concat(splitTextInMultiLine('', 0, line));
+            } else if (so_far) {
+              res.push(leading + ' ' + line);
+            } else {
+              if (leading)
+                res.push(leading);
+              if (line.length > word_break_index + 1)
+                res.push(line.slice(0, word_break_index) + '-');
+              else
+                res.push(line);
+              res = res.concat(splitTextInMultiLine('', 0, line.slice(word_break_index)));
+            }
 
-          return res;
-        };
+            return res;
+          };
 
-      for (var i = 0; i < words.length; i++) {
-        var tmpArr = splitTextInMultiLine(
-          curr_line, width_so_far, words[i]
-        );
+        for (var i = 0; i < words.length; i++) {
+          var tmpArr = splitTextInMultiLine(
+            curr_line, width_so_far, words[i]
+          );
 
-        if (curr_line) {
-          lines = lines.slice(0, lines.length - 1);
+          if (curr_line) {
+            lines = lines.slice(0, lines.length - 1);
+          }
+          lines = lines.concat(tmpArr);
+          curr_line = lines[lines.length - 1];
+          width_so_far = (curr_line.length * letter_width);
         }
-        lines = lines.concat(tmpArr);
-        curr_line = lines[lines.length - 1];
-        width_so_far = (curr_line.length * letter_width);
-      }
 
-      // Create multiple tspan for each string in array
-      var t = this.text(x, y, lines).attr(attributes);
-      t.selectAll('tspan:nth-child(n+2)').attr({
-        dy: '1.2em',
-        x: x,
-      });
-      return t;
-    };
-  });
+        // Create multiple tspan for each string in array
+        var t = this.text(x, y, lines).attr(attributes);
+        t.selectAll('tspan:nth-child(n+2)').attr({
+          dy: '1.2em',
+          x: x,
+        });
+        return t;
+      };
+    });
+  };
 
   if (pgAdmin.Explain)
     return pgAdmin.Explain;
@@ -161,7 +165,7 @@ define('pgadmin.misc.explain', [
         ypos += yMargin;
       }
 
-      if (S.startsWith(node_type, '(slice'))
+      if (node_type.startsWith('(slice'))
         node_type = node_type.substring(0, 7);
 
       // Get the image information for current node
@@ -494,7 +498,7 @@ define('pgadmin.misc.explain', [
         ypos += yMargin;
       }
 
-      if (S.startsWith(node_type, '(slice'))
+      if (node_type.startsWith(node_type, '(slice'))
         node_type = node_type.substring(0, 7);
       // Get the image information for current node
       let imageStore = imageMapper.default;
@@ -769,8 +773,26 @@ define('pgadmin.misc.explain', [
 
   // Parse and draw full graphical explain
   _.extend(pgExplain, {
-    // Assumption container is a jQuery object
+
     DrawJSONPlan: function(container, plan, isDownload) {
+      let self = this;
+      if(Snap != null) {
+        self.goForDraw(container, plan, isDownload);
+      } else {
+        import('snapsvg')
+          .then((module)=>{
+            initSnap(module.default);
+            self.goForDraw(container, plan, isDownload);
+          })
+          .catch((error)=>{
+            throw(error);
+          });
+      }
+    },
+
+    // Assumption container is a jQuery object
+    goForDraw: function(container, plan, isDownload) {
+
       pgExplain.totalNodes = 0;
       pgExplain.totalDownloadedNodes = 0;
       pgExplain.isDownloaded = false;
diff --git a/web/pgadmin/misc/static/explain/js/image_maper.js b/web/pgadmin/misc/static/explain/js/image_maper.js
index 3a66653e..babd2a63 100644
--- a/web/pgadmin/misc/static/explain/js/image_maper.js
+++ b/web/pgadmin/misc/static/explain/js/image_maper.js
@@ -7,7 +7,6 @@
 //
 //////////////////////////////////////////////////////////////
 
-import S from 'underscore.string';
 /*
  * A map which is used to fetch the image to be drawn and
  * text which will appear below it
@@ -223,7 +222,7 @@ let imageMapper = {
       command = data['Command'];
 
     if (strategy == 'Hashed') {
-      if (S.startsWith(command, 'Intersect')) {
+      if (command.startsWith('Intersect')) {
         if (command == 'Intersect All')
           return {
             'image': 'ex_hash_setop_intersect_all.svg',
@@ -233,7 +232,7 @@ let imageMapper = {
           'image': 'ex_hash_setop_intersect.svg',
           'image_text': 'Hashed Intersect',
         };
-      } else if (S.startsWith(command, 'Except')) {
+      } else if (command.startsWith('Except')) {
         if (command == 'Except All')
           return {
             'image': 'ex_hash_setop_except_all.svg',
diff --git a/web/pgadmin/misc/statistics/static/js/statistics.js b/web/pgadmin/misc/statistics/static/js/statistics.js
index d4c062d4..101ebd5f 100644
--- a/web/pgadmin/misc/statistics/static/js/statistics.js
+++ b/web/pgadmin/misc/statistics/static/js/statistics.js
@@ -8,11 +8,11 @@
 //////////////////////////////////////////////////////////////
 
 define('misc.statistics', [
-  'sources/gettext', 'underscore', 'underscore.string', 'jquery', 'backbone',
+  'sources/gettext', 'underscore', 'jquery', 'backbone',
   'sources/pgadmin', 'pgadmin.browser', 'pgadmin.backgrid', 'alertify', 'sources/size_prettify',
   'sources/misc/statistics/statistics',
 ], function(
-  gettext, _, S, $, Backbone, pgAdmin, pgBrowser, Backgrid, Alertify, sizePrettify,
+  gettext, _, $, Backbone, pgAdmin, pgBrowser, Backgrid, Alertify, sizePrettify,
   statisticsHelper
 ) {
 
@@ -315,9 +315,8 @@ define('misc.statistics', [
                 })) {
                   Alertify.pgNotifier(
                     error, xhr,
-                    S(gettext('Error retrieving the information - %s')).sprintf(
-                      message || _label
-                    ).value(), function(msg) {
+                    gettext('Error retrieving the information - %s', message || _label),
+                    function(msg) {
                       if(msg === 'CRYPTKEY_SET') {
                         ajaxHook();
                       } else {
diff --git a/web/pgadmin/static/bundle/app.js b/web/pgadmin/static/bundle/app.js
index 68f8a3b1..71034c93 100644
--- a/web/pgadmin/static/bundle/app.js
+++ b/web/pgadmin/static/bundle/app.js
@@ -8,8 +8,8 @@
 //////////////////////////////////////////////////////////////
 
 define('app', [
-  'babel-polyfill', 'sources/pgadmin', 'bundled_browser', 'pgadmin.datagrid',
-], function(babelPolyFill, pgAdmin) {
+  'sources/pgadmin', 'bundled_browser', 'pgadmin.datagrid',
+], function(pgAdmin) {
   var initializeModules = function(Object) {
     for (var key in Object) {
       var module = Object[key];
diff --git a/web/pgadmin/static/bundle/slickgrid.js b/web/pgadmin/static/bundle/slickgrid.js
index 34fe1413..731b4202 100644
--- a/web/pgadmin/static/bundle/slickgrid.js
+++ b/web/pgadmin/static/bundle/slickgrid.js
@@ -20,4 +20,3 @@ import 'slickgrid/plugins/slick.cellrangeselector';
 import 'sources/slickgrid/custom_header_buttons';
 
 export default window.Slick;
-
diff --git a/web/pgadmin/static/css/alertify.noanimation.css b/web/pgadmin/static/css/alertify.noanimation.css
deleted file mode 100644
index 6d7589a9..00000000
--- a/web/pgadmin/static/css/alertify.noanimation.css
+++ /dev/null
@@ -1,41 +0,0 @@
-.alertify .ajs-dimmer,
-.alertify .ajs-modal,
-.alertify-notifier,
-.alertify-notifier .ajs-message.ajs-visible,
-.alertify-notifier .ajs-message,
-.alertify-notifier.ajs-center .ajs-message.ajs-visible,
-.alertify-notifier.ajs-center .ajs-message
-{
-  -moz-transition: none;
-  -webkit-transition: none;
-  -o-transition: none;
-  transition: none;
-  -webkit-transform: none;
-  transform: none;
-}
-
-.alertify.ajs-zoom.ajs-in:not(.ajs-hidden) .ajs-dialog {
-  -webkit-animation-name: ajs-zoomIn;
-  animation-name: ajs-zoomIn;
-}
-.alertify.ajs-zoom.ajs-out.ajs-hidden .ajs-dialog {
-  -webkit-animation-name: ajs-zoomOut;
-  animation-name: ajs-zoomOut;
-}
-
-@-webkit-keyframes ajs-zoomIn {
-  -webkit-transform: none;
-  transform: none;
-}
-@keyframes ajs-zoomIn {
-  -webkit-transform: none;
-  transform: none;
-}
-@-webkit-keyframes ajs-zoomOut {
-  -webkit-transform: none;
-  transform: none;
-}
-@keyframes ajs-zoomeOut {
-  -webkit-transform: none;
-  transform: none;
-}
diff --git a/web/pgadmin/static/css/pgadmin.css b/web/pgadmin/static/css/pgadmin.css
index 676e933c..fe48add2 100644
--- a/web/pgadmin/static/css/pgadmin.css
+++ b/web/pgadmin/static/css/pgadmin.css
@@ -1,39 +1,3 @@
-@font-face {
-  font-family: "Open Sans";
-  src: url("~top/static/fonts/OpenSans-Regular.ttf") format("truetype");
-  speak: none;
-  font-style: normal;
-  font-weight: normal;
-  font-variant: normal;
-  text-transform: none;
-  line-height: 1;
-  -webkit-font-smoothing: antialiased;
-}
-
-@font-face {
-  font-family: "Open Sans Semibold";
-  src: url("~top/static/fonts/OpenSans-SemiBold.ttf") format("truetype");
-  speak: none;
-  font-style: normal;
-  font-weight: normal;
-  font-variant: normal;
-  text-transform: none;
-  line-height: 1;
-  -webkit-font-smoothing: antialiased;
-}
-
-@font-face {
-  font-family: "Open Sans Bold";
-  src: url("~top/static/fonts/OpenSans-Bold.ttf") format("truetype");
-  speak: none;
-  font-style: normal;
-  font-weight: normal;
-  font-variant: normal;
-  text-transform: none;
-  line-height: 1;
-  -webkit-font-smoothing: antialiased;
-}
-
 @font-face {
   font-family: "Source Code Pro";
   src: url("~top/static/fonts/SourceCodePro-Regular.ttf") format("truetype");
@@ -43,6 +7,7 @@
   font-variant: normal;
   text-transform: none;
   line-height: 1;
+  font-display: swap;
   -webkit-font-smoothing: antialiased;
 }
 
@@ -55,6 +20,7 @@
   font-variant: normal;
   text-transform: none;
   line-height: 1;
+  font-display: swap;
   -webkit-font-smoothing: antialiased;
 }
 
@@ -67,6 +33,7 @@
   font-variant: normal;
   text-transform: none;
   line-height: 1;
+  font-display: swap;
   -webkit-font-smoothing: antialiased;
 }
 
diff --git a/web/pgadmin/static/css/style.css b/web/pgadmin/static/css/style.css
index e7293d47..26b8dfc4 100644
--- a/web/pgadmin/static/css/style.css
+++ b/web/pgadmin/static/css/style.css
@@ -6,7 +6,6 @@
 @import '~bootstrap4-toggle/css/bootstrap4-toggle.css';
 @import '~backgrid-select-all/backgrid-select-all.css';
 @import '~backgrid-filter/backgrid-filter.css';
-@import '~backgrid-sizeable-columns/backgrid-sizeable-columns.css';
 @import '~slickgrid/css/select2.css';
 @import '~jquery-contextmenu/dist/jquery.contextMenu.css';
 @import '~webcabin-docker/Build/wcDocker.css';
@@ -21,3 +20,5 @@
 @import '~slickgrid/slick.grid.css';
 @import '~slickgrid/slick-default-theme.css';
 @import '~slickgrid/css/smoothness/jquery-ui-1.11.3.custom.css';
+
+@import '../vendor/backgrid/backgrid.css';
diff --git a/web/pgadmin/static/js/alertify/dialog.js b/web/pgadmin/static/js/alertify/dialog.js
index fa1100b1..e67c3dbe 100644
--- a/web/pgadmin/static/js/alertify/dialog.js
+++ b/web/pgadmin/static/js/alertify/dialog.js
@@ -8,7 +8,7 @@
 //////////////////////////////////////////////////////////////
 
 import gettext from '../gettext';
-import {sprintf} from 'sprintf-js';
+import {sprintf} from 'sources/utils';
 import {DialogFactory} from './dialog_factory';
 import Backform from '../backform.pgadmin';
 import {getTreeNodeHierarchyFromIdentifier} from '../tree/pgadmin_tree_node';
diff --git a/web/pgadmin/static/js/backform.pgadmin.js b/web/pgadmin/static/js/backform.pgadmin.js
index 33d264ab..79dc7239 100644
--- a/web/pgadmin/static/js/backform.pgadmin.js
+++ b/web/pgadmin/static/js/backform.pgadmin.js
@@ -8,11 +8,11 @@
 //////////////////////////////////////////////////////////////
 
 define([
-  'sources/gettext', 'underscore', 'underscore.string', 'jquery',
+  'sources/gettext', 'underscore', 'jquery',
   'backbone', 'backform', 'backgrid', 'codemirror', 'sources/sqleditor_utils',
   'sources/keyboard_shortcuts',
   'spectrum', 'pgadmin.backgrid', 'select2', 'bootstrap.toggle',
-], function(gettext, _, S, $, Backbone, Backform, Backgrid, CodeMirror,
+], function(gettext, _, $, Backbone, Backform, Backgrid, CodeMirror,
   SqlEditorUtils, keyboardShortcuts) {
 
   var pgAdmin = (window.pgAdmin = window.pgAdmin || {}),
diff --git a/web/pgadmin/static/js/check_node_visibility.js b/web/pgadmin/static/js/check_node_visibility.js
index 4253a35e..c172a6e8 100644
--- a/web/pgadmin/static/js/check_node_visibility.js
+++ b/web/pgadmin/static/js/check_node_visibility.js
@@ -7,8 +7,8 @@
 //
 //////////////////////////////////////////////////////////////////////////
 
-define(['jquery', 'underscore', 'underscore.string'],
-  function ($, _, S) {
+define(['jquery', 'underscore'],
+  function ($, _) {
 
     var check_node_visibility = function (pgBrowser, node_type) {
       if(_.isUndefined(node_type) || _.isNull(node_type)) {
@@ -18,7 +18,7 @@ define(['jquery', 'underscore', 'underscore.string'],
       // Target actual node instead of collection.
       // If node is disabled then there is no meaning of
       // adding collection node menu
-      if(S.startsWith(node_type, 'coll-')) {
+      if(node_type.startsWith('coll-')) {
         node_type = node_type.replace('coll-', '');
       }
 
diff --git a/web/pgadmin/static/js/gettext.js b/web/pgadmin/static/js/gettext.js
index e3df9562..b4d623ce 100644
--- a/web/pgadmin/static/js/gettext.js
+++ b/web/pgadmin/static/js/gettext.js
@@ -12,30 +12,32 @@ define(['translations'], function (translations) {
   /***
    * This method behaves as a drop-in replacement for flask translation rendering.
    * It uses the same translation file under the hood and uses flask to determine the language.
-   *
-   * ex. translate("some %(adjective)s text", {adjective: "cool"})
+   * It is slightly tweaked to work like sprintf
+   * ex. translate("some %s text", "cool")
    *
    * @param {String} text
-   * @param {Object} substitutions
    */
-  return function gettext(text, substitutions) {
+  return function gettext(text) {
 
     var rawTranslation = translations[text] ? translations[text] : text;
 
-    // captures things of the form %(substitutionName)s
-    var substitutionGroupsRegExp = /([^%]*)%\(([^\)]+)\)s(.*)/;
-    var matchFound;
-
-    var interpolated = rawTranslation;
-    do {
-      matchFound = false;
-      interpolated = interpolated.replace(substitutionGroupsRegExp, function (_, textBeginning, substitutionName, textEnd) {
-        matchFound = true;
-        return textBeginning + substitutions[substitutionName] + textEnd;
-      });
-    } while (matchFound);
-
-    return interpolated;
+    try {
+      return rawTranslation.split('%s')
+        .map((w, i) => {
+          if(i > 0) {
+            if(arguments[i]) {
+              return [arguments[i], w].join('');
+            } else {
+              return ['%s', w].join('');
+            }
+          } else {
+            return w;
+          }
+        })
+        .join('');
+    } catch(e) {
+      console.error(e);
+      return rawTranslation;
+    }
   };
-
-});
\ No newline at end of file
+});
diff --git a/web/pgadmin/static/js/keyboard_shortcuts.js b/web/pgadmin/static/js/keyboard_shortcuts.js
index b0c92634..69590051 100644
--- a/web/pgadmin/static/js/keyboard_shortcuts.js
+++ b/web/pgadmin/static/js/keyboard_shortcuts.js
@@ -80,20 +80,14 @@ function shortcut_title(title, shortcut) {
   }
   text_representation += shortcut_key(shortcut);
 
-  return gettext('%(title)s (%(text_representation)s)',{
-    'title': title,
-    'text_representation': text_representation,
-  });
+  return `${title} (${text_representation})`;
 }
 
 /* Returns the key char of shortcut
  * shortcut object is browser.get_preference().value
  */
 function shortcut_accesskey_title(title, shortcut) {
-  return gettext('%(title)s (accesskey + %(key)s)',{
-    'title': title,
-    'key': shortcut_key(shortcut),
-  });
+  return `${title} (${gettext('accesskey')} + ${shortcut_key(shortcut)})`;
 }
 
 
diff --git a/web/pgadmin/static/js/modify_animation.js b/web/pgadmin/static/js/modify_animation.js
index 420c9433..1cf63c77 100644
--- a/web/pgadmin/static/js/modify_animation.js
+++ b/web/pgadmin/static/js/modify_animation.js
@@ -56,18 +56,14 @@ function modifyAlertifyAnimation(pgBrowser) {
   ).value;
 
   if(enableAcitreeAnimation) {
-    $(document).find('link#alertify-no-animation')
-      .attr('disabled', 'disabled');
+    $(document).find('body').removeClass('alertify-no-animation');
     _.each(document.getElementsByTagName('iframe'), function(frame) {
-      $(frame.contentDocument).find('link#alertify-no-animation')
-        .attr('disabled', 'disabled');
+      $(frame.contentDocument).find('body').removeClass('alertify-no-animation');
     });
   } else {
-    $(document).find('link#alertify-no-animation')
-      .removeAttr('disabled', 'disabled');
+    $(document).find('body').addClass('alertify-no-animation');
     _.each(document.getElementsByTagName('iframe'), function(frame) {
-      $(frame.contentDocument).find('link#alertify-no-animation')
-        .removeAttr('disabled', 'disabled');
+      $(frame.contentDocument).find('body').addClass('alertify-no-animation');
     });
   }
 }
diff --git a/web/pgadmin/static/js/sqleditor/call_render_after_poll.js b/web/pgadmin/static/js/sqleditor/call_render_after_poll.js
index ec18b10b..c3d21730 100644
--- a/web/pgadmin/static/js/sqleditor/call_render_after_poll.js
+++ b/web/pgadmin/static/js/sqleditor/call_render_after_poll.js
@@ -9,7 +9,7 @@
 
 import {calculateQueryRunTime} from './calculate_query_run_time';
 import gettext from '../gettext';
-import {sprintf} from 'sprintf-js';
+import {sprintf} from 'sources/utils';
 
 function hasResultsToDisplay(res) {
   return res.colinfo != null;
diff --git a/web/pgadmin/static/js/sqleditor/geometry_viewer.js b/web/pgadmin/static/js/sqleditor/geometry_viewer.js
index bd07d070..3c0f7fe9 100644
--- a/web/pgadmin/static/js/sqleditor/geometry_viewer.js
+++ b/web/pgadmin/static/js/sqleditor/geometry_viewer.js
@@ -8,16 +8,17 @@
 //////////////////////////////////////////////////////////////
 
 import gettext from 'sources/gettext';
-import {Geometry} from 'wkx';
 import {Buffer} from 'buffer';
-import L from 'leaflet';
 import $ from 'jquery';
 
+var L = null;
+var Geometry = null;
 let GeometryViewer = {
   panel_closed: true,
 
-  render_geometries: function (handler, items, columns, columnIndex) {
+  go_for_render: function(handler, items, columns, columnIndex) {
     let self = this;
+
     if (!self.map_component) {
       self.map_component = initMapComponent();
     }
@@ -53,10 +54,29 @@ let GeometryViewer = {
 
     handler.gridView.geometry_viewer.focus();
     self.map_component.clearMap();
-    let dataObj = parseData(items, columns, columnIndex);
+    let dataObj = parseData(items, columns, columnIndex, Geometry);
     self.map_component.renderMap(dataObj);
   },
 
+  render_geometries: function (handler, items, columns, columnIndex) {
+    let self = this;
+
+    if(L != null && Geometry != null) {
+      self.go_for_render(handler, items, columns, columnIndex);
+    } else {
+      Promise.all([
+        import('leaflet'),
+        import('wkx'),
+      ]).then(([leaflet, wkx]) => {
+        L = leaflet.default;
+        Geometry = wkx.Geometry;
+        self.go_for_render(handler, items, columns, columnIndex);
+      }).catch((error)=>{
+        throw(error);
+      });
+    }
+  },
+
   add_header_button: function (columnDefinition) {
     columnDefinition.header = {
       buttons: [
@@ -275,7 +295,7 @@ function initMapComponent() {
   };
 }
 
-function parseData(items, columns, columnIndex) {
+function parseData(items, columns, columnIndex, GeometryLib) {
   const maxRenderByteLength = 20 * 1024 * 1024; //render geometry data up to 20MB
   const maxRenderGeometries = 100000; // render geometries up to 100000
   let field = columns[columnIndex].field;
@@ -304,7 +324,7 @@ function parseData(items, columns, columnIndex) {
     try {
       let value = item[field];
       let buffer = Buffer.from(value, 'hex');
-      let geometry = Geometry.parse(buffer);
+      let geometry = GeometryLib.parse(buffer);
       if (geometry.hasZ) {
         geometries3D.push(geometry);
       } else {
diff --git a/web/pgadmin/static/js/utils.js b/web/pgadmin/static/js/utils.js
index 1f15858d..645a415a 100644
--- a/web/pgadmin/static/js/utils.js
+++ b/web/pgadmin/static/js/utils.js
@@ -205,3 +205,30 @@ export function getRandomInt(min, max) {
   max = Math.floor(max);
   return Math.floor(Math.random() * (max - min + 1)) + min;
 }
+
+export function titleize(i_str) {
+  return i_str.split(' ')
+    .map(w => w[0].toUpperCase() + w.substr(1).toLowerCase())
+    .join(' ');
+}
+
+export function sprintf(i_str) {
+  try {
+    return i_str.split('%s')
+      .map((w, i) => {
+        if(i > 0) {
+          if(arguments[i]) {
+            return [arguments[i], w].join('');
+          } else {
+            return ['%s', w].join('');
+          }
+        } else {
+          return w;
+        }
+      })
+      .join('');
+  } catch(e) {
+    console.error(e);
+    return i_str;
+  }
+}
diff --git a/web/pgadmin/static/scss/_alertify.overrides.scss b/web/pgadmin/static/scss/_alertify.overrides.scss
index d43becd5..0c579dd6 100644
--- a/web/pgadmin/static/scss/_alertify.overrides.scss
+++ b/web/pgadmin/static/scss/_alertify.overrides.scss
@@ -234,3 +234,39 @@
 .alertify .ajs-dialog.ajs-capture:before {
   display: none;
 }
+
+.alertify-no-animation {
+  .alertify .ajs-dimmer,
+  .alertify .ajs-modal,
+  .alertify-notifier,
+  .alertify-notifier .ajs-message.ajs-visible,
+  .alertify-notifier .ajs-message,
+  .alertify-notifier.ajs-center .ajs-message.ajs-visible,
+  .alertify-notifier.ajs-center .ajs-message
+  {
+    -moz-transition: none;
+    -webkit-transition: none;
+    -o-transition: none;
+    transition: none;
+    -webkit-transform: none;
+    transform: none;
+  }
+
+  .alertify.ajs-zoom.ajs-in:not(.ajs-hidden) .ajs-dialog {
+    -webkit-animation-name: ajs-noanimate;
+    animation-name: ajs-noanimate;
+  }
+  .alertify.ajs-zoom.ajs-out.ajs-hidden .ajs-dialog {
+    -webkit-animation-name: ajs-noanimate;
+    animation-name: ajs-noanimate;
+  }
+
+  @-webkit-keyframes ajs-noanimate {
+    -webkit-transform: none;
+    transform: none;
+  }
+  @keyframes ajs-noanimate {
+    -webkit-transform: none;
+    transform: none;
+  }
+}
diff --git a/web/pgadmin/static/vendor/backgrid/backgrid.css b/web/pgadmin/static/vendor/backgrid/backgrid.css
index c4298e22..a8cef8c3 100644
--- a/web/pgadmin/static/vendor/backgrid/backgrid.css
+++ b/web/pgadmin/static/vendor/backgrid/backgrid.css
@@ -1,8 +1,8 @@
 /*
   backgrid
-  http://github.com/wyuenho/backgrid
+  http://github.com/cloudflare/backgrid
 
-  Copyright (c) 2013 Jimmy Yuen Ho Wong and contributors
+  Copyright (c) 2013-present Cloudflare, Inc. and contributors
   Licensed under the MIT license.
 */
 
@@ -233,4 +233,4 @@
 .backgrid .select-cell.editor optgroup::-o-focus-inner,
 .backgrid .select-cell.editor option::-o-focus-inner {
   border: 0;
-}
\ No newline at end of file
+}
diff --git a/web/pgadmin/static/vendor/backgrid/backgrid.js b/web/pgadmin/static/vendor/backgrid/backgrid.js
index 963ddca2..9830db59 100644
--- a/web/pgadmin/static/vendor/backgrid/backgrid.js
+++ b/web/pgadmin/static/vendor/backgrid/backgrid.js
@@ -1,39 +1,33 @@
-/////////////////////////////////////////////////////////////
-//
-// pgAdmin 4 - PostgreSQL Tools
-//
-// Copyright (C) 2013 - 2019, The pgAdmin Development Team
-// This software is released under the PostgreSQL Licence
-//
-//////////////////////////////////////////////////////////////
-
 /*!
-  backgrid
-  http://github.com/wyuenho/backgrid
+  backgrid 0.3.8
+  http://github.com/cloudflare/backgrid
 
-  Copyright (c) 2014 Jimmy Yuen Ho Wong and contributors <wyuenho@gmail.com>
+  Copyright (c) 2017 Cloudflare, Inc. and contributors <jwong@cloudflare.com>
   Licensed under the MIT license.
 */
 
-(function (factory) {
+(function (root, factory) {
 
-  // CommonJS
-  if (typeof exports == "object") {
-    module.exports = factory(module.exports,
-                             require("underscore"),
-                             require("backbone"));
-  }
-  // Browser
-  else factory(this, this._, this.Backbone);
-}(function (root, _, Backbone) {
+  if (typeof define === "function" && define.amd) {
+    // AMD (+ global for extensions)
+    define(["underscore", "backbone"], function (_, Backbone) {
+      return (root.Backgrid = factory(_, Backbone));
+    });
+  } else if (typeof exports === "object") {
+    // CommonJS
+    module.exports = factory(require("underscore"), require("backbone"));
+  } else {
+    // Browser
+    root.Backgrid = factory(root._, root.Backbone);
+  }}(this, function (_, Backbone) {
 
   "use strict";
 
 /*
   backgrid
-  http://github.com/wyuenho/backgrid
+  http://github.com/cloudflare/backgrid
 
-  Copyright (c) 2013 Jimmy Yuen Ho Wong and contributors
+  Copyright (c) 2013-present Cloudflare, Inc. and contributors
   Licensed under the MIT license.
 */
 
@@ -72,7 +66,7 @@ function lpad(str, length, padstr) {
 
 var $ = Backbone.$;
 
-var Backgrid = root.Backgrid = {
+var Backgrid = {
 
   Extension: {},
 
@@ -180,9 +174,9 @@ _.extend(Command.prototype, {
 
 /*
   backgrid
-  http://github.com/wyuenho/backgrid
+  http://github.com/cloudflare/backgrid
 
-  Copyright (c) 2013 Jimmy Yuen Ho Wong and contributors
+  Copyright (c) 2013-present Cloudflare, Inc. and contributors
   Licensed under the MIT license.
 */
 
@@ -285,7 +279,7 @@ _.extend(NumberFormatter.prototype, {
   fromRaw: function (number, model) {
     if (_.isNull(number) || _.isUndefined(number)) return '';
 
-    number = number.toFixed(~~this.decimals);
+    number = parseFloat(number).toFixed(~~this.decimals);
 
     var parts = number.split('.');
     var integerPart = parts[0];
@@ -625,9 +619,9 @@ _.extend(SelectFormatter.prototype, {
 
 /*
   backgrid
-  http://github.com/wyuenho/backgrid
+  http://github.com/cloudflare/backgrid
 
-  Copyright (c) 2013 Jimmy Yuen Ho Wong and contributors
+  Copyright (c) 2013-present Cloudflare, Inc. and contributors
   Licensed under the MIT license.
 */
 
@@ -873,9 +867,16 @@ var Cell = Backgrid.Cell = Backbone.View.extend({
                     }
                   });
 
-    if (Backgrid.callByNeed(column.editable(), column, model)) $el.addClass("editable");
-    if (Backgrid.callByNeed(column.sortable(), column, model)) $el.addClass("sortable");
-    if (Backgrid.callByNeed(column.renderable(), column, model)) $el.addClass("renderable");
+    this.updateStateClassesMaybe();
+  },
+
+  updateStateClassesMaybe: function () {
+    var model = this.model;
+    var column = this.column;
+    var $el = this.$el;
+    $el.toggleClass("editable", Backgrid.callByNeed(column.editable(), column, model));
+    $el.toggleClass("sortable", Backgrid.callByNeed(column.sortable(), column, model));
+    $el.toggleClass("renderable", Backgrid.callByNeed(column.renderable(), column, model));
   },
 
   /**
@@ -883,9 +884,13 @@ var Cell = Backgrid.Cell = Backbone.View.extend({
      model's raw value for this cell's column.
   */
   render: function () {
-    this.$el.empty();
+    var $el = this.$el;
+    $el.empty();
     var model = this.model;
-    this.$el.text(this.formatter.fromRaw(model.get(this.column.get("name")), model));
+    var columnName = this.column.get("name");
+    $el.text(this.formatter.fromRaw(model.get(columnName), model));
+    $el.addClass(columnName);
+    this.updateStateClassesMaybe();
     this.delegateEvents();
     return this;
   },
@@ -1408,7 +1413,15 @@ var SelectCellEditor = Backgrid.SelectCellEditor = CellEditor.extend({
   },
 
   /** @property {function(Object, ?Object=): string} template */
-  template: _.template('<option value="<%- value %>" <%= selected ? \'selected="selected"\' : "" %>><%- text %></option>', null, {variable: null}),
+  template: _.template(
+    '<option value="<%- value %>" <%= selected ? \'selected="selected"\' : "" %>><%- text %></option>',
+    null,
+    {
+        variable    : null,
+        evaluate    : /<%([\s\S]+?)%>/g,
+        interpolate : /<%=([\s\S]+?)%>/g,
+        escape      : /<%-([\s\S]+?)%>/g
+    }),
 
   setOptionValues: function (optionValues) {
     this.optionValues = optionValues;
@@ -1651,9 +1664,9 @@ var SelectCell = Backgrid.SelectCell = Cell.extend({
 
 /*
   backgrid
-  http://github.com/wyuenho/backgrid
+  http://github.com/cloudflare/backgrid
 
-  Copyright (c) 2013 Jimmy Yuen Ho Wong and contributors
+  Copyright (c) 2013-present Cloudflare, Inc. and contributors
   Licensed under the MIT license.
 */
 
@@ -1706,19 +1719,20 @@ var Column = Backgrid.Column = Backbone.Model.extend({
      this column is sortable. If the value is a string, a method will the same
      name will be looked up from the column instance to determine whether the
      column should be sortable. The method's signature must be `function
-     (Backgrid.Column, Backbone.Model): boolean`.
+     (Backbone.Model): boolean`. The function's context is the column instance.
 
      @cfg {boolean|string|function(): boolean} [defaults.editable=true] Whether
      this column is editable. If the value is a string, a method will the same
      name will be looked up from the column instance to determine whether the
      column should be editable. The method's signature must be `function
-     (Backgrid.Column, Backbone.Model): boolean`.
+     (Backbone.Model): boolean`. The function's context is the column instance.
 
      @cfg {boolean|string|function(): boolean} [defaults.renderable=true]
      Whether this column is renderable. If the value is a string, a method will
      the same name will be looked up from the column instance to determine
      whether the column should be renderable. The method's signature must be
-     `function (Backrid.Column, Backbone.Model): boolean`.
+     `function (Backbone.Model): boolean`. The function's context is the column
+     instance.
 
      @cfg {Backgrid.CellFormatter | Object | string} [defaults.formatter] The
      formatter to use to convert between raw model values and user input.
@@ -1824,24 +1838,33 @@ var Column = Backgrid.Column = Backbone.Model.extend({
   }
 
   /**
+     If you cannot always determine whether a column should be sortable before
+     the grid get initialized, you can override this method.
+
      @member Backgrid.Column
      @protected
      @method sortable
-     @return {function(Backgrid.Column, Backbone.Model): boolean | boolean}
+     @return {function(Backbone.Model): boolean | boolean}
   */
 
   /**
+     If you cannot always determine whether a column should be editable before
+     the grid get initialized, you can override this method.
+
      @member Backgrid.Column
      @protected
      @method editable
-     @return {function(Backgrid.Column, Backbone.Model): boolean | boolean}
+     @return {function(Backbone.Model): boolean | boolean}
   */
 
   /**
+     If you cannot always determine whether a column should be renderable before
+     the grid get initialized, you can override this method.
+
      @member Backgrid.Column
      @protected
      @method renderable
-     @return {function(Backgrid.Column, Backbone.Model): boolean | boolean}
+     @return {function(Backbone.Model): boolean | boolean}
   */
 });
 
@@ -1871,9 +1894,9 @@ var Columns = Backgrid.Columns = Backbone.Collection.extend({
 
 /*
   backgrid
-  http://github.com/wyuenho/backgrid
+  http://github.com/cloudflare/backgrid
 
-  Copyright (c) 2013 Jimmy Yuen Ho Wong and contributors
+  Copyright (c) 2013-present Cloudflare, Inc. and contributors
   Licensed under the MIT license.
 */
 
@@ -2020,7 +2043,9 @@ var EmptyRow = Backgrid.EmptyRow = Backbone.View.extend({
 
     var td = document.createElement("td");
     td.setAttribute("colspan", this.columns.length);
-    td.appendChild(document.createTextNode(_.result(this, "emptyText")));
+    var span = document.createElement("span");
+    span.innerHTML = _.result(this, "emptyText");
+    td.appendChild(span);
 
     this.el.className = "empty";
     this.el.appendChild(td);
@@ -2031,9 +2056,9 @@ var EmptyRow = Backgrid.EmptyRow = Backbone.View.extend({
 
 /*
   backgrid
-  http://github.com/wyuenho/backgrid
+  http://github.com/cloudflare/backgrid
 
-  Copyright (c) 2013 Jimmy Yuen Ho Wong and contributors
+  Copyright (c) 2013-present Cloudflare, Inc. and contributors
   Licensed under the MIT license.
 */
 
@@ -2052,7 +2077,7 @@ var HeaderCell = Backgrid.HeaderCell = Backbone.View.extend({
 
   /** @property */
   events: {
-    "click a": "onClick"
+    "click button": "onClick"
   },
 
   /**
@@ -2087,12 +2112,12 @@ var HeaderCell = Backgrid.HeaderCell = Backbone.View.extend({
     if (Backgrid.callByNeed(column.sortable(), column, collection)) $el.addClass("sortable");
     if (Backgrid.callByNeed(column.renderable(), column, collection)) $el.addClass("renderable");
 
-    this.listenTo(collection.fullCollection || collection, "sort", this.removeCellDirection);
+    this.listenTo(collection.fullCollection || collection, "backgrid:sorted", this.removeCellDirection);
   },
 
   /**
-     Event handler for the collection's `sort` event. Removes all the CSS
-     direction classes.
+     Event handler for the collection's `backgrid:sorted` event. Removes
+     all the CSS direction classes.
    */
   removeCellDirection: function () {
     this.$el.removeClass("ascending").removeClass("descending");
@@ -2151,7 +2176,7 @@ var HeaderCell = Backgrid.HeaderCell = Backbone.View.extend({
     var sortable = Backgrid.callByNeed(column.sortable(), column, this.collection);
     var label;
     if(sortable){
-      label = $("<a>").text(column.get("label")).append("<b class='sort-caret'></b>");
+      label = $("<button>").text(column.get("label")).append("<span class='sort-caret' aria-hidden='true'></span>");
     } else {
       label = document.createTextNode(column.get("label"));
     }
@@ -2173,8 +2198,6 @@ var HeaderCell = Backgrid.HeaderCell = Backbone.View.extend({
  */
 var HeaderRow = Backgrid.HeaderRow = Backgrid.Row.extend({
 
-  requiredOptions: ["columns", "collection"],
-
   /**
      Initializer.
 
@@ -2259,9 +2282,9 @@ var Header = Backgrid.Header = Backbone.View.extend({
 
 /*
   backgrid
-  http://github.com/wyuenho/backgrid
+  http://github.com/cloudflare/backgrid
 
-  Copyright (c) 2013 Jimmy Yuen Ho Wong and contributors
+  Copyright (c) 2013-present Cloudflare, Inc. and contributors
   Licensed under the MIT license.
 */
 
@@ -2298,7 +2321,7 @@ var Body = Backgrid.Body = Backbone.View.extend({
       this.columns = new Columns(this.columns);
     }
 
-    this.row = options.row || Row;
+    this.row = options.row || this.row || Row;
     this.rows = this.collection.map(function (model) {
       var row = new this.row({
         columns: this.columns,
@@ -2318,14 +2341,19 @@ var Body = Backgrid.Body = Backbone.View.extend({
     this.listenTo(collection, "reset", this.refresh);
     this.listenTo(collection, "backgrid:sort", this.sort);
     this.listenTo(collection, "backgrid:edited", this.moveToNextCell);
+
+    this.listenTo(this.columns, "add remove", this.updateEmptyRow);
   },
 
   _unshiftEmptyRowMayBe: function () {
     if (this.rows.length === 0 && this.emptyText != null) {
-      this.rows.unshift(new EmptyRow({
+      this.emptyRow = new EmptyRow({
         emptyText: this.emptyText,
         columns: this.columns
-      }));
+      });
+
+      this.rows.unshift(this.emptyRow);
+      return true
     }
   },
 
@@ -2413,7 +2441,9 @@ var Body = Backgrid.Body = Backbone.View.extend({
     // removeRow() is called directly
     if (!options) {
       this.collection.remove(model, (options = collection));
-      this._unshiftEmptyRowMayBe();
+      if (this._unshiftEmptyRowMayBe()) {
+        this.render();
+      }
       return;
     }
 
@@ -2422,11 +2452,24 @@ var Body = Backgrid.Body = Backbone.View.extend({
     }
 
     this.rows.splice(options.index, 1);
-    this._unshiftEmptyRowMayBe();
+    if (this._unshiftEmptyRowMayBe()) {
+      this.render();
+    }
 
     return this;
   },
 
+  /**
+     Rerender the EmptyRow which empties the DOM element, creates the td with the
+     updated colspan, and appends it back into the DOM
+  */
+
+  updateEmptyRow: function () {
+    if (this.emptyRow != null) {
+      this.emptyRow.render();
+    }
+  },
+
   /**
      Reinitialize all the rows inside the body and re-render them. Triggers a
      Backbone `backgrid:refresh` event from the collection along with the body
@@ -2503,7 +2546,7 @@ var Body = Backgrid.Body = Backbone.View.extend({
      Triggers a Backbone `backgrid:sorted` event from the collection when done
      with the column, direction and a reference to the collection.
 
-     @param {Backgrid.Column} column
+     @param {Backgrid.Column|string} column
      @param {null|"ascending"|"descending"} direction
 
      See [Backbone.Collection#comparator](http://backbonejs.org/#Collection-comparator)
@@ -2545,19 +2588,20 @@ var Body = Backgrid.Body = Backbone.View.extend({
         }
         collection.fullCollection.sort();
         collection.trigger("backgrid:sorted", column, direction, collection);
+        column.set("direction", direction);
       }
       else collection.fetch({reset: true, success: function () {
         collection.trigger("backgrid:sorted", column, direction, collection);
+        column.set("direction", direction);
       }});
     }
     else {
       collection.comparator = comparator;
       collection.sort();
       collection.trigger("backgrid:sorted", column, direction, collection);
+      column.set("direction", direction);
     }
 
-    column.set("direction", direction);
-
     return this;
   },
 
@@ -2596,6 +2640,9 @@ var Body = Backgrid.Body = Backbone.View.extend({
     var j = this.columns.indexOf(column);
     var cell, renderable, editable, m, n;
 
+    // return if model being edited in a different grid
+    if (j === -1) return this;
+
     this.rows[i].cells[j].exitEditMode();
 
     if (command.moveUp() || command.moveDown() || command.moveLeft() ||
@@ -2644,9 +2691,9 @@ var Body = Backgrid.Body = Backbone.View.extend({
 
 /*
   backgrid
-  http://github.com/wyuenho/backgrid
+  http://github.com/cloudflare/backgrid
 
-  Copyright (c) 2013 Jimmy Yuen Ho Wong and contributors
+  Copyright (c) 2013-present Cloudflare, Inc. and contributors
   Licensed under the MIT license.
 */
 
@@ -2684,9 +2731,9 @@ var Footer = Backgrid.Footer = Backbone.View.extend({
 
 /*
   backgrid
-  http://github.com/wyuenho/backgrid
+  http://github.com/cloudflare/backgrid
 
-  Copyright (c) 2013 Jimmy Yuen Ho Wong and contributors
+  Copyright (c) 2013-present Cloudflare, Inc. and contributors
   Licensed under the MIT license.
 */
 
@@ -2760,6 +2807,7 @@ var Grid = Backgrid.Grid = Backbone.View.extend({
      @param {Object} options
      @param {Backbone.Collection.<Backgrid.Columns>|Array.<Backgrid.Column>|Array.<Object>} options.columns Column metadata.
      @param {Backbone.Collection} options.collection The collection of tabular model data to display.
+     @param {string} [options.caption=string] An optional caption to be added to the table.
      @param {Backgrid.Header} [options.header=Backgrid.Header] An optional Header class to override the default.
      @param {Backgrid.Body} [options.body=Backgrid.Body] An optional Body class to override the default.
      @param {Backgrid.Row} [options.row=Backgrid.Row] An optional Row class to override the default.
@@ -2769,9 +2817,11 @@ var Grid = Backgrid.Grid = Backbone.View.extend({
     // Convert the list of column objects here first so the subviews don't have
     // to.
     if (!(options.columns instanceof Backbone.Collection)) {
-      options.columns = new Columns(options.columns);
+      options.columns = new Columns(options.columns || this.columns);
     }
     this.columns = options.columns;
+    
+    this.caption = options.caption;
 
     var filteredOptions = _.omit(options, ["el", "id", "attributes",
                                            "className", "tagName", "events"]);
@@ -2851,12 +2901,16 @@ var Grid = Backgrid.Grid = Backbone.View.extend({
   },
 
   /**
-     Renders the grid's header, then footer, then finally the body. Triggers a
+     Renders the grid's caption, then header, then footer, then finally the body. Triggers a
      Backbone `backgrid:rendered` event along with a reference to the grid when
      the it has successfully been rendered.
    */
   render: function () {
     this.$el.empty();
+    
+    if (this.caption) {
+      this.$el.append($("<caption>").text(this.caption));
+    }
 
     if (this.header) {
       this.$el.append(this.header.render().$el);
@@ -2888,5 +2942,5 @@ var Grid = Backgrid.Grid = Backbone.View.extend({
   }
 
 });
-return Backgrid;
-}));
+  return Backgrid;
+}));
\ No newline at end of file
diff --git a/web/pgadmin/templates/base.html b/web/pgadmin/templates/base.html
index 8a7b255b..cddf51f6 100644
--- a/web/pgadmin/templates/base.html
+++ b/web/pgadmin/templates/base.html
@@ -19,10 +19,8 @@
     <link rel="shortcut icon" href="{{ url_for('redirects.favicon') }}"/>
 
     <!-- Base template stylesheets -->
-    <link type="text/css" rel="stylesheet" href="{{ url_for('static', filename='vendor/backgrid/backgrid.css')}}"/>
     <link type="text/css" rel="stylesheet" href="{{ url_for('static', filename='js/generated/style.css')}}"/>
     <link type="text/css" rel="stylesheet" href="{{ url_for('static', filename='js/generated/pgadmin.css')}}"/>
-    <link type="text/css" rel="stylesheet" href="{{ url_for('static', filename='css/alertify.noanimation.css')}}" id="alertify-no-animation"/>
 
      <!--View specified stylesheets-->
     {% block css_link %}{% endblock %}
@@ -40,8 +38,6 @@
                 shim: {},
                 paths: {
                     sources: "{{ url_for('static', filename='js') }}",
-                    slickgrid: "{{ url_for('static', filename='js/generated/slickgrid') }}",
-                    codemirror: "{{ url_for('static', filename='js/generated/codemirror') }}",
                     datagrid: "{{ url_for('static', filename='js/generated/datagrid') }}",
                     sqleditor: "{{ url_for('static', filename='js/generated/sqleditor') }}",
                     'pgadmin.browser.utils': "{{ url_for('browser.index') }}" + "js/utils",
@@ -54,11 +50,12 @@
             });
 
     </script>
+
     <!-- View specified scripts -->
-    <script type="text/javascript" src="{{ url_for('static', filename='js/generated/vendor.js') }}" ></script>
+    <script type="text/javascript" src="{{ url_for('static', filename='js/generated/vendor.main.js') }}" ></script>
+    <script type="text/javascript" src="{{ url_for('static', filename='js/generated/vendor.others.js') }}" ></script>
     <script type="text/javascript" src="{{ url_for('static', filename='js/generated/pgadmin_commons.js') }}" ></script>
 
-
 </head>
 <body>
 <!--[if lt IE 7]>
diff --git a/web/pgadmin/tools/backup/static/js/backup.js b/web/pgadmin/tools/backup/static/js/backup.js
index 32a37a98..ae31cef3 100644
--- a/web/pgadmin/tools/backup/static/js/backup.js
+++ b/web/pgadmin/tools/backup/static/js/backup.js
@@ -10,13 +10,13 @@
 // Backup dialog
 define([
   'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
-  'underscore.string', 'pgadmin.alertifyjs', 'backbone', 'pgadmin.backgrid',
+  'pgadmin.alertifyjs', 'backbone', 'pgadmin.backgrid',
   'pgadmin.backform', 'pgadmin.browser', 'sources/utils',
   'tools/backup/static/js/menu_utils',
   'tools/backup/static/js/backup_dialog',
   'sources/nodes/supported_database_node',
 ], function(
-  gettext, url_for, $, _, S, alertify, Backbone, Backgrid, Backform, pgBrowser,
+  gettext, url_for, $, _, alertify, Backbone, Backgrid, Backform, pgBrowser,
   commonUtils, menuUtils, globalBackupDialog, supportedNodes
 ) {
 
diff --git a/web/pgadmin/tools/datagrid/templates/datagrid/index.html b/web/pgadmin/tools/datagrid/templates/datagrid/index.html
index 3b3e3508..f50561ef 100644
--- a/web/pgadmin/tools/datagrid/templates/datagrid/index.html
+++ b/web/pgadmin/tools/datagrid/templates/datagrid/index.html
@@ -380,7 +380,7 @@
 {% endblock %}
 
 {% block init_script %}
-	require(['sources/generated/sqleditor'], function(ctx) {
+	require(['sources/generated/sqleditor', 'sources/generated/browser_nodes', 'sources/generated/codemirror', 'sources/generated/slickgrid'], function(ctx) {
     var $ = pgAdmin.SqlEditor.jquery,
         S = pgAdmin.SqlEditor.S,
         editorPanel = $('.sql-editor'),
diff --git a/web/pgadmin/tools/debugger/static/js/debugger.js b/web/pgadmin/tools/debugger/static/js/debugger.js
index a2149bf1..4e5d1d88 100644
--- a/web/pgadmin/tools/debugger/static/js/debugger.js
+++ b/web/pgadmin/tools/debugger/static/js/debugger.js
@@ -9,13 +9,13 @@
 
 define([
   'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
-  'underscore.string', 'alertify', 'sources/pgadmin', 'pgadmin.browser',
+  'alertify', 'sources/pgadmin', 'pgadmin.browser',
   'backbone', 'pgadmin.backgrid', 'codemirror', 'pgadmin.backform',
-  'pgadmin.tools.debugger.ui', 'pgadmin.tools.debugger.utils',
+  'pgadmin.tools.debugger.ui', 'pgadmin.tools.debugger.utils', 'sources/utils',
   'wcdocker', 'pgadmin.browser.frame',
 ], function(
-  gettext, url_for, $, _, S, Alertify, pgAdmin, pgBrowser, Backbone, Backgrid,
-  CodeMirror, Backform, get_function_arguments, debuggerUtils
+  gettext, url_for, $, _, Alertify, pgAdmin, pgBrowser, Backbone, Backgrid,
+  CodeMirror, Backform, get_function_arguments, debuggerUtils, pgadminUtils,
 ) {
   var pgTools = pgAdmin.Tools = pgAdmin.Tools || {},
     wcDocker = window.wcDocker;
@@ -281,7 +281,7 @@ define([
           }
         ),
         function(o) {
-          ref = S('%s/%s').sprintf(ref, encodeURI(o._id)).value();
+          ref = pgadminUtils.sprintf('%s/%s', ref, encodeURI(o._id));
         });
 
       var args = {
diff --git a/web/pgadmin/tools/import_export/static/js/import_export.js b/web/pgadmin/tools/import_export/static/js/import_export.js
index 9c75cc1f..1e48dbb5 100644
--- a/web/pgadmin/tools/import_export/static/js/import_export.js
+++ b/web/pgadmin/tools/import_export/static/js/import_export.js
@@ -8,13 +8,13 @@
 //////////////////////////////////////////////////////////////
 
 define([
-  'sources/gettext', 'sources/url_for', 'jquery', 'underscore', 'underscore.string', 'pgadmin.alertifyjs',
+  'sources/gettext', 'sources/url_for', 'jquery', 'underscore', 'pgadmin.alertifyjs',
   'sources/pgadmin', 'pgadmin.browser', 'backbone', 'backgrid', 'backform',
   'sources/utils',
   'sources/nodes/supported_database_node',
   'pgadmin.backform', 'pgadmin.backgrid', 'pgadmin.browser.node.ui',
 ], function(
-  gettext, url_for, $, _, S, Alertify, pgAdmin, pgBrowser, Backbone, Backgrid,
+  gettext, url_for, $, _, Alertify, pgAdmin, pgBrowser, Backbone, Backgrid,
   Backform, commonUtils, supportedNodes
 ) {
 
@@ -459,7 +459,7 @@ define([
           return;
         }
       } else {
-        Alertify.alert(S(gettext('Failed to load preference %s of module %s')).sprintf(preference_name, module).value());
+        Alertify.alert(gettext('Failed to load preference %s of module %s', preference_name, module));
         return;
       }
 
@@ -689,9 +689,8 @@ define([
 
           // Open the Alertify dialog for the import/export module
           Alertify.ImportDialog(
-            S(
-              gettext('Import/Export data - table \'%s\'')
-            ).sprintf(treeInfo.table.label).value(), node, i, d
+            gettext('Import/Export data - table \'%s\'', treeInfo.table.label),
+            node, i, d
           ).set('resizable', true).resizeTo(pgAdmin.Browser.stdW.md,pgAdmin.Browser.stdH.lg);
         })
         .fail(function() {
diff --git a/web/pgadmin/tools/maintenance/static/js/maintenance.js b/web/pgadmin/tools/maintenance/static/js/maintenance.js
index abe8701e..6b10e5ec 100644
--- a/web/pgadmin/tools/maintenance/static/js/maintenance.js
+++ b/web/pgadmin/tools/maintenance/static/js/maintenance.js
@@ -9,14 +9,14 @@
 
 define([
   'sources/gettext', 'sources/url_for', 'jquery', 'underscore',
-  'underscore.string', 'pgadmin.alertifyjs', 'sources/pgadmin', 'pgadmin.browser', 'backbone',
+  'pgadmin.alertifyjs', 'sources/pgadmin', 'pgadmin.browser', 'backbone',
   'backgrid', 'backform', 'sources/utils',
   'tools/maintenance/static/js/menu_utils',
   'sources/nodes/supported_database_node',
   'pgadmin.backform', 'pgadmin.backgrid',
   'pgadmin.browser.node.ui',
 ], function(
-  gettext, url_for, $, _, S, Alertify, pgAdmin, pgBrowser, Backbone, Backgrid,
+  gettext, url_for, $, _, Alertify, pgAdmin, pgBrowser, Backbone, Backgrid,
   Backform, commonUtils,
   menuUtils, supportedNodes
 ) {
@@ -234,7 +234,7 @@ define([
           return;
         }
       } else {
-        Alertify.alert(S(gettext('Failed to load preference %s of module %s')).sprintf(preference_name, module).value());
+        Alertify.alert(gettext('Failed to load preference %s of module %s', preference_name, module));
         return;
       }
 
diff --git a/web/pgadmin/tools/restore/static/js/restore.js b/web/pgadmin/tools/restore/static/js/restore.js
index 73a32a82..428e549d 100644
--- a/web/pgadmin/tools/restore/static/js/restore.js
+++ b/web/pgadmin/tools/restore/static/js/restore.js
@@ -9,13 +9,13 @@
 
 define('tools.restore', [
   'sources/gettext', 'sources/url_for', 'jquery', 'underscore', 'backbone',
-  'underscore.string', 'pgadmin.alertifyjs', 'pgadmin.browser',
+  'pgadmin.alertifyjs', 'pgadmin.browser',
   'pgadmin.backgrid', 'pgadmin.backform', 'sources/utils',
   'tools/restore/static/js/menu_utils',
   'sources/nodes/supported_database_node',
   'tools/restore/static/js/restore_dialog',
 ], function(
-  gettext, url_for, $, _, Backbone, S, alertify, pgBrowser, Backgrid, Backform,
+  gettext, url_for, $, _, Backbone, alertify, pgBrowser, Backgrid, Backform,
   commonUtils, menuUtils, supportedNodes, restoreDialog
 ) {
 
diff --git a/web/pgadmin/tools/restore/static/js/restore_dialog.js b/web/pgadmin/tools/restore/static/js/restore_dialog.js
index b7362966..18028f8d 100644
--- a/web/pgadmin/tools/restore/static/js/restore_dialog.js
+++ b/web/pgadmin/tools/restore/static/js/restore_dialog.js
@@ -8,7 +8,7 @@
 //////////////////////////////////////////////////////////////
 
 import gettext from '../../../../static/js/gettext';
-import {sprintf} from 'sprintf-js';
+import {sprintf} from 'sources/utils';
 import Backform from '../../../../static/js/backform.pgadmin';
 import {Dialog} from '../../../../static/js/alertify/dialog';
 import url_for from 'sources/url_for';
diff --git a/web/pgadmin/tools/sqleditor/static/js/sqleditor.js b/web/pgadmin/tools/sqleditor/static/js/sqleditor.js
index 37d15a9c..b5b001fe 100644
--- a/web/pgadmin/tools/sqleditor/static/js/sqleditor.js
+++ b/web/pgadmin/tools/sqleditor/static/js/sqleditor.js
@@ -8,9 +8,9 @@
 //////////////////////////////////////////////////////////////
 
 define('tools.querytool', [
-  'babel-polyfill', 'sources/gettext', 'sources/url_for', 'jquery', 'jquery.ui',
-  'jqueryui.position', 'underscore', 'underscore.string', 'pgadmin.alertifyjs',
-  'sources/pgadmin', 'backbone', 'sources/../bundle/codemirror',
+  'sources/gettext', 'sources/url_for', 'jquery', 'jquery.ui',
+  'jqueryui.position', 'underscore', 'pgadmin.alertifyjs',
+  'sources/pgadmin', 'backbone', 'bundled_codemirror',
   'pgadmin.misc.explain',
   'sources/selection/grid_selector',
   'sources/selection/active_cell_capture',
@@ -40,14 +40,13 @@ define('tools.querytool', [
   'tools/datagrid/static/js/datagrid_panel_title',
   'sources/../bundle/slickgrid',
   'pgadmin.file_manager',
-  'backgrid.sizeable.columns',
   'slick.pgadmin.formatters',
   'slick.pgadmin.editors',
   'slick.pgadmin.plugins/slick.autocolumnsize',
   'pgadmin.browser',
   'pgadmin.tools.user_management',
 ], function(
-  babelPollyfill, gettext, url_for, $, jqueryui, jqueryui_position, _, S, alertify, pgAdmin, Backbone, codemirror,
+  gettext, url_for, $, jqueryui, jqueryui_position, _, alertify, pgAdmin, Backbone, codemirror,
   pgExplain, GridSelector, ActiveCellCapture, clipboard, copyData, RangeSelectionHelper, handleQueryOutputKeyboardEvent,
   XCellSelectionModel, setStagedRows, SqlEditorUtils, ExecuteQuery, httpErrorHandler, FilterHandler,
   GeometryViewer, historyColl, queryHist, querySources,
@@ -1365,9 +1364,7 @@ define('tools.querytool', [
       /* history fetch fail should not affect query tool */
       });
     },
-    /* This function is responsible to create and render the
-     * new backgrid for the history tab.
-     */
+    /* This function is responsible to create and render the the history tab. */
     render_history_grid: function() {
       var self = this;
 
@@ -2169,7 +2166,7 @@ define('tools.querytool', [
           });
       },
       /* This function is used to create instance of SQLEditorView,
-       * call the render method of the grid view to render the backgrid
+       * call the render method of the grid view to render the slickgrid
        * header and loading icon and start execution of the sql query.
        */
       start: function(transId, url_params, layout) {
@@ -2271,7 +2268,7 @@ define('tools.querytool', [
                 );
 
                 pgBrowser.report_error(
-                  S(gettext('Error fetching SQL for script: %s.')).sprintf(msg).value()
+                  gettext('Error fetching SQL for script: %s.', msg)
                 );
               });
           } else {
@@ -2495,9 +2492,8 @@ define('tools.querytool', [
         executeQuery.delayedPoll(this);
       },
 
-      /* This function is used to create the backgrid columns,
-       * create the Backbone PageableCollection and finally render
-       * the data in the backgrid.
+      /* This function is used to create the slickgrid columns
+       * and render the data in the slickgrid.
        */
       _render: function(data) {
         var self = this;
@@ -2560,8 +2556,8 @@ define('tools.querytool', [
               self.query_start_time,
               self.query_end_time
             );
-            var msg1 = S(gettext('Successfully run. Total query runtime: %s.')).sprintf(self.total_time).value();
-            var msg2 = S(gettext('%s rows affected.')).sprintf(self.rows_affected).value();
+            var msg1 = gettext('Successfully run. Total query runtime: %s.',self.total_time);
+            var msg2 = gettext('%s rows affected.',self.rows_affected);
 
             // Display the notifier if the timeout is set to >= 0
             if (self.info_notifier_timeout >= 0) {
@@ -3137,7 +3133,7 @@ define('tools.querytool', [
             } else {
             // Something went wrong while saving data on the db server
               self.set_sql_message(res.data.result);
-              var err_msg = S(gettext('%s.')).sprintf(res.data.result).value();
+              var err_msg = gettext('%s.', res.data.result);
               alertify.error(err_msg, 20);
               // If the transaction is not idle, notify the user that previous queries are not rolled back,
               // only the failed save queries.
@@ -4338,7 +4334,6 @@ define('tools.querytool', [
       return new SqlEditorController(container);
     },
     jquery: $,
-    S: S,
   };
 
   return pgAdmin.SqlEditor;
diff --git a/web/pgadmin/tools/user_management/static/js/user_management.js b/web/pgadmin/tools/user_management/static/js/user_management.js
index 57fd8d30..abb3ad94 100644
--- a/web/pgadmin/tools/user_management/static/js/user_management.js
+++ b/web/pgadmin/tools/user_management/static/js/user_management.js
@@ -8,12 +8,12 @@
 //////////////////////////////////////////////////////////////
 
 define([
-  'sources/gettext', 'sources/url_for', 'jquery', 'underscore', 'underscore.string', 'pgadmin.alertifyjs',
+  'sources/gettext', 'sources/url_for', 'jquery', 'underscore', 'pgadmin.alertifyjs',
   'pgadmin.browser', 'backbone', 'backgrid', 'backform', 'pgadmin.browser.node',
   'pgadmin.user_management.current_user',
   'backgrid.select.all', 'backgrid.filter',
 ], function(
-  gettext, url_for, $, _, S, alertify, pgBrowser, Backbone, Backgrid, Backform,
+  gettext, url_for, $, _, alertify, pgBrowser, Backbone, Backgrid, Backform,
   pgNode, userInfo
 ) {
 
@@ -352,18 +352,18 @@ define([
               return errmsg;
             } else if (!!this.get('email') && !email_filter.test(this.get('email'))) {
 
-              errmsg = S(gettext('Invalid email address: %s.')).sprintf(
+              errmsg = gettext('Invalid email address: %s.',
                 this.get('email')
-              ).value();
+              );
               this.errorModel.set('email', errmsg);
               return errmsg;
             } else if (!!this.get('email') && this.collection.where({
               'email': this.get('email'),
             }).length > 1) {
 
-              errmsg = S(gettext('The email address %s already exists.')).sprintf(
+              errmsg = gettext('The email address %s already exists.',
                 this.get('email')
-              ).value();
+              );
 
               this.errorModel.set('email', errmsg);
               return errmsg;
@@ -375,9 +375,9 @@ define([
                 _.isNull(this.get('role')) ||
                 String(this.get('role')).replace(/^\s+|\s+$/g, '') == '')) {
 
-              errmsg = S(gettext('Role cannot be empty for user %s.')).sprintf(
+              errmsg = gettext('Role cannot be empty for user %s.',
                 (this.get('email') || '')
-              ).value();
+              );
 
               this.errorModel.set('role', errmsg);
               return errmsg;
@@ -391,9 +391,9 @@ define([
                   _.isNull(this.get('newPassword')) ||
                   this.get('newPassword') == '')) {
 
-                errmsg = S(gettext('Password cannot be empty for user %s.')).sprintf(
+                errmsg = gettext('Password cannot be empty for user %s.',
                   (this.get('email') || '')
-                ).value();
+                );
 
                 this.errorModel.set('newPassword', errmsg);
                 return errmsg;
@@ -401,9 +401,9 @@ define([
                 !_.isNull(this.get('newPassword')) &&
                 this.get('newPassword').length < 6) {
 
-                errmsg = S(gettext('Password must be at least 6 characters for user %s.')).sprintf(
+                errmsg = gettext('Password must be at least 6 characters for user %s.',
                   (this.get('email') || '')
-                ).value();
+                );
 
                 this.errorModel.set('newPassword', errmsg);
                 return errmsg;
@@ -415,9 +415,9 @@ define([
                   _.isNull(this.get('confirmPassword')) ||
                   this.get('confirmPassword') == '')) {
 
-                errmsg = S(gettext('Confirm Password cannot be empty for user %s.')).sprintf(
+                errmsg = gettext('Confirm Password cannot be empty for user %s.',
                   (this.get('email') || '')
-                ).value();
+                );
 
                 this.errorModel.set('confirmPassword', errmsg);
                 return errmsg;
@@ -428,9 +428,9 @@ define([
               if (!!this.get('newPassword') && !!this.get('confirmPassword') &&
                 this.get('newPassword') != this.get('confirmPassword')) {
 
-                errmsg = S(gettext('Passwords do not match for user %s.')).sprintf(
+                errmsg = gettext('Passwords do not match for user %s.',
                   (this.get('email') || '')
-                ).value();
+                );
 
                 this.errorModel.set('confirmPassword', errmsg);
                 return errmsg;
@@ -462,9 +462,9 @@ define([
                 !this.get('newPassword') == '' &&
                 this.get('newPassword').length < 6) {
 
-                errmsg = S(gettext('Password must be at least 6 characters for user %s.')).sprintf(
+                errmsg = gettext('Password must be at least 6 characters for user %s.',
                   (this.get('email') || '')
-                ).value();
+                );
 
                 this.errorModel.set('newPassword', errmsg);
                 return errmsg;
@@ -472,18 +472,18 @@ define([
                 _.isNull(this.get('confirmPassword')) ||
                 this.get('confirmPassword') == '') {
 
-                errmsg = S(gettext('Confirm Password cannot be empty for user %s.')).sprintf(
+                errmsg = gettext('Confirm Password cannot be empty for user %s.',
                   (this.get('email') || '')
-                ).value();
+                );
 
                 this.errorModel.set('confirmPassword', errmsg);
                 return errmsg;
               } else if (!!this.get('newPassword') && !!this.get('confirmPassword') &&
                 this.get('newPassword') != this.get('confirmPassword')) {
 
-                errmsg = S(gettext('Passwords do not match for user %s.')).sprintf(
+                errmsg = gettext('Passwords do not match for user %s.',
                   (this.get('email') || '')
-                ).value();
+                );
 
                 this.errorModel.set('confirmPassword', errmsg);
                 return errmsg;
@@ -740,16 +740,16 @@ define([
                           });
 
                           m.startNewSession();
-                          alertify.success(S(gettext('User \'%s\' saved.')).sprintf(
+                          alertify.success(gettext('User \'%s\' saved.',
                             m.get('email')
-                          ).value());
+                          ));
                         },
                         error: function(res, jqxhr) {
                           m.startNewSession();
                           alertify.error(
-                            S(gettext('Error saving user: \'%s\'')).sprintf(
+                            gettext('Error saving user: \'%s\'',
                               jqxhr.responseJSON.errormsg
-                            ).value()
+                            )
                           );
                         },
                       });
diff --git a/web/regression/javascript/browser/modify_animation_spec.js b/web/regression/javascript/browser/modify_animation_spec.js
index a1b9942f..edc0572f 100644
--- a/web/regression/javascript/browser/modify_animation_spec.js
+++ b/web/regression/javascript/browser/modify_animation_spec.js
@@ -25,8 +25,8 @@ describe('modifyAnimation', function () {
     });
     dummyElement = document.createElement('link');
     spyOn($.fn, 'find').and.returnValue($(dummyElement));
-    spyOn($.fn, 'removeAttr');
-    spyOn($.fn, 'attr');
+    spyOn($.fn, 'removeClass');
+    spyOn($.fn, 'addClass');
   });
 
   describe('When browser tree animation is disabled', () => {
@@ -74,7 +74,7 @@ describe('modifyAnimation', function () {
     it('alertify disalogue/notification animation should be disabled', function() {
       expect(pgBrowser.get_preference).toHaveBeenCalled();
       expect($.fn.find).toHaveBeenCalled();
-      expect($.fn.removeAttr).toHaveBeenCalledWith('disabled', 'disabled');
+      expect($.fn.addClass).toHaveBeenCalledWith('alertify-no-animation');
     });
   });
 
@@ -86,7 +86,7 @@ describe('modifyAnimation', function () {
     it('alertify disalogue/notification animation should be enabled', function() {
       expect(pgBrowser.get_preference).toHaveBeenCalled();
       expect($.fn.find).toHaveBeenCalled();
-      expect($.fn.attr).toHaveBeenCalledWith('disabled', 'disabled');
+      expect($.fn.removeClass).toHaveBeenCalledWith('alertify-no-animation');
     });
   });
 
diff --git a/web/regression/javascript/dashboard/charting_spec.js b/web/regression/javascript/dashboard/charting_spec.js
index 26143144..b853c75e 100644
--- a/web/regression/javascript/dashboard/charting_spec.js
+++ b/web/regression/javascript/dashboard/charting_spec.js
@@ -23,10 +23,6 @@ describe('In charting related testcases', ()=> {
     chartObj = new Chart(chartDiv, options);
   });
 
-  it('Chart api should be defined', ()=>{
-    expect(chartObj.chartApi).toBeDefined();
-  });
-
   it('Return the correct container', ()=>{
     expect(chartObj.getContainer()).toEqual(chartDiv);
   });
diff --git a/web/regression/javascript/geometry_viewer/geometry_viewer_spec.js b/web/regression/javascript/geometry_viewer/geometry_viewer_spec.js
index f7cc7016..555c57d1 100644
--- a/web/regression/javascript/geometry_viewer/geometry_viewer_spec.js
+++ b/web/regression/javascript/geometry_viewer/geometry_viewer_spec.js
@@ -8,6 +8,7 @@
 //////////////////////////////////////////////////////////////
 
 import GeometryViewer from 'sources/sqleditor/geometry_viewer';
+import {Geometry} from 'wkx';
 
 describe('geometry viewer test', function () {
 
@@ -54,7 +55,7 @@ describe('geometry viewer test', function () {
         },
       ];
       let columnIndex = 0;
-      let result = GeometryViewer.parse_data(items, columns, columnIndex);
+      let result = GeometryViewer.parse_data(items, columns, columnIndex, Geometry);
       expect(result.geoJSONs.length).toEqual(2);
     });
 
@@ -75,7 +76,7 @@ describe('geometry viewer test', function () {
         },
       ];
       let columnIndex = 0;
-      let result = GeometryViewer.parse_data(items, columns, columnIndex);
+      let result = GeometryViewer.parse_data(items, columns, columnIndex, Geometry);
       expect(result.geoJSONs.length).toEqual(1);
     });
 
@@ -95,7 +96,7 @@ describe('geometry viewer test', function () {
         },
       ];
       let columnIndex = 0;
-      let result = GeometryViewer.parse_data(items, columns, columnIndex);
+      let result = GeometryViewer.parse_data(items, columns, columnIndex, Geometry);
       expect(result.geoJSONs.length).toEqual(1);
     });
 
@@ -113,7 +114,7 @@ describe('geometry viewer test', function () {
         },
       ];
       let columnIndex = 0;
-      let result = GeometryViewer.parse_data(items, columns, columnIndex);
+      let result = GeometryViewer.parse_data(items, columns, columnIndex, Geometry);
       expect(result.geoJSONs.length).toEqual(1);
     });
 
@@ -144,7 +145,7 @@ describe('geometry viewer test', function () {
         },
       ];
       let columnIndex = 0;
-      let result = GeometryViewer.parse_data(items, columns, columnIndex);
+      let result = GeometryViewer.parse_data(items, columns, columnIndex, Geometry);
       expect(result.geoJSONs.length).toEqual(2);
     });
 
@@ -163,7 +164,7 @@ describe('geometry viewer test', function () {
         },
       ];
       let columnIndex = 0;
-      let result = GeometryViewer.parse_data(items, columns, columnIndex);
+      let result = GeometryViewer.parse_data(items, columns, columnIndex, Geometry);
       expect(result.geoJSONs.length).toEqual(0);
     });
 
@@ -182,7 +183,7 @@ describe('geometry viewer test', function () {
         },
       ];
       let columnIndex = 0;
-      let result = GeometryViewer.parse_data(items, columns, columnIndex);
+      let result = GeometryViewer.parse_data(items, columns, columnIndex, Geometry);
       expect(result.geoJSONs.length).toEqual(0);
     });
 
@@ -202,7 +203,7 @@ describe('geometry viewer test', function () {
         },
       ];
       let columnIndex = 0;
-      let result = GeometryViewer.parse_data(items, columns, columnIndex);
+      let result = GeometryViewer.parse_data(items, columns, columnIndex, Geometry);
       expect(result.geoJSONs.length).toEqual(0);
     });
 
@@ -224,7 +225,7 @@ describe('geometry viewer test', function () {
         },
       ];
       let columnIndex = 0;
-      let result = GeometryViewer.parse_data(items, columns, columnIndex);
+      let result = GeometryViewer.parse_data(items, columns, columnIndex, Geometry);
       expect(result.geoJSONs.length).toBeLessThan(600000);
     });
   });
diff --git a/web/regression/javascript/gettext_spec.js b/web/regression/javascript/gettext_spec.js
index 1aca85ef..07e4609c 100644
--- a/web/regression/javascript/gettext_spec.js
+++ b/web/regression/javascript/gettext_spec.js
@@ -19,16 +19,13 @@ describe('translate', function () {
 
     describe('when there are substitutions', function () {
       it('interpolates a substitution', function () {
-        expect(gettext('translate text for %(person)s', {'person': 'Sarah'})).toEqual('translate text for Sarah');
+        expect(gettext('translate text for %s', 'Sarah')).toEqual('translate text for Sarah');
       });
 
       it('interpolates multiple substitutions', function () {
-        expect(gettext('translate \'%(text)s\' for %(person)s',
-          {
-            'text': 'constitution',
-            'person': 'Sarah',
-          }
-        )).toEqual('translate \'constitution\' for Sarah');
+        expect(
+          gettext('translate \'%s\' for %s', 'constitution', 'Sarah')
+        ).toEqual('translate \'constitution\' for Sarah');
       });
     });
 
@@ -37,7 +34,7 @@ describe('translate', function () {
   describe('when there is a translation', function () {
     beforeEach(function () {
       translations['something to be translated'] = 'etwas zum uebersetzen';
-      translations['another translation for %(person)s'] = 'eine weitere Uebersetzung fuer %(person)s';
+      translations['another translation for %s'] = 'eine weitere Uebersetzung fuer %s';
     });
 
     it('returns the translation', function () {
@@ -46,7 +43,7 @@ describe('translate', function () {
 
     describe('when there is a substitution', function () {
       it('interpolates the substitution', function () {
-        expect(gettext('another translation for %(person)s', {'person': 'Sarah'}))
+        expect(gettext('another translation for %s', 'Sarah'))
           .toEqual('eine weitere Uebersetzung fuer Sarah');
       });
     });
diff --git a/web/webpack.config.js b/web/webpack.config.js
index 5c992008..87a8eb76 100644
--- a/web/webpack.config.js
+++ b/web/webpack.config.js
@@ -34,7 +34,6 @@ const providePlugin = new webpack.ProvidePlugin({
   jQuery: 'jquery',
   'window.jQuery': 'jquery',
   _: 'underscore',
-  S: 'underscore.string',
   Backbone: 'backbone',
   Backgrid: 'backgrid',
   pgAdmin: 'pgadmin',
@@ -46,8 +45,12 @@ const providePlugin = new webpack.ProvidePlugin({
 const optimizeAssetsPlugin = new OptimizeCssAssetsPlugin({
   assetNameRegExp: /\.css$/g,
   cssProcessor: require('cssnano'),
-  cssProcessorOptions: { discardComments: {removeAll: true } },
-  canPrint: true,
+  cssProcessorOptions: {
+    discardComments: {
+      removeAll: true,
+    },
+  },
+  canPrint: false,
 });
 
 // Helps in debugging each single file, it extracts the module files
@@ -119,6 +122,7 @@ module.exports = {
   entry: {
     'app.bundle': sourceDir + '/bundle/app.js',
     codemirror: sourceDir + '/bundle/codemirror.js',
+    slickgrid: sourceDir + '/bundle/slickgrid.js',
     sqleditor: './pgadmin/tools/sqleditor/static/js/sqleditor.js',
     debugger_direct: './pgadmin/tools/debugger/static/js/direct.js',
     file_utils: './pgadmin/misc/file_manager/static/js/utility.js',
@@ -153,7 +157,7 @@ module.exports = {
       use: {
         loader: 'babel-loader',
         options: {
-          presets: [['@babel/preset-env', {'modules': 'commonjs'}]],
+          presets: [['@babel/preset-env', {'modules': 'commonjs', 'useBuiltIns': 'usage', 'corejs': 3}]],
         },
       },
     }, {
@@ -161,7 +165,7 @@ module.exports = {
       use: {
         loader: 'babel-loader',
         options: {
-          presets: [['@babel/preset-env', {'modules': 'commonjs'}]],
+          presets: [['@babel/preset-env', {'modules': 'commonjs', 'useBuiltIns': 'usage', 'corejs': 3}]],
         },
       },
     }, {
@@ -354,18 +358,58 @@ module.exports = {
         parallel: true,
         cache: true,
         uglifyOptions: {
-          compress: false,
+          compress: true,
+          mangle: true,
+          output: {
+            comments: false,
+          },
         },
       }),
     ],
     splitChunks: {
       cacheGroups: {
-        vendors: {
-          name: 'vendors',
-          filename: 'vendor.js',
+        slickgrid: {
+          name: 'slickgrid',
+          filename: 'slickgrid.js',
+          chunks: 'all',
+          reuseExistingChunk: true,
+          priority: 9,
+          minChunks: 2,
+          enforce: true,
+          test(module) {
+            return webpackShimConfig.matchModules(module, 'slickgrid');
+          },
+        },
+        codemirror: {
+          name: 'codemirror',
+          filename: 'codemirror.js',
+          chunks: 'all',
+          reuseExistingChunk: true,
+          priority: 8,
+          minChunks: 2,
+          enforce: true,
+          test(module) {
+            return webpackShimConfig.matchModules(module, 'codemirror');
+          },
+        },
+        vendor_main: {
+          name: 'vendor_main',
+          filename: 'vendor.main.js',
           chunks: 'all',
           reuseExistingChunk: true,
-          priority: 1,
+          priority: 7,
+          minChunks: 2,
+          enforce: true,
+          test(module) {
+            return webpackShimConfig.matchModules(module, ['wcdocker', 'backbone', 'jquery', 'bootstrap', 'popper']);
+          },
+        },
+        vendor_others: {
+          name: 'vendor_others',
+          filename: 'vendor.others.js',
+          chunks: 'all',
+          reuseExistingChunk: true,
+          priority: 6,
           minChunks: 2,
           enforce: true,
           test(module) {
@@ -376,13 +420,24 @@ module.exports = {
           name: 'pgadmin_commons',
           filename: 'pgadmin_commons.js',
           chunks: 'all',
-          priority: 2,
+          priority: 5,
           minChunks: 2,
           enforce: true,
           test(module) {
             return webpackShimConfig.isPgAdminLib(module);
           },
         },
+        browser_nodes: {
+          name: 'browser_nodes',
+          filename: 'browser_nodes.js',
+          chunks: 'all',
+          priority: 4,
+          minChunks: 2,
+          enforce: true,
+          test(module) {
+            return webpackShimConfig.isBrowserNode(module);
+          },
+        },
       },
     },
   },
diff --git a/web/webpack.shim.js b/web/webpack.shim.js
index ca5f72c9..3dab744e 100644
--- a/web/webpack.shim.js
+++ b/web/webpack.shim.js
@@ -68,9 +68,6 @@ var webpackShimConfig = {
     'backgrid.filter': {
       'deps': ['backgrid'],
     },
-    'backgrid.sizeable.columns': {
-      'deps': ['backgrid'],
-    },
     'jquery.event.drag': {
       'deps': ['jquery'], 'exports': 'jQuery.fn.drag',
     },
@@ -138,13 +135,13 @@ var webpackShimConfig = {
     'translations': path.join(__dirname, './pgadmin/tools/templates/js/translations'),
     'sources/gettext': path.join(__dirname, './pgadmin/static/js/gettext'),
     'sources/utils': path.join(__dirname, './pgadmin/static/js/utils'),
-    'babel-polyfill': path.join(__dirname, './node_modules/@babel/polyfill/dist/polyfill'),
     'tools': path.join(__dirname, './pgadmin/tools/'),
     'pgbrowser': path.join(__dirname, './pgadmin/browser/static/js/'),
+    'sprintf': path.join(__dirname, './pgadmin/static/js/sprintf'),
 
     // Vendor JS
-    'jquery': path.join(__dirname, './node_modules/jquery/dist/jquery'),
-    'wcdocker': path.join(__dirname, './node_modules/webcabin-docker/Build/wcDocker'),
+    'jquery': path.join(__dirname, './node_modules/jquery/dist/jquery.min'),
+    'wcdocker': path.join(__dirname, './node_modules/webcabin-docker/Build/wcDocker.min'),
     'alertify': path.join(__dirname, './node_modules/alertifyjs/build/alertify'),
     'moment': path.join(__dirname, './node_modules/moment/moment'),
     'jquery.event.drag': path.join(__dirname, './node_modules/slickgrid/lib/jquery.event.drag-2.3.0'),
@@ -156,7 +153,7 @@ var webpackShimConfig = {
     'dropzone': path.join(__dirname, './node_modules/dropzone/dist/dropzone'),
     'bignumber': path.join(__dirname, './node_modules/bignumber.js/bignumber'),
     'json-bignumber': path.join(__dirname, './node_modules/json-bignumber/dist/JSONBigNumber.min'),
-    'snap.svg': path.join(__dirname, './node_modules/snapsvg/dist/snap.svg'),
+    'snap.svg': path.join(__dirname, './node_modules/snapsvg/dist/snap.svg-min'),
     'spectrum': path.join(__dirname, './node_modules/spectrum-colorpicker/spectrum'),
     'mousetrap': path.join(__dirname, './node_modules/mousetrap'),
 
@@ -170,12 +167,11 @@ var webpackShimConfig = {
     'backbone': path.join(__dirname, './node_modules/backbone/backbone'),
     'backbone.undo': path.join(__dirname, './node_modules/backbone-undo/Backbone.Undo'),
     'backform': path.join(__dirname, './pgadmin/static/vendor/backform/backform'),
-    'backgrid': path.join(__dirname, './node_modules/backgrid/lib/backgrid'),
+    'backgrid': path.join(__dirname, './pgadmin/static/vendor/backgrid/backgrid'),
     'bootstrap.datetimepicker': path.join(__dirname, './node_modules/tempusdominus-bootstrap-4/build/js/tempusdominus-bootstrap-4.min'),
     'bootstrap.toggle': path.join(__dirname, './node_modules/bootstrap4-toggle/js/bootstrap4-toggle'),
     'select2': path.join(__dirname, './node_modules/select2/dist/js/select2.full'),
     'backgrid.filter': path.join(__dirname, './node_modules/backgrid-filter/backgrid-filter'),
-    'backgrid.sizeable.columns': path.join(__dirname, './node_modules/backgrid-sizeable-columns/backgrid-sizeable-columns'),
     'backgrid.select.all': path.join(__dirname, './node_modules/backgrid-select-all/backgrid-select-all'),
     'pgadmin.alertifyjs': path.join(__dirname, './pgadmin/static/js/alertify.pgadmin.defaults'),
     'pgadmin.backform': path.join(__dirname, './pgadmin/static/js/backform.pgadmin'),
@@ -311,13 +307,36 @@ var webpackShimConfig = {
   isExternal: function(module) {
     var context = module.context;
     if (typeof context !== 'string') { return false; }
-    return context.indexOf('node_modules') !== -1;
+    return (context.indexOf('node_modules') !== -1 || context.indexOf('vendor') !== -1);
   },
   // Checks whether module is in pgLibs or not. Returns true if exists
   isPgAdminLib: function (module) {
     if (module.rawRequest === undefined) { return false; }
     return this.pgLibs.indexOf(module.rawRequest) !== -1;
   },
+  isBrowserNode: function(module) {
+    if (module.rawRequest === undefined) { return false; }
+    if(module.rawRequest.startsWith('pgadmin.node')) {
+      return true;
+    }
+    return false;
+  },
+  matchModules: function(module, match_modules) {
+    if (module.rawRequest === undefined) { return false; }
+    if(typeof match_modules === 'string') {
+      if(module.rawRequest.indexOf(match_modules) >= 0) {
+        return true;
+      }
+    } else {
+      for(let i=0; i<match_modules.length; i++) {
+        if(module.rawRequest.indexOf(match_modules[i]) >= 0) {
+          return true;
+        }
+      }
+    }
+    return false;
+  },
+
   /* These will be skipped when webpack picks css/scss files recursively to bundle */
   css_bundle_skip: [
     './pgadmin/static',
diff --git a/web/webpack.test.config.js b/web/webpack.test.config.js
index f19d666c..fe0fc768 100644
--- a/web/webpack.test.config.js
+++ b/web/webpack.test.config.js
@@ -21,7 +21,6 @@ module.exports = {
     new webpack.ProvidePlugin({
       jQuery: 'jquery',
       _: 'underscore',
-      'underscore.string': 'underscore.string',
       'window.jQuery': 'jquery',
       'moment': 'moment',
       'window.moment':'moment',
diff --git a/web/yarn.lock b/web/yarn.lock
index cdab798c..bcb1953a 100644
--- a/web/yarn.lock
+++ b/web/yarn.lock
@@ -9,32 +9,32 @@
   dependencies:
     "@babel/highlight" "^7.0.0"
 
-"@babel/core@~7.3.4":
-  version "7.3.4"
-  resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.3.4.tgz#921a5a13746c21e32445bf0798680e9d11a6530b"
-  integrity sha512-jRsuseXBo9pN197KnDwhhaaBzyZr2oIcLHHTt2oDdQrej5Qp57dCCJafWx5ivU8/alEYDpssYqv1MUqcxwQlrA==
+"@babel/core@~7.6.0":
+  version "7.6.0"
+  resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.6.0.tgz#9b00f73554edd67bebc86df8303ef678be3d7b48"
+  integrity sha512-FuRhDRtsd6IptKpHXAa+4WPZYY2ZzgowkbLBecEDDSje1X/apG7jQM33or3NdOmjXBKWGOg4JmSiRfUfuTtHXw==
   dependencies:
-    "@babel/code-frame" "^7.0.0"
-    "@babel/generator" "^7.3.4"
-    "@babel/helpers" "^7.2.0"
-    "@babel/parser" "^7.3.4"
-    "@babel/template" "^7.2.2"
-    "@babel/traverse" "^7.3.4"
-    "@babel/types" "^7.3.4"
+    "@babel/code-frame" "^7.5.5"
+    "@babel/generator" "^7.6.0"
+    "@babel/helpers" "^7.6.0"
+    "@babel/parser" "^7.6.0"
+    "@babel/template" "^7.6.0"
+    "@babel/traverse" "^7.6.0"
+    "@babel/types" "^7.6.0"
     convert-source-map "^1.1.0"
     debug "^4.1.0"
     json5 "^2.1.0"
-    lodash "^4.17.11"
+    lodash "^4.17.13"
     resolve "^1.3.2"
     semver "^5.4.1"
     source-map "^0.5.0"
 
-"@babel/generator@^7.3.4", "@babel/generator@^7.5.5":
-  version "7.5.5"
-  resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.5.5.tgz#873a7f936a3c89491b43536d12245b626664e3cf"
-  integrity sha512-ETI/4vyTSxTzGnU2c49XHv2zhExkv9JHLTwDAFz85kmcwuShvYG2H08FwgIguQf4JC75CBnXAUM5PqeF4fj0nQ==
+"@babel/generator@^7.6.0":
+  version "7.6.0"
+  resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.6.0.tgz#e2c21efbfd3293ad819a2359b448f002bfdfda56"
+  integrity sha512-Ms8Mo7YBdMMn1BYuNtKuP/z0TgEIhbcyB8HVR6PPNYp4P61lMsABiS4A3VG1qznjXVCf3r+fVHhm4efTYVsySA==
   dependencies:
-    "@babel/types" "^7.5.5"
+    "@babel/types" "^7.6.0"
     jsesc "^2.5.1"
     lodash "^4.17.13"
     source-map "^0.5.0"
@@ -195,14 +195,14 @@
     "@babel/traverse" "^7.1.0"
     "@babel/types" "^7.2.0"
 
-"@babel/helpers@^7.2.0":
-  version "7.5.5"
-  resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.5.5.tgz#63908d2a73942229d1e6685bc2a0e730dde3b75e"
-  integrity sha512-nRq2BUhxZFnfEn/ciJuhklHvFOqjJUD5wpx+1bxUF2axL9C+v4DE/dmp5sT2dKnpOs4orZWzpAZqlCy8QqE/7g==
+"@babel/helpers@^7.6.0":
+  version "7.6.0"
+  resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.6.0.tgz#21961d16c6a3c3ab597325c34c465c0887d31c6e"
+  integrity sha512-W9kao7OBleOjfXtFGgArGRX6eCP0UEcA2ZWEWNkJdRZnHhW4eEbeswbG3EwaRsnQUAEGWYgMq1HsIXuNNNy2eQ==
   dependencies:
-    "@babel/template" "^7.4.4"
-    "@babel/traverse" "^7.5.5"
-    "@babel/types" "^7.5.5"
+    "@babel/template" "^7.6.0"
+    "@babel/traverse" "^7.6.0"
+    "@babel/types" "^7.6.0"
 
 "@babel/highlight@^7.0.0":
   version "7.5.0"
@@ -213,10 +213,10 @@
     esutils "^2.0.2"
     js-tokens "^4.0.0"
 
-"@babel/parser@^7.3.4", "@babel/parser@^7.4.4", "@babel/parser@^7.5.5":
-  version "7.5.5"
-  resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.5.5.tgz#02f077ac8817d3df4a832ef59de67565e71cca4b"
-  integrity sha512-E5BN68cqR7dhKan1SfqgPGhQ178bkVKpXTPEXnFJBrEt8/DKRZlybmy+IgYLTeN7tp1R5Ccmbm2rBk17sHYU3g==
+"@babel/parser@^7.0.0", "@babel/parser@^7.6.0":
+  version "7.6.0"
+  resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.6.0.tgz#3e05d0647432a8326cb28d0de03895ae5a57f39b"
+  integrity sha512-+o2q111WEx4srBs7L9eJmcwi655eD8sXniLqMB93TBK9GrNzGrxDWSjiqz2hLU0Ha8MTXFIP0yd9fNdP+m43ZQ==
 
 "@babel/plugin-proposal-async-generator-functions@^7.2.0":
   version "7.2.0"
@@ -227,6 +227,14 @@
     "@babel/helper-remap-async-to-generator" "^7.1.0"
     "@babel/plugin-syntax-async-generators" "^7.2.0"
 
+"@babel/plugin-proposal-dynamic-import@^7.5.0":
+  version "7.5.0"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.5.0.tgz#e532202db4838723691b10a67b8ce509e397c506"
+  integrity sha512-x/iMjggsKTFHYC6g11PL7Qy58IK8H5zqfm9e6hu4z1iH2IRyAp9u9dL80zA6R76yFovETFLKz2VJIC2iIPBuFw==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.0.0"
+    "@babel/plugin-syntax-dynamic-import" "^7.2.0"
+
 "@babel/plugin-proposal-json-strings@^7.2.0":
   version "7.2.0"
   resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz#568ecc446c6148ae6b267f02551130891e29f317"
@@ -235,7 +243,7 @@
     "@babel/helper-plugin-utils" "^7.0.0"
     "@babel/plugin-syntax-json-strings" "^7.2.0"
 
-"@babel/plugin-proposal-object-rest-spread@^7.3.4":
+"@babel/plugin-proposal-object-rest-spread@^7.5.5":
   version "7.5.5"
   resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.5.5.tgz#61939744f71ba76a3ae46b5eea18a54c16d22e58"
   integrity sha512-F2DxJJSQ7f64FyTVl5cw/9MWn6naXGdk3Q3UhDbFEEHv+EilCPoeRD3Zh/Utx1CJz4uyKlQ4uH+bJPbEhMV7Zw==
@@ -251,7 +259,7 @@
     "@babel/helper-plugin-utils" "^7.0.0"
     "@babel/plugin-syntax-optional-catch-binding" "^7.2.0"
 
-"@babel/plugin-proposal-unicode-property-regex@^7.2.0":
+"@babel/plugin-proposal-unicode-property-regex@^7.4.4":
   version "7.4.4"
   resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.4.4.tgz#501ffd9826c0b91da22690720722ac7cb1ca9c78"
   integrity sha512-j1NwnOqMG9mFUOH58JTFsA/+ZYzQLUZ/drqWUqxCYLGeu2JFZL8YrNC9hBxKmWtAuOCHPcRpgv7fhap09Fb4kA==
@@ -267,6 +275,13 @@
   dependencies:
     "@babel/helper-plugin-utils" "^7.0.0"
 
+"@babel/plugin-syntax-dynamic-import@^7.2.0":
+  version "7.2.0"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz#69c159ffaf4998122161ad8ebc5e6d1f55df8612"
+  integrity sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.0.0"
+
 "@babel/plugin-syntax-json-strings@^7.2.0":
   version "7.2.0"
   resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz#72bd13f6ffe1d25938129d2a186b11fd62951470"
@@ -295,7 +310,7 @@
   dependencies:
     "@babel/helper-plugin-utils" "^7.0.0"
 
-"@babel/plugin-transform-async-to-generator@^7.3.4":
+"@babel/plugin-transform-async-to-generator@^7.5.0":
   version "7.5.0"
   resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.5.0.tgz#89a3848a0166623b5bc481164b5936ab947e887e"
   integrity sha512-mqvkzwIGkq0bEF1zLRRiTdjfomZJDV33AH3oQzHVGkI2VzEmXLpKKOBvEVaFZBJdN0XTyH38s9j/Kiqr68dggg==
@@ -311,15 +326,15 @@
   dependencies:
     "@babel/helper-plugin-utils" "^7.0.0"
 
-"@babel/plugin-transform-block-scoping@^7.3.4":
-  version "7.5.5"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.5.5.tgz#a35f395e5402822f10d2119f6f8e045e3639a2ce"
-  integrity sha512-82A3CLRRdYubkG85lKwhZB0WZoHxLGsJdux/cOVaJCJpvYFl1LVzAIFyRsa7CvXqW8rBM4Zf3Bfn8PHt5DP0Sg==
+"@babel/plugin-transform-block-scoping@^7.6.0":
+  version "7.6.0"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.6.0.tgz#c49e21228c4bbd4068a35667e6d951c75439b1dc"
+  integrity sha512-tIt4E23+kw6TgL/edACZwP1OUKrjOTyMrFMLoT5IOFrfMRabCgekjqFd5o6PaAMildBu46oFkekIdMuGkkPEpA==
   dependencies:
     "@babel/helper-plugin-utils" "^7.0.0"
     lodash "^4.17.13"
 
-"@babel/plugin-transform-classes@^7.3.4":
+"@babel/plugin-transform-classes@^7.5.5":
   version "7.5.5"
   resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.5.5.tgz#d094299d9bd680a14a2a0edae38305ad60fb4de9"
   integrity sha512-U2htCNK/6e9K7jGyJ++1p5XRU+LJjrwtoiVn9SzRlDT2KubcZ11OOwy3s24TjHxPgxNwonCYP7U2K51uVYCMDg==
@@ -340,14 +355,14 @@
   dependencies:
     "@babel/helper-plugin-utils" "^7.0.0"
 
-"@babel/plugin-transform-destructuring@^7.2.0":
-  version "7.5.0"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.5.0.tgz#f6c09fdfe3f94516ff074fe877db7bc9ef05855a"
-  integrity sha512-YbYgbd3TryYYLGyC7ZR+Tq8H/+bCmwoaxHfJHupom5ECstzbRLTch6gOQbhEY9Z4hiCNHEURgq06ykFv9JZ/QQ==
+"@babel/plugin-transform-destructuring@^7.6.0":
+  version "7.6.0"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.6.0.tgz#44bbe08b57f4480094d57d9ffbcd96d309075ba6"
+  integrity sha512-2bGIS5P1v4+sWTCnKNDZDxbGvEqi0ijeqM/YqHtVGrvG2y0ySgnEEhXErvE9dA0bnIzY9bIzdFK0jFA46ASIIQ==
   dependencies:
     "@babel/helper-plugin-utils" "^7.0.0"
 
-"@babel/plugin-transform-dotall-regex@^7.2.0":
+"@babel/plugin-transform-dotall-regex@^7.4.4":
   version "7.4.4"
   resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.4.4.tgz#361a148bc951444312c69446d76ed1ea8e4450c3"
   integrity sha512-P05YEhRc2h53lZDjRPk/OektxCVevFzZs2Gfjd545Wde3k+yFDbXORgl2e0xpbq8mLcKJ7Idss4fAg0zORN/zg==
@@ -356,7 +371,7 @@
     "@babel/helper-regex" "^7.4.4"
     regexpu-core "^4.5.4"
 
-"@babel/plugin-transform-duplicate-keys@^7.2.0":
+"@babel/plugin-transform-duplicate-keys@^7.5.0":
   version "7.5.0"
   resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.5.0.tgz#c5dbf5106bf84cdf691222c0974c12b1df931853"
   integrity sha512-igcziksHizyQPlX9gfSjHkE2wmoCH3evvD2qR5w29/Dk0SMKE/eOI7f1HhBdNhR/zxJDqrgpoDTq5YSLH/XMsQ==
@@ -371,14 +386,14 @@
     "@babel/helper-builder-binary-assignment-operator-visitor" "^7.1.0"
     "@babel/helper-plugin-utils" "^7.0.0"
 
-"@babel/plugin-transform-for-of@^7.2.0":
+"@babel/plugin-transform-for-of@^7.4.4":
   version "7.4.4"
   resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.4.tgz#0267fc735e24c808ba173866c6c4d1440fc3c556"
   integrity sha512-9T/5Dlr14Z9TIEXLXkt8T1DU7F24cbhwhMNUziN3hB1AXoZcdzPcTiKGRn/6iOymDqtTKWnr/BtRKN9JwbKtdQ==
   dependencies:
     "@babel/helper-plugin-utils" "^7.0.0"
 
-"@babel/plugin-transform-function-name@^7.2.0":
+"@babel/plugin-transform-function-name@^7.4.4":
   version "7.4.4"
   resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.4.4.tgz#e1436116abb0610c2259094848754ac5230922ad"
   integrity sha512-iU9pv7U+2jC9ANQkKeNF6DrPy4GBa4NWQtl6dHB4Pb3izX2JOEvDTFarlNsBj/63ZEzNNIAMs3Qw4fNCcSOXJA==
@@ -393,7 +408,14 @@
   dependencies:
     "@babel/helper-plugin-utils" "^7.0.0"
 
-"@babel/plugin-transform-modules-amd@^7.2.0":
+"@babel/plugin-transform-member-expression-literals@^7.2.0":
+  version "7.2.0"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.2.0.tgz#fa10aa5c58a2cb6afcf2c9ffa8cb4d8b3d489a2d"
+  integrity sha512-HiU3zKkSU6scTidmnFJ0bMX8hz5ixC93b4MHMiYebmk2lUVNGOboPsqQvx5LzooihijUoLR/v7Nc1rbBtnc7FA==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.0.0"
+
+"@babel/plugin-transform-modules-amd@^7.5.0":
   version "7.5.0"
   resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.5.0.tgz#ef00435d46da0a5961aa728a1d2ecff063e4fb91"
   integrity sha512-n20UsQMKnWrltocZZm24cRURxQnWIvsABPJlw/fvoy9c6AgHZzoelAIzajDHAQrDpuKFFPPcFGd7ChsYuIUMpg==
@@ -402,17 +424,17 @@
     "@babel/helper-plugin-utils" "^7.0.0"
     babel-plugin-dynamic-import-node "^2.3.0"
 
-"@babel/plugin-transform-modules-commonjs@^7.2.0":
-  version "7.5.0"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.5.0.tgz#425127e6045231360858eeaa47a71d75eded7a74"
-  integrity sha512-xmHq0B+ytyrWJvQTc5OWAC4ii6Dhr0s22STOoydokG51JjWhyYo5mRPXoi+ZmtHQhZZwuXNN+GG5jy5UZZJxIQ==
+"@babel/plugin-transform-modules-commonjs@^7.6.0":
+  version "7.6.0"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.6.0.tgz#39dfe957de4420445f1fcf88b68a2e4aa4515486"
+  integrity sha512-Ma93Ix95PNSEngqomy5LSBMAQvYKVe3dy+JlVJSHEXZR5ASL9lQBedMiCyVtmTLraIDVRE3ZjTZvmXXD2Ozw3g==
   dependencies:
     "@babel/helper-module-transforms" "^7.4.4"
     "@babel/helper-plugin-utils" "^7.0.0"
     "@babel/helper-simple-access" "^7.1.0"
     babel-plugin-dynamic-import-node "^2.3.0"
 
-"@babel/plugin-transform-modules-systemjs@^7.3.4":
+"@babel/plugin-transform-modules-systemjs@^7.5.0":
   version "7.5.0"
   resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.5.0.tgz#e75266a13ef94202db2a0620977756f51d52d249"
   integrity sha512-Q2m56tyoQWmuNGxEtUyeEkm6qJYFqs4c+XyXH5RAuYxObRNz9Zgj/1g2GMnjYp2EUyEy7YTrxliGCXzecl/vJg==
@@ -429,21 +451,21 @@
     "@babel/helper-module-transforms" "^7.1.0"
     "@babel/helper-plugin-utils" "^7.0.0"
 
-"@babel/plugin-transform-named-capturing-groups-regex@^7.3.0":
-  version "7.4.5"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.4.5.tgz#9d269fd28a370258199b4294736813a60bbdd106"
-  integrity sha512-z7+2IsWafTBbjNsOxU/Iv5CvTJlr5w4+HGu1HovKYTtgJ362f7kBcQglkfmlspKKZ3bgrbSGvLfNx++ZJgCWsg==
+"@babel/plugin-transform-named-capturing-groups-regex@^7.6.0":
+  version "7.6.0"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.6.0.tgz#1e6e663097813bb4f53d42df0750cf28ad3bb3f1"
+  integrity sha512-jem7uytlmrRl3iCAuQyw8BpB4c4LWvSpvIeXKpMb+7j84lkx4m4mYr5ErAcmN5KM7B6BqrAvRGjBIbbzqCczew==
   dependencies:
-    regexp-tree "^0.1.6"
+    regexp-tree "^0.1.13"
 
-"@babel/plugin-transform-new-target@^7.0.0":
+"@babel/plugin-transform-new-target@^7.4.4":
   version "7.4.4"
   resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.4.4.tgz#18d120438b0cc9ee95a47f2c72bc9768fbed60a5"
   integrity sha512-r1z3T2DNGQwwe2vPGZMBNjioT2scgWzK9BCnDEh+46z8EEwXBq24uRzd65I7pjtugzPSj921aM15RpESgzsSuA==
   dependencies:
     "@babel/helper-plugin-utils" "^7.0.0"
 
-"@babel/plugin-transform-object-super@^7.2.0":
+"@babel/plugin-transform-object-super@^7.5.5":
   version "7.5.5"
   resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.5.5.tgz#c70021df834073c65eb613b8679cc4a381d1a9f9"
   integrity sha512-un1zJQAhSosGFBduPgN/YFNvWVpRuHKU7IHBglLoLZsGmruJPOo6pbInneflUdmq7YvSVqhpPs5zdBvLnteltQ==
@@ -451,7 +473,7 @@
     "@babel/helper-plugin-utils" "^7.0.0"
     "@babel/helper-replace-supers" "^7.5.5"
 
-"@babel/plugin-transform-parameters@^7.2.0":
+"@babel/plugin-transform-parameters@^7.4.4":
   version "7.4.4"
   resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.4.tgz#7556cf03f318bd2719fe4c922d2d808be5571e16"
   integrity sha512-oMh5DUO1V63nZcu/ZVLQFqiihBGo4OpxJxR1otF50GMeCLiRx5nUdtokd+u9SuVJrvvuIh9OosRFPP4pIPnwmw==
@@ -460,13 +482,27 @@
     "@babel/helper-get-function-arity" "^7.0.0"
     "@babel/helper-plugin-utils" "^7.0.0"
 
-"@babel/plugin-transform-regenerator@^7.3.4":
+"@babel/plugin-transform-property-literals@^7.2.0":
+  version "7.2.0"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.2.0.tgz#03e33f653f5b25c4eb572c98b9485055b389e905"
+  integrity sha512-9q7Dbk4RhgcLp8ebduOpCbtjh7C0itoLYHXd9ueASKAG/is5PQtMR5VJGka9NKqGhYEGn5ITahd4h9QeBMylWQ==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.0.0"
+
+"@babel/plugin-transform-regenerator@^7.4.5":
   version "7.4.5"
   resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.5.tgz#629dc82512c55cee01341fb27bdfcb210354680f"
   integrity sha512-gBKRh5qAaCWntnd09S8QC7r3auLCqq5DI6O0DlfoyDjslSBVqBibrMdsqO+Uhmx3+BlOmE/Kw1HFxmGbv0N9dA==
   dependencies:
     regenerator-transform "^0.14.0"
 
+"@babel/plugin-transform-reserved-words@^7.2.0":
+  version "7.2.0"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.2.0.tgz#4792af87c998a49367597d07fedf02636d2e1634"
+  integrity sha512-fz43fqW8E1tAB3DKF19/vxbpib1fuyCwSPE418ge5ZxILnBhWyhtPgz8eh1RCGGJlwvksHkyxMxh0eenFi+kFw==
+  dependencies:
+    "@babel/helper-plugin-utils" "^7.0.0"
+
 "@babel/plugin-transform-shorthand-properties@^7.2.0":
   version "7.2.0"
   resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz#6333aee2f8d6ee7e28615457298934a3b46198f0"
@@ -489,7 +525,7 @@
     "@babel/helper-plugin-utils" "^7.0.0"
     "@babel/helper-regex" "^7.0.0"
 
-"@babel/plugin-transform-template-literals@^7.2.0":
+"@babel/plugin-transform-template-literals@^7.4.4":
   version "7.4.4"
   resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.4.4.tgz#9d28fea7bbce637fb7612a0750989d8321d4bcb0"
   integrity sha512-mQrEC4TWkhLN0z8ygIvEL9ZEToPhG5K7KDW3pzGqOfIGZ28Jb0POUkeWcoz8HnHvhFy6dwAT1j8OzqN8s804+g==
@@ -504,7 +540,7 @@
   dependencies:
     "@babel/helper-plugin-utils" "^7.0.0"
 
-"@babel/plugin-transform-unicode-regex@^7.2.0":
+"@babel/plugin-transform-unicode-regex@^7.4.4":
   version "7.4.4"
   resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.4.4.tgz#ab4634bb4f14d36728bf5978322b35587787970f"
   integrity sha512-il+/XdNw01i93+M9J9u4T7/e/Ue/vWfNZE4IRUQjplu2Mqb/AFTDimkw2tdEdSH50wuQXZAbXSql0UphQke+vA==
@@ -513,91 +549,90 @@
     "@babel/helper-regex" "^7.4.4"
     regexpu-core "^4.5.4"
 
-"@babel/polyfill@^7.2.5":
-  version "7.4.4"
-  resolved "https://registry.yarnpkg.com/@babel/polyfill/-/polyfill-7.4.4.tgz#78801cf3dbe657844eeabf31c1cae3828051e893"
-  integrity sha512-WlthFLfhQQhh+A2Gn5NSFl0Huxz36x86Jn+E9OW7ibK8edKPq+KLy4apM1yDpQ8kJOVi1OVjpP4vSDLdrI04dg==
-  dependencies:
-    core-js "^2.6.5"
-    regenerator-runtime "^0.13.2"
-
-"@babel/preset-env@~7.3.4":
-  version "7.3.4"
-  resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.3.4.tgz#887cf38b6d23c82f19b5135298bdb160062e33e1"
-  integrity sha512-2mwqfYMK8weA0g0uBKOt4FE3iEodiHy9/CW0b+nWXcbL+pGzLx8ESYc+j9IIxr6LTDHWKgPm71i9smo02bw+gA==
+"@babel/preset-env@~7.6.0":
+  version "7.6.0"
+  resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.6.0.tgz#aae4141c506100bb2bfaa4ac2a5c12b395619e50"
+  integrity sha512-1efzxFv/TcPsNXlRhMzRnkBFMeIqBBgzwmZwlFDw5Ubj0AGLeufxugirwZmkkX/ayi3owsSqoQ4fw8LkfK9SYg==
   dependencies:
     "@babel/helper-module-imports" "^7.0.0"
     "@babel/helper-plugin-utils" "^7.0.0"
     "@babel/plugin-proposal-async-generator-functions" "^7.2.0"
+    "@babel/plugin-proposal-dynamic-import" "^7.5.0"
     "@babel/plugin-proposal-json-strings" "^7.2.0"
-    "@babel/plugin-proposal-object-rest-spread" "^7.3.4"
+    "@babel/plugin-proposal-object-rest-spread" "^7.5.5"
     "@babel/plugin-proposal-optional-catch-binding" "^7.2.0"
-    "@babel/plugin-proposal-unicode-property-regex" "^7.2.0"
+    "@babel/plugin-proposal-unicode-property-regex" "^7.4.4"
     "@babel/plugin-syntax-async-generators" "^7.2.0"
+    "@babel/plugin-syntax-dynamic-import" "^7.2.0"
     "@babel/plugin-syntax-json-strings" "^7.2.0"
     "@babel/plugin-syntax-object-rest-spread" "^7.2.0"
     "@babel/plugin-syntax-optional-catch-binding" "^7.2.0"
     "@babel/plugin-transform-arrow-functions" "^7.2.0"
-    "@babel/plugin-transform-async-to-generator" "^7.3.4"
+    "@babel/plugin-transform-async-to-generator" "^7.5.0"
     "@babel/plugin-transform-block-scoped-functions" "^7.2.0"
-    "@babel/plugin-transform-block-scoping" "^7.3.4"
-    "@babel/plugin-transform-classes" "^7.3.4"
+    "@babel/plugin-transform-block-scoping" "^7.6.0"
+    "@babel/plugin-transform-classes" "^7.5.5"
     "@babel/plugin-transform-computed-properties" "^7.2.0"
-    "@babel/plugin-transform-destructuring" "^7.2.0"
-    "@babel/plugin-transform-dotall-regex" "^7.2.0"
-    "@babel/plugin-transform-duplicate-keys" "^7.2.0"
+    "@babel/plugin-transform-destructuring" "^7.6.0"
+    "@babel/plugin-transform-dotall-regex" "^7.4.4"
+    "@babel/plugin-transform-duplicate-keys" "^7.5.0"
     "@babel/plugin-transform-exponentiation-operator" "^7.2.0"
-    "@babel/plugin-transform-for-of" "^7.2.0"
-    "@babel/plugin-transform-function-name" "^7.2.0"
+    "@babel/plugin-transform-for-of" "^7.4.4"
+    "@babel/plugin-transform-function-name" "^7.4.4"
     "@babel/plugin-transform-literals" "^7.2.0"
-    "@babel/plugin-transform-modules-amd" "^7.2.0"
-    "@babel/plugin-transform-modules-commonjs" "^7.2.0"
-    "@babel/plugin-transform-modules-systemjs" "^7.3.4"
+    "@babel/plugin-transform-member-expression-literals" "^7.2.0"
+    "@babel/plugin-transform-modules-amd" "^7.5.0"
+    "@babel/plugin-transform-modules-commonjs" "^7.6.0"
+    "@babel/plugin-transform-modules-systemjs" "^7.5.0"
     "@babel/plugin-transform-modules-umd" "^7.2.0"
-    "@babel/plugin-transform-named-capturing-groups-regex" "^7.3.0"
-    "@babel/plugin-transform-new-target" "^7.0.0"
-    "@babel/plugin-transform-object-super" "^7.2.0"
-    "@babel/plugin-transform-parameters" "^7.2.0"
-    "@babel/plugin-transform-regenerator" "^7.3.4"
+    "@babel/plugin-transform-named-capturing-groups-regex" "^7.6.0"
+    "@babel/plugin-transform-new-target" "^7.4.4"
+    "@babel/plugin-transform-object-super" "^7.5.5"
+    "@babel/plugin-transform-parameters" "^7.4.4"
+    "@babel/plugin-transform-property-literals" "^7.2.0"
+    "@babel/plugin-transform-regenerator" "^7.4.5"
+    "@babel/plugin-transform-reserved-words" "^7.2.0"
     "@babel/plugin-transform-shorthand-properties" "^7.2.0"
     "@babel/plugin-transform-spread" "^7.2.0"
     "@babel/plugin-transform-sticky-regex" "^7.2.0"
-    "@babel/plugin-transform-template-literals" "^7.2.0"
+    "@babel/plugin-transform-template-literals" "^7.4.4"
     "@babel/plugin-transform-typeof-symbol" "^7.2.0"
-    "@babel/plugin-transform-unicode-regex" "^7.2.0"
-    browserslist "^4.3.4"
+    "@babel/plugin-transform-unicode-regex" "^7.4.4"
+    "@babel/types" "^7.6.0"
+    browserslist "^4.6.0"
+    core-js-compat "^3.1.1"
     invariant "^2.2.2"
     js-levenshtein "^1.1.3"
-    semver "^5.3.0"
+    semver "^5.5.0"
 
-"@babel/template@^7.1.0", "@babel/template@^7.2.2", "@babel/template@^7.4.4":
-  version "7.4.4"
-  resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.4.4.tgz#f4b88d1225689a08f5bc3a17483545be9e4ed237"
-  integrity sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==
+"@babel/template@^7.1.0", "@babel/template@^7.4.4", "@babel/template@^7.6.0":
+  version "7.6.0"
+  resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.6.0.tgz#7f0159c7f5012230dad64cca42ec9bdb5c9536e6"
+  integrity sha512-5AEH2EXD8euCk446b7edmgFdub/qfH1SN6Nii3+fyXP807QRx9Q73A2N5hNwRRslC2H9sNzaFhsPubkS4L8oNQ==
   dependencies:
     "@babel/code-frame" "^7.0.0"
-    "@babel/parser" "^7.4.4"
-    "@babel/types" "^7.4.4"
+    "@babel/parser" "^7.6.0"
+    "@babel/types" "^7.6.0"
 
-"@babel/traverse@^7.1.0", "@babel/traverse@^7.3.4", "@babel/traverse@^7.4.4", "@babel/traverse@^7.5.5":
-  version "7.5.5"
-  resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.5.5.tgz#f664f8f368ed32988cd648da9f72d5ca70f165bb"
-  integrity sha512-MqB0782whsfffYfSjH4TM+LMjrJnhCNEDMDIjeTpl+ASaUvxcjoiVCo/sM1GhS1pHOXYfWVCYneLjMckuUxDaQ==
+"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.4.4", "@babel/traverse@^7.5.5", "@babel/traverse@^7.6.0":
+  version "7.6.0"
+  resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.6.0.tgz#389391d510f79be7ce2ddd6717be66d3fed4b516"
+  integrity sha512-93t52SaOBgml/xY74lsmt7xOR4ufYvhb5c5qiM6lu4J/dWGMAfAh6eKw4PjLes6DI6nQgearoxnFJk60YchpvQ==
   dependencies:
     "@babel/code-frame" "^7.5.5"
-    "@babel/generator" "^7.5.5"
+    "@babel/generator" "^7.6.0"
     "@babel/helper-function-name" "^7.1.0"
     "@babel/helper-split-export-declaration" "^7.4.4"
-    "@babel/parser" "^7.5.5"
-    "@babel/types" "^7.5.5"
+    "@babel/parser" "^7.6.0"
+    "@babel/types" "^7.6.0"
     debug "^4.1.0"
     globals "^11.1.0"
     lodash "^4.17.13"
 
-"@babel/types@^7.0.0", "@babel/types@^7.2.0", "@babel/types@^7.3.4", "@babel/types@^7.4.4", "@babel/types@^7.5.5":
-  version "7.5.5"
-  resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.5.5.tgz#97b9f728e182785909aa4ab56264f090a028d18a"
-  integrity sha512-s63F9nJioLqOlW3UkyMd+BYhXt44YuaFm/VV0VwuteqjYwRrObkU7ra9pY4wAJR3oXi8hJrMcrcJdO/HH33vtw==
+"@babel/types@^7.0.0", "@babel/types@^7.2.0", "@babel/types@^7.4.4", "@babel/types@^7.5.5", "@babel/types@^7.6.0":
+  version "7.6.1"
+  resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.6.1.tgz#53abf3308add3ac2a2884d539151c57c4b3ac648"
+  integrity sha512-X7gdiuaCmA0uRjCmRtYJNAVCc/q+5xSgsfKJHqMN4iNLILX39677fJE1O40arPMh0TTtS9ItH67yre6c7k6t0g==
   dependencies:
     esutils "^2.0.2"
     lodash "^4.17.13"
@@ -792,7 +827,7 @@ abbrev@1:
   resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
   integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==
 
-accepts@~1.3.4:
+accepts@~1.3.4, accepts@~1.3.7:
   version "1.3.7"
   resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd"
   integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==
@@ -1042,6 +1077,11 @@ array-find-index@^1.0.1:
   resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1"
   integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=
 
+array-flatten@1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
+  integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=
+
 array-map@~0.0.0:
   version "0.0.0"
   resolved "https://registry.yarnpkg.com/array-map/-/array-map-0.0.0.tgz#88a2bab73d1cf7bcd5c1b118a003f66f665fa662"
@@ -1194,6 +1234,18 @@ babel-code-frame@^6.26.0:
     esutils "^2.0.2"
     js-tokens "^3.0.2"
 
+babel-eslint@^10.0.3:
+  version "10.0.3"
+  resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.0.3.tgz#81a2c669be0f205e19462fed2482d33e4687a88a"
+  integrity sha512-z3U7eMY6r/3f3/JB9mTsLjyxrv0Yb1zb8PCWCLpguxfCzBIZUwy23R1t/XKewP+8mEN2Ck8Dtr4q20z6ce6SoA==
+  dependencies:
+    "@babel/code-frame" "^7.0.0"
+    "@babel/parser" "^7.0.0"
+    "@babel/traverse" "^7.0.0"
+    "@babel/types" "^7.0.0"
+    eslint-visitor-keys "^1.0.0"
+    resolve "^1.12.0"
+
 babel-helper-call-delegate@^6.24.1:
   version "6.24.1"
   resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d"
@@ -1627,7 +1679,7 @@ backgrid-sizeable-columns@^0.1.1:
   resolved "https://registry.yarnpkg.com/backgrid-sizeable-columns/-/backgrid-sizeable-columns-0.1.1.tgz#ec6fa592b263b390df1d83e566a48dca5036f02b"
   integrity sha1-7G+lkrJjs5DfHYPlZqSNylA28Cs=
 
-backgrid@^0.3.8, backgrid@~0.3.7:
+backgrid@~0.3.7:
   version "0.3.8"
   resolved "https://registry.yarnpkg.com/backgrid/-/backgrid-0.3.8.tgz#7d26816742d72c859cad39b13f19c9f27baffed7"
   integrity sha1-fSaBZ0LXLIWcrTmxPxnJ8nuv/tc=
@@ -1687,6 +1739,16 @@ better-assert@~1.0.0:
   dependencies:
     callsite "1.0.0"
 
+bfj@^6.1.1:
+  version "6.1.2"
+  resolved "https://registry.yarnpkg.com/bfj/-/bfj-6.1.2.tgz#325c861a822bcb358a41c78a33b8e6e2086dde7f"
+  integrity sha512-BmBJa4Lip6BPRINSZ0BPEIfB1wUY/9rwbwvIHQA1KjX9om29B6id0wnWXq7m3bn5JrUVjeOTnVuhPT1FiHwPGw==
+  dependencies:
+    bluebird "^3.5.5"
+    check-types "^8.0.3"
+    hoopy "^0.1.4"
+    tryer "^1.0.1"
+
 big.js@^5.2.2:
   version "5.2.2"
   resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328"
@@ -1795,7 +1857,7 @@ bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0:
   resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f"
   integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==
 
-body-parser@^1.16.1:
+body-parser@1.19.0, body-parser@^1.16.1:
   version "1.19.0"
   resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a"
   integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==
@@ -2006,7 +2068,7 @@ browserify@^16.1.0, browserify@~16.2.3:
     vm-browserify "^1.0.0"
     xtend "^4.0.0"
 
-browserslist@^4.0.0, browserslist@^4.3.4:
+browserslist@^4.0.0:
   version "4.6.6"
   resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.6.6.tgz#6e4bf467cde520bc9dbdf3747dafa03531cec453"
   integrity sha512-D2Nk3W9JL9Fp/gIcWei8LrERCS+eXu9AM5cfXA8WEZ84lFks+ARnZ0q/R69m2SV3Wjma83QDDPxsNKXUwdIsyA==
@@ -2015,6 +2077,15 @@ browserslist@^4.0.0, browserslist@^4.3.4:
     electron-to-chromium "^1.3.191"
     node-releases "^1.1.25"
 
+browserslist@^4.6.0, browserslist@^4.6.6:
+  version "4.7.0"
+  resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.7.0.tgz#9ee89225ffc07db03409f2fee524dc8227458a17"
+  integrity sha512-9rGNDtnj+HaahxiVV38Gn8n8Lr8REKsel68v1sPFfIGEK6uSXTY3h9acgiT1dZVtOOUtifo/Dn8daDQ5dUgVsA==
+  dependencies:
+    caniuse-lite "^1.0.30000989"
+    electron-to-chromium "^1.3.247"
+    node-releases "^1.1.29"
+
 buffer-alloc-unsafe@^1.1.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0"
@@ -2215,11 +2286,16 @@ caniuse-api@^3.0.0:
     lodash.memoize "^4.1.2"
     lodash.uniq "^4.5.0"
 
-caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000984:
+caniuse-lite@^1.0.0:
   version "1.0.30000988"
   resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000988.tgz#742f35ec1b8b75b9628d705d7652eea1fef983db"
   integrity sha512-lPj3T8poYrRc/bniW5SQPND3GRtSrQdUM/R4mCYTbZxyi3jQiggLvZH4+BYUuX0t4TXjU+vMM7KFDQg+rSzZUQ==
 
+caniuse-lite@^1.0.30000984, caniuse-lite@^1.0.30000989:
+  version "1.0.30000989"
+  resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000989.tgz#b9193e293ccf7e4426c5245134b8f2a56c0ac4b9"
+  integrity sha512-vrMcvSuMz16YY6GSVZ0dWDTJP8jqk3iFQ/Aq5iqblPwxSVVZI+zxDyTX0VPqtQsDnfdrBDcsmhgTEOh5R8Lbpw==
+
 caseless@~0.12.0:
   version "0.12.0"
   resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
@@ -2260,6 +2336,11 @@ chardet@^0.7.0:
   resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e"
   integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==
 
+check-types@^8.0.3:
+  version "8.0.3"
+  resolved "https://registry.yarnpkg.com/check-types/-/check-types-8.0.3.tgz#3356cca19c889544f2d7a95ed49ce508a0ecf552"
+  integrity sha512-YpeKZngUmG65rLudJ4taU7VLkOCTMhNl/u4ctNC56LQS/zJTyNH0Lrtwm1tfTsbLlwvlfsA2d1c8vCf/Kh2KwQ==
+
 checkstyle-formatter@^1.1.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/checkstyle-formatter/-/checkstyle-formatter-1.1.0.tgz#1c4922dbac72d67242cfb85e7706917d5587b512"
@@ -2515,7 +2596,7 @@ combined-stream@^1.0.6, combined-stream@~1.0.6:
   dependencies:
     delayed-stream "~1.0.0"
 
-commander@^2.19.0, commander@^2.20.0, commander@~2.20.0:
+commander@^2.18.0, commander@^2.19.0, commander@^2.20.0, commander@~2.20.0:
   version "2.20.0"
   resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422"
   integrity sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==
@@ -2607,7 +2688,7 @@ constants-browserify@^1.0.0, constants-browserify@~1.0.0:
   resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75"
   integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=
 
-content-disposition@^0.5.2:
+content-disposition@0.5.3, content-disposition@^0.5.2:
   version "0.5.3"
   resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd"
   integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==
@@ -2619,23 +2700,33 @@ content-type@~1.0.4:
   resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b"
   integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==
 
-convert-source-map@^1.1.0, convert-source-map@^1.1.3, convert-source-map@~1.1.0:
-  version "1.1.3"
-  resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.1.3.tgz#4829c877e9fe49b3161f3bf3673888e204699860"
-  integrity sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=
-
-convert-source-map@^1.5.0:
+convert-source-map@^1.1.0, convert-source-map@^1.5.0:
   version "1.6.0"
   resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20"
   integrity sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==
   dependencies:
     safe-buffer "~5.1.1"
 
+convert-source-map@^1.1.3, convert-source-map@~1.1.0:
+  version "1.1.3"
+  resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.1.3.tgz#4829c877e9fe49b3161f3bf3673888e204699860"
+  integrity sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=
+
+cookie-signature@1.0.6:
+  version "1.0.6"
+  resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
+  integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw=
+
 cookie@0.3.1:
   version "0.3.1"
   resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb"
   integrity sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=
 
+cookie@0.4.0:
+  version "0.4.0"
+  resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba"
+  integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==
+
 copy-concurrently@^1.0.0:
   version "1.0.5"
   resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0"
@@ -2653,7 +2744,15 @@ copy-descriptor@^0.1.0:
   resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
   integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=
 
-core-js@^2.4.0, core-js@^2.6.5:
+core-js-compat@^3.1.1:
+  version "3.2.1"
+  resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.2.1.tgz#0cbdbc2e386e8e00d3b85dc81c848effec5b8150"
+  integrity sha512-MwPZle5CF9dEaMYdDeWm73ao/IflDH+FjeJCWEADcEgFSE9TLimFKwJsfmkwzI8eC0Aj0mgvMDjeQjrElkz4/A==
+  dependencies:
+    browserslist "^4.6.6"
+    semver "^6.3.0"
+
+core-js@^2.4.0:
   version "2.6.9"
   resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.9.tgz#6b4b214620c834152e179323727fc19741b084f2"
   integrity sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==
@@ -2663,6 +2762,11 @@ core-js@^3.1.3:
   resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.1.4.tgz#3a2837fc48e582e1ae25907afcd6cf03b0cc7a07"
   integrity sha512-YNZN8lt82XIMLnLirj9MhKDFZHalwzzrL9YLt6eb0T5D0EDl4IQ90IGkua8mHbnxNrkj1d8hbdizMc0Qmg1WnQ==
 
+core-js@^3.2.1:
+  version "3.2.1"
+  resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.2.1.tgz#cd41f38534da6cc59f7db050fe67307de9868b09"
+  integrity sha512-Qa5XSVefSVPRxy2XfUC13WbvqkxhkwB3ve+pgCQveNgYzbM/UxZeu1dcOX/xr4UmfUd+muuvsaxilQzCyUurMw==
+
 core-util-is@1.0.2, core-util-is@~1.0.0:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
@@ -3158,6 +3262,11 @@ des.js@^1.0.0:
     inherits "^2.0.1"
     minimalistic-assert "^1.0.0"
 
+destroy@~1.0.4:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
+  integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=
+
 detect-file@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7"
@@ -3298,6 +3407,11 @@ duplexer3@^0.1.4:
   resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2"
   integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=
 
+duplexer@^0.1.1:
+  version "0.1.1"
+  resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1"
+  integrity sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=
+
 duplexify@^3.4.2, duplexify@^3.6.0:
   version "3.7.1"
   resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309"
@@ -3357,10 +3471,10 @@ ejs@^2.6.1:
   resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.6.2.tgz#3a32c63d1cd16d11266cd4703b14fec4e74ab4f6"
   integrity sha512-PcW2a0tyTuPHz3tWyYqtK6r1fZ3gp+3Sop8Ph+ZYN81Ob5rwmbHEzaqs10N3BEsaGTkh/ooniXK+WwszGlc2+Q==
 
-electron-to-chromium@^1.3.191:
-  version "1.3.211"
-  resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.211.tgz#0c39d17316bf342d1971fed68e754fa1775918f7"
-  integrity sha512-GZAiK3oHrs0K+LwH+HD+bdjZ17v40oQQdXbbd3dgrwgbENvazrGpcuIADSAREWnxzo9gADB1evuizrbXsnoU2Q==
+electron-to-chromium@^1.3.191, electron-to-chromium@^1.3.247:
+  version "1.3.260"
+  resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.260.tgz#ffd686b4810bab0e1a428e7af5f08c21fe7c1fa2"
+  integrity sha512-wGt+OivF1C1MPwaSv3LJ96ebNbLAWlx3HndivDDWqwIVSQxmhL17Y/YmwUdEMtS/bPyommELt47Dct0/VZNQBQ==
 
 elliptic@^6.0.0:
   version "6.5.0"
@@ -3610,6 +3724,11 @@ esutils@^2.0.2:
   resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
   integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
 
+etag@~1.8.1:
+  version "1.8.1"
+  resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
+  integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=
+
 eve@~0.5.1:
   version "0.5.4"
   resolved "https://registry.yarnpkg.com/eve/-/eve-0.5.4.tgz#67d080b9725291d7e389e34c26860dd97f1debaa"
@@ -3723,6 +3842,42 @@ exports-loader@~0.7.0:
     loader-utils "^1.1.0"
     source-map "0.5.0"
 
+express@^4.16.3:
+  version "4.17.1"
+  resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134"
+  integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==
+  dependencies:
+    accepts "~1.3.7"
+    array-flatten "1.1.1"
+    body-parser "1.19.0"
+    content-disposition "0.5.3"
+    content-type "~1.0.4"
+    cookie "0.4.0"
+    cookie-signature "1.0.6"
+    debug "2.6.9"
+    depd "~1.1.2"
+    encodeurl "~1.0.2"
+    escape-html "~1.0.3"
+    etag "~1.8.1"
+    finalhandler "~1.1.2"
+    fresh "0.5.2"
+    merge-descriptors "1.0.1"
+    methods "~1.1.2"
+    on-finished "~2.3.0"
+    parseurl "~1.3.3"
+    path-to-regexp "0.1.7"
+    proxy-addr "~2.0.5"
+    qs "6.7.0"
+    range-parser "~1.2.1"
+    safe-buffer "5.1.2"
+    send "0.17.1"
+    serve-static "1.14.1"
+    setprototypeof "1.1.1"
+    statuses "~1.5.0"
+    type-is "~1.6.18"
+    utils-merge "1.0.1"
+    vary "~1.1.2"
+
 ext-list@^2.0.0:
   version "2.2.2"
   resolved "https://registry.yarnpkg.com/ext-list/-/ext-list-2.2.2.tgz#0b98e64ed82f5acf0f2931babf69212ef52ddd37"
@@ -3911,6 +4066,11 @@ filenamify@^2.0.0:
     strip-outer "^1.0.0"
     trim-repeated "^1.0.0"
 
+filesize@^3.6.1:
+  version "3.6.1"
+  resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.6.1.tgz#090bb3ee01b6f801a8a8be99d31710b3422bb317"
+  integrity sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==
+
 fill-range@^4.0.0:
   version "4.0.0"
   resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7"
@@ -3928,7 +4088,7 @@ fill-range@^7.0.1:
   dependencies:
     to-regex-range "^5.0.1"
 
-finalhandler@1.1.2:
+finalhandler@1.1.2, finalhandler@~1.1.2:
   version "1.1.2"
   resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d"
   integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==
@@ -4057,6 +4217,11 @@ format@^0.2.2:
   resolved "https://registry.yarnpkg.com/format/-/format-0.2.2.tgz#d6170107e9efdc4ed30c9dc39016df942b5cb58b"
   integrity sha1-1hcBB+nv3E7TDJ3DkBbflCtctYs=
 
+forwarded@~0.1.2:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84"
+  integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=
+
 fragment-cache@^0.2.1:
   version "0.2.1"
   resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19"
@@ -4064,6 +4229,11 @@ fragment-cache@^0.2.1:
   dependencies:
     map-cache "^0.2.2"
 
+fresh@0.5.2:
+  version "0.5.2"
+  resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
+  integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=
+
 from2@^2.1.0, from2@^2.1.1:
   version "2.3.0"
   resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af"
@@ -4474,6 +4644,14 @@ gulp-tap@^1.0.1:
   dependencies:
     through2 "^2.0.3"
 
+gzip-size@^5.0.0:
+  version "5.1.1"
+  resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-5.1.1.tgz#cb9bee692f87c0612b232840a873904e4c135274"
+  integrity sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==
+  dependencies:
+    duplexer "^0.1.1"
+    pify "^4.0.1"
+
 har-schema@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92"
@@ -4618,6 +4796,11 @@ homedir-polyfill@^1.0.1:
   dependencies:
     parse-passwd "^1.0.0"
 
+hoopy@^0.1.4:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/hoopy/-/hoopy-0.1.4.tgz#609207d661100033a9a9402ad3dea677381c1b1d"
+  integrity sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==
+
 hosted-git-info@^2.1.4:
   version "2.7.1"
   resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047"
@@ -4659,6 +4842,17 @@ http-errors@1.7.2:
     statuses ">= 1.5.0 < 2"
     toidentifier "1.0.0"
 
+http-errors@~1.7.2:
+  version "1.7.3"
+  resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06"
+  integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==
+  dependencies:
+    depd "~1.1.2"
+    inherits "2.0.4"
+    setprototypeof "1.1.1"
+    statuses ">= 1.5.0 < 2"
+    toidentifier "1.0.0"
+
 http-proxy@^1.13.0:
   version "1.17.0"
   resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.17.0.tgz#7ad38494658f84605e2f6db4436df410f4e5be9a"
@@ -4897,7 +5091,7 @@ inflight@^1.0.4:
     once "^1.3.0"
     wrappy "1"
 
-inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3:
+inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3:
   version "2.0.4"
   resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
   integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
@@ -4998,6 +5192,11 @@ ip-address@^5.8.9:
     lodash "^4.17.15"
     sprintf-js "1.1.2"
 
+ipaddr.js@1.9.0:
+  version "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==
+
 is-absolute-url@^2.0.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6"
@@ -5403,16 +5602,16 @@ js-string-escape@^1.0.0:
   resolved "https://registry.yarnpkg.com/js-string-escape/-/js-string-escape-1.0.1.tgz#e2625badbc0d67c7533e9edc1068c587ae4137ef"
   integrity sha1-4mJbrbwNZ8dTPp7cEGjFh65BN+8=
 
-"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^3.0.2:
-  version "3.0.2"
-  resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
-  integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls=
-
-js-tokens@^4.0.0:
+"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0:
   version "4.0.0"
   resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
   integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
 
+js-tokens@^3.0.2:
+  version "3.0.2"
+  resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
+  integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls=
+
 js-yaml@^3.12.0, js-yaml@^3.13.1:
   version "3.13.1"
   resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847"
@@ -6002,6 +6201,16 @@ meow@^3.3.0, meow@^3.7.0:
     redent "^1.0.0"
     trim-newlines "^1.0.0"
 
+merge-descriptors@1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61"
+  integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=
+
+methods@~1.1.2:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
+  integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=
+
 micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4:
   version "3.1.10"
   resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23"
@@ -6041,6 +6250,11 @@ mime-types@^2.1.12, mime-types@~2.1.19, mime-types@~2.1.24:
   dependencies:
     mime-db "1.40.0"
 
+mime@1.6.0:
+  version "1.6.0"
+  resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
+  integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
+
 mime@^2.0.3, mime@^2.3.1, mime@^2.4.2:
   version "2.4.4"
   resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.4.tgz#bd7b91135fc6b01cde3e9bae33d659b63d8857e5"
@@ -6227,6 +6441,11 @@ ms@2.0.0:
   resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
   integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=
 
+ms@2.1.1:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a"
+  integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==
+
 ms@^2.1.1:
   version "2.1.2"
   resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
@@ -6361,10 +6580,10 @@ node-pre-gyp@^0.12.0:
     semver "^5.3.0"
     tar "^4"
 
-node-releases@^1.1.25:
-  version "1.1.26"
-  resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.26.tgz#f30563edc5c7dc20cf524cc8652ffa7be0762937"
-  integrity sha512-fZPsuhhUHMTlfkhDLGtfY80DSJTjOcx+qD1j5pqPkuhUHVS7xHZIg9EE4DHK8O3f0zTxXHX5VIkDG8pu98/wfQ==
+node-releases@^1.1.25, node-releases@^1.1.29:
+  version "1.1.30"
+  resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.30.tgz#35eebf129c63baeb6d8ddeda3c35b05abfd37f7f"
+  integrity sha512-BHcr1g6NeUH12IL+X3Flvs4IOnl1TL0JczUhEZjDE+FXXPQcVCNr8NEPb01zqGxzhTpdyJL5GXemaCW7aw6Khw==
   dependencies:
     semver "^5.3.0"
 
@@ -6596,6 +6815,11 @@ onetime@^2.0.0:
   dependencies:
     mimic-fn "^1.0.0"
 
+opener@^1.5.1:
+  version "1.5.1"
+  resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.1.tgz#6d2f0e77f1a0af0032aca716c2c1fbb8e7e8abed"
+  integrity sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA==
+
 optimist@^0.6.1:
   version "0.6.1"
   resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686"
@@ -6928,6 +7152,11 @@ path-platform@~0.11.15:
   resolved "https://registry.yarnpkg.com/path-platform/-/path-platform-0.11.15.tgz#e864217f74c36850f0852b78dc7bf7d4a5721bf2"
   integrity sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I=
 
+path-to-regexp@0.1.7:
+  version "0.1.7"
+  resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c"
+  integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=
+
 path-type@^1.0.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441"
@@ -7409,6 +7638,14 @@ proto-list@~1.2.1:
   resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849"
   integrity sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=
 
+proxy-addr@~2.0.5:
+  version "2.0.5"
+  resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.5.tgz#34cbd64a2d81f4b1fd21e76f9f06c8a45299ee34"
+  integrity sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==
+  dependencies:
+    forwarded "~0.1.2"
+    ipaddr.js "1.9.0"
+
 prr@~1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476"
@@ -7530,7 +7767,7 @@ randomfill@^1.0.3:
     randombytes "^2.0.5"
     safe-buffer "^5.1.0"
 
-range-parser@^1.2.0, range-parser@^1.2.1:
+range-parser@^1.2.0, range-parser@^1.2.1, range-parser@~1.2.1:
   version "1.2.1"
   resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031"
   integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==
@@ -7624,7 +7861,7 @@ redent@^1.0.0:
     indent-string "^2.1.0"
     strip-indent "^1.0.1"
 
-regenerate-unicode-properties@^8.0.2:
+regenerate-unicode-properties@^8.1.0:
   version "8.1.0"
   resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz#ef51e0f0ea4ad424b77bf7cb41f3e015c70a3f0e"
   integrity sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA==
@@ -7641,11 +7878,6 @@ regenerator-runtime@^0.11.0:
   resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9"
   integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==
 
-regenerator-runtime@^0.13.2:
-  version "0.13.3"
-  resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz#7cf6a77d8f5c6f60eb73c5fc1955b2ceb01e6bf5"
-  integrity sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==
-
 regenerator-transform@^0.10.0:
   version "0.10.1"
   resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd"
@@ -7670,10 +7902,10 @@ regex-not@^1.0.0, regex-not@^1.0.2:
     extend-shallow "^3.0.2"
     safe-regex "^1.1.0"
 
-regexp-tree@^0.1.6:
-  version "0.1.11"
-  resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.11.tgz#c9c7f00fcf722e0a56c7390983a7a63dd6c272f3"
-  integrity sha512-7/l/DgapVVDzZobwMCCgMlqiqyLFJ0cduo/j+3BcDJIB+yJdsYCfKuI3l/04NV+H/rfNRdPIDbXNZHM9XvQatg==
+regexp-tree@^0.1.13:
+  version "0.1.13"
+  resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.13.tgz#5b19ab9377edc68bc3679256840bb29afc158d7f"
+  integrity sha512-hwdV/GQY5F8ReLZWO+W1SRoN5YfpOKY6852+tBFcma72DKBIcHjPRIlIvQN35bCOljuAfP2G2iB0FC/w236mUw==
 
 regexpp@^2.0.1:
   version "2.0.1"
@@ -7690,12 +7922,12 @@ regexpu-core@^2.0.0:
     regjsparser "^0.1.4"
 
 regexpu-core@^4.5.4:
-  version "4.5.4"
-  resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.5.4.tgz#080d9d02289aa87fe1667a4f5136bc98a6aebaae"
-  integrity sha512-BtizvGtFQKGPUcTy56o3nk1bGRp4SZOTYrDtGNlqCQufptV5IkkLN6Emw+yunAJjzf+C9FQFtvq7IoA3+oMYHQ==
+  version "4.6.0"
+  resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.6.0.tgz#2037c18b327cfce8a6fea2a4ec441f2432afb8b6"
+  integrity sha512-YlVaefl8P5BnFYOITTNzDvan1ulLOiXJzCNZxduTIosN17b87h3bvG9yHMoHaRuo88H4mQ06Aodj5VtYGGGiTg==
   dependencies:
     regenerate "^1.4.0"
-    regenerate-unicode-properties "^8.0.2"
+    regenerate-unicode-properties "^8.1.0"
     regjsgen "^0.5.0"
     regjsparser "^0.6.0"
     unicode-match-property-ecmascript "^1.0.4"
@@ -7862,7 +8094,7 @@ resolve@1.1.7:
   resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b"
   integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=
 
-resolve@^1.1.4, resolve@^1.10.0, resolve@^1.3.2, resolve@^1.4.0:
+resolve@^1.1.4, resolve@^1.10.0, resolve@^1.12.0, resolve@^1.3.2, resolve@^1.4.0:
   version "1.12.0"
   resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.12.0.tgz#3fc644a35c84a48554609ff26ec52b66fa577df6"
   integrity sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==
@@ -8040,21 +8272,60 @@ semver-truncate@^1.1.2:
   dependencies:
     semver "^5.3.0"
 
-"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0:
+"semver@2 || 3 || 4 || 5", semver@^5.5.0, semver@^5.5.1, semver@^5.6.0:
   version "5.7.0"
   resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b"
   integrity sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==
 
+semver@^5.3.0, semver@^5.4.1:
+  version "5.7.1"
+  resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
+  integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
+
+semver@^6.3.0:
+  version "6.3.0"
+  resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
+  integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
+
 semver@~5.3.0:
   version "5.3.0"
   resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f"
   integrity sha1-myzl094C0XxgEq0yaqa00M9U+U8=
 
+send@0.17.1:
+  version "0.17.1"
+  resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8"
+  integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==
+  dependencies:
+    debug "2.6.9"
+    depd "~1.1.2"
+    destroy "~1.0.4"
+    encodeurl "~1.0.2"
+    escape-html "~1.0.3"
+    etag "~1.8.1"
+    fresh "0.5.2"
+    http-errors "~1.7.2"
+    mime "1.6.0"
+    ms "2.1.1"
+    on-finished "~2.3.0"
+    range-parser "~1.2.1"
+    statuses "~1.5.0"
+
 serialize-javascript@^1.7.0:
   version "1.7.0"
   resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.7.0.tgz#d6e0dfb2a3832a8c94468e6eb1db97e55a192a65"
   integrity sha512-ke8UG8ulpFOxO8f8gRYabHQe/ZntKlcig2Mp+8+URDP1D8vJZ0KUt7LYo07q25Z/+JVSgpr/cui9PIp5H6/+nA==
 
+serve-static@1.14.1:
+  version "1.14.1"
+  resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9"
+  integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==
+  dependencies:
+    encodeurl "~1.0.2"
+    escape-html "~1.0.3"
+    parseurl "~1.3.3"
+    send "0.17.1"
+
 set-blocking@^2.0.0, set-blocking@~2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
@@ -8397,7 +8668,7 @@ split.js@^1.5.10:
   resolved "https://registry.yarnpkg.com/split.js/-/split.js-1.5.11.tgz#3654b2a8c625994e33c531df5c4dea83ca8af011"
   integrity sha512-ec0sAbWnaMGpNHWo1ZgIlF3Mx7GzSyaO0GlcEBZGIFZQwYPPkbDV6JRpDmpzIshVig7USREuEPudy0ygQaskXg==
 
-sprintf-js@1.1.2, sprintf-js@^1.0.3, sprintf-js@^1.1.2:
+sprintf-js@1.1.2:
   version "1.1.2"
   resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673"
   integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==
@@ -9008,6 +9279,11 @@ trim-right@^1.0.1:
   dependencies:
     glob "^7.1.2"
 
+tryer@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8"
+  integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==
+
 tslib@^1.9.0:
   version "1.10.0"
   resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a"
@@ -9042,7 +9318,7 @@ type-check@~0.3.2:
   dependencies:
     prelude-ls "~1.1.2"
 
-type-is@~1.6.17:
+type-is@~1.6.17, type-is@~1.6.18:
   version "1.6.18"
   resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131"
   integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==
@@ -9112,14 +9388,6 @@ undeclared-identifiers@^1.1.2:
     simple-concat "^1.0.0"
     xtend "^4.0.1"
 
-underscore.string@^3.3.5:
-  version "3.3.5"
-  resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-3.3.5.tgz#fc2ad255b8bd309e239cbc5816fd23a9b7ea4023"
-  integrity sha512-g+dpmgn+XBneLmXXo+sGlW5xQEt4ErkS3mgeN2GFbremYeMBSJKr9Wf2KJplQVaiPY/f7FN6atosWYNm9ovrYg==
-  dependencies:
-    sprintf-js "^1.0.3"
-    util-deprecate "^1.0.2"
-
 underscore@>=1.7.0, underscore@>=1.8.3, underscore@^1.8.0, underscore@^1.8.3, underscore@^1.9.1:
   version "1.9.1"
   resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.1.tgz#06dce34a0e68a7babc29b365b8e74b8925203961"
@@ -9279,7 +9547,7 @@ useragent@2.3.0:
     lru-cache "4.1.x"
     tmp "0.0.x"
 
-util-deprecate@^1.0.2, util-deprecate@~1.0.1:
+util-deprecate@~1.0.1:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
   integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
@@ -9341,6 +9609,11 @@ value-or-function@^3.0.0:
   resolved "https://registry.yarnpkg.com/value-or-function/-/value-or-function-3.0.0.tgz#1c243a50b595c1be54a754bfece8563b9ff8d813"
   integrity sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=
 
+vary@~1.1.2:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
+  integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=
+
 vendors@^1.0.0:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.3.tgz#a6467781abd366217c050f8202e7e50cc9eef8c0"
@@ -9444,6 +9717,25 @@ watchpack@^1.6.0:
     jquery "^3.3.1"
     jquery-contextmenu "^2.6.4"
 
+webpack-bundle-analyzer@^3.4.1:
+  version "3.4.1"
+  resolved "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.4.1.tgz#430544c7ba1631baccf673475ca8300cb74a3c47"
+  integrity sha512-Bs8D/1zF+17lhqj2OYmzi7HEVYqEVxu7lCO9Ff8BwajenOU0vAwEoV8e4ICCPNZAcqR1PCR/7o2SkW+cnCmF0A==
+  dependencies:
+    acorn "^6.0.7"
+    acorn-walk "^6.1.1"
+    bfj "^6.1.1"
+    chalk "^2.4.1"
+    commander "^2.18.0"
+    ejs "^2.6.1"
+    express "^4.16.3"
+    filesize "^3.6.1"
+    gzip-size "^5.0.0"
+    lodash "^4.17.15"
+    mkdirp "^0.5.1"
+    opener "^1.5.1"
+    ws "^6.0.0"
+
 webpack-cli@^3.2.3:
   version "3.3.6"
   resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.3.6.tgz#2c8c399a2642133f8d736a359007a052e060032c"
@@ -9601,6 +9893,13 @@ write@1.0.3:
   dependencies:
     mkdirp "^0.5.1"
 
+ws@^6.0.0:
+  version "6.2.1"
+  resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb"
+  integrity sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==
+  dependencies:
+    async-limiter "~1.0.0"
+
 ws@~3.3.1:
   version "3.3.3"
   resolved "https://registry.yarnpkg.com/ws/-/ws-3.3.3.tgz#f1cf84fe2d5e901ebce94efaece785f187a228f2"
