UNPKG

react-static

Version:

A progressive static site generator for React

227 lines (177 loc) 22.6 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = getRoutes; exports.normalizeAllRoutes = normalizeAllRoutes; exports.normalizeRoute = normalizeRoute; exports.rebuildRoutes = void 0; var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); var _path = _interopRequireDefault(require("path")); var _chalk = _interopRequireDefault(require("chalk")); var _utils = require("../utils"); var _plugins = _interopRequireDefault(require("./plugins")); function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } var rebuildRoutes = function rebuildRoutes() { rebuildRoutes.current(); }; exports.rebuildRoutes = rebuildRoutes; rebuildRoutes.current = function () { throw new Error('Routes cannot be rebuilt yet!'); }; function getRoutes(_x) { return _getRoutes.apply(this, arguments); } // We recursively loop through the routes and their children and // return an array of normalised routes. // Original routes array [{ path: 'path', children: { path: 'to' } }] // These can be returned as flat routes eg. [{ path: 'path' }, { path: 'path/to' }] // Or they can be returned nested routes eg. [{ path: 'path', children: { path: 'path/to' } }] function _getRoutes() { _getRoutes = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2(state) { var callback, _args2 = arguments; return _regenerator["default"].wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: callback = _args2.length > 1 && _args2[1] !== undefined ? _args2[1] : function (d) { return d; }; rebuildRoutes.current = /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() { var _state, silent, incremental, pluginRoutes, userRoutes, routes, _normalizeAllRoutes, allNormalizedRoutes, hasIndex, has404; return _regenerator["default"].wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: _state = state, silent = _state.silent, incremental = _state.incremental; if (!silent) console.log('Building Routes...'); if (!silent) (0, _utils.time)(_chalk["default"].green("[\u2713] Routes Built")); _context.next = 5; return _plugins["default"].beforePrepareRoutes(state); case 5: state = _context.sent; _context.next = 8; return _plugins["default"].getRoutes([], state); case 8: pluginRoutes = _context.sent; _context.next = 11; return state.config.getRoutes(state); case 11: userRoutes = _context.sent; routes = [].concat((0, _toConsumableArray2["default"])(pluginRoutes), (0, _toConsumableArray2["default"])(userRoutes)); // Flatten and normalize all of the routes _normalizeAllRoutes = normalizeAllRoutes(routes, state), allNormalizedRoutes = _normalizeAllRoutes.routes, hasIndex = _normalizeAllRoutes.hasIndex, has404 = _normalizeAllRoutes.has404; // If no Index page was found, throw an error. This is required if (!(!hasIndex && !incremental)) { _context.next = 17; break; } console.error('No index found!'); throw new Error('Could not find a route for the "index" page of your site! This is ' + 'required. Please create a page or specify a route and template ' + 'for this page.'); case 17: console.log({ has404: has404 }); // If no 404 page was found, add one. This is required. if (!has404 && !incremental) { console.warn('Creating default 404 because none was found...'); allNormalizedRoutes.unshift({ path: _utils.PATH_404, template: _path["default"].resolve(__dirname, _path["default"].join('..', 'browser', 'components', 'Default404')) }); } if (!silent) (0, _utils.timeEnd)(_chalk["default"].green("[\u2713] Routes Built")); state = _objectSpread(_objectSpread({}, state), {}, { routes: allNormalizedRoutes }); _context.t0 = callback; _context.next = 24; return _plugins["default"].afterPrepareRoutes(state); case 24: _context.t1 = _context.sent; return _context.abrupt("return", (0, _context.t0)(_context.t1)); case 26: case "end": return _context.stop(); } } }, _callee); })); return _context2.abrupt("return", rebuildRoutes.current()); case 3: case "end": return _context2.stop(); } } }, _callee2); })); return _getRoutes.apply(this, arguments); } function normalizeAllRoutes(routes, state) { var routesByPath = {}; var hasIndex; var has404; // This hook is set up beore the loop, since it could have expensive // overhead diving into plugins every time var pluginNormalizeRoute = _plugins["default"].normalizeRoute(state); var recurseRoute = function recurseRoute(route, parent) { // Normalize the route var normalizedRoute = normalizeRoute(route, parent, pluginNormalizeRoute); // we check an array of paths to see // if route path already existings var existingRoute = routesByPath[normalizedRoute.path]; // If the route has children, we do a depth-first recurse if (normalizedRoute.children) { normalizedRoute.children.forEach(function (childRoute) { return recurseRoute(childRoute, normalizedRoute); }); } // If the route exists if (existingRoute) { // If it is meant to replace any routes before it if (!normalizedRoute.replace) { // If not replacing, we need to merge the two // routes together Object.assign(existingRoute, normalizedRoute); // Then make sure we're pointing to the exising route normalizedRoute = existingRoute; } } delete normalizedRoute.children; // Register the route by path routesByPath[normalizedRoute.path] = normalizedRoute; // Keep track of index and 404 routes existence if (normalizedRoute.path === '/') { hasIndex = true; } if ((0, _utils.is404Path)(normalizedRoute.path)) { has404 = true; } if (normalizedRoute.path.indexOf('\\') !== -1) { throw new Error('Plugins must return a normalized path for the `path` key of a route,' + ' which is a path with / and not \\.'); } }; routes.forEach(function (route) { return recurseRoute(route); }); var normalizedRoutes = Object.values(routesByPath); return { routes: normalizedRoutes, hasIndex: hasIndex, has404: has404 }; } function normalizeRoute(route) { var parent = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; var pluginNormalizeRoute = arguments.length > 2 ? arguments[2] : undefined; var _parent$path = parent.path, parentPath = _parent$path === void 0 ? '/' : _parent$path; if (!route.path) { throw new Error("No path defined for route: ".concat(JSON.stringify(route))); } var routePath = (0, _utils.pathJoin)(parentPath, route.path); if (typeof route.noIndex !== 'undefined') { console.warn("Warning: Route ".concat(route.path, " is using 'noIndex'. Did you mean 'noindex'?")); } route.path = (0, _utils.getRoutePath)(routePath); route.parent = parent; route = pluginNormalizeRoute(route); delete route.parent; return route; } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdGF0aWMvZ2V0Um91dGVzLmpzIl0sIm5hbWVzIjpbInJlYnVpbGRSb3V0ZXMiLCJjdXJyZW50IiwiRXJyb3IiLCJnZXRSb3V0ZXMiLCJzdGF0ZSIsImNhbGxiYWNrIiwiZCIsInNpbGVudCIsImluY3JlbWVudGFsIiwiY29uc29sZSIsImxvZyIsImNoYWxrIiwiZ3JlZW4iLCJwbHVnaW5zIiwiYmVmb3JlUHJlcGFyZVJvdXRlcyIsInBsdWdpblJvdXRlcyIsImNvbmZpZyIsInVzZXJSb3V0ZXMiLCJyb3V0ZXMiLCJub3JtYWxpemVBbGxSb3V0ZXMiLCJhbGxOb3JtYWxpemVkUm91dGVzIiwiaGFzSW5kZXgiLCJoYXM0MDQiLCJlcnJvciIsIndhcm4iLCJ1bnNoaWZ0IiwicGF0aCIsIlBBVEhfNDA0IiwidGVtcGxhdGUiLCJyZXNvbHZlIiwiX19kaXJuYW1lIiwiam9pbiIsImFmdGVyUHJlcGFyZVJvdXRlcyIsInJvdXRlc0J5UGF0aCIsInBsdWdpbk5vcm1hbGl6ZVJvdXRlIiwibm9ybWFsaXplUm91dGUiLCJyZWN1cnNlUm91dGUiLCJyb3V0ZSIsInBhcmVudCIsIm5vcm1hbGl6ZWRSb3V0ZSIsImV4aXN0aW5nUm91dGUiLCJjaGlsZHJlbiIsImZvckVhY2giLCJjaGlsZFJvdXRlIiwicmVwbGFjZSIsIk9iamVjdCIsImFzc2lnbiIsImluZGV4T2YiLCJub3JtYWxpemVkUm91dGVzIiwidmFsdWVzIiwicGFyZW50UGF0aCIsIkpTT04iLCJzdHJpbmdpZnkiLCJyb3V0ZVBhdGgiLCJub0luZGV4Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUVBOztBQVFBOzs7Ozs7QUFFTyxJQUFNQSxhQUFhLEdBQUcsU0FBaEJBLGFBQWdCLEdBQU07QUFDakNBLEVBQUFBLGFBQWEsQ0FBQ0MsT0FBZDtBQUNELENBRk07Ozs7QUFJUEQsYUFBYSxDQUFDQyxPQUFkLEdBQXdCLFlBQU07QUFDNUIsUUFBTSxJQUFJ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LDBCQUNvQmEsS0FBSyxDQUFDWCxJQUQxQjtBQUdEOztBQUVEVyxFQUFBQSxLQUFLLENBQUNYLElBQU4sR0FBYSx5QkFBYTJCLFNBQWIsQ0FBYjtBQUVBaEIsRUFBQUEsS0FBSyxDQUFDQyxNQUFOLEdBQWVBLE1BQWY7QUFDQUQsRUFBQUEsS0FBSyxHQUFHSCxvQkFBb0IsQ0FBQ0csS0FBRCxDQUE1QjtBQUNBLFNBQU9BLEtBQUssQ0FBQ0MsTUFBYjtBQUVBLFNBQU9ELEtBQVA7QUFDRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBwYXRoIGZyb20gJ3BhdGgnXG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnXG4vL1xuaW1wb3J0IHtcbiAgcGF0aEpvaW4sXG4gIGdldFJvdXRlUGF0aCxcbiAgdGltZSxcbiAgdGltZUVuZCxcbiAgUEFUSF80MDQsXG4gIGlzNDA0UGF0aCxcbn0gZnJvbSAnLi4vdXRpbHMnXG5pbXBvcnQgcGx1Z2lucyBmcm9tICcuL3BsdWdpbnMnXG5cbmV4cG9ydCBjb25zdCByZWJ1aWxkUm91dGVzID0gKCkgPT4ge1xuICByZWJ1aWxkUm91dGVzLmN1cnJlbnQoKVxufVxuXG5yZWJ1aWxkUm91dGVzLmN1cnJlbnQgPSAoKSA9PiB7XG4gIHRocm93IG5ldyBFcnJvcignUm91dGVzIGNhbm5vdCBiZSByZWJ1aWx0IHlldCEnKVxufVxuXG5leHBvcnQgZGVmYXVsdCBhc3luYyBmdW5jdGlvbiBnZXRSb3V0ZXMoc3RhdGUsIGNhbGxiYWNrID0gZCA9PiBkKSB7XG4gIHJlYnVpbGRSb3V0ZXMuY3VycmVudCA9IGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB7IHNpbGVudCwgaW5jcmVtZW50YWwgfSA9IHN0YXRlXG5cbiAgICBpZiAoIXNpbGVudCkgY29uc29sZS5sb2coJ0J1aWxkaW5nIFJvdXRlcy4uLicpXG4gICAgaWYgKCFzaWxlbnQpIHRpbWUoY2hhbGsuZ3JlZW4oJ1tcXHUyNzEzXSBSb3V0ZXMgQnVpbHQnKSlcblxuICAgIHN0YXRlID0gYXdhaXQgcGx1Z2lucy5iZWZvcmVQcmVwYXJlUm91dGVzKHN0YXRlKVxuXG4gICAgY29uc3QgcGx1Z2luUm91dGVzID0gYXdhaXQgcGx1Z2lucy5nZXRSb3V0ZXMoW10sIHN0YXRlKVxuICAgIGNvbnN0IHVzZXJSb3V0ZXMgPSBhd2FpdCBzdGF0ZS5jb25maWcuZ2V0Um91dGVzKHN0YXRlKVxuXG4gICAgY29uc3Qgcm91dGVzID0gWy4uLnBsdWdpblJvdXRlcywgLi4udXNlclJvdXRlc11cblxuICAgIC8vIEZsYXR0ZW4gYW5kIG5vcm1hbGl6ZSBhbGwgb2YgdGhlIHJvdXRlc1xuICAgIGNvbnN0IHtcbiAgICAgIHJvdXRlczogYWxsTm9ybWFsaXplZFJvdXRlcyxcbiAgICAgIGhhc0luZGV4LFxuICAgICAgaGFzNDA0LFxuICAgIH0gPSBub3JtYWxpemVBbGxSb3V0ZXMocm91dGVzLCBzdGF0ZSlcblxuICAgIC8vIElmIG5vIEluZGV4IHBhZ2Ugd2FzIGZvdW5kLCB0aHJvdyBhbiBlcnJvci4gVGhpcyBpcyByZXF1aXJlZFxuICAgIGlmICghaGFzSW5kZXggJiYgIWluY3JlbWVudGFsKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdObyBpbmRleCBmb3VuZCEnKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnQ291bGQgbm90IGZpbmQgYSByb3V0ZSBmb3IgdGhlIFwiaW5kZXhcIiBwYWdlIG9mIHlvdXIgc2l0ZSEgVGhpcyBpcyAnICtcbiAgICAgICAgICAncmVxdWlyZWQuIFBsZWFzZSBjcmVhdGUgYSBwYWdlIG9yIHNwZWNpZnkgYSByb3V0ZSBhbmQgdGVtcGxhdGUgJyArXG4gICAgICAgICAgJ2ZvciB0aGlzIHBhZ2UuJ1xuICAgICAgKVxuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKHsgaGFzNDA0IH0pXG5cbiAgICAvLyBJZiBubyA0MDQgcGFnZSB3YXMgZm91bmQsIGFkZCBvbmUuIFRoaXMgaXMgcmVxdWlyZWQuXG4gICAgaWYgKCFoYXM0MDQgJiYgIWluY3JlbWVudGFsKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ0NyZWF0aW5nIGRlZmF1bHQgNDA0IGJlY2F1c2Ugbm9uZSB3YXMgZm91bmQuLi4nKVxuXG4gICAgICBhbGxOb3JtYWxpemVkUm91dGVzLnVuc2hpZnQoe1xuICAgICAgICBwYXRoOiBQQVRIXzQwNCxcbiAgICAgICAgdGVtcGxhdGU6IHBhdGgucmVzb2x2ZShcbiAgICAgICAgICBfX2Rpcm5hbWUsXG4gICAgICAgICAgcGF0aC5qb2luKCcuLicsICdicm93c2VyJywgJ2NvbXBvbmVudHMnLCAnRGVmYXVsdDQwNCcpXG4gICAgICAgICksXG4gICAgICB9KVxuICAgIH1cblxuICAgIGlmICghc2lsZW50KSB0aW1lRW5kKGNoYWxrLmdyZWVuKCdbXFx1MjcxM10gUm91dGVzIEJ1aWx0JykpXG5cbiAgICBzdGF0ZSA9IHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgcm91dGVzOiBhbGxOb3JtYWxpemVkUm91dGVzLFxuICAgIH1cblxuICAgIHJldHVybiBjYWxsYmFjayhhd2FpdCBwbHVnaW5zLmFmdGVyUHJlcGFyZVJvdXRlcyhzdGF0ZSkpXG4gIH1cblxuICByZXR1cm4gcmVidWlsZFJvdXRlcy5jdXJyZW50KClcbn1cblxuLy8gV2UgcmVjdXJzaXZlbHkgbG9vcCB0aHJvdWdoIHRoZSByb3V0ZXMgYW5kIHRoZWlyIGNoaWxkcmVuIGFuZFxuLy8gcmV0dXJuIGFuIGFycmF5IG9mIG5vcm1hbGlzZWQgcm91dGVzLlxuLy8gT3JpZ2luYWwgcm91dGVzIGFycmF5IFt7IHBhdGg6ICdwYXRoJywgY2hpbGRyZW46IHsgcGF0aDogJ3RvJyB9IH1dXG4vLyBUaGVzZSBjYW4gYmUgcmV0dXJuZWQgYXMgZmxhdCByb3V0ZXMgZWcuIFt7IHBhdGg6ICdwYXRoJyB9LCB7IHBhdGg6ICdwYXRoL3RvJyB9XVxuLy8gT3IgdGhleSBjYW4gYmUgcmV0dXJuZWQgbmVzdGVkIHJvdXRlcyBlZy4gW3sgcGF0aDogJ3BhdGgnLCBjaGlsZHJlbjogeyBwYXRoOiAncGF0aC90bycgfSB9XVxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUFsbFJvdXRlcyhyb3V0ZXMsIHN0YXRlKSB7XG4gIGNvbnN0IHJvdXRlc0J5UGF0aCA9IHt9XG4gIGxldCBoYXNJbmRleFxuICBsZXQgaGFzNDA0XG5cbiAgLy8gVGhpcyBob29rIGlzIHNldCB1cCBiZW9yZSB0aGUgbG9vcCwgc2luY2UgaXQgY291bGQgaGF2ZSBleHBlbnNpdmVcbiAgLy8gb3ZlcmhlYWQgZGl2aW5nIGludG8gcGx1Z2lucyBldmVyeSB0aW1lXG4gIGNvbnN0IHBsdWdpbk5vcm1hbGl6ZVJvdXRlID0gcGx1Z2lucy5ub3JtYWxpemVSb3V0ZShzdGF0ZSlcblxuICBjb25zdCByZWN1cnNlUm91dGUgPSAocm91dGUsIHBhcmVudCkgPT4ge1xuICAgIC8vIE5vcm1hbGl6ZSB0aGUgcm91dGVcbiAgICBsZXQgbm9ybWFsaXplZFJvdXRlID0gbm9ybWFsaXplUm91dGUocm91dGUsIHBhcmVudCwgcGx1Z2luTm9ybWFsaXplUm91dGUpXG5cbiAgICAvLyB3ZSBjaGVjayBhbiBhcnJheSBvZiBwYXRocyB0byBzZWVcbiAgICAvLyBpZiByb3V0ZSBwYXRoIGFscmVhZHkgZXhpc3RpbmdzXG4gICAgY29uc3QgZXhpc3RpbmdSb3V0ZSA9IHJvdXRlc0J5UGF0aFtub3JtYWxpemVkUm91dGUucGF0aF1cblxuICAgIC8vIElmIHRoZSByb3V0ZSBoYXMgY2hpbGRyZW4sIHdlIGRvIGEgZGVwdGgtZmlyc3QgcmVjdXJzZVxuICAgIGlmIChub3JtYWxpemVkUm91dGUuY2hpbGRyZW4pIHtcbiAgICAgIG5vcm1hbGl6ZWRSb3V0ZS5jaGlsZHJlbi5mb3JFYWNoKGNoaWxkUm91dGUgPT5cbiAgICAgICAgcmVjdXJzZVJvdXRlKGNoaWxkUm91dGUsIG5vcm1hbGl6ZWRSb3V0ZSlcbiAgICAgIClcbiAgICB9XG5cbiAgICAvLyBJZiB0aGUgcm91dGUgZXhpc3RzXG4gICAgaWYgKGV4aXN0aW5nUm91dGUpIHtcbiAgICAgIC8vIElmIGl0IGlzIG1lYW50IHRvIHJlcGxhY2UgYW55IHJvdXRlcyBiZWZvcmUgaXRcbiAgICAgIGlmICghbm9ybWFsaXplZFJvdXRlLnJlcGxhY2UpIHtcbiAgICAgICAgLy8gSWYgbm90IHJlcGxhY2luZywgd2UgbmVlZCB0byBtZXJnZSB0aGUgdHdvXG4gICAgICAgIC8vIHJvdXRlcyB0b2dldGhlclxuICAgICAgICBPYmplY3QuYXNzaWduKGV4aXN0aW5nUm91dGUsIG5vcm1hbGl6ZWRSb3V0ZSlcbiAgICAgICAgLy8gVGhlbiBtYWtlIHN1cmUgd2UncmUgcG9pbnRpbmcgdG8gdGhlIGV4aXNpbmcgcm91dGVcbiAgICAgICAgbm9ybWFsaXplZFJvdXRlID0gZXhpc3RpbmdSb3V0ZVxuICAgICAgfVxuICAgIH1cblxuICAgIGRlbGV0ZSBub3JtYWxpemVkUm91dGUuY2hpbGRyZW5cblxuICAgIC8vIFJlZ2lzdGVyIHRoZSByb3V0ZSBieSBwYXRoXG4gICAgcm91dGVzQnlQYXRoW25vcm1hbGl6ZWRSb3V0ZS5wYXRoXSA9IG5vcm1hbGl6ZWRSb3V0ZVxuXG4gICAgLy8gS2VlcCB0cmFjayBvZiBpbmRleCBhbmQgNDA0IHJvdXRlcyBleGlzdGVuY2VcbiAgICBpZiAobm9ybWFsaXplZFJvdXRlLnBhdGggPT09ICcvJykge1xuICAgICAgaGFzSW5kZXggPSB0cnVlXG4gICAgfVxuXG4gICAgaWYgKGlzNDA0UGF0aChub3JtYWxpemVkUm91dGUucGF0aCkpIHtcbiAgICAgIGhhczQwNCA9IHRydWVcbiAgICB9XG5cbiAgICBpZiAobm9ybWFsaXplZFJvdXRlLnBhdGguaW5kZXhPZignXFxcXCcpICE9PSAtMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnUGx1Z2lucyBtdXN0IHJldHVybiBhIG5vcm1hbGl6ZWQgcGF0aCBmb3IgdGhlIGBwYXRoYCBrZXkgb2YgYSByb3V0ZSwnICtcbiAgICAgICAgICAnIHdoaWNoIGlzIGEgcGF0aCB3aXRoIC8gYW5kIG5vdCBcXFxcLidcbiAgICAgIClcbiAgICB9XG4gIH1cblxuICByb3V0ZXMuZm9yRWFjaChyb3V0ZSA9PiByZWN1cnNlUm91dGUocm91dGUpKVxuXG4gIGNvbnN0IG5vcm1hbGl6ZWRSb3V0ZXMgPSBPYmplY3QudmFsdWVzKHJvdXRlc0J5UGF0aClcblxuICByZXR1cm4ge1xuICAgIHJvdXRlczogbm9ybWFsaXplZFJvdXRlcyxcbiAgICBoYXNJbmRleCxcbiAgICBoYXM0MDQsXG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVJvdXRlKHJvdXRlLCBwYXJlbnQgPSB7fSwgcGx1Z2luTm9ybWFsaXplUm91dGUpIHtcbiAgY29uc3QgeyBwYXRoOiBwYXJlbnRQYXRoID0gJy8nIH0gPSBwYXJlbnRcblxuICBpZiAoIXJvdXRlLnBhdGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHBhdGggZGVmaW5lZCBmb3Igcm91dGU6ICR7SlNPTi5zdHJpbmdpZnkocm91dGUpfWApXG4gIH1cblxuICBjb25zdCByb3V0ZVBhdGggPSBwYXRoSm9pbihwYXJlbnRQYXRoLCByb3V0ZS5wYXRoKVxuXG4gIGlmICh0eXBlb2Ygcm91dGUubm9JbmRleCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICBgV2FybmluZzogUm91dGUgJHtyb3V0ZS5wYXRofSBpcyB1c2luZyAnbm9JbmRleCcuIERpZCB5b3UgbWVhbiAnbm9pbmRleCc/YFxuICAgIClcbiAgfVxuXG4gIHJvdXRlLnBhdGggPSBnZXRSb3V0ZVBhdGgocm91dGVQYXRoKVxuXG4gIHJvdXRlLnBhcmVudCA9IHBhcmVudFxuICByb3V0ZSA9IHBsdWdpbk5vcm1hbGl6ZVJvdXRlKHJvdXRlKVxuICBkZWxldGUgcm91dGUucGFyZW50XG5cbiAgcmV0dXJuIHJvdXRlXG59XG4iXX0=