# Stats from current release

Default Server Mode (Decrease detected ✓)

General Overall decrease ✓

|  | zeit/next.js canary | zeit/next.js refs/tags/v9.0.4-canary.7 | Change |
| - | - | - | - |
| buildDuration | 23.7s | 25.7s | ⚠ +2s |
| nodeModulesSize | 41.5 MB | 41.3 MB | -225 kB |

Client Bundles (main, webpack, commons) Overall decrease ✓

|  | zeit/next.js canary | zeit/next.js refs/tags/v9.0.4-canary.7 | Change |
| - | - | - | - |
| main-HASH.js | 19.9 kB | 17.9 kB | -2.02 kB |
| main-HASH.js gzip | 7.1 kB | 6.56 kB | -537 B |
| webpack-HASH.js | 1.49 kB | 1.53 kB | ⚠ +43 B |
| webpack-HASH.js gzip | 738 B | 746 B | ⚠ +8 B |
| commons.HASH.js | 191 kB | 190 kB | -604 B |
| commons.HASH.js gzip | 61.6 kB | 61.6 kB | ✓ |
| Overall change |  |  | -2.58 kB |

Client Bundles (main, webpack, commons) Modern Overall decrease ✓

|  | zeit/next.js canary | zeit/next.js refs/tags/v9.0.4-canary.7 | Change |
| - | - | - | - |
| main-HASH.module.js | 17.7 kB | 16.2 kB | -1.47 kB |
| main-HASH.module.js gzip | 6.73 kB | 6.28 kB | -449 B |
| webpack-HASH.module.js | 1.49 kB | 1.53 kB | ⚠ +43 B |
| webpack-HASH.module.js gzip | 738 B | 746 B | ⚠ +8 B |
| commons.HASH.module.js | 171 kB | 171 kB | ⚠ +43 B |
| commons.HASH.module.js gzip | 55.3 kB | 55.4 kB | ⚠ +94 B |
| Overall change |  |  | -1.39 kB |

Client Pages Overall decrease ✓

|  | zeit/next.js canary | zeit/next.js refs/tags/v9.0.4-canary.7 | Change |
| - | - | - | - |
| _app.js | 2.39 kB | 1.9 kB | -490 B |
| _app.js gzip | 1.07 kB | 905 B | -169 B |
| _error.js | 12.3 kB | 12.1 kB | -199 B |
| _error.js gzip | 4.8 kB | 4.76 kB | -38 B |
| hooks.js | 751 B | 1.06 kB | ⚠ +311 B |
| hooks.js gzip | 385 B | 600 B | ⚠ +215 B |
| index.js | 343 B | 343 B | ✓ |
| index.js gzip | 237 B | 237 B | ✓ |
| link.js | 8.17 kB | 8.13 kB | -41 B |
| link.js gzip | 3.5 kB | 3.49 kB | -7 B |
| routerDirect.js | 423 B | 429 B | ⚠ +6 B |
| routerDirect.js gzip | 290 B | 292 B | ⚠ +2 B |
| withRouter.js | 435 B | 439 B | ⚠ +4 B |
| withRouter.js gzip | 286 B | 290 B | ⚠ +4 B |
| Overall change |  |  | -409 B |

Client Pages Modern Overall decrease ✓

|  | zeit/next.js canary | zeit/next.js refs/tags/v9.0.4-canary.7 | Change |
| - | - | - | - |
| _app.module.js | 1.83 kB | 1.79 kB | -35 B |
| _app.module.js gzip | 875 B | 865 B | -10 B |
| _error.module.js | 10.6 kB | 10.6 kB | -23 B |
| _error.module.js gzip | 4.3 kB | 4.31 kB | ⚠ +5 B |
| hooks.module.js | 652 B | 596 B | -56 B |
| hooks.module.js gzip | 352 B | 354 B | ⚠ +2 B |
| index.module.js | 319 B | 319 B | ✓ |
| index.module.js gzip | 238 B | 238 B | ✓ |
| link.module.js | 8.46 kB | 8.52 kB | ⚠ +57 B |
| link.module.js gzip | 3.65 kB | 3.67 kB | ⚠ +21 B |
| routerDirect.module.js | 411 B | 417 B | ⚠ +6 B |
| routerDirect.module.js gzip | 291 B | 292 B | ⚠ +1 B |
| withRouter.module.js | 423 B | 427 B | ⚠ +4 B |
| withRouter.module.js gzip | 288 B | 291 B | ⚠ +3 B |
| Overall change |  |  | -47 B |

Fetched pages Overall decrease ✓

|  | zeit/next.js canary | zeit/next.js refs/tags/v9.0.4-canary.7 | Change |
| - | - | - | - |
| link | 2.81 kB | 2.8 kB | -4 B |
| link gzip | 847 B | 850 B | ⚠ +3 B |
| index | 2.76 kB | 2.75 kB | -4 B |
| index gzip | 838 B | 842 B | ⚠ +4 B |
| withRouter | 2.82 kB | 2.81 kB | -4 B |
| withRouter gzip | 832 B | 838 B | ⚠ +6 B |
| Overall change |  |  | -12 B |

#### Diffs

Diff for main-HASH.js

Diff too large to display

Diff for webpack-HASH.js

```diff
@@ -10,7 +10,7 @@
 /******/ 		var moduleId, chunkId, i = 0, resolves = [];
 /******/ 		for(;i < chunkIds.length; i++) {
 /******/ 			chunkId = chunkIds[i];
-/******/ 			if(installedChunks[chunkId]) {
+/******/ 			if(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {
 /******/ 				resolves.push(installedChunks[chunkId][0]);
 /******/ 			}
 /******/ 			installedChunks[chunkId] = 0;
```

Diff for commons.HASH.js

Diff too large to display

Diff for main-HASH.module.js

```diff
@@ -1,19 +1,4 @@
-(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[2],{
-
-/***/ "+iuc":
-/***/ (function(module, exports, __webpack_require__) {
-
-__webpack_require__("wgeU");
-__webpack_require__("FlQf");
-__webpack_require__("bBy9");
-__webpack_require__("B9jh");
-__webpack_require__("dL40");
-__webpack_require__("xvv9");
-__webpack_require__("V+O7");
-module.exports = __webpack_require__("WEpk").Set;
-
-
-/***/ }),
+(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[9],{

 /***/ "+oT+":
 /***/ (function(module, exports, __webpack_require__) {
@@ -145,28 +130,6 @@ module.exports = function (NAME) {

 /***/ }),

-/***/ "B9jh":
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-var strong = __webpack_require__("Wu5q");
-var validate = __webpack_require__("n3ko");
-var SET = 'Set';
-
-// 23.2 Set Objects
-module.exports = __webpack_require__("raTm")(SET, function (get) {
-  return function Set() { return get(this, arguments.length > 0 ? arguments[0] : undefined); };
-}, {
-  // 23.2.3.1 Set.prototype.add(value)
-  add: function add(value) {
-    return strong.def(validate(this, SET), value = value === 0 ? 0 : value, value);
-  }
-}, strong);
-
-
-/***/ }),
-
 /***/ "BMP1":
 /***/ (function(module, exports, __webpack_require__) {

@@ -270,6 +233,9 @@ class HeadManager {
   updateElements(type, components) {
     const headEl = document.getElementsByTagName('head')[0];
     const headCountEl = headEl.querySelector('meta[name=next-head-count]');
+
+    if (false) {}
+
     const headCount = Number(headCountEl.content);
     const oldTags = [];

@@ -336,13 +302,12 @@ function reactElementToDOM(_ref) {
 "use strict";

-var _interopRequireDefault = __webpack_require__("KI45");
-
-var _defineProperty = _interopRequireDefault(__webpack_require__("hfKm"));
+var _Object$defineProperty = __webpack_require__("hfKm");

-(0, _defineProperty.default)(exports, "__esModule", {
+_Object$defineProperty(exports, "__esModule", {
   value: true
 });
+
 let runtimeConfig;

 exports.default = () => {
@@ -363,11 +328,9 @@ exports.setConfig = setConfig;
 "use strict";

-var _interopRequireDefault = __webpack_require__("KI45");
-
-var _defineProperty = _interopRequireDefault(__webpack_require__("hfKm"));
+var _Object$defineProperty = __webpack_require__("hfKm");

-var __importStar = void 0 && (void 0).__importStar || function (mod) {
+var __importStar = this && this.__importStar || function (mod) {
   if (mod && mod.__esModule) return mod;
   var result = {};
   if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
@@ -375,7 +338,7 @@ var __importStar = void 0 && (void 0).__importStar || function (mod) {
   return result;
 };

-(0, _defineProperty.default)(exports, "__esModule", {
+_Object$defineProperty(exports, "__esModule", {
   value: true
 });

@@ -505,7 +468,7 @@ class Container extends _react.default.Component {
     this.scrollToHash(); // If page was exported and has a querystring
     // If it's a dynamic route or has a querystring

-    if (data.nextExport && ((0, _isDynamic.isDynamicRoute)(router.pathname) || location.search)) {
+    if (data.nextExport && ((0, _isDynamic.isDynamicRoute)(router.pathname) || location.search || data.skeleton)) {
       // update query on mount for exported pages
       router.replace(router.pathname + '?' + (0, _querystring.stringify)((0, _extends2.default)({}, router.query, (0, _querystring.parse)(location.search.substr(1)))), asPath, {
         // WARNING: `_h` is an internal option for handing Next.js
@@ -568,9 +531,7 @@ function () {
       yield window.__NEXT_PRELOADREADY(dynamicIds);
     }

-    if (dynamicBuildId === true) {
-      pageLoader.onDynamicBuildId();
-    }
+    if (false) {}

     exports.router = router = (0, _router.createRouter)(page, query, asPath, {
       initialProps: props,
@@ -594,13 +555,14 @@ function () {
         });
       }
     });
-    render({
+    const renderCtx = {
       App,
       Component,
       props,
       err: initialErr,
       emitter
-    });
+    };
+    render(renderCtx);
     return emitter;
   });

@@ -657,15 +619,17 @@ function _renderError() {
     // If we've gotten here upon initial render, we can use the props from the server.
     // Otherwise, we need to call `getInitialProps` on `App` before mounting.

+    const AppTree = wrapApp(App);
     const appCtx = {
-      AppTree: wrapApp(App),
       Component: ErrorComponent,
+      AppTree,
       router,
       ctx: {
         err,
         pathname: page,
         query,
-        asPath
+        asPath,
+        AppTree
       }
     };
     const initProps = props.props ? props.props : yield (0, _utils.loadGetInitialProps)(App, appCtx);
@@ -681,16 +645,54 @@ function _renderError() {
 let isInitialRender = typeof _reactDom.default.hydrate === 'function';

 function renderReactElement(reactEl, domEl) {
-  // The check for `.hydrate` is there to support React alternatives like preact
+  // mark start of hydrate/render
+  if (_utils.SUPPORTS_PERFORMANCE_USER_TIMING) {
+    performance.mark('beforeRender');
+  } // The check for `.hydrate` is there to support React alternatives like preact
+
+
   if (isInitialRender) {
-    _reactDom.default.hydrate(reactEl, domEl);
+    _reactDom.default.hydrate(reactEl, domEl, markHydrateComplete);

     isInitialRender = false;
   } else {
-    _reactDom.default.render(reactEl, domEl);
+    _reactDom.default.render(reactEl, domEl, markRenderComplete);
   }
 }

+function markHydrateComplete() {
+  if (!_utils.SUPPORTS_PERFORMANCE_USER_TIMING) return;
+  performance.mark('afterHydrate'); // mark end of hydration
+
+  performance.measure('Next.js-before-hydration', 'navigationStart', 'beforeRender');
+  performance.measure('Next.js-hydration', 'beforeRender', 'afterHydrate');
+  clearMarks();
+}
+
+function markRenderComplete() {
+  if (!_utils.SUPPORTS_PERFORMANCE_USER_TIMING) return;
+  performance.mark('afterRender'); // mark end of render
+
+  const navStartEntries = performance.getEntriesByName('routeChange', 'mark');
+
+  if (!navStartEntries.length) {
+    return;
+  }
+
+  performance.measure('Next.js-route-change-to-render', navStartEntries[0].name, 'beforeRender');
+  performance.measure('Next.js-render', 'beforeRender', 'afterRender');
+  clearMarks();
+}
+
+function clearMarks() {
+  performance.clearMarks();
+  /*
+  * TODO: uncomment the following line when we have a way to
+  * expose this to user code.
+  */
+  // performance.clearMeasures()
+}
+
 function AppContainer(_ref4) {
   let {
     children
@@ -740,15 +742,17 @@ function _doRender() {
         query,
         asPath
       } = router;
+      const AppTree = wrapApp(App);
       const appCtx = {
         router,
-        AppTree: wrapApp(App),
+        AppTree,
         Component: ErrorComponent,
         ctx: {
           err,
           pathname,
           query,
-          asPath
+          asPath,
+          AppTree
         }
       };
       props = yield (0, _utils.loadGetInitialProps)(App, appCtx);
@@ -825,15 +829,6 @@ module.exports = __webpack_require__("WEpk").Map;

 /***/ }),

-/***/ "V+O7":
-/***/ (function(module, exports, __webpack_require__) {
-
-// https://tc39.github.io/proposal-setmap-offrom/#sec-set.from
-__webpack_require__("aPfg")('Set');
-
-
-/***/ }),
-
 /***/ "V7Et":
 /***/ (function(module, exports, __webpack_require__) {

@@ -1110,19 +1105,17 @@ module.exports = function (COLLECTION) {
 "use strict";

-var _interopRequireDefault = __webpack_require__("KI45");
-
-var _map = _interopRequireDefault(__webpack_require__("LX0d"));
+var _Map = __webpack_require__("LX0d");

-var _defineProperty = _interopRequireDefault(__webpack_require__("hfKm"));
+var _Object$defineProperty = __webpack_require__("hfKm");

-(0, _defineProperty.default)(exports, "__esModule", {
+_Object$defineProperty(exports, "__esModule", {
   value: true
 });

 class DataManager {
   constructor(data) {
-    this.data = new _map.default(data);
+    this.data = new _Map(data);
   }

   getData() {
@@ -1138,7 +1131,7 @@ class DataManager {
   }

   overwrite(data) {
-    this.data = new _map.default(data);
+    this.data = new _Map(data);
   }

 }
@@ -1147,17 +1140,6 @@ exports.DataManager = DataManager;

 /***/ }),

-/***/ "dL40":
-/***/ (function(module, exports, __webpack_require__) {
-
-// https://github.com/DavidBruant/Map-Set.prototype.toJSON
-var $export = __webpack_require__("Y7ZC");
-
-$export($export.P + $export.R, 'Set', { toJSON: __webpack_require__("8iia")('Set') });
-
-
-/***/ }),
-
 /***/ "dVTT":
 /***/ (function(module, exports, __webpack_require__) {

@@ -1206,17 +1188,6 @@ module.exports = Array.isArray || function isArray(arg) {

 /***/ }),

-/***/ "m/Gl":
-/***/ (function(__webpack_module__, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-__webpack_require__.r(__webpack_exports__);
-/* harmony default export */ __webpack_exports__["default"] = (function(e,n){return n=n||{},new Promise(function(t,r){var s=new XMLHttpRequest,o=[],u=[],i={},a=function(){return{ok:2==(s.status/100|0),statusText:s.statusText,status:s.status,url:s.responseURL,text:function(){return Promise.resolve(s.responseText)},json:function(){return Promise.resolve(JSON.parse(s.responseText))},blob:function(){return Promise.resolve(new Blob([s.response]))},clone:a,headers:{keys:function(){return o},entries:function(){return u},get:function(e){return i[e.toLowerCase()]},has:function(e){return e.toLowerCase()in i}}}};for(var l in s.open(n.method||"get",e,!0),s.onload=function(){s.getAllResponseHeaders().replace(/^(.*?):[^\S\n]*([\s\S]*?)$/gm,function(e,n,t){o.push(n=n.toLowerCase()),u.push([n,t]),i[n]=i[n]?i[n]+","+t:t}),t(a())},s.onerror=r,s.withCredentials="include"==n.credentials,n.headers)s.setRequestHeader(l,n.headers[l]);s.send(n.body||null)})});
-//# sourceMappingURL=unfetch.mjs.map
-
-
-/***/ }),
-
 /***/ "n3ko":
 /***/ (function(module, exports, __webpack_require__) {

@@ -1235,11 +1206,9 @@ module.exports = function (it, TYPE) {
 "use strict";

-var _interopRequireDefault = __webpack_require__("KI45");
-
-var _defineProperty = _interopRequireDefault(__webpack_require__("hfKm"));
+var _Object$defineProperty = __webpack_require__("hfKm");

-var __importStar = void 0 && (void 0).__importStar || function (mod) {
+var __importStar = this && this.__importStar || function (mod) {
   if (mod && mod.__esModule) return mod;
   var result = {};
   if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
@@ -1247,7 +1216,7 @@ var __importStar = void 0 && (void 0).__importStar || function (mod) {
   return result;
 };

-(0, _defineProperty.default)(exports, "__esModule", {
+_Object$defineProperty(exports, "__esModule", {
   value: true
 });

@@ -1324,13 +1293,6 @@ module.exports = function (NAME, wrapper, methods, common, IS_MAP, IS_WEAK) {

 /***/ }),

-/***/ "ttDY":
-/***/ (function(module, exports, __webpack_require__) {
-
-module.exports = __webpack_require__("+iuc");
-
-/***/ }),
-
 /***/ "v6xn":
 /***/ (function(module, exports, __webpack_require__) {

@@ -1344,15 +1306,6 @@ module.exports = function (original, length) {

 /***/ }),

-/***/ "xvv9":
-/***/ (function(module, exports, __webpack_require__) {
-
-// https://tc39.github.io/proposal-setmap-offrom/#sec-set.of
-__webpack_require__("cHUd")('Set');
-
-
-/***/ }),
-
 /***/ "zmvN":
 /***/ (function(module, exports, __webpack_require__) {

@@ -1368,38 +1321,46 @@ var _asyncToGenerator2 = _interopRequireDefault(__webpack_require__("+oT+"));

 var _promise = _interopRequireDefault(__webpack_require__("eVuF"));

-var _set = _interopRequireDefault(__webpack_require__("ttDY"));
-
 var _mitt = _interopRequireDefault(__webpack_require__("kiME"));
+/* global document, window */

-var _unfetch = _interopRequireDefault(__webpack_require__("m/Gl"));
-/* global document */
-// smaller version of https://gist.github.com/igrigorik/a02f2359f3bc50ca7a9c
-
-
-function supportsPreload(list) {
-  if (!list || !list.supports) {
-    return false;
-  }

+function supportsPreload(el) {
   try {
-    return list.supports('preload');
-  } catch (e) {
+    return el.relList.supports('preload');
+  } catch (_unused) {
     return false;
   }
 }

-const hasPreload = supportsPreload(document.createElement('link').relList);
+const hasPreload = supportsPreload(document.createElement('link'));
+
+function preloadScript(url) {
+  const link = document.createElement('link');
+  link.rel = 'preload';
+  link.crossOrigin = "anonymous";
+  link.href = url;
+  link.as = 'script';
+  document.head.appendChild(link);
+}

 class PageLoader {
   constructor(buildId, assetPrefix) {
     this.buildId = buildId;
     this.assetPrefix = assetPrefix;
     this.pageCache = {};
-    this.prefetchCache = new _set.default();
     this.pageRegisterEvents = (0, _mitt.default)();
     this.loadingRoutes = {};
     this.promisedBuildId = _promise.default.resolve();
+
+    if (false) {}
+
+    if (false) {}
+  } // Returns a promise for the dependencies for a particular route
+
+
+  getDependencies(route) {
+    return this.promisedBuildManifest.then(man => man[route] && man[route].map(url => "/_next/" + url) || []);
   }

   normalizeRoute(route) {
@@ -1446,67 +1407,55 @@ class PageLoader {
       this.pageRegisterEvents.on(route, fire); // If the page is loading via SSR, we need to wait for it
       // rather downloading it again.

-      if (document.getElementById("__NEXT_PAGE__" + route)) {
+      if (document.querySelector("script[data-next-page=\"" + route + "\"]")) {
         return;
-      } // Load the script if not asked to load yet.
-
-
-      if (!this.loadingRoutes[route]) {
-        this.loadScript(route);
-        this.loadingRoutes[route] = true;
       }
-    });
-  }

-  onDynamicBuildId() {
-    this.promisedBuildId = new _promise.default(resolve => {
-      (0, _unfetch.default)(this.assetPrefix + "/_next/static/HEAD_BUILD_ID").then(res => {
-        if (res.ok) {
-          return res;
+      if (!this.loadingRoutes[route]) {
+        if (false) {} else {
+          this.loadRoute(route);
+          this.loadingRoutes[route] = true;
         }
-
-        const err = new Error('Failed to fetch HEAD buildId');
-        err.res = res;
-        throw err;
-      }).then(res => res.text()).then(buildId => {
-        this.buildId = buildId.trim();
-      }).catch(() => {
-        // When this fails it's not a _huge_ deal, preload wont work and page
-        // navigation will 404, triggering a SSR refresh
-        console.warn('Failed to load BUILD_ID from server. ' + 'The following client-side page transition will likely 404 and cause a SSR.\n' + 'http://err.sh/zeit/next.js/head-build-id');
-      }).then(resolve, resolve);
+      }
     });
   }

-  loadScript(route) {
+  loadRoute(route) {
     var _this = this;

     return (0, _asyncToGenerator2.default)(function* () {
-      yield _this.promisedBuildId;
+      if (false) {}
+
       route = _this.normalizeRoute(route);
       let scriptRoute = route === '/' ? '/index.js' : route + ".js";
-      const script = document.createElement('script');
+      const url = _this.assetPrefix + "/_next/static/" + encodeURIComponent(_this.buildId) + "/pages" + scriptRoute;

-      if ( true && 'noModule' in script) {
-        script.type = 'module';
-        scriptRoute = scriptRoute.replace(/\.js$/, '.module.js');
-      }
+      _this.loadScript(url, route, true);
+    })();
+  }

-      const url = _this.assetPrefix + "/_next/static/" + encodeURIComponent(_this.buildId) + "/pages" + scriptRoute;
-      script.crossOrigin = "anonymous";
-      script.src = url;
+  loadScript(url, route, isPage) {
+    const script = document.createElement('script');

-      script.onerror = () => {
-        const error = new Error("Error loading script " + url);
-        error.code = 'PAGE_LOAD_ERROR';
+    if ( true && 'noModule' in script) {
+      script.type = 'module'; // Only page bundle scripts need to have .module added to url,
+      // dependencies already have it added during build manifest creation

-        _this.pageRegisterEvents.emit(route, {
-          error
-        });
-      };
+      if (isPage) url = url.replace(/\.js$/, '.module.js');
+    }

-      document.body.appendChild(script);
-    })();
+    script.crossOrigin = "anonymous";
+    script.src = url;
+
+    script.onerror = () => {
+      const error = new Error("Error loading script " + url);
+      error.code = 'PAGE_LOAD_ERROR';
+      this.pageRegisterEvents.emit(route, {
+        error
+      });
+    };
+
+    document.body.appendChild(script);
   } // This method if called by the route code.

@@ -1540,10 +1489,12 @@ class PageLoader {
     register();
   }

-  prefetch(route) {
+  prefetch(route, isDependency) {
     var _this2 = this;

     return (0, _asyncToGenerator2.default)(function* () {
+      if (false) {}
+
       route = _this2.normalizeRoute(route);
       let scriptRoute = (route === '/' ? '/index' : route) + ".js";

@@ -1551,31 +1502,36 @@ class PageLoader {
         scriptRoute = scriptRoute.replace(/\.js$/, '.module.js');
       }

-      if (_this2.prefetchCache.has(scriptRoute) || document.getElementById("__NEXT_PAGE__" + route)) {
+      const url = isDependency ? route : _this2.assetPrefix + "/_next/static/" + encodeURIComponent(_this2.buildId) + "/pages" + scriptRoute; // n.b. If preload is not supported, we fall back to `loadPage` which has
+      // its own deduping mechanism.
+
+      if (document.querySelector("link[rel=\"preload\"][href^=\"" + url + "\"], script[data-next-page=\"" + route + "\"]")) {
         return;
-      }
+      } // Inspired by quicklink, license: https://github.com/GoogleChromeLabs/quicklink/blob/master/LICENSE

-      _this2.prefetchCache.add(scriptRoute); // Inspired by quicklink, license: https://github.com/GoogleChromeLabs/quicklink/blob/master/LICENSE
-      // Don't prefetch if the user is on 2G / Don't prefetch if Save-Data is enabled

+      let cn;

-      if ('connection' in navigator) {
-        if ((navigator.connection.effectiveType || '').indexOf('2g') !== -1 || navigator.connection.saveData) {
+      if (cn = navigator.connection) {
+        // Don't prefetch if the user is on 2G or if Save-Data is enabled.
+        if ((cn.effectiveType || '').indexOf('2g') !== -1 || cn.saveData) {
           return;
         }
-      } // Feature detection is used to see if preload is supported
+      }
+
+      if (false) {} // Feature detection is used to see if preload is supported
       // If not fall back to loading script tags before the page is loaded
       // https://caniuse.com/#feat=link-rel-preload

       if (hasPreload) {
-        yield _this2.promisedBuildId;
-        const link = document.createElement('link');
-        link.rel = 'preload';
-        link.crossOrigin = "anonymous";
-        link.href = _this2.assetPrefix + "/_next/static/" + encodeURIComponent(_this2.buildId) + "/pages" + scriptRoute;
-        link.as = 'script';
-        document.head.appendChild(link);
+        preloadScript(url);
+        return;
+      }
+
+      if (isDependency) {
+        // loadPage will automatically handle depencies, so no need to
+        // preload them manually
         return;
       }

@@ -1591,17 +1547,6 @@ class PageLoader {
     })();
   }

-  clearCache(route) {
-    route = this.normalizeRoute(route);
-    delete this.pageCache[route];
-    delete this.loadingRoutes[route];
-    const script = document.getElementById("__NEXT_PAGE__" + route);
-
-    if (script) {
-      script.parentNode.removeChild(script);
-    }
-  }
-
 }

 exports.default = PageLoader;
```

Diff for webpack-HASH.module.js

```diff
@@ -10,7 +10,7 @@
 /******/ 		var moduleId, chunkId, i = 0, resolves = [];
 /******/ 		for(;i < chunkIds.length; i++) {
 /******/ 			chunkId = chunkIds[i];
-/******/ 			if(installedChunks[chunkId]) {
+/******/ 			if(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {
 /******/ 				resolves.push(installedChunks[chunkId][0]);
 /******/ 			}
 /******/ 			installedChunks[chunkId] = 0;
```

Diff for commons.HASH.module.js

```diff
@@ -14,7 +14,7 @@
  */

 Object.defineProperty(exports,"__esModule",{value:!0});var d=void 0,e=void 0,g=void 0,m=void 0,n=void 0;exports.unstable_now=void 0;exports.unstable_forceFrameRate=void 0;
-if( false||"function"!==typeof MessageChannel){var p=null,q=null,r=function(){if(null!==p)try{var a=exports.unstable_now();p(!0,a);p=null}catch(b){throw setTimeout(r,0),b;}};exports.unstable_now=function(){return Date.now()};d=function(a){null!==p?setTimeout(d,0,a):(p=a,setTimeout(r,0))};e=function(a,b){q=setTimeout(a,b)};g=function(){clearTimeout(q)};m=function(){return!1};n=exports.unstable_forceFrameRate=function(){}}else{var t=window.performance,u=window.Date,v=window.setTimeout,
+if("undefined"===typeof window||"function"!==typeof MessageChannel){var p=null,q=null,r=function(){if(null!==p)try{var a=exports.unstable_now();p(!0,a);p=null}catch(b){throw setTimeout(r,0),b;}};exports.unstable_now=function(){return Date.now()};d=function(a){null!==p?setTimeout(d,0,a):(p=a,setTimeout(r,0))};e=function(a,b){q=setTimeout(a,b)};g=function(){clearTimeout(q)};m=function(){return!1};n=exports.unstable_forceFrameRate=function(){}}else{var t=window.performance,u=window.Date,v=window.setTimeout,
 w=window.clearTimeout,x=window.requestAnimationFrame,y=window.cancelAnimationFrame;"undefined"!==typeof console&&("function"!==typeof x&&console.error("This browser doesn't support requestAnimationFrame. Make sure that you load a polyfill in older browsers. https://fb.me/react-polyfills"),"function"!==typeof y&&console.error("This browser doesn't support cancelAnimationFrame. Make sure that you load a polyfill in older browsers. https://fb.me/react-polyfills"));exports.unstable_now="object"===typeof t&&
 "function"===typeof t.now?function(){return t.now()}:function(){return u.now()};var z=!1,A=null,B=-1,C=-1,D=33.33,E=-1,F=-1,G=0,H=!1;m=function(){return exports.unstable_now()>=G};n=function(){};exports.unstable_forceFrameRate=function(a){0>a||125<a?console.error("forceFrameRate takes a positive int between 0 and 125, forcing framerates higher than 125 fps is not unsupported"):0<a?(D=Math.floor(1E3/a),H=!0):(D=33.33,H=!1)};var J=function(){if(null!==A){var a=exports.unstable_now(),b=0<G-a;try{A(b,
 a)||(A=null)}catch(c){throw I.postMessage(null),c;}}},K=new MessageChannel,I=K.port2;K.port1.onmessage=J;var L=function(a){if(null===A)F=E=-1,z=!1;else{z=!0;x(function(a){w(B);L(a)});var b=function(){G=exports.unstable_now()+D/2;J();B=v(b,3*D)};B=v(b,3*D);if(-1!==E&&.1<a-E){var c=a-E;!H&&-1!==F&&c<D&&F<D&&(D=c<F?F:c,8.33>D&&(D=8.33));F=c}E=a;G=a+D;I.postMessage(null)}};d=function(a){A=a;z||(z=!0,x(function(a){L(a)}))};e=function(a,b){C=v(function(){a(exports.unstable_now())},b)};g=function(){w(C);
@@ -360,13 +360,11 @@ var objectKeys = Object.keys || function (obj) {
 "use strict";

-var _interopRequireDefault = __webpack_require__("KI45");
-
-var _keys = _interopRequireDefault(__webpack_require__("pLtp"));
+var _Object$keys = __webpack_require__("pLtp");

-var _defineProperty = _interopRequireDefault(__webpack_require__("hfKm"));
+var _Object$defineProperty = __webpack_require__("hfKm");

-(0, _defineProperty.default)(exports, "__esModule", {
+_Object$defineProperty(exports, "__esModule", {
   value: true
 });

@@ -383,13 +381,15 @@ function getRouteMatcher(routeRegex) {
     }

     const params = {};
-    (0, _keys.default)(groups).forEach(slugName => {
+
+    _Object$keys(groups).forEach(slugName => {
       const m = routeMatch[groups[slugName]];

       if (m !== undefined) {
         params[slugName] = decodeURIComponent(m);
       }
     });
+
     return params;
   };
 }
@@ -411,10 +411,10 @@ module.exports = function (it) {
 /***/ }),

 /***/ "5T2Y":
-/***/ (function(module, exports, __webpack_require__) {
+/***/ (function(module, exports) {

 // https://github.com/zloirock/core-js/issues/86#issuecomment-115759028
-var global = module.exports =  true && window.Math == Math
+var global = module.exports = typeof window != 'undefined' && window.Math == Math
   ? window : typeof self != 'undefined' && self.Math == Math ? self
   // eslint-disable-next-line no-new-func
   : Function('return this')();
@@ -489,11 +489,9 @@ module.exports = function (object, names) {
 "use strict";

-var _interopRequireDefault = __webpack_require__("KI45");
-
-var _defineProperty = _interopRequireDefault(__webpack_require__("hfKm"));
+var _Object$defineProperty = __webpack_require__("hfKm");

-(0, _defineProperty.default)(exports, "__esModule", {
+_Object$defineProperty(exports, "__esModule", {
   value: true
 });

@@ -546,11 +544,9 @@ module.exports = function (it) {
 "use strict";

-var _interopRequireDefault = __webpack_require__("KI45");
-
-var _defineProperty = _interopRequireDefault(__webpack_require__("hfKm"));
+var _Object$defineProperty = __webpack_require__("hfKm");

-var __importStar = void 0 && (void 0).__importStar || function (mod) {
+var __importStar = this && this.__importStar || function (mod) {
   if (mod && mod.__esModule) return mod;
   var result = {};
   if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
@@ -558,7 +554,7 @@ var __importStar = void 0 && (void 0).__importStar || function (mod) {
   return result;
 };

-(0, _defineProperty.default)(exports, "__esModule", {
+_Object$defineProperty(exports, "__esModule", {
   value: true
 });

@@ -585,13 +581,11 @@ module.exports = function (it, key) {
 "use strict";

-var _interopRequireDefault = __webpack_require__("KI45");
-
-var _keys = _interopRequireDefault(__webpack_require__("pLtp"));
+var _Object$keys = __webpack_require__("pLtp");

-var _defineProperty = _interopRequireDefault(__webpack_require__("hfKm"));
+var _Object$defineProperty = __webpack_require__("hfKm");

-(0, _defineProperty.default)(exports, "__esModule", {
+_Object$defineProperty(exports, "__esModule", {
   value: true
 });

@@ -687,6 +681,8 @@ function formatWithValidation(url, options) {
 }

 exports.formatWithValidation = formatWithValidation;
+exports.SUPPORTS_PERFORMANCE = typeof performance !== 'undefined';
+exports.SUPPORTS_PERFORMANCE_USER_TIMING = exports.SUPPORTS_PERFORMANCE && typeof performance.mark === 'function' && typeof performance.measure === 'function';

 /***/ }),

@@ -2364,21 +2360,19 @@ $export($export.S + $export.F * !(USE_NATIVE && __webpack_require__("TuGD")(func
 "use strict";

-var _interopRequireDefault = __webpack_require__("KI45");
-
-var _promise = _interopRequireDefault(__webpack_require__("eVuF"));
+var _Promise = __webpack_require__("eVuF");

-var _assign = _interopRequireDefault(__webpack_require__("UXZV"));
+var _Object$assign = __webpack_require__("UXZV");

-var _defineProperty = _interopRequireDefault(__webpack_require__("hfKm"));
+var _Object$defineProperty = __webpack_require__("hfKm");

-var __importDefault = void 0 && (void 0).__importDefault || function (mod) {
+var __importDefault = this && this.__importDefault || function (mod) {
   return mod && mod.__esModule ? mod : {
     "default": mod
   };
 };

-(0, _defineProperty.default)(exports, "__esModule", {
+_Object$defineProperty(exports, "__esModule", {
   value: true
 });

@@ -2504,13 +2498,14 @@ class Router {
             as,
             options
           } = history.state;
-          this.changeState('replaceState', url, as, (0, _assign.default)({}, options, {
+          this.changeState('replaceState', url, as, _Object$assign({}, options, {
             fromExternal: true
           }));
         }
       });
     }
-  }
+  } // @deprecated backwards compatibility even though it's a private method.
+

   static _rewriteUrlForNextExport(url) {
     return rewrite_url_for_export_1.rewriteUrlForNextExport(url);
@@ -2523,9 +2518,10 @@ class Router {
       throw new Error("Cannot update unavailable route: ".concat(route));
     }

-    const newData = (0, _assign.default)({}, data, {
+    const newData = _Object$assign({}, data, {
       Component
     });
+
     this.components[route] = newData; // pages/_app.js updated

     if (route === '/_app') {
@@ -2577,9 +2573,14 @@ class Router {
   }

   change(method, _url, _as, options) {
-    return new _promise.default((resolve, reject) => {
-      // If url and as provided as an object representation,
+    return new _Promise((resolve, reject) => {
+      // marking route changes as a navigation start entry
+      if (utils_1.SUPPORTS_PERFORMANCE_USER_TIMING) {
+        performance.mark('routeChange');
+      } // If url and as provided as an object representation,
       // we'll format them into the string version here.
+
+
       const url = typeof _url === 'object' ? utils_1.formatWithValidation(_url) : _url;
       let as = typeof _as === 'object' ? utils_1.formatWithValidation(_as) : _as; // Add the ending slash to the paths. So, we can serve the
       // "<page>/index.html" directly for the SSR page.
@@ -2603,13 +2604,21 @@ class Router {

       const {
         pathname,
-        query
-      } = url_1.parse(url, true); // If asked to change the current URL we should reload the current page
+        query,
+        protocol
+      } = url_1.parse(url, true);
+
+      if (!pathname || protocol) {
+        if (false) {}
+
+        return resolve(false);
+      } // If asked to change the current URL we should reload the current page
       // (not location.reload() but reload getInitialProps and other Next.js stuffs)
       // We also need to set the method = replaceState always
       // as this should not go into the history (That's how browsers work)
       // We should compare the new asPath to the current asPath, not the url

+
       if (!this.urlIsNew(as)) {
         method = 'replaceState';
       } // @ts-ignore pathname is always a string
@@ -2633,7 +2642,7 @@ class Router {
         } // Merge params into `query`, overwriting any specified in search

-        (0, _assign.default)(query, routeMatch);
+        _Object$assign(query, routeMatch);
       }

       Router.events.emit('routeChangeStart', as); // If shallow is true and the route exists in the router cache we reuse the previous result
@@ -2655,7 +2664,7 @@ class Router {
         if (false) {} // @ts-ignore pathname is always defined

-        this.set(route, pathname, query, as, (0, _assign.default)({}, routeInfo, {
+        this.set(route, pathname, query, as, _Object$assign({}, routeInfo, {
           hash
         }));

@@ -2691,10 +2700,10 @@ class Router {
     // If the route is already rendered on the screen.

     if (shallow && cachedRouteInfo && this.route === route) {
-      return _promise.default.resolve(cachedRouteInfo);
+      return _Promise.resolve(cachedRouteInfo);
     }

-    return new _promise.default((resolve, reject) => {
+    return new _Promise((resolve, reject) => {
       if (cachedRouteInfo) {
         return resolve(cachedRouteInfo);
       }
@@ -2709,25 +2718,20 @@ class Router {

       if (false) {}

-      return new _promise.default((resolve, reject) => {
-        const ctx = {
+      return new _Promise((resolve, reject) => {
+        // we provide AppTree later so this needs to be `any`
+        this.getInitialProps(Component, {
           pathname,
           query,
           asPath: as
-        };
-        this.getInitialProps(Component, ctx).then(props => {
-          // if data is inlined during prerender it is a string
-          if (props && typeof props.pageProps === 'string') {
-            props.pageProps = JSON.parse(props.pageProps);
-          }
-
+        }).then(props => {
           routeInfo.props = props;
           this.components[route] = routeInfo;
           resolve(routeInfo);
         }, reject);
       });
     }).catch(err => {
-      return new _promise.default(resolve => {
+      return new _Promise(resolve => {
         if (err.code === 'PAGE_LOAD_ERROR') {
           // If we can't load the page it could be one of following reasons
           //  1. Page doesn't exists
@@ -2756,13 +2760,12 @@ class Router {
             Component,
             err
           };
-          const ctx = {
-            err,
-            pathname,
-            query
-          };
-          return new _promise.default(resolve => {
-            this.getInitialProps(Component, ctx).then(props => {
+          return new _Promise(resolve => {
+            this.getInitialProps(Component, {
+              err,
+              pathname,
+              query
+            }).then(props => {
               routeInfo.props = props;
               routeInfo.error = err;
               resolve(routeInfo);
@@ -2852,12 +2855,20 @@ class Router {

   prefetch(url) {
-    return new _promise.default((resolve, reject) => {
-      // Prefetch is not supported in development mode because it would trigger on-demand-entries
-      if (false) {}
+    return new _Promise((resolve, reject) => {
       const {
-        pathname
-      } = url_1.parse(url); // @ts-ignore pathname is always defined
+        pathname,
+        protocol
+      } = url_1.parse(url);
+
+      if (!pathname || protocol) {
+        if (false) {}
+
+        return;
+      } // Prefetch is not supported in development mode because it would trigger on-demand-entries
+
+
+      if (false) {} // @ts-ignore pathname is always defined

       const route = toRoute(pathname);
       this.pageLoader.prefetch(route).then(resolve, reject);
@@ -2897,12 +2908,47 @@ class Router {
     const {
       Component: App
     } = this.components['/_app'];
-    const props = await utils_1.loadGetInitialProps(App, {
-      AppTree: this._wrapApp(App),
-      Component,
-      router: this,
-      ctx
-    });
+    let props;
+
+    if ( // @ts-ignore workaround for dead-code elimination
+    (self.__HAS_SPR || "production" !== 'production') && Component.__NEXT_SPR) {
+      let status;
+      const url = ctx.asPath ? ctx.asPath : url_1.format({
+        pathname: ctx.pathname,
+        query: ctx.query
+      });
+      props = await fetch(url, {
+        headers: {
+          'content-type': 'application/json'
+        }
+      }).then(res => {
+        if (!res.ok) {
+          status = res.status;
+          throw new Error('failed to load prerender data');
+        }
+
+        return res.json();
+      }).then(pageProps => {
+        return {
+          pageProps
+        };
+      }).catch(err => {
+        return {
+          error: err.message,
+          status
+        };
+      });
+    } else {
+      const AppTree = this._wrapApp(App);
+
+      ctx.AppTree = AppTree;
+      props = await utils_1.loadGetInitialProps(App, {
+        AppTree,
+        Component,
+        router: this,
+        ctx
+      });
+    }

     if (cancel === this.clc) {
       this.clc = null;
@@ -2963,11 +3009,9 @@ module.exports = __webpack_require__("/eQG");
 "use strict";

-var _interopRequireDefault = __webpack_require__("KI45");
-
-var _defineProperty = _interopRequireDefault(__webpack_require__("hfKm"));
+var _Object$defineProperty = __webpack_require__("hfKm");

-(0, _defineProperty.default)(exports, "__esModule", {
+_Object$defineProperty(exports, "__esModule", {
   value: true
 });

@@ -4192,14 +4236,13 @@ module.exports = __webpack_require__("NegM");
 "use strict";

-var _interopRequireDefault = __webpack_require__("KI45");
-
-var _defineProperty = _interopRequireDefault(__webpack_require__("hfKm"));
+var _Object$defineProperty = __webpack_require__("hfKm");

-(0, _defineProperty.default)(exports, "__esModule", {
+_Object$defineProperty(exports, "__esModule", {
   value: true
 }); // Identify /[param]/ in route string

+
 const TEST_ROUTE = /\/\[[^\/]+?\](?=\/|$)/;

 function isDynamicRoute(route) {
@@ -4319,18 +4362,17 @@ The above copyright notice and this permission notice shall be included in all c
 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

-var _interopRequireDefault = __webpack_require__("KI45");
-
-var _create = _interopRequireDefault(__webpack_require__("SqZg"));
+var _Object$create = __webpack_require__("SqZg");

-var _defineProperty = _interopRequireDefault(__webpack_require__("hfKm"));
+var _Object$defineProperty = __webpack_require__("hfKm");

-(0, _defineProperty.default)(exports, "__esModule", {
+_Object$defineProperty(exports, "__esModule", {
   value: true
 });

 function mitt() {
-  const all = (0, _create.default)(null);
+  const all = _Object$create(null);
+
   return {
     on(type, handler) {
       ;
@@ -4474,8 +4516,7 @@ const singletonRouter = {

 }; // Create public properties and methods of the router in the singletonRouter

-const urlPropertyFields = ['pathname', 'route', 'query', 'asPath'];
-const propertyFields = ['components'];
+const urlPropertyFields = ['pathname', 'route', 'query', 'asPath', 'components'];
 const routerEvents = ['routeChangeStart', 'beforeHistoryChange', 'routeChangeComplete', 'routeChangeError', 'hashChangeStart', 'hashChangeComplete'];
 const coreMethodFields = ['push', 'replace', 'reload', 'back', 'prefetch', 'beforePopState']; // Events is a static property on the router, the router doesn't have to be initialized to use it

@@ -4485,7 +4526,7 @@ const coreMethodFields = ['push', 'replace', 'reload', 'back', 'prefetch', 'befo
   }

 });
-propertyFields.concat(urlPropertyFields).forEach(field => {
+urlPropertyFields.forEach(field => {
   // Here we need to use Object.defineProperty because, we need to return
   // the property assigned to the actual router
   // The value might get changed as we change routes and this is the
@@ -4581,18 +4622,6 @@ function makePublicRouterInstance(router) {

   instance.events = _router2.default.events;
-  propertyFields.forEach(field => {
-    // Here we need to use Object.defineProperty because, we need to return
-    // the property assigned to the actual router
-    // The value might get changed as we change routes and this is the
-    // proper way to access it
-    (0, _defineProperty.default)(instance, field, {
-      get() {
-        return _router[field];
-      }
-
-    });
-  });
   coreMethodFields.forEach(field => {
     instance[field] = function () {
       return _router[field](...arguments);
@@ -5004,7 +5033,7 @@ module.exports = Object.keys || function keys(O) {
 /***/ }),

 /***/ "yLpj":
-/***/ (function(module, exports, __webpack_require__) {
+/***/ (function(module, exports) {

 var g;

@@ -5018,7 +5047,7 @@ try {
 	g = g || new Function("return this")();
 } catch (e) {
 	// This works if the window reference is available
-	if (true) g = window;
+	if (typeof window === "object") g = window;
 }

 // g can still be undefined, but nothing to do about it...
@@ -5055,7 +5084,7 @@ var Ca={injectEventPluginOrder:function(a){if(ba)throw t(Error(101));ba=Array.pr
 function Da(a,b){var c=a.stateNode;if(!c)return null;var d=sa(c);if(!d)return null;c=d[b];a:switch(b){case "onClick":case "onClickCapture":case "onDoubleClick":case "onDoubleClickCapture":case "onMouseDown":case "onMouseDownCapture":case "onMouseMove":case "onMouseMoveCapture":case "onMouseUp":case "onMouseUpCapture":(d=!d.disabled)||(a=a.type,d=!("button"===a||"input"===a||"select"===a||"textarea"===a));a=!d;break a;default:a=!1}if(a)return null;if(c&&"function"!==typeof c)throw t(Error(231),b,typeof c);
 return c}var Ea=Math.random().toString(36).slice(2),Fa="__reactInternalInstance$"+Ea,Ga="__reactEventHandlers$"+Ea;function Ha(a){if(a[Fa])return a[Fa];for(;!a[Fa];)if(a.parentNode)a=a.parentNode;else return null;a=a[Fa];return 5===a.tag||6===a.tag?a:null}function Ia(a){a=a[Fa];return!a||5!==a.tag&&6!==a.tag?null:a}function Ja(a){if(5===a.tag||6===a.tag)return a.stateNode;throw t(Error(33));}function Ka(a){return a[Ga]||null}function La(a){do a=a.return;while(a&&5!==a.tag);return a?a:null}
 function Ma(a,b,c){if(b=Da(a,c.dispatchConfig.phasedRegistrationNames[b]))c._dispatchListeners=xa(c._dispatchListeners,b),c._dispatchInstances=xa(c._dispatchInstances,a)}function Na(a){if(a&&a.dispatchConfig.phasedRegistrationNames){for(var b=a._targetInst,c=[];b;)c.push(b),b=La(b);for(b=c.length;0<b--;)Ma(c[b],"captured",a);for(b=0;b<c.length;b++)Ma(c[b],"bubbled",a)}}
-function Oa(a,b,c){a&&c&&c.dispatchConfig.registrationName&&(b=Da(a,c.dispatchConfig.registrationName))&&(c._dispatchListeners=xa(c._dispatchListeners,b),c._dispatchInstances=xa(c._dispatchInstances,a))}function Pa(a){a&&a.dispatchConfig.registrationName&&Oa(a._targetInst,null,a)}function Qa(a){ya(a,Na)}var Ra=!( false||"undefined"===typeof window.document||"undefined"===typeof window.document.createElement);
+function Oa(a,b,c){a&&c&&c.dispatchConfig.registrationName&&(b=Da(a,c.dispatchConfig.registrationName))&&(c._dispatchListeners=xa(c._dispatchListeners,b),c._dispatchInstances=xa(c._dispatchInstances,a))}function Pa(a){a&&a.dispatchConfig.registrationName&&Oa(a._targetInst,null,a)}function Qa(a){ya(a,Na)}var Ra=!("undefined"===typeof window||"undefined"===typeof window.document||"undefined"===typeof window.document.createElement);
 function Sa(a,b){var c={};c[a.toLowerCase()]=b.toLowerCase();c["Webkit"+a]="webkit"+b;c["Moz"+a]="moz"+b;return c}var Ta={animationend:Sa("Animation","AnimationEnd"),animationiteration:Sa("Animation","AnimationIteration"),animationstart:Sa("Animation","AnimationStart"),transitionend:Sa("Transition","TransitionEnd")},Ua={},Va={};
 Ra&&(Va=document.createElement("div").style,"AnimationEvent"in window||(delete Ta.animationend.animation,delete Ta.animationiteration.animation,delete Ta.animationstart.animation),"TransitionEvent"in window||delete Ta.transitionend.transition);function Wa(a){if(Ua[a])return Ua[a];if(!Ta[a])return a;var b=Ta[a],c;for(c in b)if(b.hasOwnProperty(c)&&c in Va)return Ua[a]=b[c];return a}
 var Xa=Wa("animationend"),Ya=Wa("animationiteration"),Za=Wa("animationstart"),ab=Wa("transitionend"),bb="abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange seeked seeking stalled suspend timeupdate volumechange waiting".split(" "),cb=null,db=null,eb=null;
```
</details>
<details>
<summary>Diff for <strong>_app.js</strong></summary>

```diff
@@ -1,49 +1,4 @@
-(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[3],{
-
-/***/ "+oT+":
-/***/ (function(module, exports, __webpack_require__) {
-
-var _Promise = __webpack_require__("eVuF");
-
-function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
-  try {
-    var info = gen[key](arg);
-    var value = info.value;
-  } catch (error) {
-    reject(error);
-    return;
-  }
-
-  if (info.done) {
-    resolve(value);
-  } else {
-    _Promise.resolve(value).then(_next, _throw);
-  }
-}
-
-function _asyncToGenerator(fn) {
-  return function () {
-    var self = this,
-        args = arguments;
-    return new _Promise(function (resolve, reject) {
-      var gen = fn.apply(self, args);
-
-      function _next(value) {
-        asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
-      }
-
-      function _throw(err) {
-        asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
-      }
-
-      _next(undefined);
-    });
-  };
-}
-
-module.exports = _asyncToGenerator;
-
-/***/ }),
+(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[2],{

 /***/ "B5Ud":
 /***/ (function(module, exports, __webpack_require__) {
@@ -51,19 +6,17 @@ module.exports = _asyncToGenerator;
 "use strict";

-var _interopRequireDefault2 = __webpack_require__("KI45");
-
-var _classCallCheck2 = _interopRequireDefault2(__webpack_require__("0iUn"));
+var _classCallCheck = __webpack_require__("/HRN");

-var _createClass2 = _interopRequireDefault2(__webpack_require__("sLSF"));
+var _createClass = __webpack_require__("WaGi");

-var _possibleConstructorReturn2 = _interopRequireDefault2(__webpack_require__("MI3g"));
+var _possibleConstructorReturn = __webpack_require__("ZDA2");

-var _getPrototypeOf2 = _interopRequireDefault2(__webpack_require__("a7VT"));
+var _getPrototypeOf = __webpack_require__("/+P4");

-var _inherits2 = _interopRequireDefault2(__webpack_require__("Tit0"));
+var _inherits = __webpack_require__("N9n2");

-var _regenerator = _interopRequireDefault2(__webpack_require__("ln6h"));
+var _regeneratorRuntime = __webpack_require__("ln6h");

 var _interopRequireDefault = __webpack_require__("KI45");

@@ -98,9 +51,9 @@ function appGetInitialProps(_x) {
 function _appGetInitialProps() {
   _appGetInitialProps = (0, _asyncToGenerator2["default"])(
   /*#__PURE__*/
-  _regenerator["default"].mark(function _callee(_ref) {
+  _regeneratorRuntime.mark(function _callee(_ref) {
     var Component, ctx, pageProps;
-    return _regenerator["default"].wrap(function _callee$(_context) {
+    return _regeneratorRuntime.wrap(function _callee$(_context) {
       while (1) {
         switch (_context.prev = _context.next) {
           case 0:
@@ -127,14 +80,15 @@ function _appGetInitialProps() {
 var App =
 /*#__PURE__*/
 function (_react$default$Compon) {
-  (0, _inherits2["default"])(App, _react$default$Compon);
+  _inherits(App, _react$default$Compon);

   function App() {
-    (0, _classCallCheck2["default"])(this, App);
-    return (0, _possibleConstructorReturn2["default"])(this, (0, _getPrototypeOf2["default"])(App).apply(this, arguments));
+    _classCallCheck(this, App);
+
+    return _possibleConstructorReturn(this, _getPrototypeOf(App).apply(this, arguments));
   }

-  (0, _createClass2["default"])(App, [{
+  _createClass(App, [{
     key: "getChildContext",
     value: function getChildContext() {
       return {
@@ -157,11 +111,12 @@ function (_react$default$Compon) {
           Component = _this$props.Component,
           pageProps = _this$props.pageProps;
       var url = createUrl(router);
-      return _react["default"].createElement(Container, null, _react["default"].createElement(Component, (0, _extends2["default"])({}, pageProps, {
+      return _react["default"].createElement(Component, (0, _extends2["default"])({}, pageProps, {
         url: url
-      })));
+      }));
     }
   }]);
+
   return App;
 }(_react["default"].Component); // @deprecated noop for now until removal
```
</details>
<details>
<summary>Diff for <strong>_error.js</strong></summary>

```diff
@@ -1,4 +1,4 @@
-(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[4],{
+(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[3],{

 /***/ "+iuc":
 /***/ (function(module, exports, __webpack_require__) {
@@ -21,17 +21,15 @@ module.exports = __webpack_require__("WEpk").Set;
 "use strict";

-var _interopRequireDefault2 = __webpack_require__("KI45");
+var _classCallCheck = __webpack_require__("/HRN");

-var _classCallCheck2 = _interopRequireDefault2(__webpack_require__("0iUn"));
+var _createClass = __webpack_require__("WaGi");

-var _createClass2 = _interopRequireDefault2(__webpack_require__("sLSF"));
+var _possibleConstructorReturn = __webpack_require__("ZDA2");

-var _possibleConstructorReturn2 = _interopRequireDefault2(__webpack_require__("MI3g"));
+var _getPrototypeOf = __webpack_require__("/+P4");

-var _getPrototypeOf2 = _interopRequireDefault2(__webpack_require__("a7VT"));
-
-var _inherits2 = _interopRequireDefault2(__webpack_require__("Tit0"));
+var _inherits = __webpack_require__("N9n2");

 var _interopRequireDefault = __webpack_require__("KI45");

@@ -55,14 +53,15 @@ var statusCodes = {
 var Error =
 /*#__PURE__*/
 function (_react$default$Compon) {
-  (0, _inherits2["default"])(Error, _react$default$Compon);
+  _inherits(Error, _react$default$Compon);

   function Error() {
-    (0, _classCallCheck2["default"])(this, Error);
-    return (0, _possibleConstructorReturn2["default"])(this, (0, _getPrototypeOf2["default"])(Error).apply(this, arguments));
+    _classCallCheck(this, Error);
+
+    return _possibleConstructorReturn(this, _getPrototypeOf(Error).apply(this, arguments));
   }

-  (0, _createClass2["default"])(Error, [{
+  _createClass(Error, [{
     key: "render",
     value: function render() {
       var statusCode = this.props.statusCode;
@@ -92,6 +91,7 @@ function (_react$default$Compon) {
       };
     }
   }]);
+
   return Error;
 }(_react["default"].Component);

@@ -160,17 +160,26 @@ module.exports = __webpack_require__("WEpk").Array.from;

 /***/ }),

+/***/ "2PDY":
+/***/ (function(module, exports) {
+
+function _nonIterableSpread() {
+  throw new TypeError("Invalid attempt to spread non-iterable instance");
+}
+
+module.exports = _nonIterableSpread;
+
+/***/ }),
+
 /***/ "3JuP":
 /***/ (function(module, exports, __webpack_require__) {

 "use strict";

-var _interopRequireDefault = __webpack_require__("KI45");
-
-var _defineProperty = _interopRequireDefault(__webpack_require__("hfKm"));
+var _Object$defineProperty = __webpack_require__("hfKm");

-var __importStar = void 0 && (void 0).__importStar || function (mod) {
+var __importStar = this && this.__importStar || function (mod) {
   if (mod && mod.__esModule) return mod;
   var result = {};
   if (mod != null) for (var k in mod) {
@@ -180,7 +189,7 @@ var __importStar = void 0 && (void 0).__importStar || function (mod) {
   return result;
 };

-(0, _defineProperty["default"])(exports, "__esModule", {
+_Object$defineProperty(exports, "__esModule", {
   value: true
 });

@@ -196,40 +205,38 @@ exports.AmpStateContext = React.createContext({});
 "use strict";

-var _interopRequireDefault = __webpack_require__("KI45");
-
-var _classCallCheck2 = _interopRequireDefault(__webpack_require__("0iUn"));
+var _classCallCheck = __webpack_require__("/HRN");

-var _possibleConstructorReturn2 = _interopRequireDefault(__webpack_require__("MI3g"));
+var _possibleConstructorReturn = __webpack_require__("ZDA2");

-var _getPrototypeOf2 = _interopRequireDefault(__webpack_require__("a7VT"));
+var _getPrototypeOf = __webpack_require__("/+P4");

-var _assertThisInitialized2 = _interopRequireDefault(__webpack_require__("AT/M"));
+var _assertThisInitialized = __webpack_require__("K47E");

-var _createClass2 = _interopRequireDefault(__webpack_require__("sLSF"));
+var _createClass = __webpack_require__("WaGi");

-var _inherits2 = _interopRequireDefault(__webpack_require__("Tit0"));
+var _inherits = __webpack_require__("N9n2");

-var _toConsumableArray2 = _interopRequireDefault(__webpack_require__("dfwq"));
+var _toConsumableArray = __webpack_require__("TbGu");

-var _set = _interopRequireDefault(__webpack_require__("ttDY"));
+var _Set = __webpack_require__("ttDY");

-var _defineProperty = _interopRequireDefault(__webpack_require__("hfKm"));
+var _Object$defineProperty = __webpack_require__("hfKm");

-(0, _defineProperty["default"])(exports, "__esModule", {
+_Object$defineProperty(exports, "__esModule", {
   value: true
 });

 var react_1 = __webpack_require__("q1tI");

-var isServer = "object" === 'undefined';
+var isServer = false;

 exports["default"] = function () {
-  var mountedInstances = new _set["default"]();
+  var mountedInstances = new _Set();
   var state;

   function emitChange(component) {
-    state = component.props.reduceComponentsToState((0, _toConsumableArray2["default"])(mountedInstances), component.props);
+    state = component.props.reduceComponentsToState(_toConsumableArray(mountedInstances), component.props);

     if (component.props.handleStateChange) {
       component.props.handleStateChange(state);
@@ -239,8 +246,9 @@ exports["default"] = function () {
   return (
     /*#__PURE__*/
     function (_react_1$Component) {
-      (0, _inherits2["default"])(_class, _react_1$Component);
-      (0, _createClass2["default"])(_class, null, [{
+      _inherits(_class, _react_1$Component);
+
+      _createClass(_class, null, [{
         key: "rewind",
         // Used when server rendering
         value: function rewind() {
@@ -254,18 +262,19 @@ exports["default"] = function () {
       function _class(props) {
         var _this;

-        (0, _classCallCheck2["default"])(this, _class);
-        _this = (0, _possibleConstructorReturn2["default"])(this, (0, _getPrototypeOf2["default"])(_class).call(this, props));
+        _classCallCheck(this, _class);
+
+        _this = _possibleConstructorReturn(this, _getPrototypeOf(_class).call(this, props));

         if (isServer) {
-          mountedInstances.add((0, _assertThisInitialized2["default"])(_this));
-          emitChange((0, _assertThisInitialized2["default"])(_this));
+          mountedInstances.add(_assertThisInitialized(_this));
+          emitChange(_assertThisInitialized(_this));
         }

         return _this;
       }

-      (0, _createClass2["default"])(_class, [{
+      _createClass(_class, [{
         key: "componentDidMount",
         value: function componentDidMount() {
           mountedInstances.add(this);
@@ -288,6 +297,7 @@ exports["default"] = function () {
           return null;
         }
       }]);
+
       return _class;
     }(react_1.Component)
   );
@@ -362,11 +372,9 @@ module.exports = function (original) {
 "use strict";

-var _interopRequireDefault = __webpack_require__("KI45");
-
-var _defineProperty = _interopRequireDefault(__webpack_require__("hfKm"));
+var _Object$defineProperty = __webpack_require__("hfKm");

-var __importStar = void 0 && (void 0).__importStar || function (mod) {
+var __importStar = this && this.__importStar || function (mod) {
   if (mod && mod.__esModule) return mod;
   var result = {};
   if (mod != null) for (var k in mod) {
@@ -376,7 +384,7 @@ var __importStar = void 0 && (void 0).__importStar || function (mod) {
   return result;
 };

-(0, _defineProperty["default"])(exports, "__esModule", {
+_Object$defineProperty(exports, "__esModule", {
   value: true
 });

@@ -402,6 +410,21 @@ module.exports = function (object, index, value) {

 /***/ }),

+/***/ "PQJW":
+/***/ (function(module, exports, __webpack_require__) {
+
+var _Array$from = __webpack_require__("d04V");
+
+var _isIterable = __webpack_require__("yLu3");
+
+function _iterableToArray(iter) {
+  if (_isIterable(Object(iter)) || Object.prototype.toString.call(iter) === "[object Arguments]") return _Array$from(iter);
+}
+
+module.exports = _iterableToArray;
+
+/***/ }),
+
 /***/ "PgRs":
 /***/ (function(module, exports, __webpack_require__) {

@@ -424,6 +447,23 @@ module.exports = function (iter, ITERATOR) {

 /***/ }),

+/***/ "TbGu":
+/***/ (function(module, exports, __webpack_require__) {
+
+var arrayWithoutHoles = __webpack_require__("fGSI");
+
+var iterableToArray = __webpack_require__("PQJW");
+
+var nonIterableSpread = __webpack_require__("2PDY");
+
+function _toConsumableArray(arr) {
+  return arrayWithoutHoles(arr) || iterableToArray(arr) || nonIterableSpread();
+}
+
+module.exports = _toConsumableArray;
+
+/***/ }),
+
 /***/ "V+O7":
 /***/ (function(module, exports, __webpack_require__) {

@@ -697,17 +737,15 @@ module.exports = {
 "use strict";

-var _interopRequireDefault = __webpack_require__("KI45");
-
-var _defineProperty = _interopRequireDefault(__webpack_require__("hfKm"));
+var _Object$defineProperty = __webpack_require__("hfKm");

-var __importDefault = void 0 && (void 0).__importDefault || function (mod) {
+var __importDefault = this && this.__importDefault || function (mod) {
   return mod && mod.__esModule ? mod : {
     "default": mod
   };
 };

-(0, _defineProperty["default"])(exports, "__esModule", {
+_Object$defineProperty(exports, "__esModule", {
   value: true
 });

@@ -730,9 +768,8 @@ function isInAmpMode() {
 exports.isInAmpMode = isInAmpMode;

 function useAmp() {
-  var ampState = react_1["default"].useContext(amp_context_1.AmpStateContext); // un-comment below to not be considered AMP in dirty mode
-
-  return isInAmpMode(ampState); // && ampMode.hasQuery
+  // Don't assign the context value to a variable to save bytes
+  return isInAmpMode(react_1["default"].useContext(amp_context_1.AmpStateContext));
 }

 exports.useAmp = useAmp;
@@ -813,20 +850,13 @@ $export($export.P + $export.R, 'Set', { toJSON: __webpack_require__("8iia")('Set

 /***/ }),

-/***/ "dfwq":
-/***/ (function(module, __webpack_exports__, __webpack_require__) {
-
-"use strict";
-__webpack_require__.r(__webpack_exports__);
-
-// EXTERNAL MODULE: ./node_modules/@babel/runtime-corejs2/core-js/array/is-array.js
-var is_array = __webpack_require__("p0XB");
-var is_array_default = /*#__PURE__*/__webpack_require__.n(is_array);
+/***/ "fGSI":
+/***/ (function(module, exports, __webpack_require__) {

-// CONCATENATED MODULE: ./node_modules/@babel/runtime-corejs2/helpers/esm/arrayWithoutHoles.js
+var _Array$isArray = __webpack_require__("p0XB");

 function _arrayWithoutHoles(arr) {
-  if (is_array_default()(arr)) {
+  if (_Array$isArray(arr)) {
     for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) {
       arr2[i] = arr[i];
     }
@@ -834,32 +864,8 @@ function _arrayWithoutHoles(arr) {
     return arr2;
   }
 }
-// EXTERNAL MODULE: ./node_modules/@babel/runtime-corejs2/core-js/array/from.js
-var from = __webpack_require__("d04V");
-var from_default = /*#__PURE__*/__webpack_require__.n(from);

-// EXTERNAL MODULE: ./node_modules/@babel/runtime-corejs2/core-js/is-iterable.js
-var is_iterable = __webpack_require__("yLu3");
-var is_iterable_default = /*#__PURE__*/__webpack_require__.n(is_iterable);
-
-// CONCATENATED MODULE: ./node_modules/@babel/runtime-corejs2/helpers/esm/iterableToArray.js
-
-
-function _iterableToArray(iter) {
-  if (is_iterable_default()(Object(iter)) || Object.prototype.toString.call(iter) === "[object Arguments]") return from_default()(iter);
-}
-// CONCATENATED MODULE: ./node_modules/@babel/runtime-corejs2/helpers/esm/nonIterableSpread.js
-function _nonIterableSpread() {
-  throw new TypeError("Invalid attempt to spread non-iterable instance");
-}
-// CONCATENATED MODULE: ./node_modules/@babel/runtime-corejs2/helpers/esm/toConsumableArray.js
-/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return _toConsumableArray; });
-
-
-
-function _toConsumableArray(arr) {
-  return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread();
-}
+module.exports = _arrayWithoutHoles;

 /***/ }),

@@ -886,19 +892,17 @@ module.exports = __webpack_require__("WEpk").isIterable = function (it) {
 "use strict";

-var _interopRequireDefault = __webpack_require__("KI45");
-
-var _set = _interopRequireDefault(__webpack_require__("ttDY"));
+var _Set = __webpack_require__("ttDY");

-var _defineProperty = _interopRequireDefault(__webpack_require__("hfKm"));
+var _Object$defineProperty = __webpack_require__("hfKm");

-var __importDefault = void 0 && (void 0).__importDefault || function (mod) {
+var __importDefault = this && this.__importDefault || function (mod) {
   return mod && mod.__esModule ? mod : {
     "default": mod
   };
 };

-(0, _defineProperty["default"])(exports, "__esModule", {
+_Object$defineProperty(exports, "__esModule", {
   value: true
 });

@@ -960,9 +964,9 @@ var METATYPES = ['name', 'httpEquiv', 'charSet', 'itemProp'];
 */

 function unique() {
-  var keys = new _set["default"]();
-  var tags = new _set["default"]();
-  var metaTypes = new _set["default"]();
+  var keys = new _Set();
+  var tags = new _Set();
+  var metaTypes = new _Set();
   var metaCategories = {};
   return function (h) {
     if (h.key && typeof h.key !== 'number' && h.key.indexOf('.$') === 0) {
@@ -988,7 +992,7 @@ function unique() {
             metaTypes.add(metatype);
           } else {
             var category = h.props[metatype];
-            var categories = metaCategories[metatype] || new _set["default"]();
+            var categories = metaCategories[metatype] || new _Set();
             if (categories.has(category)) return false;
             categories.add(category);
             metaCategories[metatype] = categories;
```
</details>
<details>
<summary>Diff for <strong>hooks.js</strong></summary>

```diff
@@ -1,35 +1,89 @@
-(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[5],{
+(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[4],{

 /***/ "+MDD":
 /***/ (function(module, __webpack_exports__, __webpack_require__) {

 "use strict";
 __webpack_require__.r(__webpack_exports__);
-/* harmony import */ var _babel_runtime_corejs2_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__("doui");
-/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__("q1tI");
-/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);

+// EXTERNAL MODULE: ./node_modules/@babel/runtime-corejs2/core-js/array/is-array.js
+var is_array = __webpack_require__("p0XB");
+var is_array_default = /*#__PURE__*/__webpack_require__.n(is_array);

-/* harmony default export */ __webpack_exports__["default"] = (function () {
-  var _React$useState = react__WEBPACK_IMPORTED_MODULE_1___default.a.useState(0),
-      _React$useState2 = Object(_babel_runtime_corejs2_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_0__["default"])(_React$useState, 2),
+// CONCATENATED MODULE: ./node_modules/@babel/runtime-corejs2/helpers/esm/arrayWithHoles.js
+
+function _arrayWithHoles(arr) {
+  if (is_array_default()(arr)) return arr;
+}
+// EXTERNAL MODULE: ./node_modules/@babel/runtime-corejs2/core-js/get-iterator.js
+var get_iterator = __webpack_require__("XXOK");
+var get_iterator_default = /*#__PURE__*/__webpack_require__.n(get_iterator);
+
+// CONCATENATED MODULE: ./node_modules/@babel/runtime-corejs2/helpers/esm/iterableToArrayLimit.js
+
+function _iterableToArrayLimit(arr, i) {
+  var _arr = [];
+  var _n = true;
+  var _d = false;
+  var _e = undefined;
+
+  try {
+    for (var _i = get_iterator_default()(arr), _s; !(_n = (_s = _i.next()).done); _n = true) {
+      _arr.push(_s.value);
+
+      if (i && _arr.length === i) break;
+    }
+  } catch (err) {
+    _d = true;
+    _e = err;
+  } finally {
+    try {
+      if (!_n && _i["return"] != null) _i["return"]();
+    } finally {
+      if (_d) throw _e;
+    }
+  }
+
+  return _arr;
+}
+// CONCATENATED MODULE: ./node_modules/@babel/runtime-corejs2/helpers/esm/nonIterableRest.js
+function _nonIterableRest() {
+  throw new TypeError("Invalid attempt to destructure non-iterable instance");
+}
+// CONCATENATED MODULE: ./node_modules/@babel/runtime-corejs2/helpers/esm/slicedToArray.js
+
+
+
+function _slicedToArray(arr, i) {
+  return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest();
+}
+// EXTERNAL MODULE: ./node_modules/react/index.js
+var react = __webpack_require__("q1tI");
+var react_default = /*#__PURE__*/__webpack_require__.n(react);
+
+// CONCATENATED MODULE: ./pages/hooks.js
+
+var __jsx = react_default.a.createElement;
+
+/* harmony default export */ var hooks = __webpack_exports__["default"] = (function () {
+  var _React$useState = react_default.a.useState(0),
+      _React$useState2 = _slicedToArray(_React$useState, 2),
       clicks1 = _React$useState2[0],
       setClicks1 = _React$useState2[1];

-  var _useState = Object(react__WEBPACK_IMPORTED_MODULE_1__["useState"])(0),
-      _useState2 = Object(_babel_runtime_corejs2_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_0__["default"])(_useState, 2),
-      clicks2 = _useState2[0],
-      setClicks2 = _useState2[1];
+  var _useState = Object(react["useState"])(0),
+      clicks2 = _useState[0],
+      setClicks2 = _useState[1];

-  var doClick1 = react__WEBPACK_IMPORTED_MODULE_1___default.a.useCallback(function () {
+  var doClick1 = react_default.a.useCallback(function () {
     setClicks1(clicks1 + 1);
   }, [clicks1]);
-  var doClick2 = Object(react__WEBPACK_IMPORTED_MODULE_1__["useCallback"])(function () {
+  var doClick2 = Object(react["useCallback"])(function () {
     setClicks2(clicks2 + 1);
   }, [clicks2]);
-  return react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_1___default.a.Fragment, null, react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("h3", null, "Clicks ", clicks1), react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("button", {
+  return __jsx(react_default.a.Fragment, null, __jsx("h3", null, "Clicks ", clicks1), __jsx("button", {
     onClick: doClick1
-  }, "Click me"), react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("h3", null, "Clicks ", clicks2), react__WEBPACK_IMPORTED_MODULE_1___default.a.createElement("button", {
+  }, "Click me"), __jsx("h3", null, "Clicks ", clicks2), __jsx("button", {
     onClick: doClick2
   }, "Click me"));
 });
```
</details>
<details>
<summary>Diff for <strong>index.js</strong></summary>

```diff
@@ -1,4 +1,4 @@
-(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[6],{
+(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[5],{

 /***/ "RNiq":
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
```
</details>
<details>
<summary>Diff for <strong>link.js</strong></summary>

```diff
@@ -1,4 +1,4 @@
-(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[7],{
+(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[6],{

 /***/ "/h46":
 /***/ (function(module, exports, __webpack_require__) {
@@ -65,10 +65,11 @@ __webpack_require__.r(__webpack_exports__);
 /* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__("YFqc");
 /* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(next_link__WEBPACK_IMPORTED_MODULE_1__);

+var __jsx = react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement;

 function aLink(props) {
-  return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("h3", null, "A Link page!"), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(next_link__WEBPACK_IMPORTED_MODULE_1___default.a, {
+  return __jsx("div", null, __jsx("h3", null, "A Link page!"), __jsx(next_link__WEBPACK_IMPORTED_MODULE_1___default.a, {
     href: "/"
   }, "Go to /"));
 }
@@ -407,17 +408,15 @@ module.exports = function (COLLECTION) {
 "use strict";

-var _interopRequireDefault2 = __webpack_require__("KI45");
+var _classCallCheck = __webpack_require__("/HRN");

-var _classCallCheck2 = _interopRequireDefault2(__webpack_require__("0iUn"));
+var _createClass = __webpack_require__("WaGi");

-var _createClass2 = _interopRequireDefault2(__webpack_require__("sLSF"));
+var _possibleConstructorReturn = __webpack_require__("ZDA2");

-var _possibleConstructorReturn2 = _interopRequireDefault2(__webpack_require__("MI3g"));
+var _getPrototypeOf = __webpack_require__("/+P4");

-var _getPrototypeOf2 = _interopRequireDefault2(__webpack_require__("a7VT"));
-
-var _inherits2 = _interopRequireDefault2(__webpack_require__("Tit0"));
+var _inherits = __webpack_require__("N9n2");

 var _interopRequireWildcard = __webpack_require__("5Uuq");

@@ -471,7 +470,7 @@ function formatUrl(url) {

 var observer;
 var listeners = new _map["default"]();
-var IntersectionObserver =  true ? window.IntersectionObserver : undefined;
+var IntersectionObserver = true ? window.IntersectionObserver : undefined;

 function getObserver() {
   // Return shared instance of IntersectionObserver if already created
@@ -521,13 +520,15 @@ var listenToIntersections = function listenToIntersections(el, cb) {
 var Link =
 /*#__PURE__*/
 function (_react$Component) {
-  (0, _inherits2["default"])(Link, _react$Component);
+  _inherits(Link, _react$Component);

-  function Link() {
+  function Link(props) {
     var _this;

-    (0, _classCallCheck2["default"])(this, Link);
-    _this = (0, _possibleConstructorReturn2["default"])(this, (0, _getPrototypeOf2["default"])(Link).apply(this, arguments));
+    _classCallCheck(this, Link);
+
+    _this = _possibleConstructorReturn(this, _getPrototypeOf(Link).call(this, props));
+    _this.p = void 0;

     _this.cleanUpListeners = function () {};

@@ -554,7 +555,7 @@ function (_react$Component) {
           as = _this$formatUrls.as;

       if (!isLocal(href)) {
-        // ignore click if it's outside our scope
+        // ignore click if it's outside our scope (e.g. https://google.com)
         return;
       }

@@ -582,10 +583,13 @@ function (_react$Component) {
       });
     };

+    if (false) {}
+
+    _this.p = props.prefetch !== false;
     return _this;
   }

-  (0, _createClass2["default"])(Link, [{
+  _createClass(Link, [{
     key: "componentWillUnmount",
     value: function componentWillUnmount() {
       this.cleanUpListeners();
@@ -595,7 +599,7 @@ function (_react$Component) {
     value: function handleRef(ref) {
       var _this2 = this;

-      if (this.props.prefetch && IntersectionObserver && ref && ref.tagName) {
+      if (this.p && IntersectionObserver && ref && ref.tagName) {
         this.cleanUpListeners();
         this.cleanUpListeners = listenToIntersections(ref, function () {
           _this2.prefetch();
@@ -607,7 +611,7 @@ function (_react$Component) {
   }, {
     key: "prefetch",
     value: function prefetch() {
-      if (!this.props.prefetch || "object" === 'undefined') return; // Prefetch the JSON page if asked (only in the client)
+      if (!this.p || false) return; // Prefetch the JSON page if asked (only in the client)

       var pathname = window.location.pathname;

@@ -627,7 +631,7 @@ function (_react$Component) {

       var _this$formatUrls3 = this.formatUrls(this.props.href, this.props.as),
           href = _this$formatUrls3.href,
-          as = _this$formatUrls3.as; // Deprecated. Warning shown by propType check. If the childen provided is a string (<Link>example</Link>) we wrap it in an  tag
+          as = _this$formatUrls3.as; // Deprecated. Warning shown by propType check. If the children provided is a string (<Link>example</Link>) we wrap it in an  tag

       if (typeof children === 'string') {
@@ -639,7 +643,13 @@ function (_react$Component) {

       var props = {
         ref: function ref(el) {
-          return _this3.handleRef(el);
+          _this3.handleRef(el);
+
+          if (child && typeof child === 'object' && child.ref) {
+            if (typeof child.ref === 'function') child.ref(el);else if (typeof child.ref === 'object') {
+              child.ref.current = el;
+            }
+          }
         },
         onMouseEnter: function onMouseEnter(e) {
           if (child.props && typeof child.props.onMouseEnter === 'function') {
@@ -672,13 +682,11 @@ function (_react$Component) {
       return _react["default"].cloneElement(child, props);
     }
   }]);
+
   return Link;
 }(_react.Component);

 Link.propTypes = void 0;
-Link.defaultProps = {
-  prefetch: true
-};

 if (false) { var exact, warn; }
```
</details>
<details>
<summary>Diff for <strong>routerDirect.js</strong></summary>

```diff
@@ -1,4 +1,4 @@
-(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[8],{
+(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[7],{

 /***/ "LtRI":
 /***/ (function(module, exports, __webpack_require__) {
@@ -23,12 +23,13 @@ __webpack_require__.r(__webpack_exports__);
 /* harmony import */ var next_router__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__("nOHt");
 /* harmony import */ var next_router__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(next_router__WEBPACK_IMPORTED_MODULE_1__);

+var __jsx = react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement;

 /* eslint-disable-next-line */

 function routerDirect(props) {
-  return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", null, "I import the router directly");
+  return __jsx("div", null, "I import the router directly");
 }

 routerDirect.getInitialProps = function () {
```
</details>
<details>
<summary>Diff for <strong>withRouter.js</strong></summary>

```diff
@@ -1,4 +1,4 @@
-(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[9],{
+(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[8],{

 /***/ "0Hlz":
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
@@ -10,10 +10,11 @@ __webpack_require__.r(__webpack_exports__);
 /* harmony import */ var next_router__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__("nOHt");
 /* harmony import */ var next_router__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(next_router__WEBPACK_IMPORTED_MODULE_1__);

+var __jsx = react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement;

 function useWithRouter(props) {
-  return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", null, "I use withRouter");
+  return __jsx("div", null, "I use withRouter");
 }

 useWithRouter.getInitialProps = function () {
```
</details>
<details>
<summary>Diff for <strong>_app.module.js</strong></summary>

```diff
@@ -1,4 +1,4 @@
-(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[3],{
+(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[2],{

 /***/ "+oT+":
 /***/ (function(module, exports, __webpack_require__) {
@@ -116,9 +116,9 @@ class App extends _react.default.Component {
       pageProps
     } = this.props;
     const url = createUrl(router);
-    return _react.default.createElement(Container, null, _react.default.createElement(Component, (0, _extends2.default)({}, pageProps, {
+    return _react.default.createElement(Component, (0, _extends2.default)({}, pageProps, {
       url: url
-    })));
+    }));
   }

 } // @deprecated noop for now until removal
```
</details>
<details>
<summary>Diff for <strong>_error.module.js</strong></summary>

```diff
@@ -1,4 +1,4 @@
-(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[4],{
+(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[3],{

 /***/ "+iuc":
 /***/ (function(module, exports, __webpack_require__) {
@@ -135,11 +135,9 @@ const styles = {
 "use strict";

-var _interopRequireDefault = __webpack_require__("KI45");
-
-var _defineProperty = _interopRequireDefault(__webpack_require__("hfKm"));
+var _Object$defineProperty = __webpack_require__("hfKm");

-var __importStar = void 0 && (void 0).__importStar || function (mod) {
+var __importStar = this && this.__importStar || function (mod) {
   if (mod && mod.__esModule) return mod;
   var result = {};
   if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
@@ -147,7 +145,7 @@ var __importStar = void 0 && (void 0).__importStar || function (mod) {
   return result;
 };

-(0, _defineProperty.default)(exports, "__esModule", {
+_Object$defineProperty(exports, "__esModule", {
   value: true
 });

@@ -163,22 +161,20 @@ exports.AmpStateContext = React.createContext({});
 "use strict";

-var _interopRequireDefault = __webpack_require__("KI45");
-
-var _set = _interopRequireDefault(__webpack_require__("ttDY"));
+var _Set = __webpack_require__("ttDY");

-var _defineProperty = _interopRequireDefault(__webpack_require__("hfKm"));
+var _Object$defineProperty = __webpack_require__("hfKm");

-(0, _defineProperty.default)(exports, "__esModule", {
+_Object$defineProperty(exports, "__esModule", {
   value: true
 });

 const react_1 = __webpack_require__("q1tI");

-const isServer = "object" === 'undefined';
+const isServer = false;

 exports.default = () => {
-  const mountedInstances = new _set.default();
+  const mountedInstances = new _Set();
   let state;

   function emitChange(component) {
@@ -357,11 +353,9 @@ module.exports = function (original) {
 "use strict";

-var _interopRequireDefault = __webpack_require__("KI45");
-
-var _defineProperty = _interopRequireDefault(__webpack_require__("hfKm"));
+var _Object$defineProperty = __webpack_require__("hfKm");

-var __importStar = void 0 && (void 0).__importStar || function (mod) {
+var __importStar = this && this.__importStar || function (mod) {
   if (mod && mod.__esModule) return mod;
   var result = {};
   if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
@@ -369,7 +363,7 @@ var __importStar = void 0 && (void 0).__importStar || function (mod) {
   return result;
 };

-(0, _defineProperty.default)(exports, "__esModule", {
+_Object$defineProperty(exports, "__esModule", {
   value: true
 });

@@ -619,17 +613,15 @@ module.exports = {
 "use strict";

-var _interopRequireDefault = __webpack_require__("KI45");
-
-var _defineProperty = _interopRequireDefault(__webpack_require__("hfKm"));
+var _Object$defineProperty = __webpack_require__("hfKm");

-var __importDefault = void 0 && (void 0).__importDefault || function (mod) {
+var __importDefault = this && this.__importDefault || function (mod) {
   return mod && mod.__esModule ? mod : {
     "default": mod
   };
 };

-(0, _defineProperty.default)(exports, "__esModule", {
+_Object$defineProperty(exports, "__esModule", {
   value: true
 });

@@ -649,9 +641,8 @@ function isInAmpMode() {
 exports.isInAmpMode = isInAmpMode;

 function useAmp() {
-  const ampState = react_1.default.useContext(amp_context_1.AmpStateContext); // un-comment below to not be considered AMP in dirty mode
-
-  return isInAmpMode(ampState); // && ampMode.hasQuery
+  // Don't assign the context value to a variable to save bytes
+  return isInAmpMode(react_1.default.useContext(amp_context_1.AmpStateContext));
 }

 exports.useAmp = useAmp;
@@ -743,19 +734,17 @@ module.exports = Array.isArray || function isArray(arg) {
 "use strict";

-var _interopRequireDefault = __webpack_require__("KI45");
-
-var _set = _interopRequireDefault(__webpack_require__("ttDY"));
+var _Set = __webpack_require__("ttDY");

-var _defineProperty = _interopRequireDefault(__webpack_require__("hfKm"));
+var _Object$defineProperty = __webpack_require__("hfKm");

-var __importDefault = void 0 && (void 0).__importDefault || function (mod) {
+var __importDefault = this && this.__importDefault || function (mod) {
   return mod && mod.__esModule ? mod : {
     "default": mod
   };
 };

-(0, _defineProperty.default)(exports, "__esModule", {
+_Object$defineProperty(exports, "__esModule", {
   value: true
 });

@@ -817,9 +806,9 @@ const METATYPES = ['name', 'httpEquiv', 'charSet', 'itemProp'];
 */

 function unique() {
-  const keys = new _set.default();
-  const tags = new _set.default();
-  const metaTypes = new _set.default();
+  const keys = new _Set();
+  const tags = new _Set();
+  const metaTypes = new _Set();
   const metaCategories = {};
   return h => {
     if (h.key && typeof h.key !== 'number' && h.key.indexOf('.$') === 0) {
@@ -845,7 +834,7 @@ function unique() {
             metaTypes.add(metatype);
           } else {
             const category = h.props[metatype];
-            const categories = metaCategories[metatype] || new _set.default();
+            const categories = metaCategories[metatype] || new _Set();
             if (categories.has(category)) return false;
             categories.add(category);
             metaCategories[metatype] = categories;
```
</details>
<details>
<summary>Diff for <strong>hooks.module.js</strong></summary>

```diff
@@ -1,4 +1,4 @@
-(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[5],{
+(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[4],{

 /***/ "+MDD":
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
@@ -7,19 +7,23 @@
 __webpack_require__.r(__webpack_exports__);
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__("q1tI");
 /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);
+var __jsx = react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement;

 /* harmony default export */ __webpack_exports__["default"] = (() => {
   const [clicks1, setClicks1] = react__WEBPACK_IMPORTED_MODULE_0___default.a.useState(0);
-  const [clicks2, setClicks2] = Object(react__WEBPACK_IMPORTED_MODULE_0__["useState"])(0);
+  const {
+    0: clicks2,
+    1: setClicks2
+  } = Object(react__WEBPACK_IMPORTED_MODULE_0__["useState"])(0);
   const doClick1 = react__WEBPACK_IMPORTED_MODULE_0___default.a.useCallback(() => {
     setClicks1(clicks1 + 1);
   }, [clicks1]);
   const doClick2 = Object(react__WEBPACK_IMPORTED_MODULE_0__["useCallback"])(() => {
     setClicks2(clicks2 + 1);
   }, [clicks2]);
-  return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(react__WEBPACK_IMPORTED_MODULE_0___default.a.Fragment, null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("h3", null, "Clicks ", clicks1), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("button", {
+  return __jsx(react__WEBPACK_IMPORTED_MODULE_0___default.a.Fragment, null, __jsx("h3", null, "Clicks ", clicks1), __jsx("button", {
     onClick: doClick1
-  }, "Click me"), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("h3", null, "Clicks ", clicks2), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("button", {
+  }, "Click me"), __jsx("h3", null, "Clicks ", clicks2), __jsx("button", {
     onClick: doClick2
   }, "Click me"));
 });
```
</details>
<details>
<summary>Diff for <strong>index.module.js</strong></summary>

```diff
@@ -1,4 +1,4 @@
-(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[6],{
+(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[5],{

 /***/ "RNiq":
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
```
</details>
<details>
<summary>Diff for <strong>link.module.js</strong></summary>

```diff
@@ -1,4 +1,4 @@
-(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[7],{
+(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[6],{

 /***/ "/h46":
 /***/ (function(module, exports, __webpack_require__) {
@@ -125,10 +125,11 @@ __webpack_require__.r(__webpack_exports__);
 /* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__("YFqc");
 /* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(next_link__WEBPACK_IMPORTED_MODULE_1__);

+var __jsx = react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement;

 function aLink(props) {
-  return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", null, react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("h3", null, "A Link page!"), react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement(next_link__WEBPACK_IMPORTED_MODULE_1___default.a, {
+  return __jsx("div", null, __jsx("h3", null, "A Link page!"), __jsx(next_link__WEBPACK_IMPORTED_MODULE_1___default.a, {
     href: "/"
   }, "Go to /"));
 }
@@ -517,7 +518,7 @@ function formatUrl(url) {

 let observer;
 const listeners = new _map.default();
-const IntersectionObserver =  true ? window.IntersectionObserver : undefined;
+const IntersectionObserver = true ? window.IntersectionObserver : undefined;

 function getObserver() {
   // Return shared instance of IntersectionObserver if already created
@@ -565,8 +566,9 @@ const listenToIntersections = (el, cb) => {
 };

 class Link extends _react.Component {
-  constructor() {
-    super(...arguments);
+  constructor(props) {
+    super(props);
+    this.p = void 0;

     this.cleanUpListeners = () => {};

@@ -595,7 +597,7 @@ class Link extends _react.Component {
       } = this.formatUrls(this.props.href, this.props.as);

       if (!isLocal(href)) {
-        // ignore click if it's outside our scope
+        // ignore click if it's outside our scope (e.g. https://google.com)
         return;
       }

@@ -626,6 +628,10 @@ class Link extends _react.Component {
         }
       });
     };
+
+    if (false) {}
+
+    this.p = props.prefetch !== false;
   }

   componentWillUnmount() {
@@ -633,7 +639,7 @@ class Link extends _react.Component {
   }

   handleRef(ref) {
-    if (this.props.prefetch && IntersectionObserver && ref && ref.tagName) {
+    if (this.p && IntersectionObserver && ref && ref.tagName) {
       this.cleanUpListeners();
       this.cleanUpListeners = listenToIntersections(ref, () => {
         this.prefetch();
@@ -644,7 +650,7 @@ class Link extends _react.Component {

   prefetch() {
-    if (!this.props.prefetch || "object" === 'undefined') return; // Prefetch the JSON page if asked (only in the client)
+    if (!this.p || false) return; // Prefetch the JSON page if asked (only in the client)

     const {
       pathname
@@ -664,7 +670,7 @@ class Link extends _react.Component {
     const {
       href,
       as
-    } = this.formatUrls(this.props.href, this.props.as); // Deprecated. Warning shown by propType check. If the childen provided is a string (<Link>example</Link>) we wrap it in an  tag
+    } = this.formatUrls(this.props.href, this.props.as); // Deprecated. Warning shown by propType check. If the children provided is a string (<Link>example</Link>) we wrap it in an  tag

     if (typeof children === 'string') {
       children = _react.default.createElement("a", null, children);
@@ -674,7 +680,15 @@ class Link extends _react.Component {
     const child = _react.Children.only(children);

     const props = {
-      ref: el => this.handleRef(el),
+      ref: el => {
+        this.handleRef(el);
+
+        if (child && typeof child === 'object' && child.ref) {
+          if (typeof child.ref === 'function') child.ref(el);else if (typeof child.ref === 'object') {
+            child.ref.current = el;
+          }
+        }
+      },
       onMouseEnter: e => {
         if (child.props && typeof child.props.onMouseEnter === 'function') {
           child.props.onMouseEnter(e);
@@ -709,9 +723,6 @@ class Link extends _react.Component {
 }

 Link.propTypes = void 0;
-Link.defaultProps = {
-  prefetch: true
-};

 if (false) {}
```
</details>
<details>
<summary>Diff for <strong>routerDirect.module.js</strong></summary>

```diff
@@ -1,4 +1,4 @@
-(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[8],{
+(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[7],{

 /***/ "LtRI":
 /***/ (function(module, exports, __webpack_require__) {
@@ -23,12 +23,13 @@ __webpack_require__.r(__webpack_exports__);
 /* harmony import */ var next_router__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__("nOHt");
 /* harmony import */ var next_router__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(next_router__WEBPACK_IMPORTED_MODULE_1__);

+var __jsx = react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement;

 /* eslint-disable-next-line */

 function routerDirect(props) {
-  return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", null, "I import the router directly");
+  return __jsx("div", null, "I import the router directly");
 }

 routerDirect.getInitialProps = () => ({});
```
</details>
<details>
<summary>Diff for <strong>withRouter.module.js</strong></summary>

```diff
@@ -1,4 +1,4 @@
-(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[9],{
+(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[8],{

 /***/ "0Hlz":
 /***/ (function(module, __webpack_exports__, __webpack_require__) {
@@ -10,10 +10,11 @@ __webpack_require__.r(__webpack_exports__);
 /* harmony import */ var next_router__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__("nOHt");
 /* harmony import */ var next_router__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(next_router__WEBPACK_IMPORTED_MODULE_1__);

+var __jsx = react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement;

 function useWithRouter(props) {
-  return react__WEBPACK_IMPORTED_MODULE_0___default.a.createElement("div", null, "I use withRouter");
+  return __jsx("div", null, "I use withRouter");
 }

 useWithRouter.getInitialProps = () => ({});
```

Serverless Mode (Increase detected ⚠)

General Overall decrease ✓

|  | zeit/next.js canary | zeit/next.js refs/tags/v9.0.4-canary.7 | Change |
| - | - | - | - |
| buildDuration | 25.7s | 26.4s | ⚠ +784ms |
| nodeModulesSize | 41.5 MB | 41.3 MB | -225 kB |

Client Bundles (main, webpack, commons) Overall decrease ✓

|  | zeit/next.js canary | zeit/next.js refs/tags/v9.0.4-canary.7 | Change |
| - | - | - | - |
| main-HASH.js | 19.9 kB | 17.9 kB | -2.02 kB |
| main-HASH.js gzip | 7.1 kB | 6.56 kB | -537 B |
| webpack-HASH.js | 1.49 kB | 1.53 kB | ⚠ +43 B |
| webpack-HASH.js gzip | 738 B | 746 B | ⚠ +8 B |
| commons.HASH.js | 191 kB | 190 kB | -604 B |
| commons.HASH.js gzip | 61.6 kB | 61.6 kB | ✓ |
| Overall change |  |  | -2.58 kB |

Client Bundles (main, webpack, commons) Modern Overall decrease ✓

|  | zeit/next.js canary | zeit/next.js refs/tags/v9.0.4-canary.7 | Change |
| - | - | - | - |
| main-HASH.module.js | 17.7 kB | 16.2 kB | -1.47 kB |
| main-HASH.module.js gzip | 6.73 kB | 6.28 kB | -450 B |
| webpack-HASH.module.js | 1.49 kB | 1.53 kB | ⚠ +43 B |
| webpack-HASH.module.js gzip | 738 B | 746 B | ⚠ +8 B |
| commons.HASH.module.js | 171 kB | 171 kB | ⚠ +43 B |
| commons.HASH.module.js gzip | 55.3 kB | 55.4 kB | ⚠ +94 B |
| Overall change |  |  | -1.39 kB |

Client Pages Overall decrease ✓

|  | zeit/next.js canary | zeit/next.js refs/tags/v9.0.4-canary.7 | Change |
| - | - | - | - |
| _app.js | 2.39 kB | 1.9 kB | -490 B |
| _app.js gzip | 1.07 kB | 905 B | -169 B |
| _error.js | 12.3 kB | 12.1 kB | -199 B |
| _error.js gzip | 4.8 kB | 4.76 kB | -38 B |
| hooks.js | 751 B | 1.06 kB | ⚠ +311 B |
| hooks.js gzip | 385 B | 601 B | ⚠ +216 B |
| index.js | 343 B | 343 B | ✓ |
| index.js gzip | 237 B | 237 B | ✓ |
| link.js | 8.17 kB | 8.13 kB | -41 B |
| link.js gzip | 3.5 kB | 3.49 kB | -8 B |
| routerDirect.js | 423 B | 429 B | ⚠ +6 B |
| routerDirect.js gzip | 290 B | 292 B | ⚠ +2 B |
| withRouter.js | 435 B | 439 B | ⚠ +4 B |
| withRouter.js gzip | 286 B | 289 B | ⚠ +3 B |
| Overall change |  |  | -409 B |

Client Pages Modern Overall decrease ✓

|  | zeit/next.js canary | zeit/next.js refs/tags/v9.0.4-canary.7 | Change |
| - | - | - | - |
| _app.module.js | 1.83 kB | 1.79 kB | -35 B |
| _app.module.js gzip | 875 B | 865 B | -10 B |
| _error.module.js | 10.6 kB | 10.6 kB | -23 B |
| _error.module.js gzip | 4.3 kB | 4.31 kB | ⚠ +5 B |
| hooks.module.js | 652 B | 596 B | -56 B |
| hooks.module.js gzip | 352 B | 354 B | ⚠ +2 B |
| index.module.js | 319 B | 319 B | ✓ |
| index.module.js gzip | 238 B | 238 B | ✓ |
| link.module.js | 8.46 kB | 8.52 kB | ⚠ +57 B |
| link.module.js gzip | 3.65 kB | 3.67 kB | ⚠ +21 B |
| routerDirect.module.js | 411 B | 417 B | ⚠ +6 B |
| routerDirect.module.js gzip | 291 B | 292 B | ⚠ +1 B |
| withRouter.module.js | 423 B | 427 B | ⚠ +4 B |
| withRouter.module.js gzip | 288 B | 291 B | ⚠ +3 B |
| Overall change |  |  | -47 B |

Serverless bundles Overall increase ⚠

|  | zeit/next.js canary | zeit/next.js refs/tags/v9.0.4-canary.7 | Change |
| - | - | - | - |
| _error.js | 247 kB | 247 kB | -5 B |
| _error.js gzip | 65.7 kB | 66.3 kB | ⚠ +551 B |
| 404.html | 3.21 kB | N/A | N/A |
| 404.html gzip | 1.23 kB | N/A | N/A |
| hooks.html | 2.88 kB | 2.87 kB | -4 B |
| hooks.html gzip | 862 B | 867 B | ⚠ +5 B |
| index.js | 248 kB | 248 kB | -5 B |
| index.js gzip | 66 kB | 66.6 kB | ⚠ +599 B |
| link.js | 255 kB | 255 kB | ⚠ +223 B |
| link.js gzip | 68.2 kB | 68.8 kB | ⚠ +621 B |
| routerDirect.js | 248 kB | 248 kB | ⚠ +14 B |
| routerDirect.js gzip | 65.9 kB | 66.5 kB | ⚠ +596 B |
| withRouter.js | 248 kB | 248 kB | ⚠ +14 B |
| withRouter.js gzip | 66.1 kB | 66.6 kB | ⚠ +572 B |
| Overall change |  |  | ⚠ +237 B |


it's already done in mobility table...


@twant, it looks like this commit removes the period in the screen summary with Solution Values not checked.
I don't see periods now in either case (Solution Values checked or not checked).


Yep, the new one will report possible copy, md5_file, sha1_file usages.


The additional checks weren't needed?


I am going to look again and make a commit.


Your images src and alt are still hardcoded.


pass in current state to fn and use its quantity instead of initial state
```
const addToRecipieAmount = (state, amount) => {
    const totalAmount = state.reciepieNutrients.quantity + Number(amount)
    return totalAmount
    // initialState.reciepieNutrients.quantity always 0 event when redux tools showing differently
}	}
```


Pretty much unreachable error because the only way to enter into this method is if an email or uid exists.


Принято 👍
Можно лучше:
1. В начале: `https?`
2. Порт может быть не только с IP
3. Можно ограничить диапазон IP и порта.


непонятно зачем тут нужен указатель на конец буффера. Почему его не определить когда он нужен. Т.е. он же всегда будет равен позиции где mainBuffer[i] == '\0'


wtf is this


are you using amino master? on master of tendermint we are still using 14.1. When we cut the next release it will be updated else where


with updated fn
```
....
quantity : addToRecipieAmount(state, action.amount)
....
```


The C# code generator is very limited and uses explicit offsets anyway.


зачем обнулять `leftPartOfBuffer` и `rightPartOfBuffer` если можно при обьявлении этих массивов сделать протсо `{}` эфект тот же)


ok


I want to disable null move pruning if opposing player has no legal moves but pawn moves. Anyone has any idea how to do it? :)


.possible-cell:hover{
    background-color: #5eb80b;
    cursor: pointer;
}


Deployment failed with the following error:

~~~
The domain newprojectstarterkit.com can't be found.
~~~


Принято 👍


LGTM, from just reading the code changes. Doc changes aren't checked by the CI and have to be checked by hand. I won't get to this until tomorrow though.


Successfully aliased the URL <https://golazon-e2z57mw1v.now.sh> to the following aliases:

* https://golazon.com
* https://golazon.sobstel.now.sh
* https://golazon-git-master.sobstel.now.sh


Не принято 👎 Видно, что регулярное выражение где-то найдено, при этом ещё и позволяет писать всякую ерунду: `8925-9-0-0-9-0-9-0`


у вас есть для этого функция copyLogic, только название интересное) но смысл что то скопировать кудато) для этого и пишеться такие функции, тем более у вас такой логики много)


Final Version


Successfully aliased the URL <https://golazon-po24ffrpx.now.sh> to the following aliases:

* https://golazon.com
* https://golazon.sobstel.now.sh
* https://golazon-git-master.sobstel.now.sh


как и выше для left side buffer


То же самое 👎
1. IP не поддерживается: `http://127.0.0.1`
2. Порт не поддерживается: `http://yandex.ru:8080`
3. Путь не поддерживается: `http://yandex.ru/blabla`


@andoys in the commit: https://github.com/azerothcore/azerothcore-wotlk/commit/7954a2a07ed1af2eb050f9252d3d2c3d7dab7e1f

some unwanted changes got merged, so we just reverted those. No need to worries, just update your server to latest AC version and you'll be fine again


This is a huge overhaul and i dont like it in one commit but i did not have a better way this time.


в коде страються не оставлять закомиченный код, а если оставляют то пишут для этого некоторый коммент зачем это)


Instead of changing the code from V2, I thought it would be smart to upload a separate folder for V3. But then realized after watching more of the videos that this does not highlight how the code changed from version to version. The commits made after this one are in an attempt to fix that.


Принято 👍
Можно лучше:
1. Хорошо бы ещё букву "Ё" учесть: `[А-ЯЁ]`
2. Хорошо бы ограничить длину ещё и регуляркой


For more information on this commit, please refer to the comment on commit #3866e26.


Принято 👍
Можно лучше:
1. Хорошо бы проверять парность скобок
2. Хорошо бы проверять, что дефисы стоят именно так, если они есть: `X XXX-XXX-XX-XX`