diff --git a/activitytype-cql/src/main/resources/activities/baselines/cql-iot-dse.yaml b/activitytype-cql/src/main/resources/activities/baselines/cql-iot-dse.yaml index dea04b63d..2b534fc33 100644 --- a/activitytype-cql/src/main/resources/activities/baselines/cql-iot-dse.yaml +++ b/activitytype-cql/src/main/resources/activities/baselines/cql-iot-dse.yaml @@ -1,4 +1,4 @@ -# ebdse -v run type=cql yaml=baselines/cql-iot tags=phase:schema host=dsehost +# nb -v run type=cql yaml=baselines/cql-iot tags=phase:schema host=dsehost bindings: machine_id: Mod(<>); ToHashedUUID() -> java.util.UUID sensor_name: HashedLineToString('data/variable_words.txt') diff --git a/activitytype-cql/src/main/resources/activities/baselines/cql-iot.yaml b/activitytype-cql/src/main/resources/activities/baselines/cql-iot.yaml index c3586fafe..3e8e68972 100644 --- a/activitytype-cql/src/main/resources/activities/baselines/cql-iot.yaml +++ b/activitytype-cql/src/main/resources/activities/baselines/cql-iot.yaml @@ -1,5 +1,4 @@ -# nb -v run type=cql yaml=baselines/cql-iot tags=phase:schema - host=dsehost +# nb -v run type=cql yaml=baselines/cql-iot tags=phase:schema host=dsehost bindings: machine_id: Mod(<>); ToHashedUUID() -> java.util.UUID sensor_name: HashedLineToString('data/variable_words.txt') diff --git a/activitytype-cql/src/main/resources/activities/baselines/cql-keyvalue.yaml b/activitytype-cql/src/main/resources/activities/baselines/cql-keyvalue.yaml index 66140eed7..911a5615a 100644 --- a/activitytype-cql/src/main/resources/activities/baselines/cql-keyvalue.yaml +++ b/activitytype-cql/src/main/resources/activities/baselines/cql-keyvalue.yaml @@ -1,5 +1,4 @@ -# nb -v run type=cql yaml=baselines/cql-keyvalue tags=phase:schema - host=dsehost +# nb -v run type=cql yaml=baselines/cql-keyvalue tags=phase:schema host=dsehost bindings: seq_key: Mod(<>); ToString() -> String seq_value: Hash(); Mod(<>); ToString() -> String diff --git a/activitytype-cql/src/main/resources/activities/baselines/cql-widerows.yaml b/activitytype-cql/src/main/resources/activities/baselines/cql-widerows.yaml index b8371743f..6c58015d3 100644 --- a/activitytype-cql/src/main/resources/activities/baselines/cql-widerows.yaml +++ b/activitytype-cql/src/main/resources/activities/baselines/cql-widerows.yaml @@ -1,4 +1,4 @@ -# ebdse -v run type=cql yaml=baselines/cql-widerows tags=phase:schema host=dsehost +# nb -v run type=cql yaml=baselines/cql-widerows tags=phase:schema host=dsehost bindings: # for ramp-up and verify part_layout: Div(<>); ToString() -> String diff --git a/docsys/src/main/node/docsys/nuxt.config.js b/docsys/src/main/node/docsys/nuxt.config.js index 17bc50cfe..12636a81a 100644 --- a/docsys/src/main/node/docsys/nuxt.config.js +++ b/docsys/src/main/node/docsys/nuxt.config.js @@ -9,7 +9,7 @@ export default { ** Headers of the page */ head: { - titleTemplate: '%s' + "nosqlbench docs", + titleTemplate: '%s' + "NoSQLBench Docs", title: process.env.npm_package_name || '', meta: [ {charset: 'utf-8'}, diff --git a/docsys/src/main/node/docsys/pages/docs/_slug.vue b/docsys/src/main/node/docsys/pages/docs/_slug.vue index f2909db9d..07a4de002 100644 --- a/docsys/src/main/node/docsys/pages/docs/_slug.vue +++ b/docsys/src/main/node/docsys/pages/docs/_slug.vue @@ -9,7 +9,7 @@ - nosqlbench docs + NoSQLBench Docs diff --git a/docsys/src/main/node/docsys/pages/docs/index.vue b/docsys/src/main/node/docsys/pages/docs/index.vue index e64515808..1099b9aa3 100644 --- a/docsys/src/main/node/docsys/pages/docs/index.vue +++ b/docsys/src/main/node/docsys/pages/docs/index.vue @@ -8,10 +8,10 @@ - nosqlbench docs + NoSQLBench Docs - SUBMIT FEEDBACK + SUBMIT FEEDBACK diff --git a/docsys/src/main/resources/docsys-guidebook/200.html b/docsys/src/main/resources/docsys-guidebook/200.html index 5c0887b1d..4b5eb75c2 100644 --- a/docsys/src/main/resources/docsys-guidebook/200.html +++ b/docsys/src/main/resources/docsys-guidebook/200.html @@ -1,9 +1,9 @@ - guidebooknosqlbench docs + guidebookNoSQLBench Docs
Loading...
- + diff --git a/docsys/src/main/resources/docsys-guidebook/_nuxt/bbbb289c471766021bc7.js b/docsys/src/main/resources/docsys-guidebook/_nuxt/53667d09397c029ad15e.js similarity index 95% rename from docsys/src/main/resources/docsys-guidebook/_nuxt/bbbb289c471766021bc7.js rename to docsys/src/main/resources/docsys-guidebook/_nuxt/53667d09397c029ad15e.js index 077ac4c1f..c2611d0ac 100644 --- a/docsys/src/main/resources/docsys-guidebook/_nuxt/bbbb289c471766021bc7.js +++ b/docsys/src/main/resources/docsys-guidebook/_nuxt/53667d09397c029ad15e.js @@ -1 +1 @@ -!function(e){function r(data){for(var r,n,f=data[0],l=data[1],d=data[2],i=0,h=[];i 1 && arguments[1] !== undefined ? arguments[1] : false;\n var prop = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'components';\n return Array.prototype.concat.apply([], route.matched.map(function (m, index) {\n return Object.keys(m[prop]).map(function (key) {\n matches && matches.push(index);\n return m[prop][key];\n });\n }));\n}\nfunction getMatchedComponentsInstances(route) {\n var matches = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n return getMatchedComponents(route, matches, 'instances');\n}\nfunction flatMapComponents(route, fn) {\n return Array.prototype.concat.apply([], route.matched.map(function (m, index) {\n return Object.keys(m.components).reduce(function (promises, key) {\n if (m.components[key]) {\n promises.push(fn(m.components[key], m.instances[key], m, key, index));\n } else {\n delete m.components[key];\n }\n\n return promises;\n }, []);\n }));\n}\nfunction resolveRouteComponents(route, fn) {\n return Promise.all(flatMapComponents(route, function _callee(Component, instance, match, key) {\n return regeneratorRuntime.async(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n if (!(typeof Component === 'function' && !Component.options)) {\n _context.next = 4;\n break;\n }\n\n _context.next = 3;\n return regeneratorRuntime.awrap(Component());\n\n case 3:\n Component = _context.sent;\n\n case 4:\n match.components[key] = Component = sanitizeComponent(Component);\n return _context.abrupt(\"return\", typeof fn === 'function' ? fn(Component, instance, match, key) : Component);\n\n case 6:\n case \"end\":\n return _context.stop();\n }\n }\n });\n }));\n}\nfunction getRouteData(route) {\n return regeneratorRuntime.async(function getRouteData$(_context2) {\n while (1) {\n switch (_context2.prev = _context2.next) {\n case 0:\n if (route) {\n _context2.next = 2;\n break;\n }\n\n return _context2.abrupt(\"return\");\n\n case 2:\n _context2.next = 4;\n return regeneratorRuntime.awrap(resolveRouteComponents(route));\n\n case 4:\n return _context2.abrupt(\"return\", _objectSpread({}, route, {\n meta: getMatchedComponents(route).map(function (Component, index) {\n return _objectSpread({}, Component.options.meta, {}, (route.matched[index] || {}).meta);\n })\n }));\n\n case 5:\n case \"end\":\n return _context2.stop();\n }\n }\n });\n}\nfunction setContext(app, context) {\n var _ref, _ref2, currentRouteData, fromRouteData;\n\n return regeneratorRuntime.async(function setContext$(_context3) {\n while (1) {\n switch (_context3.prev = _context3.next) {\n case 0:\n // If context not defined, create it\n if (!app.context) {\n app.context = {\n isStatic: true,\n isDev: false,\n isHMR: false,\n app: app,\n store: app.store,\n payload: context.payload,\n error: context.error,\n base: '/',\n env: {}\n }; // Only set once\n\n if (context.req) {\n app.context.req = context.req;\n }\n\n if (context.res) {\n app.context.res = context.res;\n }\n\n if (context.ssrContext) {\n app.context.ssrContext = context.ssrContext;\n }\n\n app.context.redirect = function (status, path, query) {\n if (!status) {\n return;\n }\n\n app.context._redirected = true; // if only 1 or 2 arguments: redirect('/') or redirect('/', { foo: 'bar' })\n\n var pathType = Object(_babel_runtime_helpers_esm_typeof__WEBPACK_IMPORTED_MODULE_11__[/* default */ \"a\"])(path);\n\n if (typeof status !== 'number' && (pathType === 'undefined' || pathType === 'object')) {\n query = path || {};\n path = status;\n pathType = Object(_babel_runtime_helpers_esm_typeof__WEBPACK_IMPORTED_MODULE_11__[/* default */ \"a\"])(path);\n status = 302;\n }\n\n if (pathType === 'object') {\n path = app.router.resolve(path).route.fullPath;\n } // \"/absolute/route\", \"./relative/route\" or \"../relative/route\"\n\n\n if (/(^[.]{1,2}\\/)|(^\\/(?!\\/))/.test(path)) {\n app.context.next({\n path: path,\n query: query,\n status: status\n });\n } else {\n path = formatUrl(path, query);\n\n if (false) {}\n\n if (true) {\n // https://developer.mozilla.org/en-US/docs/Web/API/Location/replace\n window.location.replace(path); // Throw a redirect error\n\n throw new Error('ERR_REDIRECT');\n }\n }\n };\n\n if (false) {}\n\n if (true) {\n app.context.nuxtState = window.__NUXT__;\n }\n } // Dynamic keys\n\n\n _context3.next = 3;\n return regeneratorRuntime.awrap(Promise.all([getRouteData(context.route), getRouteData(context.from)]));\n\n case 3:\n _ref = _context3.sent;\n _ref2 = Object(_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_9__[/* default */ \"a\"])(_ref, 2);\n currentRouteData = _ref2[0];\n fromRouteData = _ref2[1];\n\n if (context.route) {\n app.context.route = currentRouteData;\n }\n\n if (context.from) {\n app.context.from = fromRouteData;\n }\n\n app.context.next = context.next;\n app.context._redirected = false;\n app.context._errored = false;\n app.context.isHMR = false;\n app.context.params = app.context.route.params || {};\n app.context.query = app.context.route.query || {};\n\n case 15:\n case \"end\":\n return _context3.stop();\n }\n }\n });\n}\nfunction middlewareSeries(promises, appContext) {\n if (!promises.length || appContext._redirected || appContext._errored) {\n return Promise.resolve();\n }\n\n return promisify(promises[0], appContext).then(function () {\n return middlewareSeries(promises.slice(1), appContext);\n });\n}\nfunction promisify(fn, context) {\n var promise;\n\n if (fn.length === 2) {\n // fn(context, callback)\n promise = new Promise(function (resolve) {\n fn(context, function (err, data) {\n if (err) {\n context.error(err);\n }\n\n data = data || {};\n resolve(data);\n });\n });\n } else {\n promise = fn(context);\n }\n\n if (promise && promise instanceof Promise && typeof promise.then === 'function') {\n return promise;\n }\n\n return Promise.resolve(promise);\n} // Imported from vue-router\n\nfunction getLocation(base, mode) {\n var path = decodeURI(window.location.pathname);\n\n if (mode === 'hash') {\n return window.location.hash.replace(/^#\\//, '');\n }\n\n if (base && path.indexOf(base) === 0) {\n path = path.slice(base.length);\n }\n\n return (path || '/') + window.location.search + window.location.hash;\n} // Imported from path-to-regexp\n\n/**\n * Compile a string to a template function for the path.\n *\n * @param {string} str\n * @param {Object=} options\n * @return {!function(Object=, Object=)}\n */\n\nfunction compile(str, options) {\n return tokensToFunction(parse(str, options), options);\n}\nfunction getQueryDiff(toQuery, fromQuery) {\n var diff = {};\n\n var queries = _objectSpread({}, toQuery, {}, fromQuery);\n\n for (var k in queries) {\n if (String(toQuery[k]) !== String(fromQuery[k])) {\n diff[k] = true;\n }\n }\n\n return diff;\n}\nfunction normalizeError(err) {\n var message;\n\n if (!(err.message || typeof err === 'string')) {\n try {\n message = JSON.stringify(err, null, 2);\n } catch (e) {\n message = \"[\".concat(err.constructor.name, \"]\");\n }\n } else {\n message = err.message || err;\n }\n\n return _objectSpread({}, err, {\n message: message,\n statusCode: err.statusCode || err.status || err.response && err.response.status || 500\n });\n}\n/**\n * The main path matching regexp utility.\n *\n * @type {RegExp}\n */\n\nvar PATH_REGEXP = new RegExp([// Match escaped characters that would otherwise appear in future matches.\n// This allows the user to escape special characters that won't transform.\n'(\\\\\\\\.)', // Match Express-style parameters and un-named parameters with a prefix\n// and optional suffixes. Matches appear as:\n//\n// \"/:test(\\\\d+)?\" => [\"/\", \"test\", \"\\d+\", undefined, \"?\", undefined]\n// \"/route(\\\\d+)\" => [undefined, undefined, undefined, \"\\d+\", undefined, undefined]\n// \"/*\" => [\"/\", undefined, undefined, undefined, undefined, \"*\"]\n'([\\\\/.])?(?:(?:\\\\:(\\\\w+)(?:\\\\(((?:\\\\\\\\.|[^\\\\\\\\()])+)\\\\))?|\\\\(((?:\\\\\\\\.|[^\\\\\\\\()])+)\\\\))([+*?])?|(\\\\*))'].join('|'), 'g');\n/**\n * Parse a string for the raw tokens.\n *\n * @param {string} str\n * @param {Object=} options\n * @return {!Array}\n */\n\nfunction parse(str, options) {\n var tokens = [];\n var key = 0;\n var index = 0;\n var path = '';\n var defaultDelimiter = options && options.delimiter || '/';\n var res;\n\n while ((res = PATH_REGEXP.exec(str)) != null) {\n var m = res[0];\n var escaped = res[1];\n var offset = res.index;\n path += str.slice(index, offset);\n index = offset + m.length; // Ignore already escaped sequences.\n\n if (escaped) {\n path += escaped[1];\n continue;\n }\n\n var next = str[index];\n var prefix = res[2];\n var name = res[3];\n var capture = res[4];\n var group = res[5];\n var modifier = res[6];\n var asterisk = res[7]; // Push the current path onto the tokens.\n\n if (path) {\n tokens.push(path);\n path = '';\n }\n\n var partial = prefix != null && next != null && next !== prefix;\n var repeat = modifier === '+' || modifier === '*';\n var optional = modifier === '?' || modifier === '*';\n var delimiter = res[2] || defaultDelimiter;\n var pattern = capture || group;\n tokens.push({\n name: name || key++,\n prefix: prefix || '',\n delimiter: delimiter,\n optional: optional,\n repeat: repeat,\n partial: partial,\n asterisk: Boolean(asterisk),\n pattern: pattern ? escapeGroup(pattern) : asterisk ? '.*' : '[^' + escapeString(delimiter) + ']+?'\n });\n } // Match any characters still remaining.\n\n\n if (index < str.length) {\n path += str.substr(index);\n } // If the path exists, push it onto the end.\n\n\n if (path) {\n tokens.push(path);\n }\n\n return tokens;\n}\n/**\n * Prettier encoding of URI path segments.\n *\n * @param {string}\n * @return {string}\n */\n\n\nfunction encodeURIComponentPretty(str, slashAllowed) {\n var re = slashAllowed ? /[?#]/g : /[/?#]/g;\n return encodeURI(str).replace(re, function (c) {\n return '%' + c.charCodeAt(0).toString(16).toUpperCase();\n });\n}\n/**\n * Encode the asterisk parameter. Similar to `pretty`, but allows slashes.\n *\n * @param {string}\n * @return {string}\n */\n\n\nfunction encodeAsterisk(str) {\n return encodeURIComponentPretty(str, true);\n}\n/**\n * Escape a regular expression string.\n *\n * @param {string} str\n * @return {string}\n */\n\n\nfunction escapeString(str) {\n return str.replace(/([.+*?=^!:${}()[\\]|/\\\\])/g, '\\\\$1');\n}\n/**\n * Escape the capturing group by escaping special characters and meaning.\n *\n * @param {string} group\n * @return {string}\n */\n\n\nfunction escapeGroup(group) {\n return group.replace(/([=!:$/()])/g, '\\\\$1');\n}\n/**\n * Expose a method for transforming tokens into the path function.\n */\n\n\nfunction tokensToFunction(tokens, options) {\n // Compile all the tokens into regexps.\n var matches = new Array(tokens.length); // Compile all the patterns before compilation.\n\n for (var i = 0; i < tokens.length; i++) {\n if (Object(_babel_runtime_helpers_esm_typeof__WEBPACK_IMPORTED_MODULE_11__[/* default */ \"a\"])(tokens[i]) === 'object') {\n matches[i] = new RegExp('^(?:' + tokens[i].pattern + ')$', flags(options));\n }\n }\n\n return function (obj, opts) {\n var path = '';\n var data = obj || {};\n var options = opts || {};\n var encode = options.pretty ? encodeURIComponentPretty : encodeURIComponent;\n\n for (var _i = 0; _i < tokens.length; _i++) {\n var token = tokens[_i];\n\n if (typeof token === 'string') {\n path += token;\n continue;\n }\n\n var value = data[token.name || 'pathMatch'];\n var segment = void 0;\n\n if (value == null) {\n if (token.optional) {\n // Prepend partial segment prefixes.\n if (token.partial) {\n path += token.prefix;\n }\n\n continue;\n } else {\n throw new TypeError('Expected \"' + token.name + '\" to be defined');\n }\n }\n\n if (Array.isArray(value)) {\n if (!token.repeat) {\n throw new TypeError('Expected \"' + token.name + '\" to not repeat, but received `' + JSON.stringify(value) + '`');\n }\n\n if (value.length === 0) {\n if (token.optional) {\n continue;\n } else {\n throw new TypeError('Expected \"' + token.name + '\" to not be empty');\n }\n }\n\n for (var j = 0; j < value.length; j++) {\n segment = encode(value[j]);\n\n if (!matches[_i].test(segment)) {\n throw new TypeError('Expected all \"' + token.name + '\" to match \"' + token.pattern + '\", but received `' + JSON.stringify(segment) + '`');\n }\n\n path += (j === 0 ? token.prefix : token.delimiter) + segment;\n }\n\n continue;\n }\n\n segment = token.asterisk ? encodeAsterisk(value) : encode(value);\n\n if (!matches[_i].test(segment)) {\n throw new TypeError('Expected \"' + token.name + '\" to match \"' + token.pattern + '\", but received \"' + segment + '\"');\n }\n\n path += token.prefix + segment;\n }\n\n return path;\n };\n}\n/**\n * Get the flags for a regexp from the options.\n *\n * @param {Object} options\n * @return {string}\n */\n\n\nfunction flags(options) {\n return options && options.sensitive ? '' : 'i';\n}\n/**\n * Format given url, append query to url query string\n *\n * @param {string} url\n * @param {string} query\n * @return {string}\n */\n\n\nfunction formatUrl(url, query) {\n var protocol;\n var index = url.indexOf('://');\n\n if (index !== -1) {\n protocol = url.substring(0, index);\n url = url.substring(index + 3);\n } else if (url.startsWith('//')) {\n url = url.substring(2);\n }\n\n var parts = url.split('/');\n var result = (protocol ? protocol + '://' : '//') + parts.shift();\n var path = parts.filter(Boolean).join('/');\n var hash;\n parts = path.split('#');\n\n if (parts.length === 2) {\n var _parts = parts;\n\n var _parts2 = Object(_babel_runtime_helpers_esm_slicedToArray__WEBPACK_IMPORTED_MODULE_9__[/* default */ \"a\"])(_parts, 2);\n\n path = _parts2[0];\n hash = _parts2[1];\n }\n\n result += path ? '/' + path : '';\n\n if (query && JSON.stringify(query) !== '{}') {\n result += (url.split('?').length === 2 ? '&' : '?') + formatQuery(query);\n }\n\n result += hash ? '#' + hash : '';\n return result;\n}\n/**\n * Transform data object to query string\n *\n * @param {object} query\n * @return {string}\n */\n\n\nfunction formatQuery(query) {\n return Object.keys(query).sort().map(function (key) {\n var val = query[key];\n\n if (val == null) {\n return '';\n }\n\n if (Array.isArray(val)) {\n return val.slice().map(function (val2) {\n return [key, '=', val2].join('');\n }).join('&');\n }\n\n return key + '=' + val;\n }).filter(Boolean).join('&');\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi8ubnV4dC91dGlscy5qcz9lYmVkIl0sIm5hbWVzIjpbInByb2Nlc3MiLCJ3aW5kb3ciLCJvbk51eHRSZWFkeUNicyIsIm9uTnV4dFJlYWR5IiwiY2IiLCJwdXNoIiwiZW1wdHkiLCJnbG9iYWxIYW5kbGVFcnJvciIsImVycm9yIiwiVnVlIiwiY29uZmlnIiwiZXJyb3JIYW5kbGVyIiwiaW50ZXJvcERlZmF1bHQiLCJwcm9taXNlIiwidGhlbiIsIm0iLCJkZWZhdWx0IiwiYXBwbHlBc3luY0RhdGEiLCJDb21wb25lbnQiLCJhc3luY0RhdGEiLCJvcHRpb25zIiwiX19oYXNOdXh0RGF0YSIsIkNvbXBvbmVudERhdGEiLCJfb3JpZ2luRGF0YUZuIiwiZGF0YSIsImNhbGwiLCIkc3NyQ29udGV4dCIsImNpZCIsIl9DdG9yIiwic2FuaXRpemVDb21wb25lbnQiLCJleHRlbmQiLCJleHRlbmRPcHRpb25zIiwibmFtZSIsIl9fZmlsZSIsImdldE1hdGNoZWRDb21wb25lbnRzIiwicm91dGUiLCJtYXRjaGVzIiwicHJvcCIsIkFycmF5IiwicHJvdG90eXBlIiwiY29uY2F0IiwiYXBwbHkiLCJtYXRjaGVkIiwibWFwIiwiaW5kZXgiLCJPYmplY3QiLCJrZXlzIiwia2V5IiwiZ2V0TWF0Y2hlZENvbXBvbmVudHNJbnN0YW5jZXMiLCJmbGF0TWFwQ29tcG9uZW50cyIsImZuIiwiY29tcG9uZW50cyIsInJlZHVjZSIsInByb21pc2VzIiwiaW5zdGFuY2VzIiwicmVzb2x2ZVJvdXRlQ29tcG9uZW50cyIsIlByb21pc2UiLCJhbGwiLCJpbnN0YW5jZSIsIm1hdGNoIiwiZ2V0Um91dGVEYXRhIiwibWV0YSIsInNldENvbnRleHQiLCJhcHAiLCJjb250ZXh0IiwiaXNTdGF0aWMiLCJpc0RldiIsImlzSE1SIiwic3RvcmUiLCJwYXlsb2FkIiwiYmFzZSIsImVudiIsInJlcSIsInJlcyIsInNzckNvbnRleHQiLCJyZWRpcmVjdCIsInN0YXR1cyIsInBhdGgiLCJxdWVyeSIsIl9yZWRpcmVjdGVkIiwicGF0aFR5cGUiLCJyb3V0ZXIiLCJyZXNvbHZlIiwiZnVsbFBhdGgiLCJ0ZXN0IiwibmV4dCIsImZvcm1hdFVybCIsImxvY2F0aW9uIiwicmVwbGFjZSIsIkVycm9yIiwibnV4dFN0YXRlIiwiX19OVVhUX18iLCJmcm9tIiwiY3VycmVudFJvdXRlRGF0YSIsImZyb21Sb3V0ZURhdGEiLCJfZXJyb3JlZCIsInBhcmFtcyIsIm1pZGRsZXdhcmVTZXJpZXMiLCJhcHBDb250ZXh0IiwibGVuZ3RoIiwicHJvbWlzaWZ5Iiwic2xpY2UiLCJlcnIiLCJnZXRMb2NhdGlvbiIsIm1vZGUiLCJkZWNvZGVVUkkiLCJwYXRobmFtZSIsImhhc2giLCJpbmRleE9mIiwic2VhcmNoIiwiY29tcGlsZSIsInN0ciIsInRva2Vuc1RvRnVuY3Rpb24iLCJwYXJzZSIsImdldFF1ZXJ5RGlmZiIsInRvUXVlcnkiLCJmcm9tUXVlcnkiLCJkaWZmIiwicXVlcmllcyIsImsiLCJTdHJpbmciLCJub3JtYWxpemVFcnJvciIsIm1lc3NhZ2UiLCJKU09OIiwic3RyaW5naWZ5IiwiZSIsImNvbnN0cnVjdG9yIiwic3RhdHVzQ29kZSIsInJlc3BvbnNlIiwiUEFUSF9SRUdFWFAiLCJSZWdFeHAiLCJqb2luIiwidG9rZW5zIiwiZGVmYXVsdERlbGltaXRlciIsImRlbGltaXRlciIsImV4ZWMiLCJlc2NhcGVkIiwib2Zmc2V0IiwicHJlZml4IiwiY2FwdHVyZSIsImdyb3VwIiwibW9kaWZpZXIiLCJhc3RlcmlzayIsInBhcnRpYWwiLCJyZXBlYXQiLCJvcHRpb25hbCIsInBhdHRlcm4iLCJCb29sZWFuIiwiZXNjYXBlR3JvdXAiLCJlc2NhcGVTdHJpbmciLCJzdWJzdHIiLCJlbmNvZGVVUklDb21wb25lbnRQcmV0dHkiLCJzbGFzaEFsbG93ZWQiLCJyZSIsImVuY29kZVVSSSIsImMiLCJjaGFyQ29kZUF0IiwidG9TdHJpbmciLCJ0b1VwcGVyQ2FzZSIsImVuY29kZUFzdGVyaXNrIiwiaSIsImZsYWdzIiwib2JqIiwib3B0cyIsImVuY29kZSIsInByZXR0eSIsImVuY29kZVVSSUNvbXBvbmVudCIsInRva2VuIiwidmFsdWUiLCJzZWdtZW50IiwiVHlwZUVycm9yIiwiaXNBcnJheSIsImoiLCJzZW5zaXRpdmUiLCJ1cmwiLCJwcm90b2NvbCIsInN1YnN0cmluZyIsInN0YXJ0c1dpdGgiLCJwYXJ0cyIsInNwbGl0IiwicmVzdWx0Iiwic2hpZnQiLCJmaWx0ZXIiLCJmb3JtYXRRdWVyeSIsInNvcnQiLCJ2YWwiLCJ2YWwyIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQUVBO0FBQ0E7O0FBQ0EsSUFBSUEsSUFBSixFQUFvQjtBQUNsQkMsUUFBTSxDQUFDQyxjQUFQLEdBQXdCLEVBQXhCOztBQUNBRCxRQUFNLENBQUNFLFdBQVAsR0FBcUIsVUFBQ0MsRUFBRCxFQUFRO0FBQzNCSCxVQUFNLENBQUNDLGNBQVAsQ0FBc0JHLElBQXRCLENBQTJCRCxFQUEzQjtBQUNELEdBRkQ7QUFHRDs7QUFFTSxTQUFTRSxLQUFULEdBQWtCLENBQUU7QUFFcEIsU0FBU0MsaUJBQVQsQ0FBNEJDLEtBQTVCLEVBQW1DO0FBQ3hDLE1BQUlDLG9EQUFHLENBQUNDLE1BQUosQ0FBV0MsWUFBZixFQUE2QjtBQUMzQkYsd0RBQUcsQ0FBQ0MsTUFBSixDQUFXQyxZQUFYLENBQXdCSCxLQUF4QjtBQUNEO0FBQ0Y7QUFFTSxTQUFTSSxjQUFULENBQXlCQyxPQUF6QixFQUFrQztBQUN2QyxTQUFPQSxPQUFPLENBQUNDLElBQVIsQ0FBYSxVQUFBQyxDQUFDO0FBQUEsV0FBSUEsQ0FBQyxDQUFDQyxPQUFGLElBQWFELENBQWpCO0FBQUEsR0FBZCxDQUFQO0FBQ0Q7QUFFTSxTQUFTRSxjQUFULENBQXlCQyxTQUF6QixFQUFvQ0MsU0FBcEMsRUFBK0M7QUFDcEQsT0FDRTtBQUNBO0FBQ0EsR0FBQ0EsU0FBRCxJQUFjRCxTQUFT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LFVBQUNJLEdBQUQsRUFBUztBQUM1QyxRQUFNMEksR0FBRyxHQUFHM0csS0FBSyxDQUFDL0IsR0FBRCxDQUFqQjs7QUFDQSxRQUFJMEksR0FBRyxJQUFJLElBQVgsRUFBaUI7QUFDZixhQUFPLEVBQVA7QUFDRDs7QUFDRCxRQUFJbkosS0FBSyxDQUFDcUksT0FBTixDQUFjYyxHQUFkLENBQUosRUFBd0I7QUFDdEIsYUFBT0EsR0FBRyxDQUFDcEYsS0FBSixHQUFZMUQsR0FBWixDQUFnQixVQUFBK0ksSUFBSTtBQUFBLGVBQUksQ0FBQzNJLEdBQUQsRUFBTSxHQUFOLEVBQVcySSxJQUFYLEVBQWlCdkQsSUFBakIsQ0FBc0IsRUFBdEIsQ0FBSjtBQUFBLE9BQXBCLEVBQW1EQSxJQUFuRCxDQUF3RCxHQUF4RCxDQUFQO0FBQ0Q7O0FBQ0QsV0FBT3BGLEdBQUcsR0FBRyxHQUFOLEdBQVkwSSxHQUFuQjtBQUNELEdBVE0sRUFTSkgsTUFUSSxDQVNHbkMsT0FUSCxFQVNZaEIsSUFUWixDQVNpQixHQVRqQixDQUFQO0FBVUQiLCJmaWxlIjoiMS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBWdWUgZnJvbSAndnVlJ1xuXG4vLyB3aW5kb3cue3tnbG9iYWxzLmxvYWRlZENhbGxiYWNrfX0gaG9va1xuLy8gVXNlZnVsIGZvciBqc2RvbSB0ZXN0aW5nIG9yIHBsdWdpbnMgKGh0dHBzOi8vZ2l0aHViLmNvbS90bXB2YXIvanNkb20jZGVhbGluZy13aXRoLWFzeW5jaHJvbm91cy1zY3JpcHQtbG9hZGluZylcbmlmIChwcm9jZXNzLmNsaWVudCkge1xuICB3aW5kb3cub25OdXh0UmVhZHlDYnMgPSBbXVxuICB3aW5kb3cub25OdXh0UmVhZHkgPSAoY2IpID0+IHtcbiAgICB3aW5kb3cub25OdXh0UmVhZHlDYnMucHVzaChjYilcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZW1wdHkgKCkge31cblxuZXhwb3J0IGZ1bmN0aW9uIGdsb2JhbEhhbmRsZUVycm9yIChlcnJvcikge1xuICBpZiAoVnVlLmNvbmZpZy5lcnJvckhhbmRsZXIpIHtcbiAgICBWdWUuY29uZmlnLmVycm9ySGFuZGxlcihlcnJvcilcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaW50ZXJvcERlZmF1bHQgKHByb21pc2UpIHtcbiAgcmV0dXJuIHByb21pc2UudGhlbihtID0+IG0uZGVmYXVsdCB8fCBtKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlBc3luY0RhdGEgKENvbXBvbmVudCwgYXN5bmNEYXRhKSB7XG4gIGlmIChcbiAgICAvLyBGb3IgU1NSLCB3ZSBvbmNlIGFsbCB0aGlzIGZ1bmN0aW9uIHdpdGhvdXQgc2Vjb25kIHBhcmFtIHRvIGp1c3QgYXBwbHkgYXN5bmNEYXRhXG4gICAgLy8gUHJldmVudCBkb2luZyB0aGlzIGZvciBlYWNoIFNTUiByZXF1ZXN0XG4gICAgIWFzeW5jRGF0YSAmJiBDb21wb25lbnQub3B0aW9ucy5fX2hhc051eHREYXRhXG4gICkge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgQ29tcG9uZW50RGF0YSA9IENvbXBvbmVudC5vcHRpb25zLl9vcmlnaW5EYXRhRm4gfHwgQ29tcG9uZW50Lm9wdGlvbnMuZGF0YSB8fCBmdW5jdGlvbiAoKSB7IHJldHVybiB7fSB9XG4gIENvbXBvbmVudC5vcHRpb25zLl9vcmlnaW5EYXRhRm4gPSBDb21wb25lbnREYXRhXG5cbiAgQ29tcG9uZW50Lm9wdGlvbnMuZGF0YSA9IGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBkYXRhID0gQ29tcG9uZW50RGF0YS5jYWxsKHRoaXMsIHRoaXMpXG4gICAgaWYgKHRoaXMuJHNzckNvbnRleHQpIHtcbiAgICAgIGFzeW5jRGF0YSA9IHRoaXMuJHNzckNvbnRleHQuYXN5bmNEYXRhW0NvbXBvbmVudC5jaWRdXG4gICAgfVxuICAgIHJldHVybiB7IC4uLmRhdGEsIC4uLmFzeW5jRGF0YSB9XG4gIH1cblxuICBDb21wb25lbnQub3B0aW9ucy5fX2hhc051eHREYXRhID0gdHJ1ZVxuXG4gIGlmIChDb21wb25lbnQuX0N0b3IgJiYgQ29tcG9uZW50Ll9DdG9yLm9wdGlvbnMpIHtcbiAgICBDb21wb25lbnQuX0N0b3Iub3B0aW9ucy5kYXRhID0gQ29tcG9uZW50Lm9wdGlvbnMuZGF0YVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzYW5pdGl6ZUNvbXBvbmVudCAoQ29tcG9uZW50KSB7XG4gIC8vIElmIENvbXBvbmVudCBhbHJlYWR5IHNhbml0aXplZFxuICBpZiAoQ29tcG9uZW50Lm9wdGlvbnMgJiYgQ29tcG9uZW50Ll9DdG9yID09PSBDb21wb25lbnQpIHtcbiAgICByZXR1cm4gQ29tcG9uZW50XG4gIH1cbiAgaWYgKCFDb21wb25lbnQub3B0aW9ucykge1xuICAgIENvbXBvbmVudCA9IFZ1ZS5leHRlbmQoQ29tcG9uZW50KSAvLyBmaXggaXNzdWUgIzZcbiAgICBDb21wb25lbnQuX0N0b3IgPSBDb21wb25lbnRcbiAgfSBlbHNlIHtcbiAgICBDb21wb25lbnQuX0N0b3IgPSBDb21wb25lbnRcbiAgICBDb21wb25lbnQuZXh0ZW5kT3B0aW9ucyA9IENvbXBvbmVudC5vcHRpb25zXG4gIH1cbiAgLy8gRm9yIGRlYnVnZ2luZyBwdXJwb3NlXG4gIGlmICghQ29tcG9uZW50Lm9wdGlvbnMubmFtZSAmJiBDb21wb25lbnQub3B0aW9ucy5fX2ZpbGUpIHtcbiAgICBDb21wb25lbnQub3B0aW9ucy5uYW1lID0gQ29tcG9uZW50Lm9wdGlvbnMuX19maWxlXG4gIH1cbiAgcmV0dXJuIENvbXBvbmVudFxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWF0Y2hlZENvbXBvbmVudHMgKHJvdXRlLCBtYXRjaGVzID0gZmFsc2UsIHByb3AgPSAnY29tcG9uZW50cycpIHtcbiAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoW10sIHJvdXRlLm1hdGNoZWQubWFwKChtLCBpbmRleCkgPT4ge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhtW3Byb3BdKS5tYXAoKGtleSkgPT4ge1xuICAgICAgbWF0Y2hlcyAmJiBtYXRjaGVzLnB1c2goaW5kZXgpXG4gICAgICByZXR1cm4gbVtwcm9wXVtrZXldXG4gICAgfSlcbiAgfSkpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRNYXRjaGVkQ29tcG9uZW50c0luc3RhbmNlcyAocm91dGUsIG1hdGNoZXMgPSBmYWxzZSkge1xuICByZXR1cm4gZ2V0TWF0Y2hlZENvbXBvbmVudHMocm91dGUsIG1hdGNoZXMsICdpbnN0YW5jZXMnKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZmxhdE1hcENvbXBvbmVudHMgKHJvdXRlLCBmbikge1xuICByZXR1cm4gQXJyYXkucHJvdG90eXBlLmNvbmNhdC5hcHBseShbXSwgcm91dGUubWF0Y2hlZC5tYXAoKG0sIGluZGV4KSA9PiB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKG0uY29tcG9uZW50cykucmVkdWNlKChwcm9taXNlcywga2V5KSA9PiB7XG4gICAgICBpZiAobS5jb21wb25lbnRzW2tleV0pIHtcbiAgICAgICAgcHJvbWlzZXMucHVzaChmbihtLmNvbXBvbmVudHNba2V5XSwgbS5pbnN0YW5jZXNba2V5XSwgbSwga2V5LCBpbmRleCkpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUgbS5jb21wb25lbnRzW2tleV1cbiAgICAgIH1cbiAgICAgIHJldHVybiBwcm9taXNlc1xuICAgIH0sIFtdKVxuICB9KSlcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVSb3V0ZUNvbXBvbmVudHMgKHJvdXRlLCBmbikge1xuICByZXR1cm4gUHJvbWlzZS5hbGwoXG4gICAgZmxhdE1hcENvbXBvbmVudHMocm91dGUsIGFzeW5jIChDb21wb25lbnQsIGluc3RhbmNlLCBtYXRjaCwga2V5KSA9PiB7XG4gICAgICAvLyBJZiBjb21wb25lbnQgaXMgYSBmdW5jdGlvbiwgcmVzb2x2ZSBpdFxuICAgICAgaWYgKHR5cGVvZiBDb21wb25lbnQgPT09ICdmdW5jdGlvbicgJiYgIUNvbXBvbmVudC5vcHRpb25zKSB7XG4gICAgICAgIENvbXBvbmVudCA9IGF3YWl0IENvbXBvbmVudCgpXG4gICAgICB9XG4gICAgICBtYXRjaC5jb21wb25lbnRzW2tleV0gPSBDb21wb25lbnQgPSBzYW5pdGl6ZUNvbXBvbmVudChDb21wb25lbnQpXG4gICAgICByZXR1cm4gdHlwZW9mIGZuID09PSAnZnVuY3Rpb24nID8gZm4oQ29tcG9uZW50LCBpbnN0YW5jZSwgbWF0Y2gsIGtleSkgOiBDb21wb25lbnRcbiAgICB9KVxuICApXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRSb3V0ZURhdGEgKHJvdXRlKSB7XG4gIGlmICghcm91dGUpIHtcbiAgICByZXR1cm5cbiAgfVxuICAvLyBNYWtlIHN1cmUgdGhlIGNvbXBvbmVudHMgYXJlIHJlc29sdmVkIChjb2RlLXNwbGl0dGluZylcbiAgYXdhaXQgcmVzb2x2ZVJvdXRlQ29tcG9uZW50cyhyb3V0ZSlcbiAgLy8gU2VuZCBiYWNrIGEgY29weSBvZiByb3V0ZSB3aXRoIG1ldGEgYmFzZWQgb24gQ29tcG9uZW50IGRlZmluaXRpb25cbiAgcmV0dXJuIHtcbiAgICAuLi5yb3V0ZSxcbiAgICBtZXRhOiBnZXRNYXRjaGVkQ29tcG9uZW50cyhyb3V0ZSkubWFwKChDb21wb25lbnQsIGluZGV4KSA9PiB7XG4gICAgICByZXR1cm4geyAuLi5Db21wb25lbnQub3B0aW9ucy5tZXRhLCAuLi4ocm91dGUubWF0Y2hlZFtpbmRleF0gfHwge30pLm1ldGEgfVxuICAgIH0pXG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldENvbnRleHQgKGFwcCwgY29udGV4dCkge1xuICAvLyBJZiBjb250ZXh0IG5vdCBkZWZpbmVkLCBjcmVhdGUgaXRcbiAgaWYgKCFhcHAuY29udGV4dCkge1xuICAgIGFwcC5jb250ZXh0ID0ge1xuICAgICAgaXNTdGF0aWM6IHByb2Nlc3Muc3RhdGljLFxuICAgICAgaXNEZXY6IGZhbHNlLFxuICAgICAgaXNITVI6IGZhbHNlLFxuICAgICAgYXBwLFxuICAgICAgc3RvcmU6IGFwcC5zdG9yZSxcbiAgICAgIHBheWxvYWQ6IGNvbnRleHQucGF5bG9hZCxcbiAgICAgIGVycm9yOiBjb250ZXh0LmVycm9yLFxuICAgICAgYmFzZTogJy8nLFxuICAgICAgZW52OiB7fVxuICAgIH1cbiAgICAvLyBPbmx5IHNldCBvbmNlXG4gICAgaWYgKGNvbnRleHQucmVxKSB7XG4gICAgICBhcHAuY29udGV4dC5yZXEgPSBjb250ZXh0LnJlcVxuICAgIH1cbiAgICBpZiAoY29udGV4dC5yZXMpIHtcbiAgICAgIGFwcC5jb250ZXh0LnJlcyA9IGNvbnRleHQucmVzXG4gICAgfVxuICAgIGlmIChjb250ZXh0LnNzckNvbnRleHQpIHtcbiAgICAgIGFwcC5jb250ZXh0LnNzckNvbnRleHQgPSBjb250ZXh0LnNzckNvbnRleHRcbiAgICB9XG4gICAgYXBwLmNvbnRleHQucmVkaXJlY3QgPSAoc3RhdHVzLCBwYXRoLCBxdWVyeSkgPT4ge1xuICAgICAgaWYgKCFzdGF0dXMpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBhcHAuY29udGV4dC5fcmVkaXJlY3RlZCA9IHRydWVcbiAgICAgIC8vIGlmIG9ubHkgMSBvciAyIGFyZ3VtZW50czogcmVkaXJlY3QoJy8nKSBvciByZWRpcmVjdCgnLycsIHsgZm9vOiAnYmFyJyB9KVxuICAgICAgbGV0IHBhdGhUeXBlID0gdHlwZW9mIHBhdGhcbiAgICAgIGlmICh0eXBlb2Ygc3RhdHVzICE9PSAnbnVtYmVyJyAmJiAocGF0aFR5cGUgPT09ICd1bmRlZmluZWQnIHx8IHBhdGhUeXBlID09PSAnb2JqZWN0JykpIHtcbiAgICAgICAgcXVlcnkgPSBwYXRoIHx8IHt9XG4gICAgICAgIHBhdGggPSBzdGF0dXNcbiAgICAgICAgcGF0aFR5cGUgPSB0eXBlb2YgcGF0aFxuICAgICAgICBzdGF0dXMgPSAzMDJcbiAgICAgIH1cbiAgICAgIGlmIChwYXRoVHlwZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgcGF0aCA9IGFwcC5yb3V0ZXIucmVzb2x2ZShwYXRoKS5yb3V0ZS5mdWxsUGF0aFxuICAgICAgfVxuICAgICAgLy8gXCIvYWJzb2x1dGUvcm91dGVcIiwgXCIuL3JlbGF0aXZlL3JvdXRlXCIgb3IgXCIuLi9yZWxhdGl2ZS9yb3V0ZVwiXG4gICAgICBpZiAoLyheWy5dezEsMn1cXC8pfCheXFwvKD8hXFwvKSkvLnRlc3QocGF0aCkpIHtcbiAgICAgICAgYXBwLmNvbnRleHQubmV4dCh7XG4gICAgICAgICAgcGF0aCxcbiAgICAgICAgICBxdWVyeSxcbiAgICAgICAgICBzdGF0dXNcbiAgICAgICAgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhdGggPSBmb3JtYXRVcmwocGF0aCwgcXVlcnkpXG4gICAgICAgIGlmIChwcm9jZXNzLnNlcnZlcikge1xuICAgICAgICAgIGFwcC5jb250ZXh0Lm5leHQoe1xuICAgICAgICAgICAgcGF0aCxcbiAgICAgICAgICAgIHN0YXR1c1xuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2Nlc3MuY2xpZW50KSB7XG4gICAgICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0xvY2F0aW9uL3JlcGxhY2VcbiAgICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVwbGFjZShwYXRoKVxuXG4gICAgICAgICAgLy8gVGhyb3cgYSByZWRpcmVjdCBlcnJvclxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRVJSX1JFRElSRUNUJylcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAocHJvY2Vzcy5zZXJ2ZXIpIHtcbiAgICAgIGFwcC5jb250ZXh0LmJlZm9yZU51eHRSZW5kZXIgPSBmbiA9PiBjb250ZXh0LmJlZm9yZVJlbmRlckZucy5wdXNoKGZuKVxuICAgIH1cbiAgICBpZiAocHJvY2Vzcy5jbGllbnQpIHtcbiAgICAgIGFwcC5jb250ZXh0Lm51eHRTdGF0ZSA9IHdpbmRvdy5fX05VWFRfX1xuICAgIH1cbiAgfVxuXG4gIC8vIER5bmFtaWMga2V5c1xuICBjb25zdCBbY3VycmVudFJvdXRlRGF0YSwgZnJvbVJvdXRlRGF0YV0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgZ2V0Um91dGVEYXRhKGNvbnRleHQucm91dGUpLFxuICAgIGdldFJvdXRlRGF0YShjb250ZXh0LmZyb20pXG4gIF0pXG5cbiAgaWYgKGNvbnRleHQucm91dGUpIHtcbiAgICBhcHAuY29udGV4dC5yb3V0ZSA9IGN1cnJlbnRSb3V0ZURhdGFcbiAgfVxuXG4gIGlmIChjb250ZXh0LmZyb20pIHtcbiAgICBhcHAuY29udGV4dC5mcm9tID0gZnJvbVJvdXRlRGF0YVxuICB9XG5cbiAgYXBwLmNvbnRleHQubmV4dCA9IGNvbnRleHQubmV4dFxuICBhcHAuY29udGV4dC5fcmVkaXJlY3RlZCA9IGZhbHNlXG4gIGFwcC5jb250ZXh0Ll9lcnJvcmVkID0gZmFsc2VcbiAgYXBwLmNvbnRleHQuaXNITVIgPSBmYWxzZVxuICBhcHAuY29udGV4dC5wYXJhbXMgPSBhcHAuY29udGV4dC5yb3V0ZS5wYXJhbXMgfHwge31cbiAgYXBwLmNvbnRleHQucXVlcnkgPSBhcHAuY29udGV4dC5yb3V0ZS5xdWVyeSB8fCB7fVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbWlkZGxld2FyZVNlcmllcyAocHJvbWlzZXMsIGFwcENvbnRleHQpIHtcbiAgaWYgKCFwcm9taXNlcy5sZW5ndGggfHwgYXBwQ29udGV4dC5fcmVkaXJlY3RlZCB8fCBhcHBDb250ZXh0Ll9lcnJvcmVkKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpXG4gIH1cbiAgcmV0dXJuIHByb21pc2lmeShwcm9taXNlc1swXSwgYXBwQ29udGV4dClcbiAgICAudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm4gbWlkZGxld2FyZVNlcmllcyhwcm9taXNlcy5zbGljZSgxKSwgYXBwQ29udGV4dClcbiAgICB9KVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJvbWlzaWZ5IChmbiwgY29udGV4dCkge1xuICBsZXQgcHJvbWlzZVxuICBpZiAoZm4ubGVuZ3RoID09PSAyKSB7XG4gICAgLy8gZm4oY29udGV4dCwgY2FsbGJhY2spXG4gICAgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICBmbihjb250ZXh0LCBmdW5jdGlvbiAoZXJyLCBkYXRhKSB7XG4gICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICBjb250ZXh0LmVycm9yKGVycilcbiAgICAgICAgfVxuICAgICAgICBkYXRhID0gZGF0YSB8fCB7fVxuICAgICAgICByZXNvbHZlKGRhdGEpXG4gICAgICB9KVxuICAgIH0pXG4gIH0gZWxzZSB7XG4gICAgcHJvbWlzZSA9IGZuKGNvbnRleHQpXG4gIH1cblxuICBpZiAocHJvbWlzZSAmJiBwcm9taXNlIGluc3RhbmNlb2YgUHJvbWlzZSAmJiB0eXBlb2YgcHJvbWlzZS50aGVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHByb21pc2VcbiAgfVxuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHByb21pc2UpXG59XG5cbi8vIEltcG9ydGVkIGZyb20gdnVlLXJvdXRlclxuZXhwb3J0IGZ1bmN0aW9uIGdldExvY2F0aW9uIChiYXNlLCBtb2RlKSB7XG4gIGxldCBwYXRoID0gZGVjb2RlVVJJKHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSlcbiAgaWYgKG1vZGUgPT09ICdoYXNoJykge1xuICAgIHJldHVybiB3aW5kb3cubG9jYXRpb24uaGFzaC5yZXBsYWNlKC9eI1xcLy8sICcnKVxuICB9XG4gIGlmIChiYXNlICYmIHBhdGguaW5kZXhPZihiYXNlKSA9PT0gMCkge1xuICAgIHBhdGggPSBwYXRoLnNsaWNlKGJhc2UubGVuZ3RoKVxuICB9XG4gIHJldHVybiAocGF0aCB8fCAnLycpICsgd2luZG93LmxvY2F0aW9uLnNlYXJjaCArIHdpbmRvdy5sb2NhdGlvbi5oYXNoXG59XG5cbi8vIEltcG9ydGVkIGZyb20gcGF0aC10by1yZWdleHBcblxuLyoqXG4gKiBDb21waWxlIGEgc3RyaW5nIHRvIGEgdGVtcGxhdGUgZnVuY3Rpb24gZm9yIHRoZSBwYXRoLlxuICpcbiAqIEBwYXJhbSAge3N0cmluZ30gICAgICAgICAgICAgc3RyXG4gKiBAcGFyYW0gIHtPYmplY3Q9fSAgICAgICAgICAgIG9wdGlvbnNcbiAqIEByZXR1cm4geyFmdW5jdGlvbihPYmplY3Q9LCBPYmplY3Q9KX1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXBpbGUgKHN0ciwgb3B0aW9ucykge1xuICByZXR1cm4gdG9rZW5zVG9GdW5jdGlvbihwYXJzZShzdHIsIG9wdGlvbnMpLCBvcHRpb25zKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UXVlcnlEaWZmICh0b1F1ZXJ5LCBmcm9tUXVlcnkpIHtcbiAgY29uc3QgZGlmZiA9IHt9XG4gIGNvbnN0IHF1ZXJpZXMgPSB7IC4uLnRvUXVlcnksIC4uLmZyb21RdWVyeSB9XG4gIGZvciAoY29uc3QgayBpbiBxdWVyaWVzKSB7XG4gICAgaWYgKFN0cmluZyh0b1F1ZXJ5W2tdKSAhPT0gU3RyaW5nKGZyb21RdWVyeVtrXSkpIHtcbiAgICAgIGRpZmZba10gPSB0cnVlXG4gICAgfVxuICB9XG4gIHJldHVybiBkaWZmXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVFcnJvciAoZXJyKSB7XG4gIGxldCBtZXNzYWdlXG4gIGlmICghKGVyci5tZXNzYWdlIHx8IHR5cGVvZiBlcnIgPT09ICdzdHJpbmcnKSkge1xuICAgIHRyeSB7XG4gICAgICBtZXNzYWdlID0gSlNPTi5zdHJpbmdpZnkoZXJyLCBudWxsLCAyKVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIG1lc3NhZ2UgPSBgWyR7ZXJyLmNvbnN0cnVjdG9yLm5hbWV9XWBcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgbWVzc2FnZSA9IGVyci5tZXNzYWdlIHx8IGVyclxuICB9XG4gIHJldHVybiB7XG4gICAgLi4uZXJyLFxuICAgIG1lc3NhZ2UsXG4gICAgc3RhdHVzQ29kZTogKGVyci5zdGF0dXNDb2RlIHx8IGVyci5zdGF0dXMgfHwgKGVyci5yZXNwb25zZSAmJiBlcnIucmVzcG9uc2Uuc3RhdHVzKSB8fCA1MDApXG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgbWFpbiBwYXRoIG1hdGNoaW5nIHJlZ2V4cCB1dGlsaXR5LlxuICpcbiAqIEB0eXBlIHtSZWdFeHB9XG4gKi9cbmNvbnN0IFBBVEhfUkVHRVhQID0gbmV3IFJlZ0V4cChbXG4gIC8vIE1hdGNoIGVzY2FwZWQgY2hhcmFjdGVycyB0aGF0IHdvdWxkIG90aGVyd2lzZSBhcHBlYXIgaW4gZnV0dXJlIG1hdGNoZXMuXG4gIC8vIFRoaXMgYWxsb3dzIHRoZSB1c2VyIHRvIGVzY2FwZSBzcGVjaWFsIGNoYXJhY3RlcnMgdGhhdCB3b24ndCB0cmFuc2Zvcm0uXG4gICcoXFxcXFxcXFwuKScsXG4gIC8vIE1hdGNoIEV4cHJlc3Mtc3R5bGUgcGFyYW1ldGVycyBhbmQgdW4tbmFtZWQgcGFyYW1ldGVycyB3aXRoIGEgcHJlZml4XG4gIC8vIGFuZCBvcHRpb25hbCBzdWZmaXhlcy4gTWF0Y2hlcyBhcHBlYXIgYXM6XG4gIC8vXG4gIC8vIFwiLzp0ZXN0KFxcXFxkKyk/XCIgPT4gW1wiL1wiLCBcInRlc3RcIiwgXCJcXGQrXCIsIHVuZGVmaW5lZCwgXCI/XCIsIHVuZGVmaW5lZF1cbiAgLy8gXCIvcm91dGUoXFxcXGQrKVwiICA9PiBbdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgXCJcXGQrXCIsIHVuZGVmaW5lZCwgdW5kZWZpbmVkXVxuICAvLyBcIi8qXCIgICAgICAgICAgICA9PiBbXCIvXCIsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgXCIqXCJdXG4gICcoW1xcXFwvLl0pPyg/Oig/OlxcXFw6KFxcXFx3KykoPzpcXFxcKCgoPzpcXFxcXFxcXC58W15cXFxcXFxcXCgpXSkrKVxcXFwpKT98XFxcXCgoKD86XFxcXFxcXFwufFteXFxcXFxcXFwoKV0pKylcXFxcKSkoWysqP10pP3woXFxcXCopKSdcbl0uam9pbignfCcpLCAnZycpXG5cbi8qKlxuICogUGFyc2UgYSBzdHJpbmcgZm9yIHRoZSByYXcgdG9rZW5zLlxuICpcbiAqIEBwYXJhbSAge3N0cmluZ30gIHN0clxuICogQHBhcmFtICB7T2JqZWN0PX0gb3B0aW9uc1xuICogQHJldHVybiB7IUFycmF5fVxuICovXG5mdW5jdGlvbiBwYXJzZSAoc3RyLCBvcHRpb25zKSB7XG4gIGNvbnN0IHRva2VucyA9IFtdXG4gIGxldCBrZXkgPSAwXG4gIGxldCBpbmRleCA9IDBcbiAgbGV0IHBhdGggPSAnJ1xuICBjb25zdCBkZWZhdWx0RGVsaW1pdGVyID0gKG9wdGlvbnMgJiYgb3B0aW9ucy5kZWxpbWl0ZXIpIHx8ICcvJ1xuICBsZXQgcmVzXG5cbiAgd2hpbGUgKChyZXMgPSBQQVRIX1JFR0VYUC5leGVjKHN0cikpICE9IG51bGwpIHtcbiAgICBjb25zdCBtID0gcmVzWzBdXG4gICAgY29uc3QgZXNjYXBlZCA9IHJlc1sxXVxuICAgIGNvbnN0IG9mZnNldCA9IHJlcy5pbmRleFxuICAgIHBhdGggKz0gc3RyLnNsaWNlKGluZGV4LCBvZmZzZXQpXG4gICAgaW5kZXggPSBvZmZzZXQgKyBtLmxlbmd0aFxuXG4gICAgLy8gSWdub3JlIGFscmVhZHkgZXNjYXBlZCBzZXF1ZW5jZXMuXG4gICAgaWYgKGVzY2FwZWQpIHtcbiAgICAgIHBhdGggKz0gZXNjYXBlZFsxXVxuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBjb25zdCBuZXh0ID0gc3RyW2luZGV4XVxuICAgIGNvbnN0IHByZWZpeCA9IHJlc1syXVxuICAgIGNvbnN0IG5hbWUgPSByZXNbM11cbiAgICBjb25zdCBjYXB0dXJlID0gcmVzWzRdXG4gICAgY29uc3QgZ3JvdXAgPSByZXNbNV1cbiAgICBjb25zdCBtb2RpZmllciA9IHJlc1s2XVxuICAgIGNvbnN0IGFzdGVyaXNrID0gcmVzWzddXG5cbiAgICAvLyBQdXNoIHRoZSBjdXJyZW50IHBhdGggb250byB0aGUgdG9rZW5zLlxuICAgIGlmIChwYXRoKSB7XG4gICAgICB0b2tlbnMucHVzaChwYXRoKVxuICAgICAgcGF0aCA9ICcnXG4gICAgfVxuXG4gICAgY29uc3QgcGFydGlhbCA9IHByZWZpeCAhPSBudWxsICYmIG5leHQgIT0gbnVsbCAmJiBuZXh0ICE9PSBwcmVmaXhcbiAgICBjb25zdCByZXBlYXQgPSBtb2RpZmllciA9PT0gJysnIHx8IG1vZGlmaWVyID09PSAnKidcbiAgICBjb25zdCBvcHRpb25hbCA9IG1vZGlmaWVyID09PSAnPycgfHwgbW9kaWZpZXIgPT09ICcqJ1xuICAgIGNvbnN0IGRlbGltaXRlciA9IHJlc1syXSB8fCBkZWZhdWx0RGVsaW1pdGVyXG4gICAgY29uc3QgcGF0dGVybiA9IGNhcHR1cmUgfHwgZ3JvdXBcblxuICAgIHRva2Vucy5wdXNoKHtcbiAgICAgIG5hbWU6IG5hbWUgfHwga2V5KyssXG4gICAgICBwcmVmaXg6IHByZWZpeCB8fCAnJyxcbiAgICAgIGRlbGltaXRlcixcbiAgICAgIG9wdGlvbmFsLFxuICAgICAgcmVwZWF0LFxuICAgICAgcGFydGlhbCxcbiAgICAgIGFzdGVyaXNrOiBCb29sZWFuKGFzdGVyaXNrKSxcbiAgICAgIHBhdHRlcm46IHBhdHRlcm4gPyBlc2NhcGVHcm91cChwYXR0ZXJuKSA6IChhc3RlcmlzayA/ICcuKicgOiAnW14nICsgZXNjYXBlU3RyaW5nKGRlbGltaXRlcikgKyAnXSs/JylcbiAgICB9KVxuICB9XG5cbiAgLy8gTWF0Y2ggYW55IGNoYXJhY3RlcnMgc3RpbGwgcmVtYWluaW5nLlxuICBpZiAoaW5kZXggPCBzdHIubGVuZ3RoKSB7XG4gICAgcGF0aCArPSBzdHIuc3Vic3RyKGluZGV4KVxuICB9XG5cbiAgLy8gSWYgdGhlIHBhdGggZXhpc3RzLCBwdXNoIGl0IG9udG8gdGhlIGVuZC5cbiAgaWYgKHBhdGgpIHtcbiAgICB0b2tlbnMucHVzaChwYXRoKVxuICB9XG5cbiAgcmV0dXJuIHRva2Vuc1xufVxuXG4vKipcbiAqIFByZXR0aWVyIGVuY29kaW5nIG9mIFVSSSBwYXRoIHNlZ21lbnRzLlxuICpcbiAqIEBwYXJhbSAge3N0cmluZ31cbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqL1xuZnVuY3Rpb24gZW5jb2RlVVJJQ29tcG9uZW50UHJldHR5IChzdHIsIHNsYXNoQWxsb3dlZCkge1xuICBjb25zdCByZSA9IHNsYXNoQWxsb3dlZCA/IC9bPyNdL2cgOiAvWy8/I10vZ1xuICByZXR1cm4gZW5jb2RlVVJJKHN0cikucmVwbGFjZShyZSwgKGMpID0+IHtcbiAgICByZXR1cm4gJyUnICsgYy5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpXG4gIH0pXG59XG5cbi8qKlxuICogRW5jb2RlIHRoZSBhc3RlcmlzayBwYXJhbWV0ZXIuIFNpbWlsYXIgdG8gYHByZXR0eWAsIGJ1dCBhbGxvd3Mgc2xhc2hlcy5cbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd9XG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGVuY29kZUFzdGVyaXNrIChzdHIpIHtcbiAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudFByZXR0eShzdHIsIHRydWUpXG59XG5cbi8qKlxuICogRXNjYXBlIGEgcmVndWxhciBleHByZXNzaW9uIHN0cmluZy5cbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd9IHN0clxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiBlc2NhcGVTdHJpbmcgKHN0cikge1xuICByZXR1cm4gc3RyLnJlcGxhY2UoLyhbLisqPz1eIToke30oKVtcXF18L1xcXFxdKS9nLCAnXFxcXCQxJylcbn1cblxuLyoqXG4gKiBFc2NhcGUgdGhlIGNhcHR1cmluZyBncm91cCBieSBlc2NhcGluZyBzcGVjaWFsIGNoYXJhY3RlcnMgYW5kIG1lYW5pbmcuXG4gKlxuICogQHBhcmFtICB7c3RyaW5nfSBncm91cFxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiBlc2NhcGVHcm91cCAoZ3JvdXApIHtcbiAgcmV0dXJuIGdyb3VwLnJlcGxhY2UoLyhbPSE6JC8oKV0pL2csICdcXFxcJDEnKVxufVxuXG4vKipcbiAqIEV4cG9zZSBhIG1ldGhvZCBmb3IgdHJhbnNmb3JtaW5nIHRva2VucyBpbnRvIHRoZSBwYXRoIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiB0b2tlbnNUb0Z1bmN0aW9uICh0b2tlbnMsIG9wdGlvbnMpIHtcbiAgLy8gQ29tcGlsZSBhbGwgdGhlIHRva2VucyBpbnRvIHJlZ2V4cHMuXG4gIGNvbnN0IG1hdGNoZXMgPSBuZXcgQXJyYXkodG9rZW5zLmxlbmd0aClcblxuICAvLyBDb21waWxlIGFsbCB0aGUgcGF0dGVybnMgYmVmb3JlIGNvbXBpbGF0aW9uLlxuICBmb3IgKGxldCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykge1xuICAgIGlmICh0eXBlb2YgdG9rZW5zW2ldID09PSAnb2JqZWN0Jykge1xuICAgICAgbWF0Y2hlc1tpXSA9IG5ldyBSZWdFeHAoJ14oPzonICsgdG9rZW5zW2ldLnBhdHRlcm4gKyAnKSQnLCBmbGFncyhvcHRpb25zKSlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKG9iaiwgb3B0cykge1xuICAgIGxldCBwYXRoID0gJydcbiAgICBjb25zdCBkYXRhID0gb2JqIHx8IHt9XG4gICAgY29uc3Qgb3B0aW9ucyA9IG9wdHMgfHwge31cbiAgICBjb25zdCBlbmNvZGUgPSBvcHRpb25zLnByZXR0eSA/IGVuY29kZVVSSUNvbXBvbmVudFByZXR0eSA6IGVuY29kZVVSSUNvbXBvbmVudFxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHRva2VuID0gdG9rZW5zW2ldXG5cbiAgICAgIGlmICh0eXBlb2YgdG9rZW4gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHBhdGggKz0gdG9rZW5cblxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCB2YWx1ZSA9IGRhdGFbdG9rZW4ubmFtZSB8fCAncGF0aE1hdGNoJ11cbiAgICAgIGxldCBzZWdtZW50XG5cbiAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgIGlmICh0b2tlbi5vcHRpb25hbCkge1xuICAgICAgICAgIC8vIFByZXBlbmQgcGFydGlhbCBzZWdtZW50IHByZWZpeGVzLlxuICAgICAgICAgIGlmICh0b2tlbi5wYXJ0aWFsKSB7XG4gICAgICAgICAgICBwYXRoICs9IHRva2VuLnByZWZpeFxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgXCInICsgdG9rZW4ubmFtZSArICdcIiB0byBiZSBkZWZpbmVkJylcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgaWYgKCF0b2tlbi5yZXBlYXQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBcIicgKyB0b2tlbi5uYW1lICsgJ1wiIHRvIG5vdCByZXBlYXQsIGJ1dCByZWNlaXZlZCBgJyArIEpTT04uc3RyaW5naWZ5KHZhbHVlKSArICdgJylcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBpZiAodG9rZW4ub3B0aW9uYWwpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIFwiJyArIHRva2VuLm5hbWUgKyAnXCIgdG8gbm90IGJlIGVtcHR5JylcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHZhbHVlLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgc2VnbWVudCA9IGVuY29kZSh2YWx1ZVtqXSlcblxuICAgICAgICAgIGlmICghbWF0Y2hlc1tpXS50ZXN0KHNlZ21lbnQpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBhbGwgXCInICsgdG9rZW4ubmFtZSArICdcIiB0byBtYXRjaCBcIicgKyB0b2tlbi5wYXR0ZXJuICsgJ1wiLCBidXQgcmVjZWl2ZWQgYCcgKyBKU09OLnN0cmluZ2lmeShzZWdtZW50KSArICdgJylcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBwYXRoICs9IChqID09PSAwID8gdG9rZW4ucHJlZml4IDogdG9rZW4uZGVsaW1pdGVyKSArIHNlZ21lbnRcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIHNlZ21lbnQgPSB0b2tlbi5hc3RlcmlzayA/IGVuY29kZUFzdGVyaXNrKHZhbHVlKSA6IGVuY29kZSh2YWx1ZSlcblxuICAgICAgaWYgKCFtYXRjaGVzW2ldLnRlc3Qoc2VnbWVudCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgXCInICsgdG9rZW4ubmFtZSArICdcIiB0byBtYXRjaCBcIicgKyB0b2tlbi5wYXR0ZXJuICsgJ1wiLCBidXQgcmVjZWl2ZWQgXCInICsgc2VnbWVudCArICdcIicpXG4gICAgICB9XG5cbiAgICAgIHBhdGggKz0gdG9rZW4ucHJlZml4ICsgc2VnbWVudFxuICAgIH1cblxuICAgIHJldHVybiBwYXRoXG4gIH1cbn1cblxuLyoqXG4gKiBHZXQgdGhlIGZsYWdzIGZvciBhIHJlZ2V4cCBmcm9tIHRoZSBvcHRpb25zLlxuICpcbiAqIEBwYXJhbSAge09iamVjdH0gb3B0aW9uc1xuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiBmbGFncyAob3B0aW9ucykge1xuICByZXR1cm4gb3B0aW9ucyAmJiBvcHRpb25zLnNlbnNpdGl2ZSA/ICcnIDogJ2knXG59XG5cbi8qKlxuICogRm9ybWF0IGdpdmVuIHVybCwgYXBwZW5kIHF1ZXJ5IHRvIHVybCBxdWVyeSBzdHJpbmdcbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmd9IHVybFxuICogQHBhcmFtICB7c3RyaW5nfSBxdWVyeVxuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiBmb3JtYXRVcmwgKHVybCwgcXVlcnkpIHtcbiAgbGV0IHByb3RvY29sXG4gIGNvbnN0IGluZGV4ID0gdXJsLmluZGV4T2YoJzovLycpXG4gIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICBwcm90b2NvbCA9IHVybC5zdWJzdHJpbmcoMCwgaW5kZXgpXG4gICAgdXJsID0gdXJsLnN1YnN0cmluZyhpbmRleCArIDMpXG4gIH0gZWxzZSBpZiAodXJsLnN0YXJ0c1dpdGgoJy8vJykpIHtcbiAgICB1cmwgPSB1cmwuc3Vic3RyaW5nKDIpXG4gIH1cblxuICBsZXQgcGFydHMgPSB1cmwuc3BsaXQoJy8nKVxuICBsZXQgcmVzdWx0ID0gKHByb3RvY29sID8gcHJvdG9jb2wgKyAnOi8vJyA6ICcvLycpICsgcGFydHMuc2hpZnQoKVxuXG4gIGxldCBwYXRoID0gcGFydHMuZmlsdGVyKEJvb2xlYW4pLmpvaW4oJy8nKVxuICBsZXQgaGFzaFxuICBwYXJ0cyA9IHBhdGguc3BsaXQoJyMnKVxuICBpZiAocGFydHMubGVuZ3RoID09PSAyKSB7XG4gICAgW3BhdGgsIGhhc2hdID0gcGFydHNcbiAgfVxuXG4gIHJlc3VsdCArPSBwYXRoID8gJy8nICsgcGF0aCA6ICcnXG5cbiAgaWYgKHF1ZXJ5ICYmIEpTT04uc3RyaW5naWZ5KHF1ZXJ5KSAhPT0gJ3t9Jykge1xuICAgIHJlc3VsdCArPSAodXJsLnNwbGl0KCc/JykubGVuZ3RoID09PSAyID8gJyYnIDogJz8nKSArIGZvcm1hdFF1ZXJ5KHF1ZXJ5KVxuICB9XG4gIHJlc3VsdCArPSBoYXNoID8gJyMnICsgaGFzaCA6ICcnXG5cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG4vKipcbiAqIFRyYW5zZm9ybSBkYXRhIG9iamVjdCB0byBxdWVyeSBzdHJpbmdcbiAqXG4gKiBAcGFyYW0gIHtvYmplY3R9IHF1ZXJ5XG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGZvcm1hdFF1ZXJ5IChxdWVyeSkge1xuICByZXR1cm4gT2JqZWN0LmtleXMocXVlcnkpLnNvcnQoKS5tYXAoKGtleSkgPT4ge1xuICAgIGNvbnN0IHZhbCA9IHF1ZXJ5W2tleV1cbiAgICBpZiAodmFsID09IG51bGwpIHtcbiAgICAgIHJldHVybiAnJ1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgICByZXR1cm4gdmFsLnNsaWNlKCkubWFwKHZhbDIgPT4gW2tleSwgJz0nLCB2YWwyXS5qb2luKCcnKSkuam9pbignJicpXG4gICAgfVxuICAgIHJldHVybiBrZXkgKyAnPScgKyB2YWxcbiAgfSkuZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyYnKVxufVxuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///1\n")},144:function(Q,B,F){Q.exports=F(145)},145:function(module,__webpack_exports__,__webpack_require__){"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* WEBPACK VAR INJECTION */(function(global) {/* harmony import */ var _babel_runtime_helpers_esm_typeof__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(18);\n/* harmony import */ var core_js_modules_es6_string_iterator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(61);\n/* harmony import */ var core_js_modules_es6_string_iterator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_string_iterator__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var core_js_modules_es7_symbol_async_iterator__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(47);\n/* harmony import */ var core_js_modules_es7_symbol_async_iterator__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es7_symbol_async_iterator__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var core_js_modules_es6_symbol__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(10);\n/* harmony import */ var core_js_modules_es6_symbol__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_symbol__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var core_js_modules_es6_regexp_match__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(95);\n/* harmony import */ var core_js_modules_es6_regexp_match__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_regexp_match__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var regenerator_runtime_runtime__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(62);\n/* harmony import */ var regenerator_runtime_runtime__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(regenerator_runtime_runtime__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var core_js_modules_es7_array_includes__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(45);\n/* harmony import */ var core_js_modules_es7_array_includes__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es7_array_includes__WEBPACK_IMPORTED_MODULE_6__);\n/* harmony import */ var core_js_modules_es6_string_includes__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(58);\n/* harmony import */ var core_js_modules_es6_string_includes__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_string_includes__WEBPACK_IMPORTED_MODULE_7__);\n/* harmony import */ var core_js_modules_web_dom_iterable__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(7);\n/* harmony import */ var core_js_modules_web_dom_iterable__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_web_dom_iterable__WEBPACK_IMPORTED_MODULE_8__);\n/* harmony import */ var core_js_modules_es6_object_to_string__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(6);\n/* harmony import */ var core_js_modules_es6_object_to_string__WEBPACK_IMPORTED_MODULE_9___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_object_to_string__WEBPACK_IMPORTED_MODULE_9__);\n/* harmony import */ var core_js_modules_es6_object_keys__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(22);\n/* harmony import */ var core_js_modules_es6_object_keys__WEBPACK_IMPORTED_MODULE_10___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_object_keys__WEBPACK_IMPORTED_MODULE_10__);\n/* harmony import */ var core_js_modules_es6_function_name__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(28);\n/* harmony import */ var core_js_modules_es6_function_name__WEBPACK_IMPORTED_MODULE_11___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_function_name__WEBPACK_IMPORTED_MODULE_11__);\n/* harmony import */ var core_js_modules_es6_array_iterator__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(113);\n/* harmony import */ var core_js_modules_es6_array_iterator__WEBPACK_IMPORTED_MODULE_12___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_array_iterator__WEBPACK_IMPORTED_MODULE_12__);\n/* harmony import */ var core_js_modules_es6_promise__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(154);\n/* harmony import */ var core_js_modules_es6_promise__WEBPACK_IMPORTED_MODULE_13___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_promise__WEBPACK_IMPORTED_MODULE_13__);\n/* harmony import */ var core_js_modules_es6_object_assign__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(159);\n/* harmony import */ var core_js_modules_es6_object_assign__WEBPACK_IMPORTED_MODULE_14___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es6_object_assign__WEBPACK_IMPORTED_MODULE_14__);\n/* harmony import */ var core_js_modules_es7_promise_finally__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(161);\n/* harmony import */ var core_js_modules_es7_promise_finally__WEBPACK_IMPORTED_MODULE_15___default = /*#__PURE__*/__webpack_require__.n(core_js_modules_es7_promise_finally__WEBPACK_IMPORTED_MODULE_15__);\n/* harmony import */ var vue__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(0);\n/* harmony import */ var unfetch__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(130);\n/* harmony import */ var _middleware_js__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(89);\n/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(1);\n/* harmony import */ var _index_js__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(27);\n/* harmony import */ var _components_nuxt_link_client_js__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(77);\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n // should be included after ./index.js\n// Component: \n\nvue__WEBPACK_IMPORTED_MODULE_16__[/* default */ "a"].component(_components_nuxt_link_client_js__WEBPACK_IMPORTED_MODULE_21__[/* default */ "a"].name, _components_nuxt_link_client_js__WEBPACK_IMPORTED_MODULE_21__[/* default */ "a"]);\nvue__WEBPACK_IMPORTED_MODULE_16__[/* default */ "a"].component(\'NLink\', _components_nuxt_link_client_js__WEBPACK_IMPORTED_MODULE_21__[/* default */ "a"]);\n\nif (!global.fetch) {\n global.fetch = unfetch__WEBPACK_IMPORTED_MODULE_17__[/* default */ "a"];\n} // Global shared references\n\n\nvar _lastPaths = [];\nvar app;\nvar router;\nvar store; // Try to rehydrate SSR data from window\n\nvar NUXT = window.__NUXT__ || {};\nObject.assign(vue__WEBPACK_IMPORTED_MODULE_16__[/* default */ "a"].config, {\n "silent": true,\n "performance": false\n});\nvar errorHandler = vue__WEBPACK_IMPORTED_MODULE_16__[/* default */ "a"].config.errorHandler || console.error; // Create and mount App\n\nObject(_index_js__WEBPACK_IMPORTED_MODULE_20__[/* createApp */ "b"])().then(mountApp).catch(errorHandler);\n\nfunction componentOption(component, key) {\n if (!component || !component.options || !component.options[key]) {\n return {};\n }\n\n var option = component.options[key];\n\n if (typeof option === \'function\') {\n for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n args[_key - 2] = arguments[_key];\n }\n\n return option.apply(void 0, args);\n }\n\n return option;\n}\n\nfunction mapTransitions(Components, to, from) {\n var componentTransitions = function componentTransitions(component) {\n var transition = componentOption(component, \'transition\', to, from) || {};\n return typeof transition === \'string\' ? {\n name: transition\n } : transition;\n };\n\n return Components.map(function (Component) {\n // Clone original object to prevent overrides\n var transitions = Object.assign({}, componentTransitions(Component)); // Combine transitions & prefer `leave` transitions of \'from\' route\n\n if (from && from.matched.length && from.matched[0].components.default) {\n var fromTransitions = componentTransitions(from.matched[0].components.default);\n Object.keys(fromTransitions).filter(function (key) {\n return fromTransitions[key] && key.toLowerCase().includes(\'leave\');\n }).forEach(function (key) {\n transitions[key] = fromTransitions[key];\n });\n }\n\n return transitions;\n });\n}\n\nfunction loadAsyncComponents(to, from, next) {\n var _this = this;\n\n var Components, startLoader, err, statusCode, message;\n return regeneratorRuntime.async(function loadAsyncComponents$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n // Check if route path changed (this._pathChanged), only if the page is not an error (for validate())\n this._pathChanged = Boolean(app.nuxt.err) || from.path !== to.path;\n this._queryChanged = JSON.stringify(to.query) !== JSON.stringify(from.query);\n this._diffQuery = this._queryChanged ? Object(_utils_js__WEBPACK_IMPORTED_MODULE_19__[/* getQueryDiff */ "g"])(to.query, from.query) : [];\n\n if (this._pathChanged && this.$loading.start && !this.$loading.manual) {\n this.$loading.start();\n }\n\n _context.prev = 4;\n\n if (!(!this._pathChanged && this._queryChanged)) {\n _context.next = 11;\n break;\n }\n\n _context.next = 8;\n return regeneratorRuntime.awrap(Object(_utils_js__WEBPACK_IMPORTED_MODULE_19__[/* resolveRouteComponents */ "n"])(to, function (Component, instance) {\n return {\n Component: Component,\n instance: instance\n };\n }));\n\n case 8:\n Components = _context.sent;\n // Add a marker on each component that it needs to refresh or not\n startLoader = Components.some(function (_ref) {\n var Component = _ref.Component,\n instance = _ref.instance;\n var watchQuery = Component.options.watchQuery;\n\n if (watchQuery === true) {\n return true;\n }\n\n if (Array.isArray(watchQuery)) {\n return watchQuery.some(function (key) {\n return _this._diffQuery[key];\n });\n }\n\n if (typeof watchQuery === \'function\') {\n return watchQuery.apply(instance, [to.query, from.query]);\n }\n\n return false;\n });\n\n if (startLoader && this.$loading.start && !this.$loading.manual) {\n this.$loading.start();\n }\n\n case 11:\n // Call next()\n next();\n _context.next = 25;\n break;\n\n case 14:\n _context.prev = 14;\n _context.t0 = _context["catch"](4);\n err = _context.t0 || {};\n statusCode = err.statusCode || err.status || err.response && err.response.status || 500;\n message = err.message || \'\'; // Handle chunk loading errors\n // This may be due to a new deployment or a network problem\n\n if (!/^Loading( CSS)? chunk (\\d)+ failed\\./.test(message)) {\n _context.next = 22;\n break;\n }\n\n window.location.reload(true\n /* skip cache */\n );\n return _context.abrupt("return");\n\n case 22:\n this.error({\n statusCode: statusCode,\n message: message\n });\n this.$nuxt.$emit(\'routeChanged\', to, from, err);\n next();\n\n case 25:\n case "end":\n return _context.stop();\n }\n }\n }, null, this, [[4, 14]]);\n}\n\nfunction applySSRData(Component, ssrData) {\n if (NUXT.serverRendered && ssrData) {\n Object(_utils_js__WEBPACK_IMPORTED_MODULE_19__[/* applyAsyncData */ "a"])(Component, ssrData);\n }\n\n Component._Ctor = Component;\n return Component;\n} // Get matched components\n\n\nfunction resolveComponents(router) {\n var path = Object(_utils_js__WEBPACK_IMPORTED_MODULE_19__[/* getLocation */ "d"])(router.options.base, router.options.mode);\n return Object(_utils_js__WEBPACK_IMPORTED_MODULE_19__[/* flatMapComponents */ "c"])(router.match(path), function _callee(Component, _, match, key, index) {\n var _Component;\n\n return regeneratorRuntime.async(function _callee$(_context2) {\n while (1) {\n switch (_context2.prev = _context2.next) {\n case 0:\n if (!(typeof Component === \'function\' && !Component.options)) {\n _context2.next = 4;\n break;\n }\n\n _context2.next = 3;\n return regeneratorRuntime.awrap(Component());\n\n case 3:\n Component = _context2.sent;\n\n case 4:\n // Sanitize it and save it\n _Component = applySSRData(Object(_utils_js__WEBPACK_IMPORTED_MODULE_19__[/* sanitizeComponent */ "o"])(Component), NUXT.data ? NUXT.data[index] : null);\n match.components[key] = _Component;\n return _context2.abrupt("return", _Component);\n\n case 7:\n case "end":\n return _context2.stop();\n }\n }\n });\n });\n}\n\nfunction callMiddleware(Components, context, layout) {\n var _this2 = this;\n\n var midd = [];\n var unknownMiddleware = false; // If layout is undefined, only call global middleware\n\n if (typeof layout !== \'undefined\') {\n midd = []; // Exclude global middleware if layout defined (already called before)\n\n layout = Object(_utils_js__WEBPACK_IMPORTED_MODULE_19__[/* sanitizeComponent */ "o"])(layout);\n\n if (layout.options.middleware) {\n midd = midd.concat(layout.options.middleware);\n }\n\n Components.forEach(function (Component) {\n if (Component.options.middleware) {\n midd = midd.concat(Component.options.middleware);\n }\n });\n }\n\n midd = midd.map(function (name) {\n if (typeof name === \'function\') {\n return name;\n }\n\n if (typeof _middleware_js__WEBPACK_IMPORTED_MODULE_18__[/* default */ "a"][name] !== \'function\') {\n unknownMiddleware = true;\n\n _this2.error({\n statusCode: 500,\n message: \'Unknown middleware \' + name\n });\n }\n\n return _middleware_js__WEBPACK_IMPORTED_MODULE_18__[/* default */ "a"][name];\n });\n\n if (unknownMiddleware) {\n return;\n }\n\n return Object(_utils_js__WEBPACK_IMPORTED_MODULE_19__[/* middlewareSeries */ "k"])(midd, context);\n}\n\nfunction render(to, from, next) {\n var _this3 = this;\n\n var fromMatches, nextCalled, _next, matches, Components, errorLayout, layout, _layout, isValid, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, Component, instances, error, _layout2;\n\n return regeneratorRuntime.async(function render$(_context3) {\n while (1) {\n switch (_context3.prev = _context3.next) {\n case 0:\n if (!(this._pathChanged === false && this._queryChanged === false)) {\n _context3.next = 2;\n break;\n }\n\n return _context3.abrupt("return", next());\n\n case 2:\n // Handle first render on SPA mode\n if (to === from) {\n _lastPaths = [];\n } else {\n fromMatches = [];\n _lastPaths = Object(_utils_js__WEBPACK_IMPORTED_MODULE_19__[/* getMatchedComponents */ "e"])(from, fromMatches).map(function (Component, i) {\n return Object(_utils_js__WEBPACK_IMPORTED_MODULE_19__[/* compile */ "b"])(from.matched[fromMatches[i]].path)(from.params);\n });\n } // nextCalled is true when redirected\n\n\n nextCalled = false;\n\n _next = function _next(path) {\n if (from.path === path.path && _this3.$loading.finish) {\n _this3.$loading.finish();\n }\n\n if (from.path !== path.path && _this3.$loading.pause) {\n _this3.$loading.pause();\n }\n\n if (nextCalled) {\n return;\n }\n\n nextCalled = true;\n next(path);\n }; // Update context\n\n\n _context3.next = 7;\n return regeneratorRuntime.awrap(Object(_utils_js__WEBPACK_IMPORTED_MODULE_19__[/* setContext */ "p"])(app, {\n route: to,\n from: from,\n next: _next.bind(this)\n }));\n\n case 7:\n this._dateLastError = app.nuxt.dateErr;\n this._hadError = Boolean(app.nuxt.err); // Get route\'s matched components\n\n matches = [];\n Components = Object(_utils_js__WEBPACK_IMPORTED_MODULE_19__[/* getMatchedComponents */ "e"])(to, matches); // If no Components matched, generate 404\n\n if (Components.length) {\n _context3.next = 26;\n break;\n }\n\n _context3.next = 14;\n return regeneratorRuntime.awrap(callMiddleware.call(this, Components, app.context));\n\n case 14:\n if (!nextCalled) {\n _context3.next = 16;\n break;\n }\n\n return _context3.abrupt("return");\n\n case 16:\n // Load layout for error page\n errorLayout = (_index_js__WEBPACK_IMPORTED_MODULE_20__[/* NuxtError */ "a"].options || _index_js__WEBPACK_IMPORTED_MODULE_20__[/* NuxtError */ "a"]).layout;\n _context3.next = 19;\n return regeneratorRuntime.awrap(this.loadLayout(typeof errorLayout === \'function\' ? errorLayout.call(_index_js__WEBPACK_IMPORTED_MODULE_20__[/* NuxtError */ "a"], app.context) : errorLayout));\n\n case 19:\n layout = _context3.sent;\n _context3.next = 22;\n return regeneratorRuntime.awrap(callMiddleware.call(this, Components, app.context, layout));\n\n case 22:\n if (!nextCalled) {\n _context3.next = 24;\n break;\n }\n\n return _context3.abrupt("return");\n\n case 24:\n // Show error page\n app.context.error({\n statusCode: 404,\n message: \'This page could not be found\'\n });\n return _context3.abrupt("return", next());\n\n case 26:\n // Update ._data and other properties if hot reloaded\n Components.forEach(function (Component) {\n if (Component._Ctor && Component._Ctor.options) {\n Component.options.asyncData = Component._Ctor.options.asyncData;\n Component.options.fetch = Component._Ctor.options.fetch;\n }\n }); // Apply transitions\n\n this.setTransitions(mapTransitions(Components, to, from));\n _context3.prev = 28;\n _context3.next = 31;\n return regeneratorRuntime.awrap(callMiddleware.call(this, Components, app.context));\n\n case 31:\n if (!nextCalled) {\n _context3.next = 33;\n break;\n }\n\n return _context3.abrupt("return");\n\n case 33:\n if (!app.context._errored) {\n _context3.next = 35;\n break;\n }\n\n return _context3.abrupt("return", next());\n\n case 35:\n // Set layout\n _layout = Components[0].options.layout;\n\n if (typeof _layout === \'function\') {\n _layout = _layout(app.context);\n }\n\n _context3.next = 39;\n return regeneratorRuntime.awrap(this.loadLayout(_layout));\n\n case 39:\n _layout = _context3.sent;\n _context3.next = 42;\n return regeneratorRuntime.awrap(callMiddleware.call(this, Components, app.context, _layout));\n\n case 42:\n if (!nextCalled) {\n _context3.next = 44;\n break;\n }\n\n return _context3.abrupt("return");\n\n case 44:\n if (!app.context._errored) {\n _context3.next = 46;\n break;\n }\n\n return _context3.abrupt("return", next());\n\n case 46:\n // Call .validate()\n isValid = true;\n _context3.prev = 47;\n _iteratorNormalCompletion = true;\n _didIteratorError = false;\n _iteratorError = undefined;\n _context3.prev = 51;\n _iterator = Components[Symbol.iterator]();\n\n case 53:\n if (_iteratorNormalCompletion = (_step = _iterator.next()).done) {\n _context3.next = 65;\n break;\n }\n\n Component = _step.value;\n\n if (!(typeof Component.options.validate !== \'function\')) {\n _context3.next = 57;\n break;\n }\n\n return _context3.abrupt("continue", 62);\n\n case 57:\n _context3.next = 59;\n return regeneratorRuntime.awrap(Component.options.validate(app.context));\n\n case 59:\n isValid = _context3.sent;\n\n if (isValid) {\n _context3.next = 62;\n break;\n }\n\n return _context3.abrupt("break", 65);\n\n case 62:\n _iteratorNormalCompletion = true;\n _context3.next = 53;\n break;\n\n case 65:\n _context3.next = 71;\n break;\n\n case 67:\n _context3.prev = 67;\n _context3.t0 = _context3["catch"](51);\n _didIteratorError = true;\n _iteratorError = _context3.t0;\n\n case 71:\n _context3.prev = 71;\n _context3.prev = 72;\n\n if (!_iteratorNormalCompletion && _iterator.return != null) {\n _iterator.return();\n }\n\n case 74:\n _context3.prev = 74;\n\n if (!_didIteratorError) {\n _context3.next = 77;\n break;\n }\n\n throw _iteratorError;\n\n case 77:\n return _context3.finish(74);\n\n case 78:\n return _context3.finish(71);\n\n case 79:\n _context3.next = 85;\n break;\n\n case 81:\n _context3.prev = 81;\n _context3.t1 = _context3["catch"](47);\n // ...If .validate() threw an error\n this.error({\n statusCode: _context3.t1.statusCode || \'500\',\n message: _context3.t1.message\n });\n return _context3.abrupt("return", next());\n\n case 85:\n if (isValid) {\n _context3.next = 88;\n break;\n }\n\n this.error({\n statusCode: 404,\n message: \'This page could not be found\'\n });\n return _context3.abrupt("return", next());\n\n case 88:\n _context3.next = 90;\n return regeneratorRuntime.awrap(Promise.all(Components.map(function (Component, i) {\n // Check if only children route changed\n Component._path = Object(_utils_js__WEBPACK_IMPORTED_MODULE_19__[/* compile */ "b"])(to.matched[matches[i]].path)(to.params);\n Component._dataRefresh = false; // Check if Component need to be refreshed (call asyncData & fetch)\n // Only if its slug has changed or is watch query changes\n\n if (_this3._pathChanged && _this3._queryChanged || Component._path !== _lastPaths[i]) {\n Component._dataRefresh = true;\n } else if (!_this3._pathChanged && _this3._queryChanged) {\n var watchQuery = Component.options.watchQuery;\n\n if (watchQuery === true) {\n Component._dataRefresh = true;\n } else if (Array.isArray(watchQuery)) {\n Component._dataRefresh = watchQuery.some(function (key) {\n return _this3._diffQuery[key];\n });\n } else if (typeof watchQuery === \'function\') {\n if (!instances) {\n instances = Object(_utils_js__WEBPACK_IMPORTED_MODULE_19__[/* getMatchedComponentsInstances */ "f"])(to);\n }\n\n Component._dataRefresh = watchQuery.apply(instances[i], [to.query, from.query]);\n }\n }\n\n if (!_this3._hadError && _this3._isMounted && !Component._dataRefresh) {\n return;\n }\n\n var promises = [];\n var hasAsyncData = Component.options.asyncData && typeof Component.options.asyncData === \'function\';\n var hasFetch = Boolean(Component.options.fetch);\n var loadingIncrease = hasAsyncData && hasFetch ? 30 : 45; // Call asyncData(context)\n\n if (hasAsyncData) {\n var promise = Object(_utils_js__WEBPACK_IMPORTED_MODULE_19__[/* promisify */ "m"])(Component.options.asyncData, app.context).then(function (asyncDataResult) {\n Object(_utils_js__WEBPACK_IMPORTED_MODULE_19__[/* applyAsyncData */ "a"])(Component, asyncDataResult);\n\n if (_this3.$loading.increase) {\n _this3.$loading.increase(loadingIncrease);\n }\n });\n promises.push(promise);\n } // Check disabled page loading\n\n\n _this3.$loading.manual = Component.options.loading === false; // Call fetch(context)\n\n if (hasFetch) {\n var p = Component.options.fetch(app.context);\n\n if (!p || !(p instanceof Promise) && typeof p.then !== \'function\') {\n p = Promise.resolve(p);\n }\n\n p.then(function (fetchResult) {\n if (_this3.$loading.increase) {\n _this3.$loading.increase(loadingIncrease);\n }\n });\n promises.push(p);\n }\n\n return Promise.all(promises);\n })));\n\n case 90:\n // If not redirected\n if (!nextCalled) {\n if (this.$loading.finish && !this.$loading.manual) {\n this.$loading.finish();\n }\n\n next();\n }\n\n _context3.next = 107;\n break;\n\n case 93:\n _context3.prev = 93;\n _context3.t2 = _context3["catch"](28);\n error = _context3.t2 || {};\n\n if (!(error.message === \'ERR_REDIRECT\')) {\n _context3.next = 98;\n break;\n }\n\n return _context3.abrupt("return", this.$nuxt.$emit(\'routeChanged\', to, from, error));\n\n case 98:\n _lastPaths = [];\n Object(_utils_js__WEBPACK_IMPORTED_MODULE_19__[/* globalHandleError */ "i"])(error); // Load error layout\n\n _layout2 = (_index_js__WEBPACK_IMPORTED_MODULE_20__[/* NuxtError */ "a"].options || _index_js__WEBPACK_IMPORTED_MODULE_20__[/* NuxtError */ "a"]).layout;\n\n if (typeof _layout2 === \'function\') {\n _layout2 = _layout2(app.context);\n }\n\n _context3.next = 104;\n return regeneratorRuntime.awrap(this.loadLayout(_layout2));\n\n case 104:\n this.error(error);\n this.$nuxt.$emit(\'routeChanged\', to, from, error);\n next();\n\n case 107:\n case "end":\n return _context3.stop();\n }\n }\n }, null, this, [[28, 93], [47, 81], [51, 67, 71, 79], [72,, 74, 78]]);\n} // Fix components format in matched, it\'s due to code-splitting of vue-router\n\n\nfunction normalizeComponents(to, ___) {\n Object(_utils_js__WEBPACK_IMPORTED_MODULE_19__[/* flatMapComponents */ "c"])(to, function (Component, _, match, key) {\n if (Object(_babel_runtime_helpers_esm_typeof__WEBPACK_IMPORTED_MODULE_0__[/* default */ "a"])(Component) === \'object\' && !Component.options) {\n // Updated via vue-router resolveAsyncComponents()\n Component = vue__WEBPACK_IMPORTED_MODULE_16__[/* default */ "a"].extend(Component);\n Component._Ctor = Component;\n match.components[key] = Component;\n }\n\n return Component;\n });\n}\n\nfunction showNextPage(to) {\n // Hide error component if no error\n if (this._hadError && this._dateLastError === this.$options.nuxt.dateErr) {\n this.error();\n } // Set layout\n\n\n var layout = this.$options.nuxt.err ? (_index_js__WEBPACK_IMPORTED_MODULE_20__[/* NuxtError */ "a"].options || _index_js__WEBPACK_IMPORTED_MODULE_20__[/* NuxtError */ "a"]).layout : to.matched[0].components.default.options.layout;\n\n if (typeof layout === \'function\') {\n layout = layout(app.context);\n }\n\n this.setLayout(layout);\n} // When navigating on a different route but the same component is used, Vue.js\n// Will not update the instance data, so we have to update $data ourselves\n\n\nfunction fixPrepatch(to, ___) {\n var _this4 = this;\n\n if (this._pathChanged === false && this._queryChanged === false) {\n return;\n }\n\n var instances = Object(_utils_js__WEBPACK_IMPORTED_MODULE_19__[/* getMatchedComponentsInstances */ "f"])(to);\n var Components = Object(_utils_js__WEBPACK_IMPORTED_MODULE_19__[/* getMatchedComponents */ "e"])(to);\n vue__WEBPACK_IMPORTED_MODULE_16__[/* default */ "a"].nextTick(function () {\n instances.forEach(function (instance, i) {\n if (!instance || instance._isDestroyed) {\n return;\n }\n\n if (instance.constructor._dataRefresh && Components[i] === instance.constructor && instance.$vnode.data.keepAlive !== true && typeof instance.constructor.options.data === \'function\') {\n var newData = instance.constructor.options.data.call(instance);\n\n for (var key in newData) {\n vue__WEBPACK_IMPORTED_MODULE_16__[/* default */ "a"].set(instance.$data, key, newData[key]);\n } // Ensure to trigger scroll event after calling scrollBehavior\n\n\n window.$nuxt.$nextTick(function () {\n window.$nuxt.$emit(\'triggerScroll\');\n });\n }\n });\n showNextPage.call(_this4, to);\n });\n}\n\nfunction nuxtReady(_app) {\n window.onNuxtReadyCbs.forEach(function (cb) {\n if (typeof cb === \'function\') {\n cb(_app);\n }\n }); // Special JSDOM\n\n if (typeof window._onNuxtLoaded === \'function\') {\n window._onNuxtLoaded(_app);\n } // Add router hooks\n\n\n router.afterEach(function (to, from) {\n // Wait for fixPrepatch + $data updates\n vue__WEBPACK_IMPORTED_MODULE_16__[/* default */ "a"].nextTick(function () {\n return _app.$nuxt.$emit(\'routeChanged\', to, from);\n });\n });\n}\n\nfunction mountApp(__app) {\n var _app, mount, Components, clientFirstMount;\n\n return regeneratorRuntime.async(function mountApp$(_context4) {\n while (1) {\n switch (_context4.prev = _context4.next) {\n case 0:\n // Set global variables\n app = __app.app;\n router = __app.router;\n store = __app.store; // Create Vue instance\n\n _app = new vue__WEBPACK_IMPORTED_MODULE_16__[/* default */ "a"](app); // Mounts Vue app to DOM element\n\n mount = function mount() {\n _app.$mount(\'#__nuxt\'); // Add afterEach router hooks\n\n\n router.afterEach(normalizeComponents);\n router.afterEach(fixPrepatch.bind(_app)); // Listen for first Vue update\n\n vue__WEBPACK_IMPORTED_MODULE_16__[/* default */ "a"].nextTick(function () {\n // Call window.{{globals.readyCallback}} callbacks\n nuxtReady(_app);\n });\n }; // Resolve route components\n\n\n _context4.next = 7;\n return regeneratorRuntime.awrap(Promise.all(resolveComponents(router)));\n\n case 7:\n Components = _context4.sent;\n // Enable transitions\n _app.setTransitions = _app.$options.nuxt.setTransitions.bind(_app);\n\n if (Components.length) {\n _app.setTransitions(mapTransitions(Components, router.currentRoute));\n\n _lastPaths = router.currentRoute.matched.map(function (route) {\n return Object(_utils_js__WEBPACK_IMPORTED_MODULE_19__[/* compile */ "b"])(route.path)(router.currentRoute.params);\n });\n } // Initialize error handler\n\n\n _app.$loading = {}; // To avoid error while _app.$nuxt does not exist\n\n if (NUXT.error) {\n _app.error(NUXT.error);\n } // Add beforeEach router hooks\n\n\n router.beforeEach(loadAsyncComponents.bind(_app));\n router.beforeEach(render.bind(_app)); // If page already is server rendered\n\n if (!NUXT.serverRendered) {\n _context4.next = 17;\n break;\n }\n\n mount();\n return _context4.abrupt("return");\n\n case 17:\n // First render on client-side\n clientFirstMount = function clientFirstMount() {\n normalizeComponents(router.currentRoute, router.currentRoute);\n showNextPage.call(_app, router.currentRoute); // Don\'t call fixPrepatch.call(_app, router.currentRoute, router.currentRoute) since it\'s first render\n\n mount();\n };\n\n render.call(_app, router.currentRoute, router.currentRoute, function (path) {\n // If not redirected\n if (!path) {\n clientFirstMount();\n return;\n } // Add a one-time afterEach hook to\n // mount the app wait for redirect and route gets resolved\n\n\n var unregisterHook = router.afterEach(function (to, from) {\n unregisterHook();\n clientFirstMount();\n }); // Push the path and let route to be resolved\n\n router.push(path, undefined, function (err) {\n if (err) {\n errorHandler(err);\n }\n });\n });\n\n case 19:\n case "end":\n return _context4.stop();\n }\n }\n });\n}\n/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(41)))//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi8ubnV4dC9jbGllbnQuanM/MDZhMCJdLCJuYW1lcyI6WyJWdWUiLCJjb21wb25lbnQiLCJOdXh0TGluayIsIm5hbWUiLCJnbG9iYWwiLCJmZXRjaCIsIl9sYXN0UGF0aHMiLCJhcHAiLCJyb3V0ZXIiLCJzdG9yZSIsIk5VWFQiLCJ3aW5kb3ciLCJfX05VWFRfXyIsIk9iamVjdCIsImFzc2lnbiIsImNvbmZpZyIsImVycm9ySGFuZGxlciIsImNvbnNvbGUiLCJlcnJvciIsImNyZWF0ZUFwcCIsInRoZW4iLCJtb3VudEFwcCIsImNhdGNoIiwiY29tcG9uZW50T3B0aW9uIiwia2V5Iiwib3B0aW9ucyIsIm9wdGlvbiIsImFyZ3MiLCJtYXBUcmFuc2l0aW9ucyIsIkNvbXBvbmVudHMiLCJ0byIsImZyb20iLCJjb21wb25lbnRUcmFuc2l0aW9ucyIsInRyYW5zaXRpb24iLCJtYXAiLCJDb21wb25lbnQiLCJ0cmFuc2l0aW9ucyIsIm1hdGNoZWQiLCJsZW5ndGgiLCJjb21wb25lbnRzIiwiZGVmYXVsdCIsImZyb21UcmFuc2l0aW9ucyIsImtleXMiLCJmaWx0ZXIiLCJ0b0xvd2VyQ2FzZSIsImluY2x1ZGVzIiwiZm9yRWFjaCIsImxvYWRBc3luY0NvbXBvbmVudHMiLCJuZXh0IiwiX3BhdGhDaGFuZ2VkIiwiQm9vbGVhbiIsIm51eHQiLCJlcnIiLCJwYXRoIiwiX3F1ZXJ5Q2hhbmdlZCIsIkpTT04iLCJzdHJpbmdpZnkiLCJxdWVyeSIsIl9kaWZmUXVlcnkiLCJnZXRRdWVyeURpZmYiLCIkbG9hZGluZyIsInN0YXJ0IiwibWFudWFsIiwicmVzb2x2ZVJvdXRlQ29tcG9uZW50cyIsImluc3RhbmNlIiwic3RhcnRMb2FkZXIiLCJzb21lIiwid2F0Y2hRdWVyeSIsIkFycmF5IiwiaXNBcnJheSIsImFwcGx5Iiwic3RhdHVzQ29kZSIsInN0YXR1cyIsInJlc3BvbnNlIiwibWVzc2FnZSIsInRlc3QiLCJsb2NhdGlvbiIsInJlbG9hZCIsIiRudXh0IiwiJGVtaXQiLCJhcHBseVNTUkRhdGEiLCJzc3JEYXRhIiwic2VydmVyUmVuZGVyZWQiLCJhcHBseUFzeW5jRGF0YSIsIl9DdG9yIiwicmVzb2x2ZUNvbXBvbmVudHMiLCJnZXRMb2NhdGlvbiIsImJhc2UiLCJtb2RlIiwiZmxhdE1hcENvbXBvbmVudHMiLCJtYXRjaCIsIl8iLCJpbmRleCIsIl9Db21wb25lbnQiLCJzYW5pdGl6ZUNvbXBvbmVudCIsImRhdGEiLCJjYWxsTWlkZGxld2FyZSIsImNvbnRleHQiLCJsYXlvdXQiLCJtaWRkIiwidW5rbm93bk1pZGRsZXdhcmUiLCJtaWRkbGV3YXJlIiwiY29uY2F0IiwibWlkZGxld2FyZVNlcmllcyIsInJlbmRlciIsImZyb21NYXRjaGVzIiwiZ2V0TWF0Y2hlZENvbXBvbmVudHMiLCJpIiwiY29tcGlsZSIsInBhcmFtcyIsIm5leHRDYWxsZWQiLCJfbmV4dCIsImZpbmlzaCIsInBhdXNlIiwic2V0Q29udGV4dCIsInJvdXRlIiwiYmluZCIsIl9kYXRlTGFzdEVycm9yIiwiZGF0ZUVyciIsIl9oYWRFcnJvciIsIm1hdGNoZXMiLCJjYWxsIiwiZXJyb3JMYXlvdXQiLCJOdXh0RXJyb3IiLCJsb2FkTGF5b3V0IiwiYXN5bmNEYXRhIiwic2V0VHJhbnNpdGlvbnMiLCJfZXJyb3JlZCIsImlzVmFsaWQiLCJ2YWxpZGF0ZSIsIlByb21pc2UiLCJhbGwiLCJfcGF0aCIsIl9kYXRhUmVmcmVzaCIsImluc3RhbmNlcyIsImdldE1hdGNoZWRDb21wb25lbnRzSW5zdGFuY2VzIiwiX2lzTW91bnRlZCIsInByb21pc2VzIiwiaGFzQXN5bmNEYXRhIiwiaGFzRmV0Y2giLCJsb2FkaW5nSW5jcmVhc2UiLCJwcm9taXNlIiwicHJvbWlzaWZ5IiwiYXN5bmNEYXRhUmVzdWx0IiwiaW5jcmVhc2UiLCJwdXNoIiwibG9hZGluZyIsInAiLCJyZXNvbHZlIiwiZmV0Y2hSZXN1bHQiLCJnbG9iYWxIYW5kbGVFcnJvciIsIm5vcm1hbGl6ZUNvbXBvbmVudHMiLCJfX18iLCJleHRlbmQiLCJzaG93TmV4dFBhZ2UiLCIkb3B0aW9ucyIsInNldExheW91dCIsImZpeFByZXBhdGNoIiwibmV4dFRpY2siLCJfaXNEZXN0cm95ZWQiLCJjb25zdHJ1Y3RvciIsIiR2bm9kZSIsImtlZXBBbGl2ZSIsIm5ld0RhdGEiLCJzZXQiLCIkZGF0YSIsIiRuZXh0VGljayIsIm51eHRSZWFkeSIsIl9hcHAiLCJvbk51eHRSZWFkeUNicyIsImNiIiwiX29uTnV4dExvYWRlZCIsImFmdGVyRWFjaCIsIl9fYXBwIiwibW91bnQiLCIkbW91bnQiLCJjdXJyZW50Um91dGUiLCJiZWZvcmVFYWNoIiwiY2xpZW50Rmlyc3RNb3VudCIsInVucmVnaXN0ZXJIb29rIiwidW5kZWZpbmVkIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQWVBO0NBQ3dEO0FBRXhEOztBQUNBQSxvREFBRyxDQUFDQyxTQUFKLENBQWNDLGdGQUFRLENBQUNDLElBQXZCLEVBQTZCRCxnRkFBN0I7QUFDQUYsb0RBQUcsQ0FBQ0MsU0FBSixDQUFjLE9BQWQsRUFBdUJDLGdGQUF2Qjs7QUFFQSxJQUFJLENBQUNFLE1BQU0sQ0FBQ0MsS0FBWixFQUFtQjtBQUFFRCxRQUFNLENBQUNDLEtBQVAsR0FBZUEsd0RBQWY7QUFBc0IsQyxDQUUzQzs7O0FBQ0EsSUFBSUMsVUFBVSxHQUFHLEVBQWpCO0FBQ0EsSUFBSUMsR0FBSjtBQUNBLElBQUlDLE1BQUo7QUFDQSxJQUFJQyxLQUFKLEMsQ0FFQTs7QUFDQSxJQUFNQyxJQUFJLEdBQUdDLE1BQU0sQ0FBQ0MsUUFBUCxJQUFtQixFQUFoQztBQUVBQyxNQUFNLENBQUNDLE1BQVAsQ0FBY2Qsb0RBQUcsQ0FBQ2UsTUFBbEIsRUFBMEI7QUFBQyxZQUFTLElBQVY7QUFBZSxpQkFBYztBQUE3QixDQUExQjtBQUVBLElBQU1DLFlBQVksR0FBR2hCLG9EQUFHLENBQUNlLE1BQUosQ0FBV0MsWUFBWCxJ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LENBQWtCK0MsSUFBbEIsRUFBd0JoSyxNQUFNLENBQUN3SyxZQUEvQixFQUY2QixDQUc3Qjs7QUFDQUYsaUJBQUs7QUFDTixXQXhESDs7QUEwREV0RSxnQkFBTSxDQUFDaUIsSUFBUCxDQUFZK0MsSUFBWixFQUFrQmhLLE1BQU0sQ0FBQ3dLLFlBQXpCLEVBQXVDeEssTUFBTSxDQUFDd0ssWUFBOUMsRUFBNEQsVUFBQzNILElBQUQsRUFBVTtBQUNwRTtBQUNBLGdCQUFJLENBQUNBLElBQUwsRUFBVztBQUNUNkgsOEJBQWdCO0FBQ2hCO0FBQ0QsYUFMbUUsQ0FPcEU7QUFDQTs7O0FBQ0EsZ0JBQU1DLGNBQWMsR0FBRzNLLE1BQU0sQ0FBQ29LLFNBQVAsQ0FBaUIsVUFBQzlJLEVBQUQsRUFBS0MsSUFBTCxFQUFjO0FBQ3BEb0osNEJBQWM7QUFDZEQsOEJBQWdCO0FBQ2pCLGFBSHNCLENBQXZCLENBVG9FLENBY3BFOztBQUNBMUssa0JBQU0sQ0FBQ3lJLElBQVAsQ0FBWTVGLElBQVosRUFBa0IrSCxTQUFsQixFQUE2QixVQUFDaEksR0FBRCxFQUFTO0FBQ3BDLGtCQUFJQSxHQUFKLEVBQVM7QUFDUHBDLDRCQUFZLENBQUNvQyxHQUFELENBQVo7QUFDRDtBQUNGLGFBSkQ7QUFLRCxXQXBCRDs7QUExREY7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsQyIsImZpbGUiOiIxNDUuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgVnVlIGZyb20gJ3Z1ZSdcbmltcG9ydCBmZXRjaCBmcm9tICd1bmZldGNoJ1xuaW1wb3J0IG1pZGRsZXdhcmUgZnJvbSAnLi9taWRkbGV3YXJlLmpzJ1xuaW1wb3J0IHtcbiAgYXBwbHlBc3luY0RhdGEsXG4gIHByb21pc2lmeSxcbiAgbWlkZGxld2FyZVNlcmllcyxcbiAgc2FuaXRpemVDb21wb25lbnQsXG4gIHJlc29sdmVSb3V0ZUNvbXBvbmVudHMsXG4gIGdldE1hdGNoZWRDb21wb25lbnRzLFxuICBnZXRNYXRjaGVkQ29tcG9uZW50c0luc3RhbmNlcyxcbiAgZmxhdE1hcENvbXBvbmVudHMsXG4gIHNldENvbnRleHQsXG4gIGdldExvY2F0aW9uLFxuICBjb21waWxlLFxuICBnZXRRdWVyeURpZmYsXG4gIGdsb2JhbEhhbmRsZUVycm9yXG59IGZyb20gJy4vdXRpbHMuanMnXG5pbXBvcnQgeyBjcmVhdGVBcHAsIE51eHRFcnJvciB9IGZyb20gJy4vaW5kZXguanMnXG5pbXBvcnQgTnV4dExpbmsgZnJvbSAnLi9jb21wb25lbnRzL251eHQtbGluay5jbGllbnQuanMnIC8vIHNob3VsZCBiZSBpbmNsdWRlZCBhZnRlciAuL2luZGV4LmpzXG5cbi8vIENvbXBvbmVudDogPE51eHRMaW5rPlxuVnVlLmNvbXBvbmVudChOdXh0TGluay5uYW1lLCBOdXh0TGluaylcblZ1ZS5jb21wb25lbnQoJ05MaW5rJywgTnV4dExpbmspXG5cbmlmICghZ2xvYmFsLmZldGNoKSB7IGdsb2JhbC5mZXRjaCA9IGZldGNoIH1cblxuLy8gR2xvYmFsIHNoYXJlZCByZWZlcmVuY2VzXG5sZXQgX2xhc3RQYXRocyA9IFtdXG5sZXQgYXBwXG5sZXQgcm91dGVyXG5sZXQgc3RvcmVcblxuLy8gVHJ5IHRvIHJlaHlkcmF0ZSBTU1IgZGF0YSBmcm9tIHdpbmRvd1xuY29uc3QgTlVYVCA9IHdpbmRvdy5fX05VWFRfXyB8fCB7fVxuXG5PYmplY3QuYXNzaWduKFZ1ZS5jb25maWcsIHtcInNpbGVudFwiOnRydWUsXCJwZXJmb3JtYW5jZVwiOmZhbHNlfSlcblxuY29uc3QgZXJyb3JIYW5kbGVyID0gVnVlLmNvbmZpZy5lcnJvckhhbmRsZXIgfHwgY29uc29sZS5lcnJvclxuXG4vLyBDcmVhdGUgYW5kIG1vdW50IEFwcFxuY3JlYXRlQXBwKCkudGhlbihtb3VudEFwcCkuY2F0Y2goZXJyb3JIYW5kbGVyKVxuXG5mdW5jdGlvbiBjb21wb25lbnRPcHRpb24gKGNvbXBvbmVudCwga2V5LCAuLi5hcmdzKSB7XG4gIGlmICghY29tcG9uZW50IHx8ICFjb21wb25lbnQub3B0aW9ucyB8fCAhY29tcG9uZW50Lm9wdGlvbnNba2V5XSkge1xuICAgIHJldHVybiB7fVxuICB9XG4gIGNvbnN0IG9wdGlvbiA9IGNvbXBvbmVudC5vcHRpb25zW2tleV1cbiAgaWYgKHR5cGVvZiBvcHRpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gb3B0aW9uKC4uLmFyZ3MpXG4gIH1cbiAgcmV0dXJuIG9wdGlvblxufVxuXG5mdW5jdGlvbiBtYXBUcmFuc2l0aW9ucyAoQ29tcG9uZW50cywgdG8sIGZyb20pIHtcbiAgY29uc3QgY29tcG9uZW50VHJhbnNpdGlvbnMgPSAoY29tcG9uZW50KSA9PiB7XG4gICAgY29uc3QgdHJhbnNpdGlvbiA9IGNvbXBvbmVudE9wdGlvbihjb21wb25lbnQsICd0cmFuc2l0aW9uJywgdG8sIGZyb20pIHx8IHt9XG4gICAgcmV0dXJuICh0eXBlb2YgdHJhbnNpdGlvbiA9PT0gJ3N0cmluZycgPyB7IG5hbWU6IHRyYW5zaXRpb24gfSA6IHRyYW5zaXRpb24pXG4gIH1cblxuICByZXR1cm4gQ29tcG9uZW50cy5tYXAoKENvbXBvbmVudCkgPT4ge1xuICAgIC8vIENsb25lIG9yaWdpbmFsIG9iamVjdCB0byBwcmV2ZW50IG92ZXJyaWRlc1xuICAgIGNvbnN0IHRyYW5zaXRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgY29tcG9uZW50VHJhbnNpdGlvbnMoQ29tcG9uZW50KSlcblxuICAgIC8vIENvbWJpbmUgdHJhbnNpdGlvbnMgJiBwcmVmZXIgYGxlYXZlYCB0cmFuc2l0aW9ucyBvZiAnZnJvbScgcm91dGVcbiAgICBpZiAoZnJvbSAmJiBmcm9tLm1hdGNoZWQubGVuZ3RoICYmIGZyb20ubWF0Y2hlZFswXS5jb21wb25lbnRzLmRlZmF1bHQpIHtcbiAgICAgIGNvbnN0IGZyb21UcmFuc2l0aW9ucyA9IGNvbXBvbmVudFRyYW5zaXRpb25zKGZyb20ubWF0Y2hlZFswXS5jb21wb25lbnRzLmRlZmF1bHQpXG4gICAgICBPYmplY3Qua2V5cyhmcm9tVHJhbnNpdGlvbnMpXG4gICAgICAgIC5maWx0ZXIoa2V5ID0+IGZyb21UcmFuc2l0aW9uc1trZXldICYmIGtleS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdsZWF2ZScpKVxuICAgICAgICAuZm9yRWFjaCgoa2V5KSA9PiB7IHRyYW5zaXRpb25zW2tleV0gPSBmcm9tVHJhbnNpdGlvbnNba2V5XSB9KVxuICAgIH1cblxuICAgIHJldHVybiB0cmFuc2l0aW9uc1xuICB9KVxufVxuXG5hc3luYyBmdW5jdGlvbiBsb2FkQXN5bmNDb21wb25lbnRzICh0bywgZnJvbSwgbmV4dCkge1xuICAvLyBDaGVjayBpZiByb3V0ZSBwYXRoIGNoYW5nZWQgKHRoaXMuX3BhdGhDaGFuZ2VkKSwgb25seSBpZiB0aGUgcGFnZSBpcyBub3QgYW4gZXJyb3IgKGZvciB2YWxpZGF0ZSgpKVxuICB0aGlzLl9wYXRoQ2hhbmdlZCA9IEJvb2xlYW4oYXBwLm51eHQuZXJyKSB8fCBmcm9tLnBhdGggIT09IHRvLnBhdGhcbiAgdGhpcy5fcXVlcnlDaGFuZ2VkID0gSlNPTi5zdHJpbmdpZnkodG8ucXVlcnkpICE9PSBKU09OLnN0cmluZ2lmeShmcm9tLnF1ZXJ5KVxuICB0aGlzLl9kaWZmUXVlcnkgPSAodGhpcy5fcXVlcnlDaGFuZ2VkID8gZ2V0UXVlcnlEaWZmKHRvLnF1ZXJ5LCBmcm9tLnF1ZXJ5KSA6IFtdKVxuXG4gIGlmICh0aGlzLl9wYXRoQ2hhbmdlZCAmJiB0aGlzLiRsb2FkaW5nLnN0YXJ0ICYmICF0aGlzLiRsb2FkaW5nLm1hbnVhbCkge1xuICAgIHRoaXMuJGxvYWRpbmcuc3RhcnQoKVxuICB9XG5cbiAgdHJ5IHtcbiAgICBpZiAoIXRoaXMuX3BhdGhDaGFuZ2VkICYmIHRoaXMuX3F1ZXJ5Q2hhbmdlZCkge1xuICAgICAgY29uc3QgQ29tcG9uZW50cyA9IGF3YWl0IHJlc29sdmVSb3V0ZUNvbXBvbmVudHMoXG4gICAgICAgIHRvLFxuICAgICAgICAoQ29tcG9uZW50LCBpbnN0YW5jZSkgPT4gKHsgQ29tcG9uZW50LCBpbnN0YW5jZSB9KVxuICAgICAgKVxuICAgICAgLy8gQWRkIGEgbWFya2VyIG9uIGVhY2ggY29tcG9uZW50IHRoYXQgaXQgbmVlZHMgdG8gcmVmcmVzaCBvciBub3RcbiAgICAgIGNvbnN0IHN0YXJ0TG9hZGVyID0gQ29tcG9uZW50cy5zb21lKCh7IENvbXBvbmVudCwgaW5zdGFuY2UgfSkgPT4ge1xuICAgICAgICBjb25zdCB3YXRjaFF1ZXJ5ID0gQ29tcG9uZW50Lm9wdGlvbnMud2F0Y2hRdWVyeVxuICAgICAgICBpZiAod2F0Y2hRdWVyeSA9PT0gdHJ1ZSkge1xuICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkod2F0Y2hRdWVyeSkpIHtcbiAgICAgICAgICByZXR1cm4gd2F0Y2hRdWVyeS5zb21lKGtleSA9PiB0aGlzLl9kaWZmUXVlcnlba2V5XSlcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHdhdGNoUXVlcnkgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICByZXR1cm4gd2F0Y2hRdWVyeS5hcHBseShpbnN0YW5jZSwgW3RvLnF1ZXJ5LCBmcm9tLnF1ZXJ5XSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgIH0pXG4gICAgICBpZiAoc3RhcnRMb2FkZXIgJiYgdGhpcy4kbG9hZGluZy5zdGFydCAmJiAhdGhpcy4kbG9hZGluZy5tYW51YWwpIHtcbiAgICAgICAgdGhpcy4kbG9hZGluZy5zdGFydCgpXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2FsbCBuZXh0KClcbiAgICBuZXh0KClcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zdCBlcnIgPSBlcnJvciB8fCB7fVxuICAgIGNvbnN0IHN0YXR1c0NvZGUgPSBlcnIuc3RhdHVzQ29kZSB8fCBlcnIuc3RhdHVzIHx8IChlcnIucmVzcG9uc2UgJiYgZXJyLnJlc3BvbnNlLnN0YXR1cykgfHwgNTAwXG4gICAgY29uc3QgbWVzc2FnZSA9IGVyci5tZXNzYWdlIHx8ICcnXG5cbiAgICAvLyBIYW5kbGUgY2h1bmsgbG9hZGluZyBlcnJvcnNcbiAgICAvLyBUaGlzIG1heSBiZSBkdWUgdG8gYSBuZXcgZGVwbG95bWVudCBvciBhIG5ldHdvcmsgcHJvYmxlbVxuICAgIGlmICgvXkxvYWRpbmcoIENTUyk/IGNodW5rIChcXGQpKyBmYWlsZWRcXC4vLnRlc3QobWVzc2FnZSkpIHtcbiAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQodHJ1ZSAvKiBza2lwIGNhY2hlICovKVxuICAgICAgcmV0dXJuIC8vIHByZXZlbnQgZXJyb3IgcGFnZSBibGlua2luZyBmb3IgdXNlclxuICAgIH1cblxuICAgIHRoaXMuZXJyb3IoeyBzdGF0dXNDb2RlLCBtZXNzYWdlIH0pXG4gICAgdGhpcy4kbnV4dC4kZW1pdCgncm91dGVDaGFuZ2VkJywgdG8sIGZyb20sIGVycilcbiAgICBuZXh0KClcbiAgfVxufVxuXG5mdW5jdGlvbiBhcHBseVNTUkRhdGEgKENvbXBvbmVudCwgc3NyRGF0YSkge1xuICBpZiAoTlVYVC5zZXJ2ZXJSZW5kZXJlZCAmJiBzc3JEYXRhKSB7XG4gICAgYXBwbHlBc3luY0RhdGEoQ29tcG9uZW50LCBzc3JEYXRhKVxuICB9XG5cbiAgQ29tcG9uZW50Ll9DdG9yID0gQ29tcG9uZW50XG4gIHJldHVybiBDb21wb25lbnRcbn1cblxuLy8gR2V0IG1hdGNoZWQgY29tcG9uZW50c1xuZnVuY3Rpb24gcmVzb2x2ZUNvbXBvbmVudHMgKHJvdXRlcikge1xuICBjb25zdCBwYXRoID0gZ2V0TG9jYXRpb24ocm91dGVyLm9wdGlvbnMuYmFzZSwgcm91dGVyLm9wdGlvbnMubW9kZSlcblxuICByZXR1cm4gZmxhdE1hcENvbXBvbmVudHMocm91dGVyLm1hdGNoKHBhdGgpLCBhc3luYyAoQ29tcG9uZW50LCBfLCBtYXRjaCwga2V5LCBpbmRleCkgPT4ge1xuICAgIC8vIElmIGNvbXBvbmVudCBpcyBub3QgcmVzb2x2ZWQgeWV0LCByZXNvbHZlIGl0XG4gICAgaWYgKHR5cGVvZiBDb21wb25lbnQgPT09ICdmdW5jdGlvbicgJiYgIUNvbXBvbmVudC5vcHRpb25zKSB7XG4gICAgICBDb21wb25lbnQgPSBhd2FpdCBDb21wb25lbnQoKVxuICAgIH1cbiAgICAvLyBTYW5pdGl6ZSBpdCBhbmQgc2F2ZSBpdFxuICAgIGNvbnN0IF9Db21wb25lbnQgPSBhcHBseVNTUkRhdGEoc2FuaXRpemVDb21wb25lbnQoQ29tcG9uZW50KSwgTlVYVC5kYXRhID8gTlVYVC5kYXRhW2luZGV4XSA6IG51bGwpXG4gICAgbWF0Y2guY29tcG9uZW50c1trZXldID0gX0NvbXBvbmVudFxuICAgIHJldHVybiBfQ29tcG9uZW50XG4gIH0pXG59XG5cbmZ1bmN0aW9uIGNhbGxNaWRkbGV3YXJlIChDb21wb25lbnRzLCBjb250ZXh0LCBsYXlvdXQpIHtcbiAgbGV0IG1pZGQgPSBbXVxuICBsZXQgdW5rbm93bk1pZGRsZXdhcmUgPSBmYWxzZVxuXG4gIC8vIElmIGxheW91dCBpcyB1bmRlZmluZWQsIG9ubHkgY2FsbCBnbG9iYWwgbWlkZGxld2FyZVxuICBpZiAodHlwZW9mIGxheW91dCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBtaWRkID0gW10gLy8gRXhjbHVkZSBnbG9iYWwgbWlkZGxld2FyZSBpZiBsYXlvdXQgZGVmaW5lZCAoYWxyZWFkeSBjYWxsZWQgYmVmb3JlKVxuICAgIGxheW91dCA9IHNhbml0aXplQ29tcG9uZW50KGxheW91dClcbiAgICBpZiAobGF5b3V0Lm9wdGlvbnMubWlkZGxld2FyZSkge1xuICAgICAgbWlkZCA9IG1pZGQuY29uY2F0KGxheW91dC5vcHRpb25zLm1pZGRsZXdhcmUpXG4gICAgfVxuICAgIENvbXBvbmVudHMuZm9yRWFjaCgoQ29tcG9uZW50KSA9PiB7XG4gICAgICBpZiAoQ29tcG9uZW50Lm9wdGlvbnMubWlkZGxld2FyZSkge1xuICAgICAgICBtaWRkID0gbWlkZC5jb25jYXQoQ29tcG9uZW50Lm9wdGlvbnMubWlkZGxld2FyZSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgbWlkZCA9IG1pZGQubWFwKChuYW1lKSA9PiB7XG4gICAgaWYgKHR5cGVvZiBuYW1lID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gbmFtZVxuICAgIH1cbiAgICBpZiAodHlwZW9mIG1pZGRsZXdhcmVbbmFtZV0gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHVua25vd25NaWRkbGV3YXJlID0gdHJ1ZVxuICAgICAgdGhpcy5lcnJvcih7IHN0YXR1c0NvZGU6IDUwMCwgbWVzc2FnZTogJ1Vua25vd24gbWlkZGxld2FyZSAnICsgbmFtZSB9KVxuICAgIH1cbiAgICByZXR1cm4gbWlkZGxld2FyZVtuYW1lXVxuICB9KVxuXG4gIGlmICh1bmtub3duTWlkZGxld2FyZSkge1xuICAgIHJldHVyblxuICB9XG4gIHJldHVybiBtaWRkbGV3YXJlU2VyaWVzKG1pZGQsIGNvbnRleHQpXG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbmRlciAodG8sIGZyb20sIG5leHQpIHtcbiAgaWYgKHRoaXMuX3BhdGhDaGFuZ2VkID09PSBmYWxzZSAmJiB0aGlzLl9xdWVyeUNoYW5nZWQgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIG5leHQoKVxuICB9XG4gIC8vIEhhbmRsZSBmaXJzdCByZW5kZXIgb24gU1BBIG1vZGVcbiAgaWYgKHRvID09PSBmcm9tKSB7XG4gICAgX2xhc3RQYXRocyA9IFtdXG4gIH0gZWxzZSB7XG4gICAgY29uc3QgZnJvbU1hdGNoZXMgPSBbXVxuICAgIF9sYXN0UGF0aHMgPSBnZXRNYXRjaGVkQ29tcG9uZW50cyhmcm9tLCBmcm9tTWF0Y2hlcykubWFwKChDb21wb25lbnQsIGkpID0+IHtcbiAgICAgIHJldHVybiBjb21waWxlKGZyb20ubWF0Y2hlZFtmcm9tTWF0Y2hlc1tpXV0ucGF0aCkoZnJvbS5wYXJhbXMpXG4gICAgfSlcbiAgfVxuXG4gIC8vIG5leHRDYWxsZWQgaXMgdHJ1ZSB3aGVuIHJlZGlyZWN0ZWRcbiAgbGV0IG5leHRDYWxsZWQgPSBmYWxzZVxuICBjb25zdCBfbmV4dCA9IChwYXRoKSA9PiB7XG4gICAgaWYgKGZyb20ucGF0aCA9PT0gcGF0aC5wYXRoICYmIHRoaXMuJGxvYWRpbmcuZmluaXNoKSB7XG4gICAgICB0aGlzLiRsb2FkaW5nLmZpbmlzaCgpXG4gICAgfVxuXG4gICAgaWYgKGZyb20ucGF0aCAhPT0gcGF0aC5wYXRoICYmIHRoaXMuJGxvYWRpbmcucGF1c2UpIHtcbiAgICAgIHRoaXMuJGxvYWRpbmcucGF1c2UoKVxuICAgIH1cblxuICAgIGlmIChuZXh0Q2FsbGVkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBuZXh0Q2FsbGVkID0gdHJ1ZVxuICAgIG5leHQocGF0aClcbiAgfVxuXG4gIC8vIFVwZGF0ZSBjb250ZXh0XG4gIGF3YWl0IHNldENvbnRleHQoYXBwLCB7XG4gICAgcm91dGU6IHRvLFxuICAgIGZyb20sXG4gICAgbmV4dDogX25leHQuYmluZCh0aGlzKVxuICB9KVxuICB0aGlzLl9kYXRlTGFzdEVycm9yID0gYXBwLm51eHQuZGF0ZUVyclxuICB0aGlzLl9oYWRFcnJvciA9IEJvb2xlYW4oYXBwLm51eHQuZXJyKVxuXG4gIC8vIEdldCByb3V0ZSdzIG1hdGNoZWQgY29tcG9uZW50c1xuICBjb25zdCBtYXRjaGVzID0gW11cbiAgY29uc3QgQ29tcG9uZW50cyA9IGdldE1hdGNoZWRDb21wb25lbnRzKHRvLCBtYXRjaGVzKVxuXG4gIC8vIElmIG5vIENvbXBvbmVudHMgbWF0Y2hlZCwgZ2VuZXJhdGUgNDA0XG4gIGlmICghQ29tcG9uZW50cy5sZW5ndGgpIHtcbiAgICAvLyBEZWZhdWx0IGxheW91dFxuICAgIGF3YWl0IGNhbGxNaWRkbGV3YXJlLmNhbGwodGhpcywgQ29tcG9uZW50cywgYXBwLmNvbnRleHQpXG4gICAgaWYgKG5leHRDYWxsZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIExvYWQgbGF5b3V0IGZvciBlcnJvciBwYWdlXG4gICAgY29uc3QgZXJyb3JMYXlvdXQgPSAoTnV4dEVycm9yLm9wdGlvbnMgfHwgTnV4dEVycm9yKS5sYXlvdXRcbiAgICBjb25zdCBsYXlvdXQgPSBhd2FpdCB0aGlzLmxvYWRMYXlvdXQoXG4gICAgICB0eXBlb2YgZXJyb3JMYXlvdXQgPT09ICdmdW5jdGlvbidcbiAgICAgICAgPyBlcnJvckxheW91dC5jYWxsKE51eHRFcnJvciwgYXBwLmNvbnRleHQpXG4gICAgICAgIDogZXJyb3JMYXlvdXRcbiAgICApXG5cbiAgICBhd2FpdCBjYWxsTWlkZGxld2FyZS5jYWxsKHRoaXMsIENvbXBvbmVudHMsIGFwcC5jb250ZXh0LCBsYXlvdXQpXG4gICAgaWYgKG5leHRDYWxsZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIFNob3cgZXJyb3IgcGFnZVxuICAgIGFwcC5jb250ZXh0LmVycm9yKHsgc3RhdHVzQ29kZTogNDA0LCBtZXNzYWdlOiAnVGhpcyBwYWdlIGNvdWxkIG5vdCBiZSBmb3VuZCcgfSlcbiAgICByZXR1cm4gbmV4dCgpXG4gIH1cblxuICAvLyBVcGRhdGUgLl9kYXRhIGFuZCBvdGhlciBwcm9wZXJ0aWVzIGlmIGhvdCByZWxvYWRlZFxuICBDb21wb25lbnRzLmZvckVhY2goKENvbXBvbmVudCkgPT4ge1xuICAgIGlmIChDb21wb25lbnQuX0N0b3IgJiYgQ29tcG9uZW50Ll9DdG9yLm9wdGlvbnMpIHtcbiAgICAgIENvbXBvbmVudC5vcHRpb25zLmFzeW5jRGF0YSA9IENvbXBvbmVudC5fQ3Rvci5vcHRpb25zLmFzeW5jRGF0YVxuICAgICAgQ29tcG9uZW50Lm9wdGlvbnMuZmV0Y2ggPSBDb21wb25lbnQuX0N0b3Iub3B0aW9ucy5mZXRjaFxuICAgIH1cbiAgfSlcblxuICAvLyBBcHBseSB0cmFuc2l0aW9uc1xuICB0aGlzLnNldFRyYW5zaXRpb25zKG1hcFRyYW5zaXRpb25zKENvbXBvbmVudHMsIHRvLCBmcm9tKSlcblxuICB0cnkge1xuICAgIC8vIENhbGwgbWlkZGxld2FyZVxuICAgIGF3YWl0IGNhbGxNaWRkbGV3YXJlLmNhbGwodGhpcywgQ29tcG9uZW50cywgYXBwLmNvbnRleHQpXG4gICAgaWYgKG5leHRDYWxsZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAoYXBwLmNvbnRleHQuX2Vycm9yZWQpIHtcbiAgICAgIHJldHVybiBuZXh0KClcbiAgICB9XG5cbiAgICAvLyBTZXQgbGF5b3V0XG4gICAgbGV0IGxheW91dCA9IENvbXBvbmVudHNbMF0ub3B0aW9ucy5sYXlvdXRcbiAgICBpZiAodHlwZW9mIGxheW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgbGF5b3V0ID0gbGF5b3V0KGFwcC5jb250ZXh0KVxuICAgIH1cbiAgICBsYXlvdXQgPSBhd2FpdCB0aGlzLmxvYWRMYXlvdXQobGF5b3V0KVxuXG4gICAgLy8gQ2FsbCBtaWRkbGV3YXJlIGZvciBsYXlvdXRcbiAgICBhd2FpdCBjYWxsTWlkZGxld2FyZS5jYWxsKHRoaXMsIENvbXBvbmVudHMsIGFwcC5jb250ZXh0LCBsYXlvdXQpXG4gICAgaWYgKG5leHRDYWxsZWQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAoYXBwLmNvbnRleHQuX2Vycm9yZWQpIHtcbiAgICAgIHJldHVybiBuZXh0KClcbiAgICB9XG5cbiAgICAvLyBDYWxsIC52YWxpZGF0ZSgpXG4gICAgbGV0IGlzVmFsaWQgPSB0cnVlXG4gICAgdHJ5IHtcbiAgICAgIGZvciAoY29uc3QgQ29tcG9uZW50IG9mIENvbXBvbmVudHMpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBDb21wb25lbnQub3B0aW9ucy52YWxpZGF0ZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICBpc1ZhbGlkID0gYXdhaXQgQ29tcG9uZW50Lm9wdGlvbnMudmFsaWRhdGUoYXBwLmNvbnRleHQpXG5cbiAgICAgICAgaWYgKCFpc1ZhbGlkKSB7XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKHZhbGlkYXRpb25FcnJvcikge1xuICAgICAgLy8gLi4uSWYgLnZhbGlkYXRlKCkgdGhyZXcgYW4gZXJyb3JcbiAgICAgIHRoaXMuZXJyb3Ioe1xuICAgICAgICBzdGF0dXNDb2RlOiB2YWxpZGF0aW9uRXJyb3Iuc3RhdHVzQ29kZSB8fCAnNTAwJyxcbiAgICAgICAgbWVzc2FnZTogdmFsaWRhdGlvbkVycm9yLm1lc3NhZ2VcbiAgICAgIH0pXG4gICAgICByZXR1cm4gbmV4dCgpXG4gICAgfVxuXG4gICAgLy8gLi4uSWYgLnZhbGlkYXRlKCkgcmV0dXJuZWQgZmFsc2VcbiAgICBpZiAoIWlzVmFsaWQpIHtcbiAgICAgIHRoaXMuZXJyb3IoeyBzdGF0dXNDb2RlOiA0MDQsIG1lc3NhZ2U6ICdUaGlzIHBhZ2UgY291bGQgbm90IGJlIGZvdW5kJyB9KVxuICAgICAgcmV0dXJuIG5leHQoKVxuICAgIH1cblxuICAgIGxldCBpbnN0YW5jZXNcbiAgICAvLyBDYWxsIGFzeW5jRGF0YSAmIGZldGNoIGhvb2tzIG9uIGNvbXBvbmVudHMgbWF0Y2hlZCBieSB0aGUgcm91dGUuXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoQ29tcG9uZW50cy5tYXAoKENvbXBvbmVudCwgaSkgPT4ge1xuICAgICAgLy8gQ2hlY2sgaWYgb25seSBjaGlsZHJlbiByb3V0ZSBjaGFuZ2VkXG4gICAgICBDb21wb25lbnQuX3BhdGggPSBjb21waWxlKHRvLm1hdGNoZWRbbWF0Y2hlc1tpXV0ucGF0aCkodG8ucGFyYW1zKVxuICAgICAgQ29tcG9uZW50Ll9kYXRhUmVmcmVzaCA9IGZhbHNlXG4gICAgICAvLyBDaGVjayBpZiBDb21wb25lbnQgbmVlZCB0byBiZSByZWZyZXNoZWQgKGNhbGwgYXN5bmNEYXRhICYgZmV0Y2gpXG4gICAgICAvLyBPbmx5IGlmIGl0cyBzbHVnIGhhcyBjaGFuZ2VkIG9yIGlzIHdhdGNoIHF1ZXJ5IGNoYW5nZXNcbiAgICAgIGlmICgodGhpcy5fcGF0aENoYW5nZWQgJiYgdGhpcy5fcXVlcnlDaGFuZ2VkKSB8fCBDb21wb25lbnQuX3BhdGggIT09IF9sYXN0UGF0aHNbaV0pIHtcbiAgICAgICAgQ29tcG9uZW50Ll9kYXRhUmVmcmVzaCA9IHRydWVcbiAgICAgIH0gZWxzZSBpZiAoIXRoaXMuX3BhdGhDaGFuZ2VkICYmIHRoaXMuX3F1ZXJ5Q2hhbmdlZCkge1xuICAgICAgICBjb25zdCB3YXRjaFF1ZXJ5ID0gQ29tcG9uZW50Lm9wdGlvbnMud2F0Y2hRdWVyeVxuICAgICAgICBpZiAod2F0Y2hRdWVyeSA9PT0gdHJ1ZSkge1xuICAgICAgICAgIENvbXBvbmVudC5fZGF0YVJlZnJlc2ggPSB0cnVlXG4gICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh3YXRjaFF1ZXJ5KSkge1xuICAgICAgICAgIENvbXBvbmVudC5fZGF0YVJlZnJlc2ggPSB3YXRjaFF1ZXJ5LnNvbWUoa2V5ID0+IHRoaXMuX2RpZmZRdWVyeVtrZXldKVxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB3YXRjaFF1ZXJ5ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgaWYgKCFpbnN0YW5jZXMpIHtcbiAgICAgICAgICAgIGluc3RhbmNlcyA9IGdldE1hdGNoZWRDb21wb25lbnRzSW5zdGFuY2VzKHRvKVxuICAgICAgICAgIH1cbiAgICAgICAgICBDb21wb25lbnQuX2RhdGFSZWZyZXNoID0gd2F0Y2hRdWVyeS5hcHBseShpbnN0YW5jZXNbaV0sIFt0by5xdWVyeSwgZnJvbS5xdWVyeV0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5faGFkRXJyb3IgJiYgdGhpcy5faXNNb3VudGVkICYmICFDb21wb25lbnQuX2RhdGFSZWZyZXNoKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBjb25zdCBwcm9taXNlcyA9IFtdXG5cbiAgICAgIGNvbnN0IGhhc0FzeW5jRGF0YSA9IChcbiAgICAgICAgQ29tcG9uZW50Lm9wdGlvbnMuYXN5bmNEYXRhICYmXG4gICAgICAgIHR5cGVvZiBDb21wb25lbnQub3B0aW9ucy5hc3luY0RhdGEgPT09ICdmdW5jdGlvbidcbiAgICAgIClcblxuICAgICAgY29uc3QgaGFzRmV0Y2ggPSBCb29sZWFuKENvbXBvbmVudC5vcHRpb25zLmZldGNoKVxuXG4gICAgICBjb25zdCBsb2FkaW5nSW5jcmVhc2UgPSAoaGFzQXN5bmNEYXRhICYmIGhhc0ZldGNoKSA/IDMwIDogNDVcblxuICAgICAgLy8gQ2FsbCBhc3luY0RhdGEoY29udGV4dClcbiAgICAgIGlmIChoYXNBc3luY0RhdGEpIHtcbiAgICAgICAgY29uc3QgcHJvbWlzZSA9IHByb21pc2lmeShDb21wb25lbnQub3B0aW9ucy5hc3luY0RhdGEsIGFwcC5jb250ZXh0KVxuICAgICAgICAgIC50aGVuKChhc3luY0RhdGFSZXN1bHQpID0+IHtcbiAgICAgICAgICAgIGFwcGx5QXN5bmNEYXRhKENvbXBvbmVudCwgYXN5bmNEYXRhUmVzdWx0KVxuXG4gICAgICAgICAgICBpZiAodGhpcy4kbG9hZGluZy5pbmNyZWFzZSkge1xuICAgICAgICAgICAgICB0aGlzLiRsb2FkaW5nLmluY3JlYXNlKGxvYWRpbmdJbmNyZWFzZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICBwcm9taXNlcy5wdXNoKHByb21pc2UpXG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGRpc2FibGVkIHBhZ2UgbG9hZGluZ1xuICAgICAgdGhpcy4kbG9hZGluZy5tYW51YWwgPSBDb21wb25lbnQub3B0aW9ucy5sb2FkaW5nID09PSBmYWxzZVxuXG4gICAgICAvLyBDYWxsIGZldGNoKGNvbnRleHQpXG4gICAgICBpZiAoaGFzRmV0Y2gpIHtcbiAgICAgICAgbGV0IHAgPSBDb21wb25lbnQub3B0aW9ucy5mZXRjaChhcHAuY29udGV4dClcbiAgICAgICAgaWYgKCFwIHx8ICghKHAgaW5zdGFuY2VvZiBQcm9taXNlKSAmJiAodHlwZW9mIHAudGhlbiAhPT0gJ2Z1bmN0aW9uJykpKSB7XG4gICAgICAgICAgcCA9IFByb21pc2UucmVzb2x2ZShwKVxuICAgICAgICB9XG4gICAgICAgIHAudGhlbigoZmV0Y2hSZXN1bHQpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy4kbG9hZGluZy5pbmNyZWFzZSkge1xuICAgICAgICAgICAgdGhpcy4kbG9hZGluZy5pbmNyZWFzZShsb2FkaW5nSW5jcmVhc2UpXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICBwcm9taXNlcy5wdXNoKHApXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBQcm9taXNlLmFsbChwcm9taXNlcylcbiAgICB9KSlcblxuICAgIC8vIElmIG5vdCByZWRpcmVjdGVkXG4gICAgaWYgKCFuZXh0Q2FsbGVkKSB7XG4gICAgICBpZiAodGhpcy4kbG9hZGluZy5maW5pc2ggJiYgIXRoaXMuJGxvYWRpbmcubWFudWFsKSB7XG4gICAgICAgIHRoaXMuJGxvYWRpbmcuZmluaXNoKClcbiAgICAgIH1cblxuICAgICAgbmV4dCgpXG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBjb25zdCBlcnJvciA9IGVyciB8fCB7fVxuICAgIGlmIChlcnJvci5tZXNzYWdlID09PSAnRVJSX1JFRElSRUNUJykge1xuICAgICAgcmV0dXJuIHRoaXMuJG51eHQuJGVtaXQoJ3JvdXRlQ2hhbmdlZCcsIHRvLCBmcm9tLCBlcnJvcilcbiAgICB9XG4gICAgX2xhc3RQYXRocyA9IFtdXG5cbiAgICBnbG9iYWxIYW5kbGVFcnJvcihlcnJvcilcblxuICAgIC8vIExvYWQgZXJyb3IgbGF5b3V0XG4gICAgbGV0IGxheW91dCA9IChOdXh0RXJyb3Iub3B0aW9ucyB8fCBOdXh0RXJyb3IpLmxheW91dFxuICAgIGlmICh0eXBlb2YgbGF5b3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBsYXlvdXQgPSBsYXlvdXQoYXBwLmNvbnRleHQpXG4gICAgfVxuICAgIGF3YWl0IHRoaXMubG9hZExheW91dChsYXlvdXQpXG5cbiAgICB0aGlzLmVycm9yKGVycm9yKVxuICAgIHRoaXMuJG51eHQuJGVtaXQoJ3JvdXRlQ2hhbmdlZCcsIHRvLCBmcm9tLCBlcnJvcilcbiAgICBuZXh0KClcbiAgfVxufVxuXG4vLyBGaXggY29tcG9uZW50cyBmb3JtYXQgaW4gbWF0Y2hlZCwgaXQncyBkdWUgdG8gY29kZS1zcGxpdHRpbmcgb2YgdnVlLXJvdXRlclxuZnVuY3Rpb24gbm9ybWFsaXplQ29tcG9uZW50cyAodG8sIF9fXykge1xuICBmbGF0TWFwQ29tcG9uZW50cyh0bywgKENvbXBvbmVudCwgXywgbWF0Y2gsIGtleSkgPT4ge1xuICAgIGlmICh0eXBlb2YgQ29tcG9uZW50ID09PSAnb2JqZWN0JyAmJiAhQ29tcG9uZW50Lm9wdGlvbnMpIHtcbiAgICAgIC8vIFVwZGF0ZWQgdmlhIHZ1ZS1yb3V0ZXIgcmVzb2x2ZUFzeW5jQ29tcG9uZW50cygpXG4gICAgICBDb21wb25lbnQgPSBWdWUuZXh0ZW5kKENvbXBvbmVudClcbiAgICAgIENvbXBvbmVudC5fQ3RvciA9IENvbXBvbmVudFxuICAgICAgbWF0Y2guY29tcG9uZW50c1trZXldID0gQ29tcG9uZW50XG4gICAgfVxuICAgIHJldHVybiBDb21wb25lbnRcbiAgfSlcbn1cblxuZnVuY3Rpb24gc2hvd05leHRQYWdlICh0bykge1xuICAvLyBIaWRlIGVycm9yIGNvbXBvbmVudCBpZiBubyBlcnJvclxuICBpZiAodGhpcy5faGFkRXJyb3IgJiYgdGhpcy5fZGF0ZUxhc3RFcnJvciA9PT0gdGhpcy4kb3B0aW9ucy5udXh0LmRhdGVFcnIpIHtcbiAgICB0aGlzLmVycm9yKClcbiAgfVxuXG4gIC8vIFNldCBsYXlvdXRcbiAgbGV0IGxheW91dCA9IHRoaXMuJG9wdGlvbnMubnV4dC5lcnJcbiAgICA/IChOdXh0RXJyb3Iub3B0aW9ucyB8fCBOdXh0RXJyb3IpLmxheW91dFxuICAgIDogdG8ubWF0Y2hlZFswXS5jb21wb25lbnRzLmRlZmF1bHQub3B0aW9ucy5sYXlvdXRcblxuICBpZiAodHlwZW9mIGxheW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGxheW91dCA9IGxheW91dChhcHAuY29udGV4dClcbiAgfVxuICB0aGlzLnNldExheW91dChsYXlvdXQpXG59XG5cbi8vIFdoZW4gbmF2aWdhdGluZyBvbiBhIGRpZmZlcmVudCByb3V0ZSBidXQgdGhlIHNhbWUgY29tcG9uZW50IGlzIHVzZWQsIFZ1ZS5qc1xuLy8gV2lsbCBub3QgdXBkYXRlIHRoZSBpbnN0YW5jZSBkYXRhLCBzbyB3ZSBoYXZlIHRvIHVwZGF0ZSAkZGF0YSBvdXJzZWx2ZXNcbmZ1bmN0aW9uIGZpeFByZXBhdGNoICh0bywgX19fKSB7XG4gIGlmICh0aGlzLl9wYXRoQ2hhbmdlZCA9PT0gZmFsc2UgJiYgdGhpcy5fcXVlcnlDaGFuZ2VkID09PSBmYWxzZSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgY29uc3QgaW5zdGFuY2VzID0gZ2V0TWF0Y2hlZENvbXBvbmVudHNJbnN0YW5jZXModG8pXG4gIGNvbnN0IENvbXBvbmVudHMgPSBnZXRNYXRjaGVkQ29tcG9uZW50cyh0bylcblxuICBWdWUubmV4dFRpY2soKCkgPT4ge1xuICAgIGluc3RhbmNlcy5mb3JFYWNoKChpbnN0YW5jZSwgaSkgPT4ge1xuICAgICAgaWYgKCFpbnN0YW5jZSB8fCBpbnN0YW5jZS5faXNEZXN0cm95ZWQpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgaW5zdGFuY2UuY29uc3RydWN0b3IuX2RhdGFSZWZyZXNoICYmXG4gICAgICAgIENvbXBvbmVudHNbaV0gPT09IGluc3RhbmNlLmNvbnN0cnVjdG9yICYmXG4gICAgICAgIGluc3RhbmNlLiR2bm9kZS5kYXRhLmtlZXBBbGl2ZSAhPT0gdHJ1ZSAmJlxuICAgICAgICB0eXBlb2YgaW5zdGFuY2UuY29uc3RydWN0b3Iub3B0aW9ucy5kYXRhID09PSAnZnVuY3Rpb24nXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgbmV3RGF0YSA9IGluc3RhbmNlLmNvbnN0cnVjdG9yLm9wdGlvbnMuZGF0YS5jYWxsKGluc3RhbmNlKVxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBuZXdEYXRhKSB7XG4gICAgICAgICAgVnVlLnNldChpbnN0YW5jZS4kZGF0YSwga2V5LCBuZXdEYXRhW2tleV0pXG4gICAgICAgIH1cblxuICAgICAgICAvLyBFbnN1cmUgdG8gdHJpZ2dlciBzY3JvbGwgZXZlbnQgYWZ0ZXIgY2FsbGluZyBzY3JvbGxCZWhhdmlvclxuICAgICAgICB3aW5kb3cuJG51eHQuJG5leHRUaWNrKCgpID0+IHtcbiAgICAgICAgICB3aW5kb3cuJG51eHQuJGVtaXQoJ3RyaWdnZXJTY3JvbGwnKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pXG4gICAgc2hvd05leHRQYWdlLmNhbGwodGhpcywgdG8pXG4gIH0pXG59XG5cbmZ1bmN0aW9uIG51eHRSZWFkeSAoX2FwcCkge1xuICB3aW5kb3cub25OdXh0UmVhZHlDYnMuZm9yRWFjaCgoY2IpID0+IHtcbiAgICBpZiAodHlwZW9mIGNiID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjYihfYXBwKVxuICAgIH1cbiAgfSlcbiAgLy8gU3BlY2lhbCBKU0RPTVxuICBpZiAodHlwZW9mIHdpbmRvdy5fb25OdXh0TG9hZGVkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgd2luZG93Ll9vbk51eHRMb2FkZWQoX2FwcClcbiAgfVxuICAvLyBBZGQgcm91dGVyIGhvb2tzXG4gIHJvdXRlci5hZnRlckVhY2goKHRvLCBmcm9tKSA9PiB7XG4gICAgLy8gV2FpdCBmb3IgZml4UHJlcGF0Y2ggKyAkZGF0YSB1cGRhdGVzXG4gICAgVnVlLm5leHRUaWNrKCgpID0+IF9hcHAuJG51eHQuJGVtaXQoJ3JvdXRlQ2hhbmdlZCcsIHRvLCBmcm9tKSlcbiAgfSlcbn1cblxuYXN5bmMgZnVuY3Rpb24gbW91bnRBcHAgKF9fYXBwKSB7XG4gIC8vIFNldCBnbG9iYWwgdmFyaWFibGVzXG4gIGFwcCA9IF9fYXBwLmFwcFxuICByb3V0ZXIgPSBfX2FwcC5yb3V0ZXJcbiAgc3RvcmUgPSBfX2FwcC5zdG9yZVxuXG4gIC8vIENyZWF0ZSBWdWUgaW5zdGFuY2VcbiAgY29uc3QgX2FwcCA9IG5ldyBWdWUoYXBwKVxuXG4gIC8vIE1vdW50cyBWdWUgYXBwIHRvIERPTSBlbGVtZW50XG4gIGNvbnN0IG1vdW50ID0gKCkgPT4ge1xuICAgIF9hcHAuJG1vdW50KCcjX19udXh0JylcblxuICAgIC8vIEFkZCBhZnRlckVhY2ggcm91dGVyIGhvb2tzXG4gICAgcm91dGVyLmFmdGVyRWFjaChub3JtYWxpemVDb21wb25lbnRzKVxuICAgIHJvdXRlci5hZnRlckVhY2goZml4UHJlcGF0Y2guYmluZChfYXBwKSlcblxuICAgIC8vIExpc3RlbiBmb3IgZmlyc3QgVnVlIHVwZGF0ZVxuICAgIFZ1ZS5uZXh0VGljaygoKSA9PiB7XG4gICAgICAvLyBDYWxsIHdpbmRvdy57e2dsb2JhbHMucmVhZHlDYWxsYmFja319IGNhbGxiYWNrc1xuICAgICAgbnV4dFJlYWR5KF9hcHApXG4gICAgfSlcbiAgfVxuXG4gIC8vIFJlc29sdmUgcm91dGUgY29tcG9uZW50c1xuICBjb25zdCBDb21wb25lbnRzID0gYXdhaXQgUHJvbWlzZS5hbGwocmVzb2x2ZUNvbXBvbmVudHMocm91dGVyKSlcblxuICAvLyBFbmFibGUgdHJhbnNpdGlvbnNcbiAgX2FwcC5zZXRUcmFuc2l0aW9ucyA9IF9hcHAuJG9wdGlvbnMubnV4dC5zZXRUcmFuc2l0aW9ucy5iaW5kKF9hcHApXG4gIGlmIChDb21wb25lbnRzLmxlbmd0aCkge1xuICAgIF9hcHAuc2V0VHJhbnNpdGlvbnMobWFwVHJhbnNpdGlvbnMoQ29tcG9uZW50cywgcm91dGVyLmN1cnJlbnRSb3V0ZSkpXG4gICAgX2xhc3RQYXRocyA9IHJvdXRlci5jdXJyZW50Um91dGUubWF0Y2hlZC5tYXAocm91dGUgPT4gY29tcGlsZShyb3V0ZS5wYXRoKShyb3V0ZXIuY3VycmVudFJvdXRlLnBhcmFtcykpXG4gIH1cblxuICAvLyBJbml0aWFsaXplIGVycm9yIGhhbmRsZXJcbiAgX2FwcC4kbG9hZGluZyA9IHt9IC8vIFRvIGF2b2lkIGVycm9yIHdoaWxlIF9hcHAuJG51eHQgZG9lcyBub3QgZXhpc3RcbiAgaWYgKE5VWFQuZXJyb3IpIHtcbiAgICBfYXBwLmVycm9yKE5VWFQuZXJyb3IpXG4gIH1cblxuICAvLyBBZGQgYmVmb3JlRWFjaCByb3V0ZXIgaG9va3NcbiAgcm91dGVyLmJlZm9yZUVhY2gobG9hZEFzeW5jQ29tcG9uZW50cy5iaW5kKF9hcHApKVxuICByb3V0ZXIuYmVmb3JlRWFjaChyZW5kZXIuYmluZChfYXBwKSlcblxuICAvLyBJZiBwYWdlIGFscmVhZHkgaXMgc2VydmVyIHJlbmRlcmVkXG4gIGlmIChOVVhULnNlcnZlclJlbmRlcmVkKSB7XG4gICAgbW91bnQoKVxuICAgIHJldHVyblxuICB9XG5cbiAgLy8gRmlyc3QgcmVuZGVyIG9uIGNsaWVudC1zaWRlXG4gIGNvbnN0IGNsaWVudEZpcnN0TW91bnQgPSAoKSA9PiB7XG4gICAgbm9ybWFsaXplQ29tcG9uZW50cyhyb3V0ZXIuY3VycmVudFJvdXRlLCByb3V0ZXIuY3VycmVudFJvdXRlKVxuICAgIHNob3dOZXh0UGFnZS5jYWxsKF9hcHAsIHJvdXRlci5jdXJyZW50Um91dGUpXG4gICAgLy8gRG9uJ3QgY2FsbCBmaXhQcmVwYXRjaC5jYWxsKF9hcHAsIHJvdXRlci5jdXJyZW50Um91dGUsIHJvdXRlci5jdXJyZW50Um91dGUpIHNpbmNlIGl0J3MgZmlyc3QgcmVuZGVyXG4gICAgbW91bnQoKVxuICB9XG5cbiAgcmVuZGVyLmNhbGwoX2FwcCwgcm91dGVyLmN1cnJlbnRSb3V0ZSwgcm91dGVyLmN1cnJlbnRSb3V0ZSwgKHBhdGgpID0+IHtcbiAgICAvLyBJZiBub3QgcmVkaXJlY3RlZFxuICAgIGlmICghcGF0aCkge1xuICAgICAgY2xpZW50Rmlyc3RNb3VudCgpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBBZGQgYSBvbmUtdGltZSBhZnRlckVhY2ggaG9vayB0b1xuICAgIC8vIG1vdW50IHRoZSBhcHAgd2FpdCBmb3IgcmVkaXJlY3QgYW5kIHJvdXRlIGdldHMgcmVzb2x2ZWRcbiAgICBjb25zdCB1bnJlZ2lzdGVySG9vayA9IHJvdXRlci5hZnRlckVhY2goKHRvLCBmcm9tKSA9PiB7XG4gICAgICB1bnJlZ2lzdGVySG9vaygpXG4gICAgICBjbGllbnRGaXJzdE1vdW50KClcbiAgICB9KVxuXG4gICAgLy8gUHVzaCB0aGUgcGF0aCBhbmQgbGV0IHJvdXRlIHRvIGJlIHJlc29sdmVkXG4gICAgcm91dGVyLnB1c2gocGF0aCwgdW5kZWZpbmVkLCAoZXJyKSA9PiB7XG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIGVycm9ySGFuZGxlcihlcnIpXG4gICAgICB9XG4gICAgfSlcbiAgfSlcbn1cbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///145\n')},170:function(module,__webpack_exports__,__webpack_require__){"use strict";eval("/* harmony import */ var _node_modules_vue_style_loader_index_js_ref_3_oneOf_1_0_node_modules_css_loader_dist_cjs_js_ref_3_oneOf_1_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_src_index_js_ref_3_oneOf_1_2_node_modules_vuetify_loader_lib_loader_js_ref_16_0_node_modules_vue_loader_lib_index_js_vue_loader_options_error_vue_vue_type_style_index_0_id_45a595ce_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(74);\n/* harmony import */ var _node_modules_vue_style_loader_index_js_ref_3_oneOf_1_0_node_modules_css_loader_dist_cjs_js_ref_3_oneOf_1_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_src_index_js_ref_3_oneOf_1_2_node_modules_vuetify_loader_lib_loader_js_ref_16_0_node_modules_vue_loader_lib_index_js_vue_loader_options_error_vue_vue_type_style_index_0_id_45a595ce_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_vue_style_loader_index_js_ref_3_oneOf_1_0_node_modules_css_loader_dist_cjs_js_ref_3_oneOf_1_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_src_index_js_ref_3_oneOf_1_2_node_modules_vuetify_loader_lib_loader_js_ref_16_0_node_modules_vue_loader_lib_index_js_vue_loader_options_error_vue_vue_type_style_index_0_id_45a595ce_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_0__);\n/* unused harmony reexport * */\n /* unused harmony default export */ var _unused_webpack_default_export = (_node_modules_vue_style_loader_index_js_ref_3_oneOf_1_0_node_modules_css_loader_dist_cjs_js_ref_3_oneOf_1_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_src_index_js_ref_3_oneOf_1_2_node_modules_vuetify_loader_lib_loader_js_ref_16_0_node_modules_vue_loader_lib_index_js_vue_loader_options_error_vue_vue_type_style_index_0_id_45a595ce_scoped_true_lang_css___WEBPACK_IMPORTED_MODULE_0___default.a); //# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9sYXlvdXRzL2Vycm9yLnZ1ZT9hOTE4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUEwYixDQUFnQiwwZkFBRyxFQUFDIiwiZmlsZSI6IjE3MC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBtb2QgZnJvbSBcIi0hLi4vbm9kZV9tb2R1bGVzL3Z1ZS1zdHlsZS1sb2FkZXIvaW5kZXguanM/P3JlZi0tMy1vbmVPZi0xLTAhLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanM/P3JlZi0tMy1vbmVPZi0xLTEhLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvc3R5bGVQb3N0TG9hZGVyLmpzIS4uL25vZGVfbW9kdWxlcy9wb3N0Y3NzLWxvYWRlci9zcmMvaW5kZXguanM/P3JlZi0tMy1vbmVPZi0xLTIhLi4vbm9kZV9tb2R1bGVzL3Z1ZXRpZnktbG9hZGVyL2xpYi9sb2FkZXIuanM/P3JlZi0tMTYtMCEuLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvaW5kZXguanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL2Vycm9yLnZ1ZT92dWUmdHlwZT1zdHlsZSZpbmRleD0wJmlkPTQ1YTU5NWNlJnNjb3BlZD10cnVlJmxhbmc9Y3NzJlwiOyBleHBvcnQgZGVmYXVsdCBtb2Q7IGV4cG9ydCAqIGZyb20gXCItIS4uL25vZGVfbW9kdWxlcy92dWUtc3R5bGUtbG9hZGVyL2luZGV4LmpzPz9yZWYtLTMtb25lT2YtMS0wIS4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzPz9yZWYtLTMtb25lT2YtMS0xIS4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3N0eWxlUG9zdExvYWRlci5qcyEuLi9ub2RlX21vZHVsZXMvcG9zdGNzcy1sb2FkZXIvc3JjL2luZGV4LmpzPz9yZWYtLTMtb25lT2YtMS0yIS4uL25vZGVfbW9kdWxlcy92dWV0aWZ5LWxvYWRlci9saWIvbG9hZGVyLmpzPz9yZWYtLTE2LTAhLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2luZGV4LmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9lcnJvci52dWU/dnVlJnR5cGU9c3R5bGUmaW5kZXg9MCZpZD00NWE1OTVjZSZzY29wZWQ9dHJ1ZSZsYW5nPWNzcyZcIiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///170\n")},171:function(module,exports,__webpack_require__){eval('// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(43);\nexports = ___CSS_LOADER_API_IMPORT___(false);\n// Module\nexports.push([module.i, "h1[data-v-45a595ce]{font-size:20px}", ""]);\n// Exports\nmodule.exports = exports;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9sYXlvdXRzL2Vycm9yLnZ1ZT9kNjhmIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0Esa0NBQWtDLG1CQUFPLENBQUMsRUFBZ0Q7QUFDMUY7QUFDQTtBQUNBLGNBQWMsUUFBUyx1QkFBdUIsZUFBZTtBQUM3RDtBQUNBIiwiZmlsZSI6IjE3MS5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEltcG9ydHNcbnZhciBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18gPSByZXF1aXJlKFwiLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL2FwaS5qc1wiKTtcbmV4cG9ydHMgPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oZmFsc2UpO1xuLy8gTW9kdWxlXG5leHBvcnRzLnB1c2goW21vZHVsZS5pZCwgXCJoMVtkYXRhLXYtNDVhNTk1Y2Vde2ZvbnQtc2l6ZToyMHB4fVwiLCBcIlwiXSk7XG4vLyBFeHBvcnRzXG5tb2R1bGUuZXhwb3J0cyA9IGV4cG9ydHM7XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///171\n')},174:function(module,__webpack_exports__,__webpack_require__){"use strict";eval("/* harmony import */ var _node_modules_vue_style_loader_index_js_ref_3_oneOf_1_0_node_modules_css_loader_dist_cjs_js_ref_3_oneOf_1_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_src_index_js_ref_3_oneOf_1_2_node_modules_vuetify_loader_lib_loader_js_ref_16_0_node_modules_vue_loader_lib_index_js_vue_loader_options_nuxt_loading_vue_vue_type_style_index_0_lang_css___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(75);\n/* harmony import */ var _node_modules_vue_style_loader_index_js_ref_3_oneOf_1_0_node_modules_css_loader_dist_cjs_js_ref_3_oneOf_1_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_src_index_js_ref_3_oneOf_1_2_node_modules_vuetify_loader_lib_loader_js_ref_16_0_node_modules_vue_loader_lib_index_js_vue_loader_options_nuxt_loading_vue_vue_type_style_index_0_lang_css___WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_vue_style_loader_index_js_ref_3_oneOf_1_0_node_modules_css_loader_dist_cjs_js_ref_3_oneOf_1_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_src_index_js_ref_3_oneOf_1_2_node_modules_vuetify_loader_lib_loader_js_ref_16_0_node_modules_vue_loader_lib_index_js_vue_loader_options_nuxt_loading_vue_vue_type_style_index_0_lang_css___WEBPACK_IMPORTED_MODULE_0__);\n/* unused harmony reexport * */\n /* unused harmony default export */ var _unused_webpack_default_export = (_node_modules_vue_style_loader_index_js_ref_3_oneOf_1_0_node_modules_css_loader_dist_cjs_js_ref_3_oneOf_1_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_src_index_js_ref_3_oneOf_1_2_node_modules_vuetify_loader_lib_loader_js_ref_16_0_node_modules_vue_loader_lib_index_js_vue_loader_options_nuxt_loading_vue_vue_type_style_index_0_lang_css___WEBPACK_IMPORTED_MODULE_0___default.a); //# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi8ubnV4dC9jb21wb25lbnRzL251eHQtbG9hZGluZy52dWU/NDkyMSJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBMmIsQ0FBZ0IseWVBQUcsRUFBQyIsImZpbGUiOiIxNzQuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgbW9kIGZyb20gXCItIS4uLy4uL25vZGVfbW9kdWxlcy92dWUtc3R5bGUtbG9hZGVyL2luZGV4LmpzPz9yZWYtLTMtb25lT2YtMS0wIS4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvY2pzLmpzPz9yZWYtLTMtb25lT2YtMS0xIS4uLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9sb2FkZXJzL3N0eWxlUG9zdExvYWRlci5qcyEuLi8uLi9ub2RlX21vZHVsZXMvcG9zdGNzcy1sb2FkZXIvc3JjL2luZGV4LmpzPz9yZWYtLTMtb25lT2YtMS0yIS4uLy4uL25vZGVfbW9kdWxlcy92dWV0aWZ5LWxvYWRlci9saWIvbG9hZGVyLmpzPz9yZWYtLTE2LTAhLi4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2luZGV4LmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9udXh0LWxvYWRpbmcudnVlP3Z1ZSZ0eXBlPXN0eWxlJmluZGV4PTAmbGFuZz1jc3MmXCI7IGV4cG9ydCBkZWZhdWx0IG1vZDsgZXhwb3J0ICogZnJvbSBcIi0hLi4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1zdHlsZS1sb2FkZXIvaW5kZXguanM/P3JlZi0tMy1vbmVPZi0xLTAhLi4vLi4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9janMuanM/P3JlZi0tMy1vbmVPZi0xLTEhLi4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2xvYWRlcnMvc3R5bGVQb3N0TG9hZGVyLmpzIS4uLy4uL25vZGVfbW9kdWxlcy9wb3N0Y3NzLWxvYWRlci9zcmMvaW5kZXguanM/P3JlZi0tMy1vbmVPZi0xLTIhLi4vLi4vbm9kZV9tb2R1bGVzL3Z1ZXRpZnktbG9hZGVyL2xpYi9sb2FkZXIuanM/P3JlZi0tMTYtMCEuLi8uLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvaW5kZXguanM/P3Z1ZS1sb2FkZXItb3B0aW9ucyEuL251eHQtbG9hZGluZy52dWU/dnVlJnR5cGU9c3R5bGUmaW5kZXg9MCZsYW5nPWNzcyZcIiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///174\n")},175:function(module,exports,__webpack_require__){eval('// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(43);\nexports = ___CSS_LOADER_API_IMPORT___(false);\n// Module\nexports.push([module.i, ".nuxt-progress{position:fixed;top:0;left:0;right:0;height:2px;width:0;opacity:1;-webkit-transition:width .1s,opacity .4s;transition:width .1s,opacity .4s;background-color:#fff;z-index:999999}.nuxt-progress.nuxt-progress-notransition{-webkit-transition:none;transition:none}.nuxt-progress-failed{background-color:red}", ""]);\n// Exports\nmodule.exports = exports;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi8ubnV4dC9jb21wb25lbnRzL251eHQtbG9hZGluZy52dWU/NWI1YiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBLGtDQUFrQyxtQkFBTyxDQUFDLEVBQW1EO0FBQzdGO0FBQ0E7QUFDQSxjQUFjLFFBQVMsa0JBQWtCLGVBQWUsTUFBTSxPQUFPLFFBQVEsV0FBVyxRQUFRLFVBQVUseUNBQXlDLGlDQUFpQyxzQkFBc0IsZUFBZSwwQ0FBMEMsd0JBQXdCLGdCQUFnQixzQkFBc0IscUJBQXFCO0FBQ3RWO0FBQ0EiLCJmaWxlIjoiMTc1LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8gSW1wb3J0c1xudmFyIF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyA9IHJlcXVpcmUoXCIuLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCIpO1xuZXhwb3J0cyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhmYWxzZSk7XG4vLyBNb2R1bGVcbmV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCBcIi5udXh0LXByb2dyZXNze3Bvc2l0aW9uOmZpeGVkO3RvcDowO2xlZnQ6MDtyaWdodDowO2hlaWdodDoycHg7d2lkdGg6MDtvcGFjaXR5OjE7LXdlYmtpdC10cmFuc2l0aW9uOndpZHRoIC4xcyxvcGFjaXR5IC40czt0cmFuc2l0aW9uOndpZHRoIC4xcyxvcGFjaXR5IC40cztiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7ei1pbmRleDo5OTk5OTl9Lm51eHQtcHJvZ3Jlc3MubnV4dC1wcm9ncmVzcy1ub3RyYW5zaXRpb257LXdlYmtpdC10cmFuc2l0aW9uOm5vbmU7dHJhbnNpdGlvbjpub25lfS5udXh0LXByb2dyZXNzLWZhaWxlZHtiYWNrZ3JvdW5kLWNvbG9yOnJlZH1cIiwgXCJcIl0pO1xuLy8gRXhwb3J0c1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///175\n')},176:function(module,__webpack_exports__,__webpack_require__){"use strict";eval("/* harmony import */ var _node_modules_vue_style_loader_index_js_ref_3_oneOf_1_0_node_modules_css_loader_dist_cjs_js_ref_3_oneOf_1_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_src_index_js_ref_3_oneOf_1_2_node_modules_vuetify_loader_lib_loader_js_ref_16_0_node_modules_vue_loader_lib_index_js_vue_loader_options_default_vue_vue_type_style_index_0_lang_css___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(76);\n/* harmony import */ var _node_modules_vue_style_loader_index_js_ref_3_oneOf_1_0_node_modules_css_loader_dist_cjs_js_ref_3_oneOf_1_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_src_index_js_ref_3_oneOf_1_2_node_modules_vuetify_loader_lib_loader_js_ref_16_0_node_modules_vue_loader_lib_index_js_vue_loader_options_default_vue_vue_type_style_index_0_lang_css___WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_vue_style_loader_index_js_ref_3_oneOf_1_0_node_modules_css_loader_dist_cjs_js_ref_3_oneOf_1_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_src_index_js_ref_3_oneOf_1_2_node_modules_vuetify_loader_lib_loader_js_ref_16_0_node_modules_vue_loader_lib_index_js_vue_loader_options_default_vue_vue_type_style_index_0_lang_css___WEBPACK_IMPORTED_MODULE_0__);\n/* unused harmony reexport * */\n /* unused harmony default export */ var _unused_webpack_default_export = (_node_modules_vue_style_loader_index_js_ref_3_oneOf_1_0_node_modules_css_loader_dist_cjs_js_ref_3_oneOf_1_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_postcss_loader_src_index_js_ref_3_oneOf_1_2_node_modules_vuetify_loader_lib_loader_js_ref_16_0_node_modules_vue_loader_lib_index_js_vue_loader_options_default_vue_vue_type_style_index_0_lang_css___WEBPACK_IMPORTED_MODULE_0___default.a); //# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9sYXlvdXRzL2RlZmF1bHQudnVlP2Y5MjIiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQW9hLENBQWdCLG9lQUFHLEVBQUMiLCJmaWxlIjoiMTc2LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IG1vZCBmcm9tIFwiLSEuLi9ub2RlX21vZHVsZXMvdnVlLXN0eWxlLWxvYWRlci9pbmRleC5qcz8/cmVmLS0zLW9uZU9mLTEtMCEuLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcz8/cmVmLS0zLW9uZU9mLTEtMSEuLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvbG9hZGVycy9zdHlsZVBvc3RMb2FkZXIuanMhLi4vbm9kZV9tb2R1bGVzL3Bvc3Rjc3MtbG9hZGVyL3NyYy9pbmRleC5qcz8/cmVmLS0zLW9uZU9mLTEtMiEuLi9ub2RlX21vZHVsZXMvdnVldGlmeS1sb2FkZXIvbGliL2xvYWRlci5qcz8/cmVmLS0xNi0wIS4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9pbmRleC5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vZGVmYXVsdC52dWU/dnVlJnR5cGU9c3R5bGUmaW5kZXg9MCZsYW5nPWNzcyZcIjsgZXhwb3J0IGRlZmF1bHQgbW9kOyBleHBvcnQgKiBmcm9tIFwiLSEuLi9ub2RlX21vZHVsZXMvdnVlLXN0eWxlLWxvYWRlci9pbmRleC5qcz8/cmVmLS0zLW9uZU9mLTEtMCEuLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcz8/cmVmLS0zLW9uZU9mLTEtMSEuLi9ub2RlX21vZHVsZXMvdnVlLWxvYWRlci9saWIvbG9hZGVycy9zdHlsZVBvc3RMb2FkZXIuanMhLi4vbm9kZV9tb2R1bGVzL3Bvc3Rjc3MtbG9hZGVyL3NyYy9pbmRleC5qcz8/cmVmLS0zLW9uZU9mLTEtMiEuLi9ub2RlX21vZHVsZXMvdnVldGlmeS1sb2FkZXIvbGliL2xvYWRlci5qcz8/cmVmLS0xNi0wIS4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9pbmRleC5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vZGVmYXVsdC52dWU/dnVlJnR5cGU9c3R5bGUmaW5kZXg9MCZsYW5nPWNzcyZcIiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///176\n")},177:function(module,exports,__webpack_require__){eval('// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(43);\nexports = ___CSS_LOADER_API_IMPORT___(false);\n// Module\nexports.push([module.i, "html{font-family:Source Sans Pro,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;font-size:16px;word-spacing:1px;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;box-sizing:border-box}*,:after,:before{box-sizing:border-box;margin:0}.button--purple{display:inline-block;border-radius:4px;border:1px solid #0c1439;color:#0c1439;text-decoration:none;padding:10px 30px}.button--purple:hover{color:#fff;background-color:#0c1439}.button--grey{display:inline-block;border-radius:4px;border:1px solid #35495e;color:#35495e;text-decoration:none;padding:10px 30px;margin-left:15px}.button--grey:hover{color:#fff;background-color:#35495e}", ""]);\n// Exports\nmodule.exports = exports;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9sYXlvdXRzL2RlZmF1bHQudnVlPzBlZjEiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQSxrQ0FBa0MsbUJBQU8sQ0FBQyxFQUFnRDtBQUMxRjtBQUNBO0FBQ0EsY0FBYyxRQUFTLFFBQVEsNkdBQTZHLGVBQWUsaUJBQWlCLDBCQUEwQiw4QkFBOEIsa0NBQWtDLG1DQUFtQyxzQkFBc0IsaUJBQWlCLHNCQUFzQixTQUFTLGdCQUFnQixxQkFBcUIsa0JBQWtCLHlCQUF5QixjQUFjLHFCQUFxQixrQkFBa0Isc0JBQXNCLFdBQVcseUJBQXlCLGNBQWMscUJBQXFCLGtCQUFrQix5QkFBeUIsY0FBYyxxQkFBcUIsa0JBQWtCLGlCQUFpQixvQkFBb0IsV0FBVyx5QkFBeUI7QUFDMXZCO0FBQ0EiLCJmaWxlIjoiMTc3LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8gSW1wb3J0c1xudmFyIF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyA9IHJlcXVpcmUoXCIuLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCIpO1xuZXhwb3J0cyA9IF9fX0NTU19MT0FERVJfQVBJX0lNUE9SVF9fXyhmYWxzZSk7XG4vLyBNb2R1bGVcbmV4cG9ydHMucHVzaChbbW9kdWxlLmlkLCBcImh0bWx7Zm9udC1mYW1pbHk6U291cmNlIFNhbnMgUHJvLC1hcHBsZS1zeXN0ZW0sQmxpbmtNYWNTeXN0ZW1Gb250LFNlZ29lIFVJLFJvYm90byxIZWx2ZXRpY2EgTmV1ZSxBcmlhbCxzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNnB4O3dvcmQtc3BhY2luZzoxcHg7LW1zLXRleHQtc2l6ZS1hZGp1c3Q6MTAwJTstd2Via2l0LXRleHQtc2l6ZS1hZGp1c3Q6MTAwJTstbW96LW9zeC1mb250LXNtb290aGluZzpncmF5c2NhbGU7LXdlYmtpdC1mb250LXNtb290aGluZzphbnRpYWxpYXNlZDtib3gtc2l6aW5nOmJvcmRlci1ib3h9Kiw6YWZ0ZXIsOmJlZm9yZXtib3gtc2l6aW5nOmJvcmRlci1ib3g7bWFyZ2luOjB9LmJ1dHRvbi0tcHVycGxle2Rpc3BsYXk6aW5saW5lLWJsb2NrO2JvcmRlci1yYWRpdXM6NHB4O2JvcmRlcjoxcHggc29saWQgIzBjMTQzOTtjb2xvcjojMGMxNDM5O3RleHQtZGVjb3JhdGlvbjpub25lO3BhZGRpbmc6MTBweCAzMHB4fS5idXR0b24tLXB1cnBsZTpob3Zlcntjb2xvcjojZmZmO2JhY2tncm91bmQtY29sb3I6IzBjMTQzOX0uYnV0dG9uLS1ncmV5e2Rpc3BsYXk6aW5saW5lLWJsb2NrO2JvcmRlci1yYWRpdXM6NHB4O2JvcmRlcjoxcHggc29saWQgIzM1NDk1ZTtjb2xvcjojMzU0OTVlO3RleHQtZGVjb3JhdGlvbjpub25lO3BhZGRpbmc6MTBweCAzMHB4O21hcmdpbi1sZWZ0OjE1cHh9LmJ1dHRvbi0tZ3JleTpob3Zlcntjb2xvcjojZmZmO2JhY2tncm91bmQtY29sb3I6IzM1NDk1ZX1cIiwgXCJcIl0pO1xuLy8gRXhwb3J0c1xubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRzO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///177\n')},178:function(module,__webpack_exports__,__webpack_require__){"use strict";eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "state", function() { return state; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getters", function() { return getters; });\nvar state = function state() {\n return {};\n};\nvar getters = {};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zdG9yZS9pbmRleC5qcz85MTAxIl0sIm5hbWVzIjpbInN0YXRlIiwiZ2V0dGVycyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQTtBQUFBO0FBQU8sSUFBTUEsS0FBSyxHQUFHLFNBQVJBLEtBQVE7QUFBQSxTQUFPLEVBQVA7QUFBQSxDQUFkO0FBSUEsSUFBTUMsT0FBTyxHQUFHLEVBQWhCIiwiZmlsZSI6IjE3OC5qcyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBzdGF0ZSA9ICgpID0+ICh7XG5cbn0pXG5cbmV4cG9ydCBjb25zdCBnZXR0ZXJzID0ge30iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///178\n')},179:function(module,__webpack_exports__,__webpack_require__){"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"state\", function() { return state; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"mutations\", function() { return mutations; });\n// https://www.mikestreety.co.uk/blog/vue-js-using-localstorage-with-the-vuex-store\nvar state = function state() {\n return {\n isDrawerOpen: true,\n isDrawerPinned: false\n };\n};\nvar mutations = {\n // initializeStore(state) {\n // if(localStorage.getItem('store')) {\n // this.replaceState(\n // Object.assign(state,JSON.parse(localStorage.getItem('store')))\n // );\n // }\n // },\n toggleDrawerState: function toggleDrawerState(state, newDrawerState) {\n if (state.isDrawerPinned) {\n return;\n }\n\n state.isDrawerOpen = !state.isDrawerOpen;\n },\n setDrawer: function setDrawer(state, newDrawerState) {\n if (state.isDrawerPinned) {\n return;\n }\n\n state.isDrawerOpen = newDrawerState;\n },\n setMenuLock: function setMenuLock(state, newLockState) {\n state.isDrawerPinned = newLockState;\n }\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9zdG9yZS9kb2NzLmpzPzNiYjAiXSwibmFtZXMiOlsic3RhdGUiLCJpc0RyYXdlck9wZW4iLCJpc0RyYXdlclBpbm5lZCIsIm11dGF0aW9ucyIsInRvZ2dsZURyYXdlclN0YXRlIiwibmV3RHJhd2VyU3RhdGUiLCJzZXREcmF3ZXIiLCJzZXRNZW51TG9jayIsIm5ld0xvY2tTdGF0ZSJdLCJtYXBwaW5ncyI6IkFBQ0E7QUFBQTtBQUFBO0FBQUE7QUFDTyxJQUFNQSxLQUFLLEdBQUcsU0FBUkEsS0FBUTtBQUFBLFNBQU87QUFDeEJDLGdCQUFZLEVBQUUsSUFEVTtBQUV4QkMsa0JBQWMsRUFBRTtBQUZRLEdBQVA7QUFBQSxDQUFkO0FBS0EsSUFBTUMsU0FBUyxHQUFHO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0FDLG1CQVJxQiw2QkFRSEosS0FSRyxFQVFJSyxjQVJKLEVBUW9CO0FBQ3JDLFFBQUlMLEtBQUssQ0FBQ0UsY0FBVixFQUEwQjtBQUN0QjtBQUNIOztBQUNERixTQUFLLENBQUNDLFlBQU4sR0FBbUIsQ0FBQ0QsS0FBSyxDQUFDQyxZQUExQjtBQUNILEdBYm9CO0FBY3JCSyxXQWRxQixxQkFjWE4sS0FkVyxFQWNKSyxjQWRJLEVBY1k7QUFDN0IsUUFBSUwsS0FBSyxDQUFDRSxjQUFWLEVBQTBCO0FBQ3RCO0FBQ0g7O0FBQ0RGLFNBQUssQ0FBQ0MsWUFBTixHQUFtQkksY0FBbkI7QUFDSCxHQW5Cb0I7QUFvQnJCRSxhQXBCcUIsdUJBb0JUUCxLQXBCUyxFQW9CRlEsWUFwQkUsRUFvQlk7QUFDN0JSLFNBQUssQ0FBQ0UsY0FBTixHQUFxQk0sWUFBckI7QUFDSDtBQXRCb0IsQ0FBbEIiLCJmaWxlIjoiMTc5LmpzIiwic291cmNlc0NvbnRlbnQiOlsiXG4vLyBodHRwczovL3d3dy5taWtlc3RyZWV0eS5jby51ay9ibG9nL3Z1ZS1qcy11c2luZy1sb2NhbHN0b3JhZ2Utd2l0aC10aGUtdnVleC1zdG9yZVxuZXhwb3J0IGNvbnN0IHN0YXRlID0gKCkgPT4gKHtcbiAgICBpc0RyYXdlck9wZW46IHRydWUsXG4gICAgaXNEcmF3ZXJQaW5uZWQ6IGZhbHNlXG59KTtcblxuZXhwb3J0IGNvbnN0IG11dGF0aW9ucyA9IHtcbiAgICAvLyBpbml0aWFsaXplU3RvcmUoc3RhdGUpIHtcbiAgICAvLyAgICAgaWYobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3N0b3JlJykpIHtcbiAgICAvLyAgICAgICAgIHRoaXMucmVwbGFjZVN0YXRlKFxuICAgIC8vICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oc3RhdGUsSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnc3RvcmUnKSkpXG4gICAgLy8gICAgICAgICApO1xuICAgIC8vICAgICB9XG4gICAgLy8gfSxcbiAgICB0b2dnbGVEcmF3ZXJTdGF0ZShzdGF0ZSwgbmV3RHJhd2VyU3RhdGUpIHtcbiAgICAgICAgaWYgKHN0YXRlLmlzRHJhd2VyUGlubmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGUuaXNEcmF3ZXJPcGVuPSFzdGF0ZS5pc0RyYXdlck9wZW47XG4gICAgfSxcbiAgICBzZXREcmF3ZXIoc3RhdGUsIG5ld0RyYXdlclN0YXRlKSB7XG4gICAgICAgIGlmIChzdGF0ZS5pc0RyYXdlclBpbm5lZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlLmlzRHJhd2VyT3Blbj1uZXdEcmF3ZXJTdGF0ZTtcbiAgICB9LFxuICAgIHNldE1lbnVMb2NrKHN0YXRlLCBuZXdMb2NrU3RhdGUpIHtcbiAgICAgICAgc3RhdGUuaXNEcmF3ZXJQaW5uZWQ9bmV3TG9ja1N0YXRlO1xuICAgIH1cbn07Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///179\n")},27:function(module,__webpack_exports__,__webpack_require__){"use strict";eval("\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es7.object.get-own-property-descriptors.js\nvar es7_object_get_own_property_descriptors = __webpack_require__(24);\n\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es6.symbol.js\nvar es6_symbol = __webpack_require__(10);\n\n// EXTERNAL MODULE: ./node_modules/core-js/modules/web.dom.iterable.js\nvar web_dom_iterable = __webpack_require__(7);\n\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es6.object.keys.js\nvar es6_object_keys = __webpack_require__(22);\n\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es6.object.to-string.js\nvar es6_object_to_string = __webpack_require__(6);\n\n// EXTERNAL MODULE: ./node_modules/regenerator-runtime/runtime.js\nvar runtime = __webpack_require__(62);\n\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/defineProperty.js\nvar defineProperty = __webpack_require__(3);\n\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es6.function.name.js\nvar es6_function_name = __webpack_require__(28);\n\n// EXTERNAL MODULE: ./node_modules/vue/dist/vue.runtime.esm.js\nvar vue_runtime_esm = __webpack_require__(0);\n\n// EXTERNAL MODULE: ./node_modules/vue-meta/dist/vue-meta.esm.browser.js\nvar vue_meta_esm_browser = __webpack_require__(131);\n\n// EXTERNAL MODULE: ./node_modules/vue-client-only/dist/vue-client-only.common.js\nvar vue_client_only_common = __webpack_require__(90);\nvar vue_client_only_common_default = /*#__PURE__*/__webpack_require__.n(vue_client_only_common);\n\n// EXTERNAL MODULE: ./node_modules/vue-no-ssr/dist/vue-no-ssr.common.js\nvar vue_no_ssr_common = __webpack_require__(42);\nvar vue_no_ssr_common_default = /*#__PURE__*/__webpack_require__.n(vue_no_ssr_common);\n\n// EXTERNAL MODULE: ./node_modules/vue-router/dist/vue-router.esm.js\nvar vue_router_esm = __webpack_require__(56);\n\n// EXTERNAL MODULE: ./.nuxt/utils.js\nvar utils = __webpack_require__(1);\n\n// CONCATENATED MODULE: ./.nuxt/router.scrollBehavior.js\n\n\n\nif (true) {\n if ('scrollRestoration' in window.history) {\n window.history.scrollRestoration = 'manual'; // reset scrollRestoration to auto when leaving page, allowing page reload\n // and back-navigation from other pages to use the browser to restore the\n // scrolling position.\n\n window.addEventListener('beforeunload', function () {\n window.history.scrollRestoration = 'auto';\n }); // Setting scrollRestoration to manual again when returning to this page.\n\n window.addEventListener('load', function () {\n window.history.scrollRestoration = 'manual';\n });\n }\n}\n\n/* harmony default export */ var router_scrollBehavior = (function (to, from, savedPosition) {\n // if the returned position is falsy or an empty object,\n // will retain current scroll position.\n var position = false; // if no children detected and scrollToTop is not explicitly disabled\n\n var Pages = Object(utils[\"e\" /* getMatchedComponents */])(to);\n\n if (Pages.length < 2 && Pages.every(function (Page) {\n return Page.options.scrollToTop !== false;\n })) {\n // scroll to the top of the page\n position = {\n x: 0,\n y: 0\n };\n } else if (Pages.some(function (Page) {\n return Page.options.scrollToTop;\n })) {\n // if one of the children has scrollToTop option set to true\n position = {\n x: 0,\n y: 0\n };\n } // savedPosition is only available for popstate navigations (back button)\n\n\n if (savedPosition) {\n position = savedPosition;\n }\n\n var nuxt = window.$nuxt; // triggerScroll is only fired when a new component is loaded\n\n if (to.path === from.path && to.hash !== from.hash) {\n nuxt.$nextTick(function () {\n return nuxt.$emit('triggerScroll');\n });\n }\n\n return new Promise(function (resolve) {\n // wait for the out transition to complete (if necessary)\n nuxt.$once('triggerScroll', function () {\n // coords will be used if no selector is provided,\n // or if the selector didn't match any element.\n if (to.hash) {\n var hash = to.hash; // CSS.escape() is not supported with IE and Edge.\n\n if (typeof window.CSS !== 'undefined' && typeof window.CSS.escape !== 'undefined') {\n hash = '#' + window.CSS.escape(hash.substr(1));\n }\n\n try {\n if (document.querySelector(hash)) {\n // scroll to anchor by returning the selector\n position = {\n selector: hash\n };\n }\n } catch (e) {\n console.warn('Failed to save scroll position. Please add CSS.escape() polyfill (https://github.com/mathiasbynens/CSS.escape).');\n }\n }\n\n resolve(position);\n });\n });\n});\n// CONCATENATED MODULE: ./.nuxt/router.js\n\n\n\n\n\nvar router_04927a0e = function _04927a0e() {\n return Object(utils[\"j\" /* interopDefault */])(Promise.all(/* import() | pages/docs/index */[__webpack_require__.e(0), __webpack_require__.e(1), __webpack_require__.e(5)]).then(__webpack_require__.bind(null, 372)));\n};\n\nvar router_b005243e = function _b005243e() {\n return Object(utils[\"j\" /* interopDefault */])(Promise.all(/* import() | pages/docs/namespaces */[__webpack_require__.e(0), __webpack_require__.e(6)]).then(__webpack_require__.bind(null, 371)));\n};\n\nvar router_07ffbc9e = function _07ffbc9e() {\n return Object(utils[\"j\" /* interopDefault */])(Promise.all(/* import() | pages/docs/_slug */[__webpack_require__.e(0), __webpack_require__.e(1), __webpack_require__.e(4)]).then(__webpack_require__.bind(null, 373)));\n};\n\nvar router_64c66db2 = function _64c66db2() {\n return Object(utils[\"j\" /* interopDefault */])(__webpack_require__.e(/* import() | pages/index */ 7).then(__webpack_require__.bind(null, 370)));\n}; // TODO: remove in Nuxt 3\n\n\nvar emptyFn = function emptyFn() {};\n\nvar originalPush = vue_router_esm[\"a\" /* default */].prototype.push;\n\nvue_router_esm[\"a\" /* default */].prototype.push = function push(location) {\n var onComplete = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : emptyFn;\n var onAbort = arguments.length > 2 ? arguments[2] : undefined;\n return originalPush.call(this, location, onComplete, onAbort);\n};\n\nvue_runtime_esm[\"a\" /* default */].use(vue_router_esm[\"a\" /* default */]);\nvar routerOptions = {\n mode: 'hash',\n base: decodeURI('/'),\n linkActiveClass: 'nuxt-link-active',\n linkExactActiveClass: 'nuxt-link-exact-active',\n scrollBehavior: router_scrollBehavior,\n routes: [{\n path: \"/docs\",\n component: router_04927a0e,\n name: \"docs\"\n }, {\n path: \"/docs/namespaces\",\n component: router_b005243e,\n name: \"docs-namespaces\"\n }, {\n path: \"/docs/:slug\",\n component: router_07ffbc9e,\n name: \"docs-slug\"\n }, {\n path: \"/\",\n component: router_64c66db2,\n name: \"index\"\n }],\n fallback: false\n};\nfunction createRouter() {\n return new vue_router_esm[\"a\" /* default */](routerOptions);\n}\n// CONCATENATED MODULE: ./.nuxt/components/nuxt-child.js\n/* harmony default export */ var nuxt_child = ({\n name: 'NuxtChild',\n functional: true,\n props: {\n nuxtChildKey: {\n type: String,\n default: ''\n },\n keepAlive: Boolean,\n keepAliveProps: {\n type: Object,\n default: undefined\n }\n },\n render: function render(h, _ref) {\n var parent = _ref.parent,\n data = _ref.data,\n props = _ref.props;\n data.nuxtChild = true;\n var _parent = parent;\n var transitions = parent.$nuxt.nuxt.transitions;\n var defaultTransition = parent.$nuxt.nuxt.defaultTransition;\n var depth = 0;\n\n while (parent) {\n if (parent.$vnode && parent.$vnode.data.nuxtChild) {\n depth++;\n }\n\n parent = parent.$parent;\n }\n\n data.nuxtChildDepth = depth;\n var transition = transitions[depth] || defaultTransition;\n var transitionProps = {};\n transitionsKeys.forEach(function (key) {\n if (typeof transition[key] !== 'undefined') {\n transitionProps[key] = transition[key];\n }\n });\n var listeners = {};\n listenersKeys.forEach(function (key) {\n if (typeof transition[key] === 'function') {\n listeners[key] = transition[key].bind(_parent);\n }\n }); // Add triggerScroll event on beforeEnter (fix #1376)\n\n var beforeEnter = listeners.beforeEnter;\n\n listeners.beforeEnter = function (el) {\n // Ensure to trigger scroll event after calling scrollBehavior\n window.$nuxt.$nextTick(function () {\n window.$nuxt.$emit('triggerScroll');\n });\n\n if (beforeEnter) {\n return beforeEnter.call(_parent, el);\n }\n }; // make sure that leave is called asynchronous (fix #5703)\n\n\n if (transition.css === false) {\n var leave = listeners.leave; // only add leave listener when user didnt provide one\n // or when it misses the done argument\n\n if (!leave || leave.length < 2) {\n listeners.leave = function (el, done) {\n if (leave) {\n leave.call(_parent, el);\n }\n\n _parent.$nextTick(done);\n };\n }\n }\n\n var routerView = h('routerView', data);\n\n if (props.keepAlive) {\n routerView = h('keep-alive', {\n props: props.keepAliveProps\n }, [routerView]);\n }\n\n return h('transition', {\n props: transitionProps,\n on: listeners\n }, [routerView]);\n }\n});\nvar transitionsKeys = ['name', 'mode', 'appear', 'css', 'type', 'duration', 'enterClass', 'leaveClass', 'appearClass', 'enterActiveClass', 'enterActiveClass', 'leaveActiveClass', 'appearActiveClass', 'enterToClass', 'leaveToClass', 'appearToClass'];\nvar listenersKeys = ['beforeEnter', 'enter', 'afterEnter', 'enterCancelled', 'beforeLeave', 'leave', 'afterLeave', 'leaveCancelled', 'beforeAppear', 'appear', 'afterAppear', 'appearCancelled'];\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vuetify-loader/lib/loader.js??ref--16-0!./node_modules/vue-loader/lib??vue-loader-options!./layouts/error.vue?vue&type=template&id=45a595ce&scoped=true&\nvar errorvue_type_template_id_45a595ce_scoped_true_render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-app',{attrs:{\"dark\":\"\"}},[(_vm.error.statusCode === 404)?_c('h1',[_vm._v(\"\\n \"+_vm._s(_vm.pageNotFound)+\"\\n \")]):_c('h1',[_vm._v(\"\\n \"+_vm._s(_vm.otherError)+\"\\n \")]),_vm._v(\" \"),_c('a',{attrs:{\"href\":\"https://github.com/nosqlbench/nosqlbench/issues/new?labels=bug\"}},[_vm._v(\"\\n File A UI Bug Report\\n \")]),_vm._v(\" \"),_c('NuxtLink',{attrs:{\"to\":\"/\"}},[_vm._v(\"\\n Home page\\n \")])],1)}\nvar staticRenderFns = []\n\n\n// CONCATENATED MODULE: ./layouts/error.vue?vue&type=template&id=45a595ce&scoped=true&\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib??ref--2-0!./node_modules/vuetify-loader/lib/loader.js??ref--16-0!./node_modules/vue-loader/lib??vue-loader-options!./layouts/error.vue?vue&type=script&lang=js&\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n/* harmony default export */ var errorvue_type_script_lang_js_ = ({\n layout: 'empty',\n props: {\n error: {\n type: Object,\n default: null\n }\n },\n head: function head() {\n var title = this.error.statusCode === 404 ? this.pageNotFound : this.otherError;\n return {\n title: title\n };\n },\n data: function data() {\n return {\n pageNotFound: '404 Not Found',\n otherError: 'An error occurred'\n };\n }\n});\n// CONCATENATED MODULE: ./layouts/error.vue?vue&type=script&lang=js&\n /* harmony default export */ var layouts_errorvue_type_script_lang_js_ = (errorvue_type_script_lang_js_); \n// EXTERNAL MODULE: ./layouts/error.vue?vue&type=style&index=0&id=45a595ce&scoped=true&lang=css&\nvar errorvue_type_style_index_0_id_45a595ce_scoped_true_lang_css_ = __webpack_require__(170);\n\n// EXTERNAL MODULE: ./node_modules/vue-loader/lib/runtime/componentNormalizer.js\nvar componentNormalizer = __webpack_require__(40);\n\n// EXTERNAL MODULE: ./node_modules/vuetify-loader/lib/runtime/installComponents.js\nvar installComponents = __webpack_require__(96);\nvar installComponents_default = /*#__PURE__*/__webpack_require__.n(installComponents);\n\n// EXTERNAL MODULE: ./node_modules/vuetify/lib/components/VApp/VApp.js\nvar VApp = __webpack_require__(211);\n\n// CONCATENATED MODULE: ./layouts/error.vue\n\n\n\n\n\n\n/* normalize component */\n\nvar component = Object(componentNormalizer[\"a\" /* default */])(\n layouts_errorvue_type_script_lang_js_,\n errorvue_type_template_id_45a595ce_scoped_true_render,\n staticRenderFns,\n false,\n null,\n \"45a595ce\",\n null\n \n)\n\n/* harmony default export */ var layouts_error = (component.exports);\n\n/* vuetify-loader */\n\n\ninstallComponents_default()(component, {VApp: VApp[\"a\" /* default */]})\n\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es6.regexp.to-string.js\nvar es6_regexp_to_string = __webpack_require__(59);\n\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es6.date.to-string.js\nvar es6_date_to_string = __webpack_require__(60);\n\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es6.regexp.replace.js\nvar es6_regexp_replace = __webpack_require__(35);\n\n// EXTERNAL MODULE: ./node_modules/@babel/runtime/helpers/esm/slicedToArray.js + 3 modules\nvar slicedToArray = __webpack_require__(17);\n\n// CONCATENATED MODULE: ./.nuxt/components/nuxt.js\n\n\n\n\n\n\n\n\n\n/* harmony default export */ var components_nuxt = ({\n name: 'Nuxt',\n components: {\n NuxtChild: nuxt_child,\n NuxtError: layouts_error\n },\n props: {\n nuxtChildKey: {\n type: String,\n default: undefined\n },\n keepAlive: Boolean,\n keepAliveProps: {\n type: Object,\n default: undefined\n },\n name: {\n type: String,\n default: 'default'\n }\n },\n errorCaptured: function errorCaptured(error) {\n // if we receive and error while showing the NuxtError component\n // capture the error and force an immediate update so we re-render\n // without the NuxtError component\n if (this.displayingNuxtError) {\n this.errorFromNuxtError = error;\n this.$forceUpdate();\n }\n },\n computed: {\n routerViewKey: function routerViewKey() {\n // If nuxtChildKey prop is given or current route has children\n if (typeof this.nuxtChildKey !== 'undefined' || this.$route.matched.length > 1) {\n return this.nuxtChildKey || Object(utils[\"b\" /* compile */])(this.$route.matched[0].path)(this.$route.params);\n }\n\n var _this$$route$matched = Object(slicedToArray[\"a\" /* default */])(this.$route.matched, 1),\n matchedRoute = _this$$route$matched[0];\n\n if (!matchedRoute) {\n return this.$route.path;\n }\n\n var Component = matchedRoute.components.default;\n\n if (Component && Component.options) {\n var options = Component.options;\n\n if (options.key) {\n return typeof options.key === 'function' ? options.key(this.$route) : options.key;\n }\n }\n\n var strict = /\\/$/.test(matchedRoute.path);\n return strict ? this.$route.path : this.$route.path.replace(/\\/$/, '');\n }\n },\n beforeCreate: function beforeCreate() {\n vue_runtime_esm[\"a\" /* default */].util.defineReactive(this, 'nuxt', this.$root.$options.nuxt);\n },\n render: function render(h) {\n var _this = this;\n\n // if there is no error\n if (!this.nuxt.err) {\n // Directly return nuxt child\n return h('NuxtChild', {\n key: this.routerViewKey,\n props: this.$props\n });\n } // if an error occured within NuxtError show a simple\n // error message instead to prevent looping\n\n\n if (this.errorFromNuxtError) {\n this.$nextTick(function () {\n return _this.errorFromNuxtError = false;\n });\n return h('div', {}, [h('h2', 'An error occured while showing the error page'), h('p', 'Unfortunately an error occured and while showing the error page another error occured'), h('p', \"Error details: \".concat(this.errorFromNuxtError.toString())), h('nuxt-link', {\n props: {\n to: '/'\n }\n }, 'Go back to home')]);\n } // track if we are showing the NuxtError component\n\n\n this.displayingNuxtError = true;\n this.$nextTick(function () {\n return _this.displayingNuxtError = false;\n });\n return h(layouts_error, {\n props: {\n error: this.nuxt.err\n }\n });\n }\n});\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es6.string.iterator.js\nvar es6_string_iterator = __webpack_require__(61);\n\n// CONCATENATED MODULE: ./node_modules/babel-loader/lib??ref--2-0!./node_modules/vuetify-loader/lib/loader.js??ref--16-0!./node_modules/vue-loader/lib??vue-loader-options!./.nuxt/components/nuxt-loading.vue?vue&type=script&lang=js&\n/* harmony default export */ var nuxt_loadingvue_type_script_lang_js_ = ({\n name: 'NuxtLoading',\n data: function data() {\n return {\n percent: 0,\n show: false,\n canSucceed: true,\n reversed: false,\n skipTimerCount: 0,\n rtl: false,\n throttle: 200,\n duration: 5000,\n continuous: false\n };\n },\n computed: {\n left: function left() {\n if (!this.continuous && !this.rtl) {\n return false;\n }\n\n return this.rtl ? this.reversed ? '0px' : 'auto' : !this.reversed ? '0px' : 'auto';\n }\n },\n beforeDestroy: function beforeDestroy() {\n this.clear();\n },\n methods: {\n clear: function clear() {\n clearInterval(this._timer);\n clearTimeout(this._throttle);\n this._timer = null;\n },\n start: function start() {\n var _this = this;\n\n this.clear();\n this.percent = 0;\n this.reversed = false;\n this.skipTimerCount = 0;\n this.canSucceed = true;\n\n if (this.throttle) {\n this._throttle = setTimeout(function () {\n return _this.startTimer();\n }, this.throttle);\n } else {\n this.startTimer();\n }\n\n return this;\n },\n set: function set(num) {\n this.show = true;\n this.canSucceed = true;\n this.percent = Math.min(100, Math.max(0, Math.floor(num)));\n return this;\n },\n get: function get() {\n return this.percent;\n },\n increase: function increase(num) {\n this.percent = Math.min(100, Math.floor(this.percent + num));\n return this;\n },\n decrease: function decrease(num) {\n this.percent = Math.max(0, Math.floor(this.percent - num));\n return this;\n },\n pause: function pause() {\n clearInterval(this._timer);\n return this;\n },\n resume: function resume() {\n this.startTimer();\n return this;\n },\n finish: function finish() {\n this.percent = this.reversed ? 0 : 100;\n this.hide();\n return this;\n },\n hide: function hide() {\n var _this2 = this;\n\n this.clear();\n setTimeout(function () {\n _this2.show = false;\n\n _this2.$nextTick(function () {\n _this2.percent = 0;\n _this2.reversed = false;\n });\n }, 500);\n return this;\n },\n fail: function fail() {\n this.canSucceed = false;\n return this;\n },\n startTimer: function startTimer() {\n var _this3 = this;\n\n if (!this.show) {\n this.show = true;\n }\n\n if (typeof this._cut === 'undefined') {\n this._cut = 10000 / Math.floor(this.duration);\n }\n\n this._timer = setInterval(function () {\n /**\n * When reversing direction skip one timers\n * so 0, 100 are displayed for two iterations\n * also disable css width transitioning\n * which otherwise interferes and shows\n * a jojo effect\n */\n if (_this3.skipTimerCount > 0) {\n _this3.skipTimerCount--;\n return;\n }\n\n if (_this3.reversed) {\n _this3.decrease(_this3._cut);\n } else {\n _this3.increase(_this3._cut);\n }\n\n if (_this3.continuous) {\n if (_this3.percent >= 100) {\n _this3.skipTimerCount = 1;\n _this3.reversed = !_this3.reversed;\n } else if (_this3.percent <= 0) {\n _this3.skipTimerCount = 1;\n _this3.reversed = !_this3.reversed;\n }\n }\n }, 100);\n }\n },\n render: function render(h) {\n var el = h(false);\n\n if (this.show) {\n el = h('div', {\n staticClass: 'nuxt-progress',\n class: {\n 'nuxt-progress-notransition': this.skipTimerCount > 0,\n 'nuxt-progress-failed': !this.canSucceed\n },\n style: {\n width: this.percent + '%',\n left: this.left\n }\n });\n }\n\n return el;\n }\n});\n// CONCATENATED MODULE: ./.nuxt/components/nuxt-loading.vue?vue&type=script&lang=js&\n /* harmony default export */ var components_nuxt_loadingvue_type_script_lang_js_ = (nuxt_loadingvue_type_script_lang_js_); \n// EXTERNAL MODULE: ./.nuxt/components/nuxt-loading.vue?vue&type=style&index=0&lang=css&\nvar nuxt_loadingvue_type_style_index_0_lang_css_ = __webpack_require__(174);\n\n// CONCATENATED MODULE: ./.nuxt/components/nuxt-loading.vue\nvar nuxt_loading_render, nuxt_loading_staticRenderFns\n\n\n\n\n\n/* normalize component */\n\nvar nuxt_loading_component = Object(componentNormalizer[\"a\" /* default */])(\n components_nuxt_loadingvue_type_script_lang_js_,\n nuxt_loading_render,\n nuxt_loading_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* harmony default export */ var nuxt_loading = (nuxt_loading_component.exports);\n// CONCATENATED MODULE: ./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/vuetify-loader/lib/loader.js??ref--16-0!./node_modules/vue-loader/lib??vue-loader-options!./layouts/default.vue?vue&type=template&id=760914e3&\nvar defaultvue_type_template_id_760914e3_render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[_c('nuxt')],1)}\nvar defaultvue_type_template_id_760914e3_staticRenderFns = []\n\n\n// CONCATENATED MODULE: ./layouts/default.vue?vue&type=template&id=760914e3&\n\n// EXTERNAL MODULE: ./layouts/default.vue?vue&type=style&index=0&lang=css&\nvar defaultvue_type_style_index_0_lang_css_ = __webpack_require__(176);\n\n// CONCATENATED MODULE: ./layouts/default.vue\n\nvar script = {}\n\n\n\n/* normalize component */\n\nvar default_component = Object(componentNormalizer[\"a\" /* default */])(\n script,\n defaultvue_type_template_id_760914e3_render,\n defaultvue_type_template_id_760914e3_staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\n/* harmony default export */ var layouts_default = (default_component.exports);\n// CONCATENATED MODULE: ./.nuxt/App.js\n\n\n\n\n\n\n\n\n\nvar layouts = {\n \"_default\": layouts_default\n};\n/* harmony default export */ var App = ({\n head: {\n \"titleTemplate\": \"%snosqlbench docs\",\n \"title\": \"guidebook\",\n \"meta\": [{\n \"charset\": \"utf-8\"\n }, {\n \"name\": \"viewport\",\n \"content\": \"width=device-width, initial-scale=1\"\n }, {\n \"hid\": \"description\",\n \"name\": \"description\",\n \"content\": \"Docs App for NoSQLBench\"\n }],\n \"link\": [{\n \"rel\": \"icon\",\n \"type\": \"image/x-icon\",\n \"href\": \"/favicon.ico\"\n }, {\n \"rel\": \"stylesheet\",\n \"type\": \"text/css\",\n \"href\": \"https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900&display=swap\"\n }, {\n \"rel\": \"stylesheet\",\n \"type\": \"text/css\",\n \"href\": \"https://cdn.jsdelivr.net/npm/@mdi/font@latest/css/materialdesignicons.min.css\"\n }],\n \"style\": [],\n \"script\": []\n },\n render: function render(h, props) {\n var loadingEl = h('NuxtLoading', {\n ref: 'loading'\n });\n\n if (this.nuxt.err && layouts_error) {\n var errorLayout = (layouts_error.options || layouts_error).layout;\n\n if (errorLayout) {\n this.setLayout(typeof errorLayout === 'function' ? errorLayout.call(layouts_error, this.context) : errorLayout);\n }\n }\n\n var layoutEl = h(this.layout || 'nuxt');\n var templateEl = h('div', {\n domProps: {\n id: '__layout'\n },\n key: this.layoutName\n }, [layoutEl]);\n var transitionEl = h('transition', {\n props: {\n name: 'layout',\n mode: 'out-in'\n },\n on: {\n beforeEnter: function beforeEnter(el) {\n // Ensure to trigger scroll event after calling scrollBehavior\n window.$nuxt.$nextTick(function () {\n window.$nuxt.$emit('triggerScroll');\n });\n }\n }\n }, [templateEl]);\n return h('div', {\n domProps: {\n id: '__nuxt'\n }\n }, [loadingEl, transitionEl]);\n },\n data: function data() {\n return {\n isOnline: true,\n layout: null,\n layoutName: ''\n };\n },\n beforeCreate: function beforeCreate() {\n vue_runtime_esm[\"a\" /* default */].util.defineReactive(this, 'nuxt', this.$options.nuxt);\n },\n created: function created() {\n // Add this.$nuxt in child instances\n vue_runtime_esm[\"a\" /* default */].prototype.$nuxt = this; // add to window so we can listen when ready\n\n if (true) {\n window.$nuxt = this;\n this.refreshOnlineStatus(); // Setup the listeners\n\n window.addEventListener('online', this.refreshOnlineStatus);\n window.addEventListener('offline', this.refreshOnlineStatus);\n } // Add $nuxt.error()\n\n\n this.error = this.nuxt.error; // Add $nuxt.context\n\n this.context = this.$options.context;\n },\n mounted: function mounted() {\n this.$loading = this.$refs.loading;\n },\n watch: {\n 'nuxt.err': 'errorChanged'\n },\n computed: {\n isOffline: function isOffline() {\n return !this.isOnline;\n }\n },\n methods: {\n refreshOnlineStatus: function refreshOnlineStatus() {\n if (true) {\n if (typeof window.navigator.onLine === 'undefined') {\n // If the browser doesn't support connection status reports\n // assume that we are online because most apps' only react\n // when they now that the connection has been interrupted\n this.isOnline = true;\n } else {\n this.isOnline = window.navigator.onLine;\n }\n }\n },\n refresh: function refresh() {\n var _this = this;\n\n var pages, promises;\n return regeneratorRuntime.async(function refresh$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n pages = Object(utils[\"f\" /* getMatchedComponentsInstances */])(this.$route);\n\n if (pages.length) {\n _context.next = 3;\n break;\n }\n\n return _context.abrupt(\"return\");\n\n case 3:\n this.$loading.start();\n promises = pages.map(function (page) {\n var p = [];\n\n if (page.$options.fetch) {\n p.push(Object(utils[\"m\" /* promisify */])(page.$options.fetch, _this.context));\n }\n\n if (page.$options.asyncData) {\n p.push(Object(utils[\"m\" /* promisify */])(page.$options.asyncData, _this.context).then(function (newData) {\n for (var key in newData) {\n vue_runtime_esm[\"a\" /* default */].set(page.$data, key, newData[key]);\n }\n }));\n }\n\n return Promise.all(p);\n });\n _context.prev = 5;\n _context.next = 8;\n return regeneratorRuntime.awrap(Promise.all(promises));\n\n case 8:\n _context.next = 15;\n break;\n\n case 10:\n _context.prev = 10;\n _context.t0 = _context[\"catch\"](5);\n this.$loading.fail();\n Object(utils[\"i\" /* globalHandleError */])(_context.t0);\n this.error(_context.t0);\n\n case 15:\n this.$loading.finish();\n\n case 16:\n case \"end\":\n return _context.stop();\n }\n }\n }, null, this, [[5, 10]]);\n },\n errorChanged: function errorChanged() {\n if (this.nuxt.err && this.$loading) {\n if (this.$loading.fail) {\n this.$loading.fail();\n }\n\n if (this.$loading.finish) {\n this.$loading.finish();\n }\n }\n },\n setLayout: function setLayout(layout) {\n if (!layout || !layouts['_' + layout]) {\n layout = 'default';\n }\n\n this.layoutName = layout;\n this.layout = layouts['_' + layout];\n return this.layout;\n },\n loadLayout: function loadLayout(layout) {\n if (!layout || !layouts['_' + layout]) {\n layout = 'default';\n }\n\n return Promise.resolve(layouts['_' + layout]);\n }\n },\n components: {\n NuxtLoading: nuxt_loading\n }\n});\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es7.symbol.async-iterator.js\nvar es7_symbol_async_iterator = __webpack_require__(47);\n\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es7.array.includes.js\nvar es7_array_includes = __webpack_require__(45);\n\n// EXTERNAL MODULE: ./node_modules/core-js/modules/es6.regexp.split.js\nvar es6_regexp_split = __webpack_require__(46);\n\n// EXTERNAL MODULE: ./node_modules/vuex/dist/vuex.esm.js\nvar vuex_esm = __webpack_require__(91);\n\n// CONCATENATED MODULE: ./.nuxt/store.js\n\n\n\n\n\n\n\n\nvue_runtime_esm[\"a\" /* default */].use(vuex_esm[\"a\" /* default */]);\nvar VUEX_PROPERTIES = ['state', 'getters', 'actions', 'mutations'];\nvar store_store = {};\n\n(function updateModules() {\n store_store = normalizeRoot(__webpack_require__(178), 'store/index.js'); // If store is an exported method = classic mode (deprecated)\n // Enforce store modules\n\n store_store.modules = store_store.modules || {};\n resolveStoreModules(__webpack_require__(179), 'docs.js'); // If the environment supports hot reloading...\n})(); // createStore\n\n\nvar createStore = store_store instanceof Function ? store_store : function () {\n return new vuex_esm[\"a\" /* default */].Store(Object.assign({\n strict: \"production\" !== 'production'\n }, store_store));\n};\n\nfunction normalizeRoot(moduleData, filePath) {\n moduleData = moduleData.default || moduleData;\n\n if (moduleData.commit) {\n throw new Error(\"[nuxt] \".concat(filePath, \" should export a method that returns a Vuex instance.\"));\n }\n\n if (typeof moduleData !== 'function') {\n // Avoid TypeError: setting a property that has only a getter when overwriting top level keys\n moduleData = Object.assign({}, moduleData);\n }\n\n return normalizeModule(moduleData, filePath);\n}\n\nfunction normalizeModule(moduleData, filePath) {\n if (moduleData.state && typeof moduleData.state !== 'function') {\n console.warn(\"'state' should be a method that returns an object in \".concat(filePath));\n\n var _state = Object.assign({}, moduleData.state); // Avoid TypeError: setting a property that has only a getter when overwriting top level keys\n\n\n moduleData = Object.assign({}, moduleData, {\n state: function state() {\n return _state;\n }\n });\n }\n\n return moduleData;\n}\n\nfunction resolveStoreModules(moduleData, filename) {\n moduleData = moduleData.default || moduleData; // Remove store src + extension (./foo/index.js -> foo/index)\n\n var namespace = filename.replace(/\\.(js|mjs)$/, '');\n var namespaces = namespace.split('/');\n var moduleName = namespaces[namespaces.length - 1];\n var filePath = \"store/\".concat(filename);\n moduleData = moduleName === 'state' ? normalizeState(moduleData, filePath) : normalizeModule(moduleData, filePath); // If src is a known Vuex property\n\n if (VUEX_PROPERTIES.includes(moduleName)) {\n var property = moduleName;\n\n var _storeModule = getStoreModule(store_store, namespaces, {\n isProperty: true\n }); // Replace state since it's a function\n\n\n mergeProperty(_storeModule, moduleData, property);\n return;\n } // If file is foo/index.js, it should be saved as foo\n\n\n var isIndexModule = moduleName === 'index';\n\n if (isIndexModule) {\n namespaces.pop();\n moduleName = namespaces[namespaces.length - 1];\n }\n\n var storeModule = getStoreModule(store_store, namespaces);\n var _iteratorNormalCompletion = true;\n var _didIteratorError = false;\n var _iteratorError = undefined;\n\n try {\n for (var _iterator = VUEX_PROPERTIES[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n var _property = _step.value;\n mergeProperty(storeModule, moduleData[_property], _property);\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion && _iterator.return != null) {\n _iterator.return();\n }\n } finally {\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n\n if (moduleData.namespaced === false) {\n delete storeModule.namespaced;\n }\n}\n\nfunction normalizeState(moduleData, filePath) {\n if (typeof moduleData !== 'function') {\n console.warn(\"\".concat(filePath, \" should export a method that returns an object\"));\n var state = Object.assign({}, moduleData);\n return function () {\n return state;\n };\n }\n\n return normalizeModule(moduleData, filePath);\n}\n\nfunction getStoreModule(storeModule, namespaces) {\n var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},\n _ref$isProperty = _ref.isProperty,\n isProperty = _ref$isProperty === void 0 ? false : _ref$isProperty;\n\n // If ./mutations.js\n if (!namespaces.length || isProperty && namespaces.length === 1) {\n return storeModule;\n }\n\n var namespace = namespaces.shift();\n storeModule.modules[namespace] = storeModule.modules[namespace] || {};\n storeModule.modules[namespace].namespaced = true;\n storeModule.modules[namespace].modules = storeModule.modules[namespace].modules || {};\n return getStoreModule(storeModule.modules[namespace], namespaces, {\n isProperty: isProperty\n });\n}\n\nfunction mergeProperty(storeModule, moduleData, property) {\n if (!moduleData) {\n return;\n }\n\n if (property === 'state') {\n storeModule.state = moduleData || storeModule.state;\n } else {\n storeModule[property] = Object.assign({}, storeModule[property], moduleData);\n }\n}\n// EXTERNAL MODULE: ./node_modules/vuetify/lib/framework.js + 21 modules\nvar framework = __webpack_require__(212);\n\n// CONCATENATED MODULE: ./.nuxt/vuetify/options.js\n/* harmony default export */ var vuetify_options = ({\n \"theme\": {\n \"dark\": false,\n \"themes\": {\n \"light\": {\n \"primary\": \"#51DDBD\",\n \"secondary\": \"#2D4ADE\",\n \"accent\": \"#FA7D2B\"\n }\n }\n }\n});\n// CONCATENATED MODULE: ./.nuxt/vuetify/plugin.js\n\n\n\nvue_runtime_esm[\"a\" /* default */].use(framework[\"a\" /* default */], {});\n/* harmony default export */ var vuetify_plugin = (function (ctx) {\n var vuetifyOptions = typeof vuetify_options === 'function' ? vuetify_options(ctx) : vuetify_options;\n vuetifyOptions.icons = vuetifyOptions.icons || {};\n vuetifyOptions.icons.iconfont = 'mdi';\n var vuetify = new framework[\"a\" /* default */](vuetifyOptions);\n ctx.app.vuetify = vuetify;\n ctx.$vuetify = vuetify.framework;\n});\n// EXTERNAL MODULE: ./node_modules/axios/index.js\nvar node_modules_axios = __webpack_require__(57);\nvar axios_default = /*#__PURE__*/__webpack_require__.n(node_modules_axios);\n\n// EXTERNAL MODULE: ./node_modules/defu/lib/index.js\nvar lib = __webpack_require__(133);\nvar lib_default = /*#__PURE__*/__webpack_require__.n(lib);\n\n// CONCATENATED MODULE: ./.nuxt/axios.js\n\n\n\n\n\n // Axios.prototype cannot be modified\n\nvar axiosExtra = {\n setBaseURL: function setBaseURL(baseURL) {\n this.defaults.baseURL = baseURL;\n },\n setHeader: function setHeader(name, value) {\n var scopes = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'common';\n var _iteratorNormalCompletion = true;\n var _didIteratorError = false;\n var _iteratorError = undefined;\n\n try {\n for (var _iterator = (Array.isArray(scopes) ? scopes : [scopes])[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n var scope = _step.value;\n\n if (!value) {\n delete this.defaults.headers[scope][name];\n return;\n }\n\n this.defaults.headers[scope][name] = value;\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion && _iterator.return != null) {\n _iterator.return();\n }\n } finally {\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n },\n setToken: function setToken(token, type) {\n var scopes = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'common';\n var value = !token ? null : (type ? type + ' ' : '') + token;\n this.setHeader('Authorization', value, scopes);\n },\n onRequest: function onRequest(fn) {\n this.interceptors.request.use(function (config) {\n return fn(config) || config;\n });\n },\n onResponse: function onResponse(fn) {\n this.interceptors.response.use(function (response) {\n return fn(response) || response;\n });\n },\n onRequestError: function onRequestError(fn) {\n this.interceptors.request.use(undefined, function (error) {\n return fn(error) || Promise.reject(error);\n });\n },\n onResponseError: function onResponseError(fn) {\n this.interceptors.response.use(undefined, function (error) {\n return fn(error) || Promise.reject(error);\n });\n },\n onError: function onError(fn) {\n this.onRequestError(fn);\n this.onResponseError(fn);\n },\n create: function create(options) {\n return axios_createAxiosInstance(lib_default()(options, this.defaults));\n }\n}; // Request helpers ($get, $post, ...)\n\nvar _loop = function _loop() {\n var method = _arr[_i];\n\n axiosExtra['$' + method] = function () {\n return this[method].apply(this, arguments).then(function (res) {\n return res && res.data;\n });\n };\n};\n\nfor (var _i = 0, _arr = ['request', 'delete', 'get', 'head', 'options', 'post', 'put', 'patch']; _i < _arr.length; _i++) {\n _loop();\n}\n\nvar extendAxiosInstance = function extendAxiosInstance(axios) {\n for (var key in axiosExtra) {\n axios[key] = axiosExtra[key].bind(axios);\n }\n};\n\nvar axios_createAxiosInstance = function createAxiosInstance(axiosOptions) {\n // Create new axios instance\n var axios = axios_default.a.create(axiosOptions);\n axios.CancelToken = axios_default.a.CancelToken;\n axios.isCancel = axios_default.a.isCancel; // Extend axios proto\n\n extendAxiosInstance(axios); // Setup interceptors\n\n axios_setupProgress(axios);\n return axios;\n};\n\nvar axios_setupProgress = function setupProgress(axios) {\n if (false) {} // A noop loading inteterface for when $nuxt is not yet ready\n\n\n var noopLoading = {\n finish: function finish() {},\n start: function start() {},\n fail: function fail() {},\n set: function set() {}\n };\n\n var $loading = function $loading() {\n return window.$nuxt && window.$nuxt.$loading && window.$nuxt.$loading.set ? window.$nuxt.$loading : noopLoading;\n };\n\n var currentRequests = 0;\n axios.onRequest(function (config) {\n if (config && config.progress === false) {\n return;\n }\n\n currentRequests++;\n });\n axios.onResponse(function (response) {\n if (response && response.config && response.config.progress === false) {\n return;\n }\n\n currentRequests--;\n\n if (currentRequests <= 0) {\n currentRequests = 0;\n $loading().finish();\n }\n });\n axios.onError(function (error) {\n if (error && error.config && error.config.progress === false) {\n return;\n }\n\n currentRequests--;\n\n if (axios_default.a.isCancel(error)) {\n return;\n }\n\n $loading().fail();\n $loading().finish();\n });\n\n var onProgress = function onProgress(e) {\n if (!currentRequests) {\n return;\n }\n\n var progress = e.loaded * 100 / (e.total * currentRequests);\n $loading().set(Math.min(100, progress));\n };\n\n axios.defaults.onUploadProgress = onProgress;\n axios.defaults.onDownloadProgress = onProgress;\n};\n\n/* harmony default export */ var _nuxt_axios = (function (ctx, inject) {\n // baseURL\n var baseURL = true ? 'http://localhost:3000/' : undefined; // Create fresh objects for all default header scopes\n // Axios creates only one which is shared across SSR requests!\n // https://github.com/mzabriskie/axios/blob/master/lib/defaults.js\n\n var headers = {\n \"common\": {\n \"Accept\": \"application/json, text/plain, */*\"\n },\n \"delete\": {},\n \"get\": {},\n \"head\": {},\n \"post\": {},\n \"put\": {},\n \"patch\": {}\n };\n var axiosOptions = {\n baseURL: baseURL,\n headers: headers\n }; // Proxy SSR request headers headers\n\n axiosOptions.headers.common = ctx.req && ctx.req.headers ? Object.assign({}, ctx.req.headers) : {};\n delete axiosOptions.headers.common['accept'];\n delete axiosOptions.headers.common['host'];\n delete axiosOptions.headers.common['cf-ray'];\n delete axiosOptions.headers.common['cf-connecting-ip'];\n delete axiosOptions.headers.common['content-length'];\n delete axiosOptions.headers.common['content-md5'];\n delete axiosOptions.headers.common['content-type'];\n\n if (false) {}\n\n var axios = axios_createAxiosInstance(axiosOptions); // Inject axios to the context as $axios\n\n ctx.$axios = axios;\n inject('axios', axios);\n});\n// CONCATENATED MODULE: ./.nuxt/index.js\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return createApp; });\n/* concated harmony reexport NuxtError */__webpack_require__.d(__webpack_exports__, \"a\", function() { return layouts_error; });\n\n\n\n\n\n\n\n\n\nfunction 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; }\n\nfunction _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) { Object(defineProperty[\"a\" /* 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; }\n\n\n\n\n\n\n\n\n\n\n\n\n/* Plugins */\n\n // Source: ./vuetify/plugin.js (mode: 'all')\n\n // Source: ./axios.js (mode: 'all')\n// Component: \n\nvue_runtime_esm[\"a\" /* default */].component(vue_client_only_common_default.a.name, vue_client_only_common_default.a); // TODO: Remove in Nuxt 3: \n\nvue_runtime_esm[\"a\" /* default */].component(vue_no_ssr_common_default.a.name, _objectSpread({}, vue_no_ssr_common_default.a, {\n render: function render(h, ctx) {\n if ( true && !vue_no_ssr_common_default.a._warned) {\n vue_no_ssr_common_default.a._warned = true;\n console.warn(' has been deprecated and will be removed in Nuxt 3, please use instead');\n }\n\n return vue_no_ssr_common_default.a.render(h, ctx);\n }\n})); // Component: \n\nvue_runtime_esm[\"a\" /* default */].component(nuxt_child.name, nuxt_child);\nvue_runtime_esm[\"a\" /* default */].component('NChild', nuxt_child); // Component NuxtLink is imported in server.js or client.js\n// Component: \n\nvue_runtime_esm[\"a\" /* default */].component(components_nuxt.name, components_nuxt);\nvue_runtime_esm[\"a\" /* default */].use(vue_meta_esm_browser[\"a\" /* default */], {\n \"keyName\": \"head\",\n \"attribute\": \"data-n-head\",\n \"ssrAttribute\": \"data-n-head-ssr\",\n \"tagIDKeyName\": \"hid\"\n});\nvar defaultTransition = {\n \"name\": \"page\",\n \"mode\": \"out-in\",\n \"appear\": true,\n \"appearClass\": \"appear\",\n \"appearActiveClass\": \"appear-active\",\n \"appearToClass\": \"appear-to\"\n};\n\nfunction createApp(ssrContext) {\n var router, store, app, next, route, path, inject;\n return regeneratorRuntime.async(function createApp$(_context2) {\n while (1) {\n switch (_context2.prev = _context2.next) {\n case 0:\n _context2.next = 2;\n return regeneratorRuntime.awrap(createRouter(ssrContext));\n\n case 2:\n router = _context2.sent;\n store = createStore(ssrContext); // Add this.$router into store actions/mutations\n\n store.$router = router; // Create Root instance\n // here we inject the router and store to all child components,\n // making them available everywhere as `this.$router` and `this.$store`.\n\n app = _objectSpread({\n store: store,\n router: router,\n nuxt: {\n defaultTransition: defaultTransition,\n transitions: [defaultTransition],\n setTransitions: function setTransitions(transitions) {\n if (!Array.isArray(transitions)) {\n transitions = [transitions];\n }\n\n transitions = transitions.map(function (transition) {\n if (!transition) {\n transition = defaultTransition;\n } else if (typeof transition === 'string') {\n transition = Object.assign({}, defaultTransition, {\n name: transition\n });\n } else {\n transition = Object.assign({}, defaultTransition, transition);\n }\n\n return transition;\n });\n this.$options.nuxt.transitions = transitions;\n return transitions;\n },\n err: null,\n dateErr: null,\n error: function error(err) {\n err = err || null;\n app.context._errored = Boolean(err);\n err = err ? Object(utils[\"l\" /* normalizeError */])(err) : null;\n var nuxt = this.nuxt || this.$options.nuxt;\n nuxt.dateErr = Date.now();\n nuxt.err = err; // Used in src/server.js\n\n if (ssrContext) {\n ssrContext.nuxt.error = err;\n }\n\n return err;\n }\n }\n }, App); // Make app available into store via this.app\n\n store.app = app;\n next = ssrContext ? ssrContext.next : function (location) {\n return app.router.push(location);\n }; // Resolve route\n\n if (ssrContext) {\n route = router.resolve(ssrContext.url).route;\n } else {\n path = Object(utils[\"d\" /* getLocation */])(router.options.base, router.options.mode);\n route = router.resolve(path).route;\n } // Set context to app.context\n\n\n _context2.next = 11;\n return regeneratorRuntime.awrap(Object(utils[\"p\" /* setContext */])(app, {\n store: store,\n route: route,\n next: next,\n error: app.nuxt.error.bind(app),\n payload: ssrContext ? ssrContext.payload : undefined,\n req: ssrContext ? ssrContext.req : undefined,\n res: ssrContext ? ssrContext.res : undefined,\n beforeRenderFns: ssrContext ? ssrContext.beforeRenderFns : undefined,\n ssrContext: ssrContext\n }));\n\n case 11:\n inject = function inject(key, value) {\n if (!key) {\n throw new Error('inject(key, value) has no key provided');\n }\n\n if (value === undefined) {\n throw new Error('inject(key, value) has no value provided');\n }\n\n key = '$' + key; // Add into app\n\n app[key] = value; // Add into store\n\n store[key] = app[key]; // Check if plugin not already installed\n\n var installKey = '__nuxt_' + key + '_installed__';\n\n if (vue_runtime_esm[\"a\" /* default */][installKey]) {\n return;\n }\n\n vue_runtime_esm[\"a\" /* default */][installKey] = true; // Call Vue.use() to install the plugin into vm\n\n vue_runtime_esm[\"a\" /* default */].use(function () {\n if (!Object.prototype.hasOwnProperty.call(vue_runtime_esm[\"a\" /* default */], key)) {\n Object.defineProperty(vue_runtime_esm[\"a\" /* default */].prototype, key, {\n get: function get() {\n return this.$root.$options[key];\n }\n });\n }\n });\n };\n\n if (true) {\n // Replace store state before plugins execution\n if (window.__NUXT__ && window.__NUXT__.state) {\n store.replaceState(window.__NUXT__.state);\n }\n } // Plugin execution\n\n\n if (!(typeof vuetify_plugin === 'function')) {\n _context2.next = 16;\n break;\n }\n\n _context2.next = 16;\n return regeneratorRuntime.awrap(vuetify_plugin(app.context, inject));\n\n case 16:\n if (!(typeof _nuxt_axios === 'function')) {\n _context2.next = 19;\n break;\n }\n\n _context2.next = 19;\n return regeneratorRuntime.awrap(_nuxt_axios(app.context, inject));\n\n case 19:\n if (true) {\n _context2.next = 22;\n break;\n }\n\n _context2.next = 22;\n return regeneratorRuntime.awrap(new Promise(function (resolve, reject) {\n router.push(ssrContext.url, resolve, function () {\n // navigated to a different route in router guard\n var unregister = router.afterEach(function _callee(to, from, next) {\n return regeneratorRuntime.async(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n ssrContext.url = to.fullPath;\n _context.next = 3;\n return regeneratorRuntime.awrap(Object(utils[\"h\" /* getRouteData */])(to));\n\n case 3:\n app.context.route = _context.sent;\n app.context.params = to.params || {};\n app.context.query = to.query || {};\n unregister();\n resolve();\n\n case 8:\n case \"end\":\n return _context.stop();\n }\n }\n });\n });\n });\n }));\n\n case 22:\n return _context2.abrupt(\"return\", {\n store: store,\n app: app,\n router: router\n });\n\n case 23:\n case \"end\":\n return _context2.stop();\n }\n }\n });\n}\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi8ubnV4dC9yb3V0ZXIuc2Nyb2xsQmVoYXZpb3IuanM/NTVjNCIsIndlYnBhY2s6Ly8vLi8ubnV4dC9yb3V0ZXIuanM/NTc4MyIsIndlYnBhY2s6Ly8vLi8ubnV4dC9jb21wb25lbnRzL251eHQtY2hpbGQuanM/MjQ1MiIsIndlYnBhY2s6Ly8vLi9sYXlvdXRzL2Vycm9yLnZ1ZT8xZmJiIiwid2VicGFjazovLy9sYXlvdXRzL2Vycm9yLnZ1ZT82NzZkIiwid2VicGFjazovLy8uL2xheW91dHMvZXJyb3IudnVlP2UyMGQiLCJ3ZWJwYWNrOi8vLy4vbGF5b3V0cy9lcnJvci52dWU/YzRiMyIsIndlYnBhY2s6Ly8vLi8ubnV4dC9jb21wb25lbnRzL251eHQuanM/Yjg5YiIsIndlYnBhY2s6Ly8vLm51eHQvY29tcG9uZW50cy9udXh0LWxvYWRpbmcudnVlP2ZlOGYiLCJ3ZWJwYWNrOi8vLy4vLm51eHQvY29tcG9uZW50cy9udXh0LWxvYWRpbmcudnVlPzVhNDciLCJ3ZWJwYWNrOi8vLy4vLm51eHQvY29tcG9uZW50cy9udXh0LWxvYWRpbmcudnVlPzNhN2MiLCJ3ZWJwYWNrOi8vLy4vbGF5b3V0cy9kZWZhdWx0LnZ1ZT9kZTcyIiwid2VicGFjazovLy8uL2xheW91dHMvZGVmYXVsdC52dWU/ZWJhMCIsIndlYnBhY2s6Ly8vLi8ubnV4dC9BcHAuanM/ZWZlNyIsIndlYnBhY2s6Ly8vLi8ubnV4dC9zdG9yZS5qcz82YzZiIiwid2VicGFjazovLy8uLy5udXh0L3Z1ZXRpZnkvb3B0aW9ucy5qcz83ZTI3Iiwid2VicGFjazovLy8uLy5udXh0L3Z1ZXRpZnkvcGx1Z2luLmpzP2M4YmMiLCJ3ZWJwYWNrOi8vLy4vLm51eHQvYXhpb3MuanM/MTBlOCIsIndlYnBhY2s6Ly8vLi8ubnV4dC9pbmRleC5qcz9mMjZlIl0sIm5hbWVzIjpbInByb2Nlc3MiLCJ3aW5kb3ciLCJoaXN0b3J5Iiwic2Nyb2xsUmVzdG9yYXRpb24iLCJhZGRFdmVudExpc3RlbmVyIiwidG8iLCJmcm9tIiwic2F2ZWRQb3NpdGlvbiIsInBvc2l0aW9uIiwiUGFnZXMiLCJnZXRNYXRjaGVkQ29tcG9uZW50cyIsImxlbmd0aCIsImV2ZXJ5IiwiUGFnZSIsIm9wdGlvbnMiLCJzY3JvbGxUb1RvcCIsIngiLCJ5Iiwic29tZSIsIm51eHQiLCIkbnV4dCIsInBhdGgiLCJoYXNoIiwiJG5leHRUaWNrIiwiJGVtaXQiLCJQcm9taXNlIiwicmVzb2x2ZSIsIiRvbmNlIiwiQ1NTIiwiZXNjYXBlIiwic3Vic3RyIiwiZG9jdW1lbnQiLCJxdWVyeVNlbGVjdG9yIiwic2VsZWN0b3IiLCJlIiwiY29uc29sZSIsIndhcm4iLCJfMDQ5MjdhMGUiLCJpbnRlcm9wRGVmYXVsdCIsIl9iMDA1MjQzZSIsIl8wN2ZmYmM5ZSIsIl82NGM2NmRiMiIsImVtcHR5Rm4iLCJvcmlnaW5hbFB1c2giLCJSb3V0ZXIiLCJwcm90b3R5cGUiLCJwdXNoIiwibG9jYXRpb24iLCJvbkNvbXBsZXRlIiwib25BYm9ydCIsImNhbGwiLCJWdWUiLCJ1c2UiLCJyb3V0ZXJPcHRpb25zIiwibW9kZSIsImJhc2UiLCJkZWNvZGVVUkkiLCJsaW5rQWN0aXZlQ2xhc3MiLCJsaW5rRXhhY3RBY3RpdmVDbGFzcyIsInNjcm9sbEJlaGF2aW9yIiwicm91dGVzIiwiY29tcG9uZW50IiwibmFtZSIsImZhbGxiYWNrIiwiY3JlYXRlUm91dGVyIiwiZnVuY3Rpb25hbCIsInByb3BzIiwibnV4dENoaWxkS2V5IiwidHlwZSIsIlN0cmluZyIsImRlZmF1bHQiLCJrZWVwQWxpdmUiLCJCb29sZWFuIiwia2VlcEFsaXZlUHJvcHMiLCJPYmplY3QiLCJ1bmRlZmluZWQiLCJyZW5kZXIiLCJoIiwicGFyZW50IiwiZGF0YSIsIm51eHRDaGlsZCIsIl9wYXJlbnQiLCJ0cmFuc2l0aW9ucyIsImRlZmF1bHRUcmFuc2l0aW9uIiwiZGVwdGgiLCIkdm5vZGUiLCIkcGFyZW50IiwibnV4dENoaWxkRGVwdGgiLCJ0cmFuc2l0aW9uIiwidHJhbnNpdGlvblByb3BzIiwidHJhbnNpdGlvbnNLZXlzIiwiZm9yRWFjaCIsImtleSIsImxpc3RlbmVycyIsImxpc3RlbmVyc0tleXMiLCJiaW5kIiwiYmVmb3JlRW50ZXIiLCJlbCIsImNzcyIsImxlYXZlIiwiZG9uZSIsInJvdXRlclZpZXciLCJvbiIsImNvbXBvbmVudHMiLCJOdXh0Q2hpbGQiLCJOdXh0RXJyb3IiLCJlcnJvckNhcHR1cmVkIiwiZXJyb3IiLCJkaXNwbGF5aW5nTnV4dEVycm9yIiwiZXJyb3JGcm9tTnV4dEVycm9yIiwiJGZvcmNlVXBkYXRlIiwiY29tcHV0ZWQiLCJyb3V0ZXJWaWV3S2V5IiwiJHJvdXRlIiwibWF0Y2hlZCIsImNvbXBpbGUiLCJwYXJhbXMiLCJtYXRjaGVkUm91dGUiLCJDb21wb25lbnQiLCJzdHJpY3QiLCJ0ZXN0IiwicmVwbGFjZSIsImJlZm9yZUNyZWF0ZSIsInV0aWwiLCJkZWZpbmVSZWFjdGl2ZSIsIiRyb290IiwiJG9wdGlvbnMiLCJlcnIiLCIkcHJvcHMiLCJ0b1N0cmluZyIsImxheW91dHMiLCJfNmY2YzA5OGIiLCJoZWFkIiwibG9hZGluZ0VsIiwicmVmIiwiZXJyb3JMYXlvdXQiLCJsYXlvdXQiLCJzZXRMYXlvdXQiLCJjb250ZXh0IiwibGF5b3V0RWwiLCJ0ZW1wbGF0ZUVsIiwiZG9tUHJvcHMiLCJpZCIsImxheW91dE5hbWUiLCJ0cmFuc2l0aW9uRWwiLCJpc09ubGluZSIsImNyZWF0ZWQiLCJyZWZyZXNoT25saW5lU3RhdHVzIiwibW91bnRlZCIsIiRsb2FkaW5nIiwiJHJlZnMiLCJsb2FkaW5nIiwid2F0Y2giLCJpc09mZmxpbmUiLCJtZXRob2RzIiwibmF2aWdhdG9yIiwib25MaW5lIiwicmVmcmVzaCIsInBhZ2VzIiwiZ2V0TWF0Y2hlZENvbXBvbmVudHNJbnN0YW5jZXMiLCJzdGFydCIsInByb21pc2VzIiwibWFwIiwicGFnZSIsInAiLCJmZXRjaCIsInByb21pc2lmeSIsImFzeW5jRGF0YSIsInRoZW4iLCJuZXdEYXRhIiwic2V0IiwiJGRhdGEiLCJhbGwiLCJmYWlsIiwiZ2xvYmFsSGFuZGxlRXJyb3IiLCJmaW5pc2giLCJlcnJvckNoYW5nZWQiLCJsb2FkTGF5b3V0IiwiTnV4dExvYWRpbmciLCJWdWV4IiwiVlVFWF9QUk9QRVJUSUVTIiwic3RvcmUiLCJ1cGRhdGVNb2R1bGVzIiwibm9ybWFsaXplUm9vdCIsInJlcXVpcmUiLCJtb2R1bGVzIiwicmVzb2x2ZVN0b3JlTW9kdWxlcyIsImNyZWF0ZVN0b3JlIiwiRnVuY3Rpb24iLCJTdG9yZSIsImFzc2lnbiIsIm1vZHVsZURhdGEiLCJmaWxlUGF0aCIsImNvbW1pdCIsIkVycm9yIiwibm9ybWFsaXplTW9kdWxlIiwic3RhdGUiLCJmaWxlbmFtZSIsIm5hbWVzcGFjZSIsIm5hbWVzcGFjZXMiLCJzcGxpdCIsIm1vZHVsZU5hbWUiLCJub3JtYWxpemVTdGF0ZSIsImluY2x1ZGVzIiwicHJvcGVydHkiLCJzdG9yZU1vZHVsZSIsImdldFN0b3JlTW9kdWxlIiwiaXNQcm9wZXJ0eSIsIm1lcmdlUHJvcGVydHkiLCJpc0luZGV4TW9kdWxlIiwicG9wIiwibmFtZXNwYWNlZCIsInNoaWZ0IiwiVnVldGlmeSIsImN0eCIsInZ1ZXRpZnlPcHRpb25zIiwiaWNvbnMiLCJpY29uZm9udCIsInZ1ZXRpZnkiLCJhcHAiLCIkdnVldGlmeSIsImZyYW1ld29yayIsImF4aW9zRXh0cmEiLCJzZXRCYXNlVVJMIiwiYmFzZVVSTCIsImRlZmF1bHRzIiwic2V0SGVhZGVyIiwidmFsdWUiLCJzY29wZXMiLCJBcnJheSIsImlzQXJyYXkiLCJzY29wZSIsImhlYWRlcnMiLCJzZXRUb2tlbiIsInRva2VuIiwib25SZXF1ZXN0IiwiZm4iLCJpbnRlcmNlcHRvcnMiLCJyZXF1ZXN0IiwiY29uZmlnIiwib25SZXNwb25zZSIsInJlc3BvbnNlIiwib25SZXF1ZXN0RXJyb3IiLCJyZWplY3QiLCJvblJlc3BvbnNlRXJyb3IiLCJvbkVycm9yIiwiY3JlYXRlIiwiY3JlYXRlQXhpb3NJbnN0YW5jZSIsImRlZnUiLCJtZXRob2QiLCJhcHBseSIsImFyZ3VtZW50cyIsInJlcyIsImV4dGVuZEF4aW9zSW5zdGFuY2UiLCJheGlvcyIsImF4aW9zT3B0aW9ucyIsIkF4aW9zIiwiQ2FuY2VsVG9rZW4iLCJpc0NhbmNlbCIsInNldHVwUHJvZ3Jlc3MiLCJub29wTG9hZGluZyIsImN1cnJlbnRSZXF1ZXN0cyIsInByb2dyZXNzIiwib25Qcm9ncmVzcyIsImxvYWRlZCIsInRvdGFsIiwiTWF0aCIsIm1pbiIsIm9uVXBsb2FkUHJvZ3Jlc3MiLCJvbkRvd25sb2FkUHJvZ3Jlc3MiLCJpbmplY3QiLCJjb21tb24iLCJyZXEiLCIkYXhpb3MiLCJDbGllbnRPbmx5IiwiTm9Tc3IiLCJfd2FybmVkIiwiTnV4dCIsIk1ldGEiLCJjcmVhdGVBcHAiLCJzc3JDb250ZXh0Iiwicm91dGVyIiwiJHJvdXRlciIsInNldFRyYW5zaXRpb25zIiwiZGF0ZUVyciIsIl9lcnJvcmVkIiwibm9ybWFsaXplRXJyb3IiLCJEYXRlIiwibm93IiwiQXBwIiwibmV4dCIsInJvdXRlIiwidXJsIiwiZ2V0TG9jYXRpb24iLCJzZXRDb250ZXh0IiwicGF5bG9hZCIsImJlZm9yZVJlbmRlckZucyIsImluc3RhbGxLZXkiLCJoYXNPd25Qcm9wZXJ0eSIsImRlZmluZVByb3BlcnR5IiwiZ2V0IiwiX19OVVhUX18iLCJyZXBsYWNlU3RhdGUiLCJudXh0X3BsdWdpbl9wbHVnaW5fODczYjkyZTYiLCJudXh0X3BsdWdpbl9heGlvc180MGEwZjk5NyIsInVucmVnaXN0ZXIiLCJhZnRlckVhY2giLCJmdWxsUGF0aCIsImdldFJvdXRlRGF0YSIsInF1ZXJ5Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztBQUVBLElBQUlBLElBQUosRUFBb0I7QUFDbEIsTUFBSSx1QkFBdUJDLE1BQU0sQ0FBQ0MsT0FBbEMsRUFBMkM7QUFDekNELFVBQU0sQ0FBQ0MsT0FBUCxDQUFlQyxpQkFBZixHQUFtQyxRQUFuQyxDQUR5QyxDQUd6QztBQUNBO0FB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LEdBQVgsR0FBaUIvUixFQUFFLENBQUM4UyxRQUFwQjtBQURrQztBQUFBLHdEQUVSQyxxQ0FBWSxDQUFDL1MsRUFBRCxDQUZKOztBQUFBO0FBRWxDc04sMkJBQUcsQ0FBQ2pGLE9BQUosQ0FBWXlKLEtBRnNCO0FBR2xDeEUsMkJBQUcsQ0FBQ2pGLE9BQUosQ0FBWXRCLE1BQVosR0FBcUIvRyxFQUFFLENBQUMrRyxNQUFILElBQWEsRUFBbEM7QUFDQXVHLDJCQUFHLENBQUNqRixPQUFKLENBQVkySyxLQUFaLEdBQW9CaFQsRUFBRSxDQUFDZ1QsS0FBSCxJQUFZLEVBQWhDO0FBQ0FKLGtDQUFVO0FBQ1Z2UiwrQkFBTzs7QUFOMkI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsZUFBakIsQ0FBbkI7QUFRRCxhQVZEO0FBV0QsV0FaSyxDQXBJVjs7QUFBQTtBQUFBLDRDQW1KUztBQUNMMkosaUJBQUssRUFBTEEsS0FESztBQUVMc0MsZUFBRyxFQUFIQSxHQUZLO0FBR0w4RCxrQkFBTSxFQUFOQTtBQUhLLFdBbkpUOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBIiwiZmlsZSI6IjI3LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZ2V0TWF0Y2hlZENvbXBvbmVudHMgfSBmcm9tICcuL3V0aWxzJ1xuXG5pZiAocHJvY2Vzcy5jbGllbnQpIHtcbiAgaWYgKCdzY3JvbGxSZXN0b3JhdGlvbicgaW4gd2luZG93Lmhpc3RvcnkpIHtcbiAgICB3aW5kb3cuaGlzdG9yeS5zY3JvbGxSZXN0b3JhdGlvbiA9ICdtYW51YWwnXG5cbiAgICAvLyByZXNldCBzY3JvbGxSZXN0b3JhdGlvbiB0byBhdXRvIHdoZW4gbGVhdmluZyBwYWdlLCBhbGxvd2luZyBwYWdlIHJlbG9hZFxuICAgIC8vIGFuZCBiYWNrLW5hdmlnYXRpb24gZnJvbSBvdGhlciBwYWdlcyB0byB1c2UgdGhlIGJyb3dzZXIgdG8gcmVzdG9yZSB0aGVcbiAgICAvLyBzY3JvbGxpbmcgcG9zaXRpb24uXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2JlZm9yZXVubG9hZCcsICgpID0+IHtcbiAgICAgIHdpbmRvdy5oaXN0b3J5LnNjcm9sbFJlc3RvcmF0aW9uID0gJ2F1dG8nXG4gICAgfSlcblxuICAgIC8vIFNldHRpbmcgc2Nyb2xsUmVzdG9yYXRpb24gdG8gbWFudWFsIGFnYWluIHdoZW4gcmV0dXJuaW5nIHRvIHRoaXMgcGFnZS5cbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsICgpID0+IHtcbiAgICAgIHdpbmRvdy5oaXN0b3J5LnNjcm9sbFJlc3RvcmF0aW9uID0gJ21hbnVhbCdcbiAgICB9KVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uICh0bywgZnJvbSwgc2F2ZWRQb3NpdGlvbikge1xuICAvLyBpZiB0aGUgcmV0dXJuZWQgcG9zaXRpb24gaXMgZmFsc3kgb3IgYW4gZW1wdHkgb2JqZWN0LFxuICAvLyB3aWxsIHJldGFpbiBjdXJyZW50IHNjcm9sbCBwb3NpdGlvbi5cbiAgbGV0IHBvc2l0aW9uID0gZmFsc2VcblxuICAvLyBpZiBubyBjaGlsZHJlbiBkZXRlY3RlZCBhbmQgc2Nyb2xsVG9Ub3AgaXMgbm90IGV4cGxpY2l0bHkgZGlzYWJsZWRcbiAgY29uc3QgUGFnZXMgPSBnZXRNYXRjaGVkQ29tcG9uZW50cyh0bylcbiAgaWYgKFxuICAgIFBhZ2VzLmxlbmd0aCA8IDIgJiZcbiAgICBQYWdlcy5ldmVyeShQYWdlID0+IFBhZ2Uub3B0aW9ucy5zY3JvbGxUb1RvcCAhPT0gZmFsc2UpXG4gICkge1xuICAgIC8vIHNjcm9sbCB0byB0aGUgdG9wIG9mIHRoZSBwYWdlXG4gICAgcG9zaXRpb24gPSB7IHg6IDAsIHk6IDAgfVxuICB9IGVsc2UgaWYgKFBhZ2VzLnNvbWUoUGFnZSA9PiBQYWdlLm9wdGlvbnMuc2Nyb2xsVG9Ub3ApKSB7XG4gICAgLy8gaWYgb25lIG9mIHRoZSBjaGlsZHJlbiBoYXMgc2Nyb2xsVG9Ub3Agb3B0aW9uIHNldCB0byB0cnVlXG4gICAgcG9zaXRpb24gPSB7IHg6IDAsIHk6IDAgfVxuICB9XG5cbiAgLy8gc2F2ZWRQb3NpdGlvbiBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgcG9wc3RhdGUgbmF2aWdhdGlvbnMgKGJhY2sgYnV0dG9uKVxuICBpZiAoc2F2ZWRQb3NpdGlvbikge1xuICAgIHBvc2l0aW9uID0gc2F2ZWRQb3NpdGlvblxuICB9XG5cbiAgY29uc3QgbnV4dCA9IHdpbmRvdy4kbnV4dFxuXG4gIC8vIHRyaWdnZXJTY3JvbGwgaXMgb25seSBmaXJlZCB3aGVuIGEgbmV3IGNvbXBvbmVudCBpcyBsb2FkZWRcbiAgaWYgKHRvLnBhdGggPT09IGZyb20ucGF0aCAmJiB0by5oYXNoICE9PSBmcm9tLmhhc2gpIHtcbiAgICBudXh0LiRuZXh0VGljaygoKSA9PiBudXh0LiRlbWl0KCd0cmlnZ2VyU2Nyb2xsJykpXG4gIH1cblxuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAvLyB3YWl0IGZvciB0aGUgb3V0IHRyYW5zaXRpb24gdG8gY29tcGxldGUgKGlmIG5lY2Vzc2FyeSlcbiAgICBudXh0LiRvbmNlKCd0cmlnZ2VyU2Nyb2xsJywgKCkgPT4ge1xuICAgICAgLy8gY29vcmRzIHdpbGwgYmUgdXNlZCBpZiBubyBzZWxlY3RvciBpcyBwcm92aWRlZCxcbiAgICAgIC8vIG9yIGlmIHRoZSBzZWxlY3RvciBkaWRuJ3QgbWF0Y2ggYW55IGVsZW1lbnQuXG4gICAgICBpZiAodG8uaGFzaCkge1xuICAgICAgICBsZXQgaGFzaCA9IHRvLmhhc2hcbiAgICAgICAgLy8gQ1NTLmVzY2FwZSgpIGlzIG5vdCBzdXBwb3J0ZWQgd2l0aCBJRSBhbmQgRWRnZS5cbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cuQ1NTICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygd2luZG93LkNTUy5lc2NhcGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgaGFzaCA9ICcjJyArIHdpbmRvdy5DU1MuZXNjYXBlKGhhc2guc3Vic3RyKDEpKVxuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoaGFzaCkpIHtcbiAgICAgICAgICAgIC8vIHNjcm9sbCB0byBhbmNob3IgYnkgcmV0dXJuaW5nIHRoZSBzZWxlY3RvclxuICAgICAgICAgICAgcG9zaXRpb24gPSB7IHNlbGVjdG9yOiBoYXNoIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ0ZhaWxlZCB0byBzYXZlIHNjcm9sbCBwb3NpdGlvbi4gUGxlYXNlIGFkZCBDU1MuZXNjYXBlKCkgcG9seWZpbGwgKGh0dHBzOi8vZ2l0aHViLmNvbS9tYXRoaWFzYnluZW5zL0NTUy5lc2NhcGUpLicpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJlc29sdmUocG9zaXRpb24pXG4gICAgfSlcbiAgfSlcbn1cbiIsImltcG9ydCBWdWUgZnJvbSAndnVlJ1xuaW1wb3J0IFJvdXRlciBmcm9tICd2dWUtcm91dGVyJ1xuaW1wb3J0IHsgaW50ZXJvcERlZmF1bHQgfSBmcm9tICcuL3V0aWxzJ1xuaW1wb3J0IHNjcm9sbEJlaGF2aW9yIGZyb20gJy4vcm91dGVyLnNjcm9sbEJlaGF2aW9yLmpzJ1xuXG5jb25zdCBfMDQ5MjdhMGUgPSAoKSA9PiBpbnRlcm9wRGVmYXVsdChpbXBvcnQoJy4uL3BhZ2VzL2RvY3MvaW5kZXgudnVlJyAvKiB3ZWJwYWNrQ2h1bmtOYW1lOiBcInBhZ2VzL2RvY3MvaW5kZXhcIiAqLykpXG5jb25zdCBfYjAwNTI0M2UgPSAoKSA9PiBpbnRlcm9wRGVmYXVsdChpbXBvcnQoJy4uL3BhZ2VzL2RvY3MvbmFtZXNwYWNlcy52dWUnIC8qIHdlYnBhY2tDaHVua05hbWU6IFwicGFnZXMvZG9jcy9uYW1lc3BhY2VzXCIgKi8pKVxuY29uc3QgXzA3ZmZiYzllID0gKCkgPT4gaW50ZXJvcERlZmF1bHQoaW1wb3J0KCcuLi9wYWdlcy9kb2NzL19zbHVnLnZ1ZScgLyogd2VicGFja0NodW5rTmFtZTogXCJwYWdlcy9kb2NzL19zbHVnXCIgKi8pKVxuY29uc3QgXzY0YzY2ZGIyID0gKCkgPT4gaW50ZXJvcERlZmF1bHQoaW1wb3J0KCcuLi9wYWdlcy9pbmRleC52dWUnIC8qIHdlYnBhY2tDaHVua05hbWU6IFwicGFnZXMvaW5kZXhcIiAqLykpXG5cbi8vIFRPRE86IHJlbW92ZSBpbiBOdXh0IDNcbmNvbnN0IGVtcHR5Rm4gPSAoKSA9PiB7fVxuY29uc3Qgb3JpZ2luYWxQdXNoID0gUm91dGVyLnByb3RvdHlwZS5wdXNoXG5Sb3V0ZXIucHJvdG90eXBlLnB1c2ggPSBmdW5jdGlvbiBwdXNoIChsb2NhdGlvbiwgb25Db21wbGV0ZSA9IGVtcHR5Rm4sIG9uQWJvcnQpIHtcbiAgcmV0dXJuIG9yaWdpbmFsUHVzaC5jYWxsKHRoaXMsIGxvY2F0aW9uLCBvbkNvbXBsZXRlLCBvbkFib3J0KVxufVxuXG5WdWUudXNlKFJvdXRlcilcblxuZXhwb3J0IGNvbnN0IHJvdXRlck9wdGlvbnMgPSB7XG4gIG1vZGU6ICdoYXNoJyxcbiAgYmFzZTogZGVjb2RlVVJJKCcvJyksXG4gIGxpbmtBY3RpdmVDbGFzczogJ251eHQtbGluay1hY3RpdmUnLFxuICBsaW5rRXhhY3RBY3RpdmVDbGFzczogJ251eHQtbGluay1leGFjdC1hY3RpdmUnLFxuICBzY3JvbGxCZWhhdmlvcixcblxuICByb3V0ZXM6IFt7XG4gICAgcGF0aDogXCIvZG9jc1wiLFxuICAgIGNvbXBvbmVudDogXzA0OTI3YTBlLFxuICAgIG5hbWU6IFwiZG9jc1wiXG4gIH0sIHtcbiAgICBwYXRoOiBcIi9kb2NzL25hbWVzcGFjZXNcIixcbiAgICBjb21wb25lbnQ6IF9iMDA1MjQzZSxcbiAgICBuYW1lOiBcImRvY3MtbmFtZXNwYWNlc1wiXG4gIH0sIHtcbiAgICBwYXRoOiBcIi9kb2NzLzpzbHVnXCIsXG4gICAgY29tcG9uZW50OiBfMDdmZmJjOWUsXG4gICAgbmFtZTogXCJkb2NzLXNsdWdcIlxuICB9LCB7XG4gICAgcGF0aDogXCIvXCIsXG4gICAgY29tcG9uZW50OiBfNjRjNjZkYjIsXG4gICAgbmFtZTogXCJpbmRleFwiXG4gIH1dLFxuXG4gIGZhbGxiYWNrOiBmYWxzZVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUm91dGVyICgpIHtcbiAgcmV0dXJuIG5ldyBSb3V0ZXIocm91dGVyT3B0aW9ucylcbn1cbiIsIlxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAnTnV4dENoaWxkJyxcbiAgZnVuY3Rpb25hbDogdHJ1ZSxcbiAgcHJvcHM6IHtcbiAgICBudXh0Q2hpbGRLZXk6IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGRlZmF1bHQ6ICcnXG4gICAgfSxcbiAgICBrZWVwQWxpdmU6IEJvb2xlYW4sXG4gICAga2VlcEFsaXZlUHJvcHM6IHtcbiAgICAgIHR5cGU6IE9iamVjdCxcbiAgICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxuICAgIH1cbiAgfSxcbiAgcmVuZGVyIChoLCB7IHBhcmVudCwgZGF0YSwgcHJvcHMgfSkge1xuICAgIGRhdGEubnV4dENoaWxkID0gdHJ1ZVxuICAgIGNvbnN0IF9wYXJlbnQgPSBwYXJlbnRcbiAgICBjb25zdCB0cmFuc2l0aW9ucyA9IHBhcmVudC4kbnV4dC5udXh0LnRyYW5zaXRpb25zXG4gICAgY29uc3QgZGVmYXVsdFRyYW5zaXRpb24gPSBwYXJlbnQuJG51eHQubnV4dC5kZWZhdWx0VHJhbnNpdGlvblxuXG4gICAgbGV0IGRlcHRoID0gMFxuICAgIHdoaWxlIChwYXJlbnQpIHtcbiAgICAgIGlmIChwYXJlbnQuJHZub2RlICYmIHBhcmVudC4kdm5vZGUuZGF0YS5udXh0Q2hpbGQpIHtcbiAgICAgICAgZGVwdGgrK1xuICAgICAgfVxuICAgICAgcGFyZW50ID0gcGFyZW50LiRwYXJlbnRcbiAgICB9XG4gICAgZGF0YS5udXh0Q2hpbGREZXB0aCA9IGRlcHRoXG4gICAgY29uc3QgdHJhbnNpdGlvbiA9IHRyYW5zaXRpb25zW2RlcHRoXSB8fCBkZWZhdWx0VHJhbnNpdGlvblxuICAgIGNvbnN0IHRyYW5zaXRpb25Qcm9wcyA9IHt9XG4gICAgdHJhbnNpdGlvbnNLZXlzLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiB0cmFuc2l0aW9uW2tleV0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHRyYW5zaXRpb25Qcm9wc1trZXldID0gdHJhbnNpdGlvbltrZXldXG4gICAgICB9XG4gICAgfSlcblxuICAgIGNvbnN0IGxpc3RlbmVycyA9IHt9XG4gICAgbGlzdGVuZXJzS2V5cy5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIGlmICh0eXBlb2YgdHJhbnNpdGlvbltrZXldID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGxpc3RlbmVyc1trZXldID0gdHJhbnNpdGlvbltrZXldLmJpbmQoX3BhcmVudClcbiAgICAgIH1cbiAgICB9KVxuICAgIC8vIEFkZCB0cmlnZ2VyU2Nyb2xsIGV2ZW50IG9uIGJlZm9yZUVudGVyIChmaXggIzEzNzYpXG4gICAgY29uc3QgYmVmb3JlRW50ZXIgPSBsaXN0ZW5lcnMuYmVmb3JlRW50ZXJcbiAgICBsaXN0ZW5lcnMuYmVmb3JlRW50ZXIgPSAoZWwpID0+IHtcbiAgICAgIC8vIEVuc3VyZSB0byB0cmlnZ2VyIHNjcm9sbCBldmVudCBhZnRlciBjYWxsaW5nIHNjcm9sbEJlaGF2aW9yXG4gICAgICB3aW5kb3cuJG51eHQuJG5leHRUaWNrKCgpID0+IHtcbiAgICAgICAgd2luZG93LiRudXh0LiRlbWl0KCd0cmlnZ2VyU2Nyb2xsJylcbiAgICAgIH0pXG4gICAgICBpZiAoYmVmb3JlRW50ZXIpIHtcbiAgICAgICAgcmV0dXJuIGJlZm9yZUVudGVyLmNhbGwoX3BhcmVudCwgZWwpXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gbWFrZSBzdXJlIHRoYXQgbGVhdmUgaXMgY2FsbGVkIGFzeW5jaHJvbm91cyAoZml4ICM1NzAzKVxuICAgIGlmICh0cmFuc2l0aW9uLmNzcyA9PT0gZmFsc2UpIHtcbiAgICAgIGNvbnN0IGxlYXZlID0gbGlzdGVuZXJzLmxlYXZlXG5cbiAgICAgIC8vIG9ubHkgYWRkIGxlYXZlIGxpc3RlbmVyIHdoZW4gdXNlciBkaWRudCBwcm92aWRlIG9uZVxuICAgICAgLy8gb3Igd2hlbiBpdCBtaXNzZXMgdGhlIGRvbmUgYXJndW1lbnRcbiAgICAgIGlmICghbGVhdmUgfHwgbGVhdmUubGVuZ3RoIDwgMikge1xuICAgICAgICBsaXN0ZW5lcnMubGVhdmUgPSAoZWwsIGRvbmUpID0+IHtcbiAgICAgICAgICBpZiAobGVhdmUpIHtcbiAgICAgICAgICAgIGxlYXZlLmNhbGwoX3BhcmVudCwgZWwpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgX3BhcmVudC4kbmV4dFRpY2soZG9uZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGxldCByb3V0ZXJWaWV3ID0gaCgncm91dGVyVmlldycsIGRhdGEpXG5cbiAgICBpZiAocHJvcHMua2VlcEFsaXZlKSB7XG4gICAgICByb3V0ZXJWaWV3ID0gaCgna2VlcC1hbGl2ZScsIHsgcHJvcHM6IHByb3BzLmtlZXBBbGl2ZVByb3BzIH0sIFtyb3V0ZXJWaWV3XSlcbiAgICB9XG5cbiAgICByZXR1cm4gaCgndHJhbnNpdGlvbicsIHtcbiAgICAgIHByb3BzOiB0cmFuc2l0aW9uUHJvcHMsXG4gICAgICBvbjogbGlzdGVuZXJzXG4gICAgfSwgW3JvdXRlclZpZXddKVxuICB9XG59XG5cbmNvbnN0IHRyYW5zaXRpb25zS2V5cyA9IFtcbiAgJ25hbWUnLFxuICAnbW9kZScsXG4gICdhcHBlYXInLFxuICAnY3NzJyxcbiAgJ3R5cGUnLFxuICAnZHVyYXRpb24nLFxuICAnZW50ZXJDbGFzcycsXG4gICdsZWF2ZUNsYXNzJyxcbiAgJ2FwcGVhckNsYXNzJyxcbiAgJ2VudGVyQWN0aXZlQ2xhc3MnLFxuICAnZW50ZXJBY3RpdmVDbGFzcycsXG4gICdsZWF2ZUFjdGl2ZUNsYXNzJyxcbiAgJ2FwcGVhckFjdGl2ZUNsYXNzJyxcbiAgJ2VudGVyVG9DbGFzcycsXG4gICdsZWF2ZVRvQ2xhc3MnLFxuICAnYXBwZWFyVG9DbGFzcydcbl1cblxuY29uc3QgbGlzdGVuZXJzS2V5cyA9IFtcbiAgJ2JlZm9yZUVudGVyJyxcbiAgJ2VudGVyJyxcbiAgJ2FmdGVyRW50ZXInLFxuICAnZW50ZXJDYW5jZWxsZWQnLFxuICAnYmVmb3JlTGVhdmUnLFxuICAnbGVhdmUnLFxuICAnYWZ0ZXJMZWF2ZScsXG4gICdsZWF2ZUNhbmNlbGxlZCcsXG4gICdiZWZvcmVBcHBlYXInLFxuICAnYXBwZWFyJyxcbiAgJ2FmdGVyQXBwZWFyJyxcbiAgJ2FwcGVhckNhbmNlbGxlZCdcbl1cbiIsInZhciByZW5kZXIgPSBmdW5jdGlvbiAoKSB7dmFyIF92bT10aGlzO3ZhciBfaD1fdm0uJGNyZWF0ZUVsZW1lbnQ7dmFyIF9jPV92bS5fc2VsZi5fY3x8X2g7cmV0dXJuIF9jKCd2LWFwcCcse2F0dHJzOntcImRhcmtcIjpcIlwifX0sWyhfdm0uZXJyb3Iuc3RhdHVzQ29kZSA9PT0gNDA0KT9fYygnaDEnLFtfdm0uX3YoXCJcXG4gICAgICAgIFwiK192bS5fcyhfdm0ucGFnZU5vdEZvdW5kKStcIlxcbiAgICBcIildKTpfYygnaDEnLFtfdm0uX3YoXCJcXG4gICAgICAgIFwiK192bS5fcyhfdm0ub3RoZXJFcnJvcikrXCJcXG4gICAgXCIpXSksX3ZtLl92KFwiIFwiKSxfYygnYScse2F0dHJzOntcImhyZWZcIjpcImh0dHBzOi8vZ2l0aHViLmNvbS9ub3NxbGJlbmNoL25vc3FsYmVuY2gvaXNzdWVzL25ldz9sYWJlbHM9YnVnXCJ9fSxbX3ZtLl92KFwiXFxuICAgICAgICBGaWxlIEEgVUkgQnVnIFJlcG9ydFxcbiAgICBcIildKSxfdm0uX3YoXCIgXCIpLF9jKCdOdXh0TGluaycse2F0dHJzOntcInRvXCI6XCIvXCJ9fSxbX3ZtLl92KFwiXFxuICAgICAgICBIb21lIHBhZ2VcXG4gICAgXCIpXSldLDEpfVxudmFyIHN0YXRpY1JlbmRlckZucyA9IFtdXG5cbmV4cG9ydCB7IHJlbmRlciwgc3RhdGljUmVuZGVyRm5zIH0iLCI8dGVtcGxhdGU+XG4gICAgPHYtYXBwIGRhcms+XG4gICAgICAgIDxoMSB2LWlmPVwiZXJyb3Iuc3RhdHVzQ29kZSA9PT0gNDA0XCI+XG4gICAgICAgICAgICB7eyBwYWdlTm90Rm91bmQgfX1cbiAgICAgICAgPC9oMT5cbiAgICAgICAgPGgxIHYtZWxzZT5cbiAgICAgICAgICAgIHt7IG90aGVyRXJyb3IgfX1cbiAgICAgICAgPC9oMT5cbiAgICAgICAgPGEgaHJlZj1cImh0dHBzOi8vZ2l0aHViLmNvbS9ub3NxbGJlbmNoL25vc3FsYmVuY2gvaXNzdWVzL25ldz9sYWJlbHM9YnVnXCI+XG4gICAgICAgICAgICBGaWxlIEEgVUkgQnVnIFJlcG9ydFxuICAgICAgICA8L2E+XG4gICAgICAgIDxOdXh0TGluayB0bz1cIi9cIj5cbiAgICAgICAgICAgIEhvbWUgcGFnZVxuICAgICAgICA8L051eHRMaW5rPlxuICAgIDwvdi1hcHA+XG48L3RlbXBsYXRlPlxuXG48c2NyaXB0PlxuICAgIGV4cG9ydCBkZWZhdWx0IHtcbiAgICAgICAgbGF5b3V0OiAnZW1wdHknLFxuICAgICAgICBwcm9wczoge1xuICAgICAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiBPYmplY3QsXG4gICAgICAgICAgICAgICAgZGVmYXVsdDogbnVsbFxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBoZWFkKCkge1xuICAgICAgICAgICAgY29uc3QgdGl0bGUgPVxuICAgICAgICAgICAgICAgIHRoaXMuZXJyb3Iuc3RhdHVzQ29kZSA9PT0gNDA0ID8gdGhpcy5wYWdlTm90Rm91bmQgOiB0aGlzLm90aGVyRXJyb3JcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdGl0bGVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZGF0YSgpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgcGFnZU5vdEZvdW5kOiAnNDA0IE5vdCBGb3VuZCcsXG4gICAgICAgICAgICAgICAgb3RoZXJFcnJvcjogJ0FuIGVycm9yIG9jY3VycmVkJ1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuPC9zY3JpcHQ+XG5cbjxzdHlsZSBzY29wZWQ+XG4gICAgaDEge1xuICAgICAgICBmb250LXNpemU6IDIwcHg7XG4gICAgfVxuPC9zdHlsZT5cbiIsImltcG9ydCBtb2QgZnJvbSBcIi0hLi4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIvaW5kZXguanM/P3JlZi0tMi0wIS4uL25vZGVfbW9kdWxlcy92dWV0aWZ5LWxvYWRlci9saWIvbG9hZGVyLmpzPz9yZWYtLTE2LTAhLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2luZGV4LmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9lcnJvci52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXCI7IGV4cG9ydCBkZWZhdWx0IG1vZDsgZXhwb3J0ICogZnJvbSBcIi0hLi4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIvaW5kZXguanM/P3JlZi0tMi0wIS4uL25vZGVfbW9kdWxlcy92dWV0aWZ5LWxvYWRlci9saWIvbG9hZGVyLmpzPz9yZWYtLTE2LTAhLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2luZGV4LmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9lcnJvci52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXCIiLCJpbXBvcnQgeyByZW5kZXIsIHN0YXRpY1JlbmRlckZucyB9IGZyb20gXCIuL2Vycm9yLnZ1ZT92dWUmdHlwZT10ZW1wbGF0ZSZpZD00NWE1OTVjZSZzY29wZWQ9dHJ1ZSZcIlxuaW1wb3J0IHNjcmlwdCBmcm9tIFwiLi9lcnJvci52dWU/dnVlJnR5cGU9c2NyaXB0Jmxhbmc9anMmXCJcbmV4cG9ydCAqIGZyb20gXCIuL2Vycm9yLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcIlxuaW1wb3J0IHN0eWxlMCBmcm9tIFwiLi9lcnJvci52dWU/dnVlJnR5cGU9c3R5bGUmaW5kZXg9MCZpZD00NWE1OTVjZSZzY29wZWQ9dHJ1ZSZsYW5nPWNzcyZcIlxuXG5cbi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi9cbmltcG9ydCBub3JtYWxpemVyIGZyb20gXCIhLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3J1bnRpbWUvY29tcG9uZW50Tm9ybWFsaXplci5qc1wiXG52YXIgY29tcG9uZW50ID0gbm9ybWFsaXplcihcbiAgc2NyaXB0LFxuICByZW5kZXIsXG4gIHN0YXRpY1JlbmRlckZucyxcbiAgZmFsc2UsXG4gIG51bGwsXG4gIFwiNDVhNTk1Y2VcIixcbiAgbnVsbFxuICBcbilcblxuZXhwb3J0IGRlZmF1bHQgY29tcG9uZW50LmV4cG9ydHNcblxuLyogdnVldGlmeS1sb2FkZXIgKi9cbmltcG9ydCBpbnN0YWxsQ29tcG9uZW50cyBmcm9tIFwiIS4uL25vZGVfbW9kdWxlcy92dWV0aWZ5LWxvYWRlci9saWIvcnVudGltZS9pbnN0YWxsQ29tcG9uZW50cy5qc1wiXG5pbXBvcnQgeyBWQXBwIH0gZnJvbSAndnVldGlmeS9saWIvY29tcG9uZW50cy9WQXBwJztcbmluc3RhbGxDb21wb25lbnRzKGNvbXBvbmVudCwge1ZBcHB9KVxuIiwiaW1wb3J0IFZ1ZSBmcm9tICd2dWUnXG5pbXBvcnQgeyBjb21waWxlIH0gZnJvbSAnLi4vdXRpbHMnXG5cbmltcG9ydCBOdXh0RXJyb3IgZnJvbSAnLi4vLi4vbGF5b3V0cy9lcnJvci52dWUnXG5cbmltcG9ydCBOdXh0Q2hpbGQgZnJvbSAnLi9udXh0LWNoaWxkJ1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG5hbWU6ICdOdXh0JyxcbiAgY29tcG9uZW50czoge1xuICAgIE51eHRDaGlsZCxcbiAgICBOdXh0RXJyb3JcbiAgfSxcbiAgcHJvcHM6IHtcbiAgICBudXh0Q2hpbGRLZXk6IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGRlZmF1bHQ6IHVuZGVmaW5lZFxuICAgIH0sXG4gICAga2VlcEFsaXZlOiBCb29sZWFuLFxuICAgIGtlZXBBbGl2ZVByb3BzOiB7XG4gICAgICB0eXBlOiBPYmplY3QsXG4gICAgICBkZWZhdWx0OiB1bmRlZmluZWRcbiAgICB9LFxuICAgIG5hbWU6IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGRlZmF1bHQ6ICdkZWZhdWx0J1xuICAgIH1cbiAgfSxcbiAgZXJyb3JDYXB0dXJlZCAoZXJyb3IpIHtcbiAgICAvLyBpZiB3ZSByZWNlaXZlIGFuZCBlcnJvciB3aGlsZSBzaG93aW5nIHRoZSBOdXh0RXJyb3IgY29tcG9uZW50XG4gICAgLy8gY2FwdHVyZSB0aGUgZXJyb3IgYW5kIGZvcmNlIGFuIGltbWVkaWF0ZSB1cGRhdGUgc28gd2UgcmUtcmVuZGVyXG4gICAgLy8gd2l0aG91dCB0aGUgTnV4dEVycm9yIGNvbXBvbmVudFxuICAgIGlmICh0aGlzLmRpc3BsYXlpbmdOdXh0RXJyb3IpIHtcbiAgICAgIHRoaXMuZXJyb3JGcm9tTnV4dEVycm9yID0gZXJyb3JcbiAgICAgIHRoaXMuJGZvcmNlVXBkYXRlKClcbiAgICB9XG4gIH0sXG4gIGNvbXB1dGVkOiB7XG4gICAgcm91dGVyVmlld0tleSAoKSB7XG4gICAgICAvLyBJZiBudXh0Q2hpbGRLZXkgcHJvcCBpcyBnaXZlbiBvciBjdXJyZW50IHJvdXRlIGhhcyBjaGlsZHJlblxuICAgICAgaWYgKHR5cGVvZiB0aGlzLm51eHRDaGlsZEtleSAhPT0gJ3VuZGVmaW5lZCcgfHwgdGhpcy4kcm91dGUubWF0Y2hlZC5sZW5ndGggPiAxKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm51eHRDaGlsZEtleSB8fCBjb21waWxlKHRoaXMuJHJvdXRlLm1hdGNoZWRbMF0ucGF0aCkodGhpcy4kcm91dGUucGFyYW1zKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBbbWF0Y2hlZFJvdXRlXSA9IHRoaXMuJHJvdXRlLm1hdGNoZWRcblxuICAgICAgaWYgKCFtYXRjaGVkUm91dGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuJHJvdXRlLnBhdGhcbiAgICAgIH1cblxuICAgICAgY29uc3QgQ29tcG9uZW50ID0gbWF0Y2hlZFJvdXRlLmNvbXBvbmVudHMuZGVmYXVsdFxuXG4gICAgICBpZiAoQ29tcG9uZW50ICYmIENvbXBvbmVudC5vcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IHsgb3B0aW9ucyB9ID0gQ29tcG9uZW50XG5cbiAgICAgICAgaWYgKG9wdGlvbnMua2V5KSB7XG4gICAgICAgICAgcmV0dXJuICh0eXBlb2Ygb3B0aW9ucy5rZXkgPT09ICdmdW5jdGlvbicgPyBvcHRpb25zLmtleSh0aGlzLiRyb3V0ZSkgOiBvcHRpb25zLmtleSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBzdHJpY3QgPSAvXFwvJC8udGVzdChtYXRjaGVkUm91dGUucGF0aClcbiAgICAgIHJldHVybiBzdHJpY3QgPyB0aGlzLiRyb3V0ZS5wYXRoIDogdGhpcy4kcm91dGUucGF0aC5yZXBsYWNlKC9cXC8kLywgJycpXG4gICAgfVxuICB9LFxuICBiZWZvcmVDcmVhdGUgKCkge1xuICAgIFZ1ZS51dGlsLmRlZmluZVJlYWN0aXZlKHRoaXMsICdudXh0JywgdGhpcy4kcm9vdC4kb3B0aW9ucy5udXh0KVxuICB9LFxuICByZW5kZXIgKGgpIHtcbiAgICAvLyBpZiB0aGVyZSBpcyBubyBlcnJvclxuICAgIGlmICghdGhpcy5udXh0LmVycikge1xuICAgICAgLy8gRGlyZWN0bHkgcmV0dXJuIG51eHQgY2hpbGRcbiAgICAgIHJldHVybiBoKCdOdXh0Q2hpbGQnLCB7XG4gICAgICAgIGtleTogdGhpcy5yb3V0ZXJWaWV3S2V5LFxuICAgICAgICBwcm9wczogdGhpcy4kcHJvcHNcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgLy8gaWYgYW4gZXJyb3Igb2NjdXJlZCB3aXRoaW4gTnV4dEVycm9yIHNob3cgYSBzaW1wbGVcbiAgICAvLyBlcnJvciBtZXNzYWdlIGluc3RlYWQgdG8gcHJldmVudCBsb29waW5nXG4gICAgaWYgKHRoaXMuZXJyb3JGcm9tTnV4dEVycm9yKSB7XG4gICAgICB0aGlzLiRuZXh0VGljaygoKSA9PiAodGhpcy5lcnJvckZyb21OdXh0RXJyb3IgPSBmYWxzZSkpXG5cbiAgICAgIHJldHVybiBoKCdkaXYnLCB7fSwgW1xuICAgICAgICBoKCdoMicsICdBbiBlcnJvciBvY2N1cmVkIHdoaWxlIHNob3dpbmcgdGhlIGVycm9yIHBhZ2UnKSxcbiAgICAgICAgaCgncCcsICdVbmZvcnR1bmF0ZWx5IGFuIGVycm9yIG9jY3VyZWQgYW5kIHdoaWxlIHNob3dpbmcgdGhlIGVycm9yIHBhZ2UgYW5vdGhlciBlcnJvciBvY2N1cmVkJyksXG4gICAgICAgIGgoJ3AnLCBgRXJyb3IgZGV0YWlsczogJHt0aGlzLmVycm9yRnJvbU51eHRFcnJvci50b1N0cmluZygpfWApLFxuICAgICAgICBoKCdudXh0LWxpbmsnLCB7IHByb3BzOiB7IHRvOiAnLycgfSB9LCAnR28gYmFjayB0byBob21lJylcbiAgICAgIF0pXG4gICAgfVxuXG4gICAgLy8gdHJhY2sgaWYgd2UgYXJlIHNob3dpbmcgdGhlIE51eHRFcnJvciBjb21wb25lbnRcbiAgICB0aGlzLmRpc3BsYXlpbmdOdXh0RXJyb3IgPSB0cnVlXG4gICAgdGhpcy4kbmV4dFRpY2soKCkgPT4gKHRoaXMuZGlzcGxheWluZ051eHRFcnJvciA9IGZhbHNlKSlcblxuICAgIHJldHVybiBoKE51eHRFcnJvciwge1xuICAgICAgcHJvcHM6IHtcbiAgICAgICAgZXJyb3I6IHRoaXMubnV4dC5lcnJcbiAgICAgIH1cbiAgICB9KVxuICB9XG59XG4iLCI8c2NyaXB0PlxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAnTnV4dExvYWRpbmcnLFxuICBkYXRhICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcGVyY2VudDogMCxcbiAgICAgIHNob3c6IGZhbHNlLFxuICAgICAgY2FuU3VjY2VlZDogdHJ1ZSxcbiAgICAgIHJldmVyc2VkOiBmYWxzZSxcbiAgICAgIHNraXBUaW1lckNvdW50OiAwLFxuICAgICAgcnRsOiBmYWxzZSxcbiAgICAgIHRocm90dGxlOiAyMDAsXG4gICAgICBkdXJhdGlvbjogNTAwMCxcbiAgICAgIGNvbnRpbnVvdXM6IGZhbHNlXG4gICAgfVxuICB9LFxuICBjb21wdXRlZDoge1xuICAgIGxlZnQgKCkge1xuICAgICAgaWYgKCF0aGlzLmNvbnRpbnVvdXMgJiYgIXRoaXMucnRsKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMucnRsXG4gICAgICAgID8gKHRoaXMucmV2ZXJzZWQgPyAnMHB4JyA6ICdhdXRvJylcbiAgICAgICAgOiAoIXRoaXMucmV2ZXJzZWQgPyAnMHB4JyA6ICdhdXRvJylcbiAgICB9XG4gIH0sXG4gIGJlZm9yZURlc3Ryb3kgKCkge1xuICAgIHRoaXMuY2xlYXIoKVxuICB9LFxuICBtZXRob2RzOiB7XG4gICAgY2xlYXIgKCkge1xuICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLl90aW1lcilcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLl90aHJvdHRsZSlcbiAgICAgIHRoaXMuX3RpbWVyID0gbnVsbFxuICAgIH0sXG4gICAgc3RhcnQgKCkge1xuICAgICAgdGhpcy5jbGVhcigpXG4gICAgICB0aGlzLnBlcmNlbnQgPSAwXG4gICAgICB0aGlzLnJldmVyc2VkID0gZmFsc2VcbiAgICAgIHRoaXMuc2tpcFRpbWVyQ291bnQgPSAwXG4gICAgICB0aGlzLmNhblN1Y2NlZWQgPSB0cnVlXG5cbiAgICAgIGlmICh0aGlzLnRocm90dGxlKSB7XG4gICAgICAgIHRoaXMuX3Rocm90dGxlID0gc2V0VGltZW91dCgoKSA9PiB0aGlzLnN0YXJ0VGltZXIoKSwgdGhpcy50aHJvdHRsZSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc3RhcnRUaW1lcigpXG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpc1xuICAgIH0sXG4gICAgc2V0IChudW0pIHtcbiAgICAgIHRoaXMuc2hvdyA9IHRydWVcbiAgICAgIHRoaXMuY2FuU3VjY2VlZCA9IHRydWVcbiAgICAgIHRoaXMucGVyY2VudCA9IE1hdGgubWluKDEwMCwgTWF0aC5tYXgoMCwgTWF0aC5mbG9vcihudW0pKSlcbiAgICAgIHJldHVybiB0aGlzXG4gICAgfSxcbiAgICBnZXQgKCkge1xuICAgICAgcmV0dXJuIHRoaXMucGVyY2VudFxuICAgIH0sXG4gICAgaW5jcmVhc2UgKG51bSkge1xuICAgICAgdGhpcy5wZXJjZW50ID0gTWF0aC5taW4oMTAwLCBNYXRoLmZsb29yKHRoaXMucGVyY2VudCArIG51bSkpXG4gICAgICByZXR1cm4gdGhpc1xuICAgIH0sXG4gICAgZGVjcmVhc2UgKG51bSkge1xuICAgICAgdGhpcy5wZXJjZW50ID0gTWF0aC5tYXgoMCwgTWF0aC5mbG9vcih0aGlzLnBlcmNlbnQgLSBudW0pKVxuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9LFxuICAgIHBhdXNlICgpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5fdGltZXIpXG4gICAgICByZXR1cm4gdGhpc1xuICAgIH0sXG4gICAgcmVzdW1lICgpIHtcbiAgICAgIHRoaXMuc3RhcnRUaW1lcigpXG4gICAgICByZXR1cm4gdGhpc1xuICAgIH0sXG4gICAgZmluaXNoICgpIHtcbiAgICAgIHRoaXMucGVyY2VudCA9IHRoaXMucmV2ZXJzZWQgPyAwIDogMTAwXG4gICAgICB0aGlzLmhpZGUoKVxuICAgICAgcmV0dXJuIHRoaXNcbiAgICB9LFxuICAgIGhpZGUgKCkge1xuICAgICAgdGhpcy5jbGVhcigpXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5zaG93ID0gZmFsc2VcbiAgICAgICAgdGhpcy4kbmV4dFRpY2soKCkgPT4ge1xuICAgICAgICAgIHRoaXMucGVyY2VudCA9IDBcbiAgICAgICAgICB0aGlzLnJldmVyc2VkID0gZmFsc2VcbiAgICAgICAgfSlcbiAgICAgIH0sIDUwMClcbiAgICAgIHJldHVybiB0aGlzXG4gICAgfSxcbiAgICBmYWlsICgpIHtcbiAgICAgIHRoaXMuY2FuU3VjY2VlZCA9IGZhbHNlXG4gICAgICByZXR1cm4gdGhpc1xuICAgIH0sXG4gICAgc3RhcnRUaW1lciAoKSB7XG4gICAgICBpZiAoIXRoaXMuc2hvdykge1xuICAgICAgICB0aGlzLnNob3cgPSB0cnVlXG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHRoaXMuX2N1dCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdGhpcy5fY3V0ID0gMTAwMDAgLyBNYXRoLmZsb29yKHRoaXMuZHVyYXRpb24pXG4gICAgICB9XG5cbiAgICAgIHRoaXMuX3RpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICAvKipcbiAgICAgICAgICogV2hlbiByZXZlcnNpbmcgZGlyZWN0aW9uIHNraXAgb25lIHRpbWVyc1xuICAgICAgICAgKiBzbyAwLCAxMDAgYXJlIGRpc3BsYXllZCBmb3IgdHdvIGl0ZXJhdGlvbnNcbiAgICAgICAgICogYWxzbyBkaXNhYmxlIGNzcyB3aWR0aCB0cmFuc2l0aW9uaW5nXG4gICAgICAgICAqIHdoaWNoIG90aGVyd2lzZSBpbnRlcmZlcmVzIGFuZCBzaG93c1xuICAgICAgICAgKiBhIGpvam8gZWZmZWN0XG4gICAgICAgICAqL1xuICAgICAgICBpZiAodGhpcy5za2lwVGltZXJDb3VudCA+IDApIHtcbiAgICAgICAgICB0aGlzLnNraXBUaW1lckNvdW50LS1cbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnJldmVyc2VkKSB7XG4gICAgICAgICAgdGhpcy5kZWNyZWFzZSh0aGlzLl9jdXQpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5pbmNyZWFzZSh0aGlzLl9jdXQpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jb250aW51b3VzKSB7XG4gICAgICAgICAgaWYgKHRoaXMucGVyY2VudCA+PSAxMDApIHtcbiAgICAgICAgICAgIHRoaXMuc2tpcFRpbWVyQ291bnQgPSAxXG5cbiAgICAgICAgICAgIHRoaXMucmV2ZXJzZWQgPSAhdGhpcy5yZXZlcnNlZFxuICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5wZXJjZW50IDw9IDApIHtcbiAgICAgICAgICAgIHRoaXMuc2tpcFRpbWVyQ291bnQgPSAxXG5cbiAgICAgICAgICAgIHRoaXMucmV2ZXJzZWQgPSAhdGhpcy5yZXZlcnNlZFxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSwgMTAwKVxuICAgIH1cbiAgfSxcbiAgcmVuZGVyIChoKSB7XG4gICAgbGV0IGVsID0gaChmYWxzZSlcbiAgICBpZiAodGhpcy5zaG93KSB7XG4gICAgICBlbCA9IGgoJ2RpdicsIHtcbiAgICAgICAgc3RhdGljQ2xhc3M6ICdudXh0LXByb2dyZXNzJyxcbiAgICAgICAgY2xhc3M6IHtcbiAgICAgICAgICAnbnV4dC1wcm9ncmVzcy1ub3RyYW5zaXRpb24nOiB0aGlzLnNraXBUaW1lckNvdW50ID4gMCxcbiAgICAgICAgICAnbnV4dC1wcm9ncmVzcy1mYWlsZWQnOiAhdGhpcy5jYW5TdWNjZWVkXG4gICAgICAgIH0sXG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgd2lkdGg6IHRoaXMucGVyY2VudCArICclJyxcbiAgICAgICAgICBsZWZ0OiB0aGlzLmxlZnRcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gICAgcmV0dXJuIGVsXG4gIH1cbn1cbjwvc2NyaXB0PlxuXG48c3R5bGU+XG4ubnV4dC1wcm9ncmVzcyB7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgdG9wOiAwcHg7XG4gIGxlZnQ6IDBweDtcbiAgcmlnaHQ6IDBweDtcbiAgaGVpZ2h0OiAycHg7XG4gIHdpZHRoOiAwJTtcbiAgb3BhY2l0eTogMTtcbiAgdHJhbnNpdGlvbjogd2lkdGggMC4xcywgb3BhY2l0eSAwLjRzO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICB6LWluZGV4OiA5OTk5OTk7XG59XG5cbi5udXh0LXByb2dyZXNzLm51eHQtcHJvZ3Jlc3Mtbm90cmFuc2l0aW9uIHtcbiAgdHJhbnNpdGlvbjogbm9uZTtcbn1cblxuLm51eHQtcHJvZ3Jlc3MtZmFpbGVkIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogcmVkO1xufVxuPC9zdHlsZT5cbiIsImltcG9ydCBtb2QgZnJvbSBcIi0hLi4vLi4vbm9kZV9tb2R1bGVzL2JhYmVsLWxvYWRlci9saWIvaW5kZXguanM/P3JlZi0tMi0wIS4uLy4uL25vZGVfbW9kdWxlcy92dWV0aWZ5LWxvYWRlci9saWIvbG9hZGVyLmpzPz9yZWYtLTE2LTAhLi4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL2luZGV4LmpzPz92dWUtbG9hZGVyLW9wdGlvbnMhLi9udXh0LWxvYWRpbmcudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlwiOyBleHBvcnQgZGVmYXVsdCBtb2Q7IGV4cG9ydCAqIGZyb20gXCItIS4uLy4uL25vZGVfbW9kdWxlcy9iYWJlbC1sb2FkZXIvbGliL2luZGV4LmpzPz9yZWYtLTItMCEuLi8uLi9ub2RlX21vZHVsZXMvdnVldGlmeS1sb2FkZXIvbGliL2xvYWRlci5qcz8/cmVmLS0xNi0wIS4uLy4uL25vZGVfbW9kdWxlcy92dWUtbG9hZGVyL2xpYi9pbmRleC5qcz8/dnVlLWxvYWRlci1vcHRpb25zIS4vbnV4dC1sb2FkaW5nLnZ1ZT92dWUmdHlwZT1zY3JpcHQmbGFuZz1qcyZcIiIsInZhciByZW5kZXIsIHN0YXRpY1JlbmRlckZuc1xuaW1wb3J0IHNjcmlwdCBmcm9tIFwiLi9udXh0LWxvYWRpbmcudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlwiXG5leHBvcnQgKiBmcm9tIFwiLi9udXh0LWxvYWRpbmcudnVlP3Z1ZSZ0eXBlPXNjcmlwdCZsYW5nPWpzJlwiXG5pbXBvcnQgc3R5bGUwIGZyb20gXCIuL251eHQtbG9hZGluZy52dWU/dnVlJnR5cGU9c3R5bGUmaW5kZXg9MCZsYW5nPWNzcyZcIlxuXG5cbi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi9cbmltcG9ydCBub3JtYWxpemVyIGZyb20gXCIhLi4vLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3J1bnRpbWUvY29tcG9uZW50Tm9ybWFsaXplci5qc1wiXG52YXIgY29tcG9uZW50ID0gbm9ybWFsaXplcihcbiAgc2NyaXB0LFxuICByZW5kZXIsXG4gIHN0YXRpY1JlbmRlckZucyxcbiAgZmFsc2UsXG4gIG51bGwsXG4gIG51bGwsXG4gIG51bGxcbiAgXG4pXG5cbmV4cG9ydCBkZWZhdWx0IGNvbXBvbmVudC5leHBvcnRzIiwidmFyIHJlbmRlciA9IGZ1bmN0aW9uICgpIHt2YXIgX3ZtPXRoaXM7dmFyIF9oPV92bS4kY3JlYXRlRWxlbWVudDt2YXIgX2M9X3ZtLl9zZWxmLl9jfHxfaDtyZXR1cm4gX2MoJ2RpdicsW19jKCdudXh0JyldLDEpfVxudmFyIHN0YXRpY1JlbmRlckZucyA9IFtdXG5cbmV4cG9ydCB7IHJlbmRlciwgc3RhdGljUmVuZGVyRm5zIH0iLCJpbXBvcnQgeyByZW5kZXIsIHN0YXRpY1JlbmRlckZucyB9IGZyb20gXCIuL2RlZmF1bHQudnVlP3Z1ZSZ0eXBlPXRlbXBsYXRlJmlkPTc2MDkxNGUzJlwiXG52YXIgc2NyaXB0ID0ge31cbmltcG9ydCBzdHlsZTAgZnJvbSBcIi4vZGVmYXVsdC52dWU/dnVlJnR5cGU9c3R5bGUmaW5kZXg9MCZsYW5nPWNzcyZcIlxuXG5cbi8qIG5vcm1hbGl6ZSBjb21wb25lbnQgKi9cbmltcG9ydCBub3JtYWxpemVyIGZyb20gXCIhLi4vbm9kZV9tb2R1bGVzL3Z1ZS1sb2FkZXIvbGliL3J1bnRpbWUvY29tcG9uZW50Tm9ybWFsaXplci5qc1wiXG52YXIgY29tcG9uZW50ID0gbm9ybWFsaXplcihcbiAgc2NyaXB0LFxuICByZW5kZXIsXG4gIHN0YXRpY1JlbmRlckZucyxcbiAgZmFsc2UsXG4gIG51bGwsXG4gIG51bGwsXG4gIG51bGxcbiAgXG4pXG5cbmV4cG9ydCBkZWZhdWx0IGNvbXBvbmVudC5leHBvcnRzIiwiaW1wb3J0IFZ1ZSBmcm9tICd2dWUnXG5cbmltcG9ydCB7XG4gIGdldE1hdGNoZWRDb21wb25lbnRzSW5zdGFuY2VzLFxuICBwcm9taXNpZnksXG4gIGdsb2JhbEhhbmRsZUVycm9yXG59IGZyb20gJy4vdXRpbHMnXG5cbmltcG9ydCBOdXh0RXJyb3IgZnJvbSAnLi4vbGF5b3V0cy9lcnJvci52dWUnXG5pbXBvcnQgTnV4dExvYWRpbmcgZnJvbSAnLi9jb21wb25lbnRzL251eHQtbG9hZGluZy52dWUnXG5cbmltcG9ydCBfNmY2YzA5OGIgZnJvbSAnLi4vbGF5b3V0cy9kZWZhdWx0LnZ1ZSdcblxuY29uc3QgbGF5b3V0cyA9IHsgXCJfZGVmYXVsdFwiOiBfNmY2YzA5OGIgfVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGhlYWQ6IHtcInRpdGxlVGVtcGxhdGVcIjpcIiVzbm9zcWxiZW5jaCBkb2NzXCIsXCJ0aXRsZVwiOlwiZ3VpZGVib29rXCIsXCJtZXRhXCI6W3tcImNoYXJzZXRcIjpcInV0Zi04XCJ9LHtcIm5hbWVcIjpcInZpZXdwb3J0XCIsXCJjb250ZW50XCI6XCJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MVwifSx7XCJoaWRcIjpcImRlc2NyaXB0aW9uXCIsXCJuYW1lXCI6XCJkZXNjcmlwdGlvblwiLFwiY29udGVudFwiOlwiRG9jcyBBcHAgZm9yIE5vU1FMQmVuY2hcIn1dLFwibGlua1wiOlt7XCJyZWxcIjpcImljb25cIixcInR5cGVcIjpcImltYWdlXFx1MDAyRngtaWNvblwiLFwiaHJlZlwiOlwiXFx1MDAyRmZhdmljb24uaWNvXCJ9LHtcInJlbFwiOlwic3R5bGVzaGVldFwiLFwidHlwZVwiOlwidGV4dFxcdTAwMkZjc3NcIixcImhyZWZcIjpcImh0dHBzOlxcdTAwMkZcXHUwMDJGZm9udHMuZ29vZ2xlYXBpcy5jb21cXHUwMDJGY3NzP2ZhbWlseT1Sb2JvdG86MTAwLDMwMCw0MDAsNTAwLDcwMCw5MDAmZGlzcGxheT1zd2FwXCJ9LHtcInJlbFwiOlwic3R5bGVzaGVldFwiLFwidHlwZVwiOlwidGV4dFxcdTAwMkZjc3NcIixcImhyZWZcIjpcImh0dHBzOlxcdTAwMkZcXHUwMDJGY2RuLmpzZGVsaXZyLm5ldFxcdTAwMkZucG1cXHUwMDJGQG1kaVxcdTAwMkZmb250QGxhdGVzdFxcdTAwMkZjc3NcXHUwMDJGbWF0ZXJpYWxkZXNpZ25pY29ucy5taW4uY3NzXCJ9XSxcInN0eWxlXCI6W10sXCJzY3JpcHRcIjpbXX0sXG5cbiAgcmVuZGVyIChoLCBwcm9wcykge1xuICAgIGNvbnN0IGxvYWRpbmdFbCA9IGgoJ051eHRMb2FkaW5nJywgeyByZWY6ICdsb2FkaW5nJyB9KVxuXG4gICAgaWYgKHRoaXMubnV4dC5lcnIgJiYgTnV4dEVycm9yKSB7XG4gICAgICBjb25zdCBlcnJvckxheW91dCA9IChOdXh0RXJyb3Iub3B0aW9ucyB8fCBOdXh0RXJyb3IpLmxheW91dFxuICAgICAgaWYgKGVycm9yTGF5b3V0KSB7XG4gICAgICAgIHRoaXMuc2V0TGF5b3V0KFxuICAgICAgICAgIHR5cGVvZiBlcnJvckxheW91dCA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgICAgPyBlcnJvckxheW91dC5jYWxsKE51eHRFcnJvciwgdGhpcy5jb250ZXh0KVxuICAgICAgICAgICAgOiBlcnJvckxheW91dFxuICAgICAgICApXG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbGF5b3V0RWwgPSBoKHRoaXMubGF5b3V0IHx8ICdudXh0JylcbiAgICBjb25zdCB0ZW1wbGF0ZUVsID0gaCgnZGl2Jywge1xuICAgICAgZG9tUHJvcHM6IHtcbiAgICAgICAgaWQ6ICdfX2xheW91dCdcbiAgICAgIH0sXG4gICAgICBrZXk6IHRoaXMubGF5b3V0TmFtZVxuICAgIH0sIFtsYXlvdXRFbF0pXG5cbiAgICBjb25zdCB0cmFuc2l0aW9uRWwgPSBoKCd0cmFuc2l0aW9uJywge1xuICAgICAgcHJvcHM6IHtcbiAgICAgICAgbmFtZTogJ2xheW91dCcsXG4gICAgICAgIG1vZGU6ICdvdXQtaW4nXG4gICAgICB9LFxuICAgICAgb246IHtcbiAgICAgICAgYmVmb3JlRW50ZXIgKGVsKSB7XG4gICAgICAgICAgLy8gRW5zdXJlIHRvIHRyaWdnZXIgc2Nyb2xsIGV2ZW50IGFmdGVyIGNhbGxpbmcgc2Nyb2xsQmVoYXZpb3JcbiAgICAgICAgICB3aW5kb3cuJG51eHQuJG5leHRUaWNrKCgpID0+IHtcbiAgICAgICAgICAgIHdpbmRvdy4kbnV4dC4kZW1pdCgndHJpZ2dlclNjcm9sbCcpXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIFt0ZW1wbGF0ZUVsXSlcblxuICAgIHJldHVybiBoKCdkaXYnLCB7XG4gICAgICBkb21Qcm9wczoge1xuICAgICAgICBpZDogJ19fbnV4dCdcbiAgICAgIH1cbiAgICB9LCBbXG4gICAgICBsb2FkaW5nRWwsXG5cbiAgICAgIHRyYW5zaXRpb25FbFxuICAgIF0pXG4gIH0sXG5cbiAgZGF0YTogKCkgPT4gKHtcbiAgICBpc09ubGluZTogdHJ1ZSxcblxuICAgIGxheW91dDogbnVsbCxcbiAgICBsYXlvdXROYW1lOiAnJ1xuICB9KSxcblxuICBiZWZvcmVDcmVhdGUgKCkge1xuICAgIFZ1ZS51dGlsLmRlZmluZVJlYWN0aXZlKHRoaXMsICdudXh0JywgdGhpcy4kb3B0aW9ucy5udXh0KVxuICB9LFxuICBjcmVhdGVkICgpIHtcbiAgICAvLyBBZGQgdGhpcy4kbnV4dCBpbiBjaGlsZCBpbnN0YW5jZXNcbiAgICBWdWUucHJvdG90eXBlLiRudXh0ID0gdGhpc1xuICAgIC8vIGFkZCB0byB3aW5kb3cgc28gd2UgY2FuIGxpc3RlbiB3aGVuIHJlYWR5XG4gICAgaWYgKHByb2Nlc3MuY2xpZW50KSB7XG4gICAgICB3aW5kb3cuJG51eHQgPSB0aGlzXG5cbiAgICAgIHRoaXMucmVmcmVzaE9ubGluZVN0YXR1cygpXG4gICAgICAvLyBTZXR1cCB0aGUgbGlzdGVuZXJzXG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignb25saW5lJywgdGhpcy5yZWZyZXNoT25saW5lU3RhdHVzKVxuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ29mZmxpbmUnLCB0aGlzLnJlZnJlc2hPbmxpbmVTdGF0dXMpXG4gICAgfVxuICAgIC8vIEFkZCAkbnV4dC5lcnJvcigpXG4gICAgdGhpcy5lcnJvciA9IHRoaXMubnV4dC5lcnJvclxuICAgIC8vIEFkZCAkbnV4dC5jb250ZXh0XG4gICAgdGhpcy5jb250ZXh0ID0gdGhpcy4kb3B0aW9ucy5jb250ZXh0XG4gIH0sXG5cbiAgbW91bnRlZCAoKSB7XG4gICAgdGhpcy4kbG9hZGluZyA9IHRoaXMuJHJlZnMubG9hZGluZ1xuICB9LFxuICB3YXRjaDoge1xuICAgICdudXh0LmVycic6ICdlcnJvckNoYW5nZWQnXG4gIH0sXG5cbiAgY29tcHV0ZWQ6IHtcbiAgICBpc09mZmxpbmUgKCkge1xuICAgICAgcmV0dXJuICF0aGlzLmlzT25saW5lXG4gICAgfVxuICB9LFxuXG4gIG1ldGhvZHM6IHtcbiAgICByZWZyZXNoT25saW5lU3RhdHVzICgpIHtcbiAgICAgIGlmIChwcm9jZXNzLmNsaWVudCkge1xuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdy5uYXZpZ2F0b3Iub25MaW5lID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIC8vIElmIHRoZSBicm93c2VyIGRvZXNuJ3Qgc3VwcG9ydCBjb25uZWN0aW9uIHN0YXR1cyByZXBvcnRzXG4gICAgICAgICAgLy8gYXNzdW1lIHRoYXQgd2UgYXJlIG9ubGluZSBiZWNhdXNlIG1vc3QgYXBwcycgb25seSByZWFjdFxuICAgICAgICAgIC8vIHdoZW4gdGhleSBub3cgdGhhdCB0aGUgY29ubmVjdGlvbiBoYXMgYmVlbiBpbnRlcnJ1cHRlZFxuICAgICAgICAgIHRoaXMuaXNPbmxpbmUgPSB0cnVlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5pc09ubGluZSA9IHdpbmRvdy5uYXZpZ2F0b3Iub25MaW5lXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYXN5bmMgcmVmcmVzaCAoKSB7XG4gICAgICBjb25zdCBwYWdlcyA9IGdldE1hdGNoZWRDb21wb25lbnRzSW5zdGFuY2VzKHRoaXMuJHJvdXRlKVxuXG4gICAgICBpZiAoIXBhZ2VzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIHRoaXMuJGxvYWRpbmcuc3RhcnQoKVxuXG4gICAgICBjb25zdCBwcm9taXNlcyA9IHBhZ2VzLm1hcCgocGFnZSkgPT4ge1xuICAgICAgICBjb25zdCBwID0gW11cblxuICAgICAgICBpZiAocGFnZS4kb3B0aW9ucy5mZXRjaCkge1xuICAgICAgICAgIHAucHVzaChwcm9taXNpZnkocGFnZS4kb3B0aW9ucy5mZXRjaCwgdGhpcy5jb250ZXh0KSlcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYWdlLiRvcHRpb25zLmFzeW5jRGF0YSkge1xuICAgICAgICAgIHAucHVzaChcbiAgICAgICAgICAgIHByb21pc2lmeShwYWdlLiRvcHRpb25zLmFzeW5jRGF0YSwgdGhpcy5jb250ZXh0KVxuICAgICAgICAgICAgICAudGhlbigobmV3RGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIG5ld0RhdGEpIHtcbiAgICAgICAgICAgICAgICAgIFZ1ZS5zZXQocGFnZS4kZGF0YSwga2V5LCBuZXdEYXRhW2tleV0pXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgIClcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBQcm9taXNlLmFsbChwKVxuICAgICAgfSlcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy4kbG9hZGluZy5mYWlsKClcbiAgICAgICAgZ2xvYmFsSGFuZGxlRXJyb3IoZXJyb3IpXG4gICAgICAgIHRoaXMuZXJyb3IoZXJyb3IpXG4gICAgICB9XG4gICAgICB0aGlzLiRsb2FkaW5nLmZpbmlzaCgpXG4gICAgfSxcblxuICAgIGVycm9yQ2hhbmdlZCAoKSB7XG4gICAgICBpZiAodGhpcy5udXh0LmVyciAmJiB0aGlzLiRsb2FkaW5nKSB7XG4gICAgICAgIGlmICh0aGlzLiRsb2FkaW5nLmZhaWwpIHtcbiAgICAgICAgICB0aGlzLiRsb2FkaW5nLmZhaWwoKVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLiRsb2FkaW5nLmZpbmlzaCkge1xuICAgICAgICAgIHRoaXMuJGxvYWRpbmcuZmluaXNoKClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBzZXRMYXlvdXQgKGxheW91dCkge1xuICAgICAgaWYgKCFsYXlvdXQgfHwgIWxheW91dHNbJ18nICsgbGF5b3V0XSkge1xuICAgICAgICBsYXlvdXQgPSAnZGVmYXVsdCdcbiAgICAgIH1cbiAgICAgIHRoaXMubGF5b3V0TmFtZSA9IGxheW91dFxuICAgICAgdGhpcy5sYXlvdXQgPSBsYXlvdXRzWydfJyArIGxheW91dF1cbiAgICAgIHJldHVybiB0aGlzLmxheW91dFxuICAgIH0sXG4gICAgbG9hZExheW91dCAobGF5b3V0KSB7XG4gICAgICBpZiAoIWxheW91dCB8fCAhbGF5b3V0c1snXycgKyBsYXlvdXRdKSB7XG4gICAgICAgIGxheW91dCA9ICdkZWZhdWx0J1xuICAgICAgfVxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShsYXlvdXRzWydfJyArIGxheW91dF0pXG4gICAgfVxuICB9LFxuXG4gIGNvbXBvbmVudHM6IHtcbiAgICBOdXh0TG9hZGluZ1xuICB9XG59XG4iLCJpbXBvcnQgVnVlIGZyb20gJ3Z1ZSdcbmltcG9ydCBWdWV4IGZyb20gJ3Z1ZXgnXG5cblZ1ZS51c2UoVnVleClcblxuY29uc3QgVlVFWF9QUk9QRVJUSUVTID0gWydzdGF0ZScsICdnZXR0ZXJzJywgJ2FjdGlvbnMnLCAnbXV0YXRpb25zJ11cblxubGV0IHN0b3JlID0ge307XG5cbihmdW5jdGlvbiB1cGRhdGVNb2R1bGVzICgpIHtcbiAgc3RvcmUgPSBub3JtYWxpemVSb290KHJlcXVpcmUoJy4uL3N0b3JlL2luZGV4LmpzJyksICdzdG9yZS9pbmRleC5qcycpXG5cbiAgLy8gSWYgc3RvcmUgaXMgYW4gZXhwb3J0ZWQgbWV0aG9kID0gY2xhc3NpYyBtb2RlIChkZXByZWNhdGVkKVxuXG4gIC8vIEVuZm9yY2Ugc3RvcmUgbW9kdWxlc1xuICBzdG9yZS5tb2R1bGVzID0gc3RvcmUubW9kdWxlcyB8fCB7fVxuXG4gIHJlc29sdmVTdG9yZU1vZHVsZXMocmVxdWlyZSgnLi4vc3RvcmUvZG9jcy5qcycpLCAnZG9jcy5qcycpXG5cbiAgLy8gSWYgdGhlIGVudmlyb25tZW50IHN1cHBvcnRzIGhvdCByZWxvYWRpbmcuLi5cbn0pKClcblxuLy8gY3JlYXRlU3RvcmVcbmV4cG9ydCBjb25zdCBjcmVhdGVTdG9yZSA9IHN0b3JlIGluc3RhbmNlb2YgRnVuY3Rpb24gPyBzdG9yZSA6ICgpID0+IHtcbiAgcmV0dXJuIG5ldyBWdWV4LlN0b3JlKE9iamVjdC5hc3NpZ24oe1xuICAgIHN0cmljdDogKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpXG4gIH0sIHN0b3JlKSlcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplUm9vdCAobW9kdWxlRGF0YSwgZmlsZVBhdGgpIHtcbiAgbW9kdWxlRGF0YSA9IG1vZHVsZURhdGEuZGVmYXVsdCB8fCBtb2R1bGVEYXRhXG5cbiAgaWYgKG1vZHVsZURhdGEuY29tbWl0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBbbnV4dF0gJHtmaWxlUGF0aH0gc2hvdWxkIGV4cG9ydCBhIG1ldGhvZCB0aGF0IHJldHVybnMgYSBWdWV4IGluc3RhbmNlLmApXG4gIH1cblxuICBpZiAodHlwZW9mIG1vZHVsZURhdGEgIT09ICdmdW5jdGlvbicpIHtcbiAgICAvLyBBdm9pZCBUeXBlRXJyb3I6IHNldHRpbmcgYSBwcm9wZXJ0eSB0aGF0IGhhcyBvbmx5IGEgZ2V0dGVyIHdoZW4gb3ZlcndyaXRpbmcgdG9wIGxldmVsIGtleXNcbiAgICBtb2R1bGVEYXRhID0gT2JqZWN0LmFzc2lnbih7fSwgbW9kdWxlRGF0YSlcbiAgfVxuICByZXR1cm4gbm9ybWFsaXplTW9kdWxlKG1vZHVsZURhdGEsIGZpbGVQYXRoKVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVNb2R1bGUgKG1vZHVsZURhdGEsIGZpbGVQYXRoKSB7XG4gIGlmIChtb2R1bGVEYXRhLnN0YXRlICYmIHR5cGVvZiBtb2R1bGVEYXRhLnN0YXRlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgY29uc29sZS53YXJuKGAnc3RhdGUnIHNob3VsZCBiZSBhIG1ldGhvZCB0aGF0IHJldHVybnMgYW4gb2JqZWN0IGluICR7ZmlsZVBhdGh9YClcblxuICAgIGNvbnN0IHN0YXRlID0gT2JqZWN0LmFzc2lnbih7fSwgbW9kdWxlRGF0YS5zdGF0ZSlcbiAgICAvLyBBdm9pZCBUeXBlRXJyb3I6IHNldHRpbmcgYSBwcm9wZXJ0eSB0aGF0IGhhcyBvbmx5IGEgZ2V0dGVyIHdoZW4gb3ZlcndyaXRpbmcgdG9wIGxldmVsIGtleXNcbiAgICBtb2R1bGVEYXRhID0gT2JqZWN0LmFzc2lnbih7fSwgbW9kdWxlRGF0YSwgeyBzdGF0ZTogKCkgPT4gc3RhdGUgfSlcbiAgfVxuICByZXR1cm4gbW9kdWxlRGF0YVxufVxuXG5mdW5jdGlvbiByZXNvbHZlU3RvcmVNb2R1bGVzIChtb2R1bGVEYXRhLCBmaWxlbmFtZSkge1xuICBtb2R1bGVEYXRhID0gbW9kdWxlRGF0YS5kZWZhdWx0IHx8IG1vZHVsZURhdGFcbiAgLy8gUmVtb3ZlIHN0b3JlIHNyYyArIGV4dGVuc2lvbiAoLi9mb28vaW5kZXguanMgLT4gZm9vL2luZGV4KVxuICBjb25zdCBuYW1lc3BhY2UgPSBmaWxlbmFtZS5yZXBsYWNlKC9cXC4oanN8bWpzKSQvLCAnJylcbiAgY29uc3QgbmFtZXNwYWNlcyA9IG5hbWVzcGFjZS5zcGxpdCgnLycpXG4gIGxldCBtb2R1bGVOYW1lID0gbmFtZXNwYWNlc1tuYW1lc3BhY2VzLmxlbmd0aCAtIDFdXG4gIGNvbnN0IGZpbGVQYXRoID0gYHN0b3JlLyR7ZmlsZW5hbWV9YFxuXG4gIG1vZHVsZURhdGEgPSBtb2R1bGVOYW1lID09PSAnc3RhdGUnXG4gICAgPyBub3JtYWxpemVTdGF0ZShtb2R1bGVEYXRhLCBmaWxlUGF0aClcbiAgICA6IG5vcm1hbGl6ZU1vZHVsZShtb2R1bGVEYXRhLCBmaWxlUGF0aClcblxuICAvLyBJZiBzcmMgaXMgYSBrbm93biBWdWV4IHByb3BlcnR5XG4gIGlmIChWVUVYX1BST1BFUlRJRVMuaW5jbHVkZXMobW9kdWxlTmFtZSkpIHtcbiAgICBjb25zdCBwcm9wZXJ0eSA9IG1vZHVsZU5hbWVcbiAgICBjb25zdCBzdG9yZU1vZHVsZSA9IGdldFN0b3JlTW9kdWxlKHN0b3JlLCBuYW1lc3BhY2VzLCB7IGlzUHJvcGVydHk6IHRydWUgfSlcblxuICAgIC8vIFJlcGxhY2Ugc3RhdGUgc2luY2UgaXQncyBhIGZ1bmN0aW9uXG4gICAgbWVyZ2VQcm9wZXJ0eShzdG9yZU1vZHVsZSwgbW9kdWxlRGF0YSwgcHJvcGVydHkpXG4gICAgcmV0dXJuXG4gIH1cblxuICAvLyBJZiBmaWxlIGlzIGZvby9pbmRleC5qcywgaXQgc2hvdWxkIGJlIHNhdmVkIGFzIGZvb1xuICBjb25zdCBpc0luZGV4TW9kdWxlID0gKG1vZHVsZU5hbWUgPT09ICdpbmRleCcpXG4gIGlmIChpc0luZGV4TW9kdWxlKSB7XG4gICAgbmFtZXNwYWNlcy5wb3AoKVxuICAgIG1vZHVsZU5hbWUgPSBuYW1lc3BhY2VzW25hbWVzcGFjZXMubGVuZ3RoIC0gMV1cbiAgfVxuXG4gIGNvbnN0IHN0b3JlTW9kdWxlID0gZ2V0U3RvcmVNb2R1bGUoc3RvcmUsIG5hbWVzcGFjZXMpXG5cbiAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiBWVUVYX1BST1BFUlRJRVMpIHtcbiAgICBtZXJnZVByb3BlcnR5KHN0b3JlTW9kdWxlLCBtb2R1bGVEYXRhW3Byb3BlcnR5XSwgcHJvcGVydHkpXG4gIH1cblxuICBpZiAobW9kdWxlRGF0YS5uYW1lc3BhY2VkID09PSBmYWxzZSkge1xuICAgIGRlbGV0ZSBzdG9yZU1vZHVsZS5uYW1lc3BhY2VkXG4gIH1cbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplU3RhdGUgKG1vZHVsZURhdGEsIGZpbGVQYXRoKSB7XG4gIGlmICh0eXBlb2YgbW9kdWxlRGF0YSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIGNvbnNvbGUud2FybihgJHtmaWxlUGF0aH0gc2hvdWxkIGV4cG9ydCBhIG1ldGhvZCB0aGF0IHJldHVybnMgYW4gb2JqZWN0YClcbiAgICBjb25zdCBzdGF0ZSA9IE9iamVjdC5hc3NpZ24oe30sIG1vZHVsZURhdGEpXG4gICAgcmV0dXJuICgpID0+IHN0YXRlXG4gIH1cbiAgcmV0dXJuIG5vcm1hbGl6ZU1vZHVsZShtb2R1bGVEYXRhLCBmaWxlUGF0aClcbn1cblxuZnVuY3Rpb24gZ2V0U3RvcmVNb2R1bGUgKHN0b3JlTW9kdWxlLCBuYW1lc3BhY2VzLCB7IGlzUHJvcGVydHkgPSBmYWxzZSB9ID0ge30pIHtcbiAgLy8gSWYgLi9tdXRhdGlvbnMuanNcbiAgaWYgKCFuYW1lc3BhY2VzLmxlbmd0aCB8fCAoaXNQcm9wZXJ0eSAmJiBuYW1lc3BhY2VzLmxlbmd0aCA9PT0gMSkpIHtcbiAgICByZXR1cm4gc3RvcmVNb2R1bGVcbiAgfVxuXG4gIGNvbnN0IG5hbWVzcGFjZSA9IG5hbWVzcGFjZXMuc2hpZnQoKVxuXG4gIHN0b3JlTW9kdWxlLm1vZHVsZXNbbmFtZXNwYWNlXSA9IHN0b3JlTW9kdWxlLm1vZHVsZXNbbmFtZXNwYWNlXSB8fCB7fVxuICBzdG9yZU1vZHVsZS5tb2R1bGVzW25hbWVzcGFjZV0ubmFtZXNwYWNlZCA9IHRydWVcbiAgc3RvcmVNb2R1bGUubW9kdWxlc1tuYW1lc3BhY2VdLm1vZHVsZXMgPSBzdG9yZU1vZHVsZS5tb2R1bGVzW25hbWVzcGFjZV0ubW9kdWxlcyB8fCB7fVxuXG4gIHJldHVybiBnZXRTdG9yZU1vZHVsZShzdG9yZU1vZHVsZS5tb2R1bGVzW25hbWVzcGFjZV0sIG5hbWVzcGFjZXMsIHsgaXNQcm9wZXJ0eSB9KVxufVxuXG5mdW5jdGlvbiBtZXJnZVByb3BlcnR5IChzdG9yZU1vZHVsZSwgbW9kdWxlRGF0YSwgcHJvcGVydHkpIHtcbiAgaWYgKCFtb2R1bGVEYXRhKSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBpZiAocHJvcGVydHkgPT09ICdzdGF0ZScpIHtcbiAgICBzdG9yZU1vZHVsZS5zdGF0ZSA9IG1vZHVsZURhdGEgfHwgc3RvcmVNb2R1bGUuc3RhdGVcbiAgfSBlbHNlIHtcbiAgICBzdG9yZU1vZHVsZVtwcm9wZXJ0eV0gPSBPYmplY3QuYXNzaWduKHt9LCBzdG9yZU1vZHVsZVtwcm9wZXJ0eV0sIG1vZHVsZURhdGEpXG4gIH1cbn1cbiIsImV4cG9ydCBkZWZhdWx0IHtcInRoZW1lXCI6e1wiZGFya1wiOmZhbHNlLFwidGhlbWVzXCI6e1wibGlnaHRcIjp7XCJwcmltYXJ5XCI6XCIjNTFEREJEXCIsXCJzZWNvbmRhcnlcIjpcIiMyRDRBREVcIixcImFjY2VudFwiOlwiI0ZBN0QyQlwifX19fVxuIiwiaW1wb3J0IFZ1ZSBmcm9tICd2dWUnXG5pbXBvcnQgVnVldGlmeSBmcm9tICd2dWV0aWZ5L2xpYidcblxuaW1wb3J0IG9wdGlvbnMgZnJvbSAnLi9vcHRpb25zJ1xuXG5WdWUudXNlKFZ1ZXRpZnksIHtcbn0pXG5cbmV4cG9ydCBkZWZhdWx0IChjdHgpID0+IHtcbiAgY29uc3QgdnVldGlmeU9wdGlvbnMgPSB0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJyA/IG9wdGlvbnMoY3R4KSA6IG9wdGlvbnNcblxuICB2dWV0aWZ5T3B0aW9ucy5pY29ucyA9IHZ1ZXRpZnlPcHRpb25zLmljb25zIHx8IHt9XG4gIHZ1ZXRpZnlPcHRpb25zLmljb25zLmljb25mb250ID0gJ21kaSdcblxuICBjb25zdCB2dWV0aWZ5ID0gbmV3IFZ1ZXRpZnkodnVldGlmeU9wdGlvbnMpXG5cbiAgY3R4LmFwcC52dWV0aWZ5ID0gdnVldGlmeVxuICBjdHguJHZ1ZXRpZnkgPSB2dWV0aWZ5LmZyYW1ld29ya1xufVxuIiwiaW1wb3J0IEF4aW9zIGZyb20gJ2F4aW9zJ1xuaW1wb3J0IGRlZnUgZnJvbSAnZGVmdSdcblxuLy8gQXhpb3MucHJvdG90eXBlIGNhbm5vdCBiZSBtb2RpZmllZFxuY29uc3QgYXhpb3NFeHRyYSA9IHtcbiAgc2V0QmFzZVVSTCAoYmFzZVVSTCkge1xuICAgIHRoaXMuZGVmYXVsdHMuYmFzZVVSTCA9IGJhc2VVUkxcbiAgfSxcbiAgc2V0SGVhZGVyIChuYW1lLCB2YWx1ZSwgc2NvcGVzID0gJ2NvbW1vbicpIHtcbiAgICBmb3IgKGxldCBzY29wZSBvZiBBcnJheS5pc0FycmF5KHNjb3BlcykgPyBzY29wZXMgOiBbIHNjb3BlcyBdKSB7XG4gICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLmRlZmF1bHRzLmhlYWRlcnNbc2NvcGVdW25hbWVdO1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIHRoaXMuZGVmYXVsdHMuaGVhZGVyc1tzY29wZV1bbmFtZV0gPSB2YWx1ZVxuICAgIH1cbiAgfSxcbiAgc2V0VG9rZW4gKHRva2VuLCB0eXBlLCBzY29wZXMgPSAnY29tbW9uJykge1xuICAgIGNvbnN0IHZhbHVlID0gIXRva2VuID8gbnVsbCA6ICh0eXBlID8gdHlwZSArICcgJyA6ICcnKSArIHRva2VuXG4gICAgdGhpcy5zZXRIZWFkZXIoJ0F1dGhvcml6YXRpb24nLCB2YWx1ZSwgc2NvcGVzKVxuICB9LFxuICBvblJlcXVlc3QoZm4pIHtcbiAgICB0aGlzLmludGVyY2VwdG9ycy5yZXF1ZXN0LnVzZShjb25maWcgPT4gZm4oY29uZmlnKSB8fCBjb25maWcpXG4gIH0sXG4gIG9uUmVzcG9uc2UoZm4pIHtcbiAgICB0aGlzLmludGVyY2VwdG9ycy5yZXNwb25zZS51c2UocmVzcG9uc2UgPT4gZm4ocmVzcG9uc2UpIHx8IHJlc3BvbnNlKVxuICB9LFxuICBvblJlcXVlc3RFcnJvcihmbikge1xuICAgIHRoaXMuaW50ZXJjZXB0b3JzLnJlcXVlc3QudXNlKHVuZGVmaW5lZCwgZXJyb3IgPT4gZm4oZXJyb3IpIHx8IFByb21pc2UucmVqZWN0KGVycm9yKSlcbiAgfSxcbiAgb25SZXNwb25zZUVycm9yKGZuKSB7XG4gICAgdGhpcy5pbnRlcmNlcHRvcnMucmVzcG9uc2UudXNlKHVuZGVmaW5lZCwgZXJyb3IgPT4gZm4oZXJyb3IpIHx8IFByb21pc2UucmVqZWN0KGVycm9yKSlcbiAgfSxcbiAgb25FcnJvcihmbikge1xuICAgIHRoaXMub25SZXF1ZXN0RXJyb3IoZm4pXG4gICAgdGhpcy5vblJlc3BvbnNlRXJyb3IoZm4pXG4gIH0sXG4gIGNyZWF0ZShvcHRpb25zKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUF4aW9zSW5zdGFuY2UoZGVmdShvcHRpb25zLCB0aGlzLmRlZmF1bHRzKSlcbiAgfVxufVxuXG4vLyBSZXF1ZXN0IGhlbHBlcnMgKCRnZXQsICRwb3N0LCAuLi4pXG5mb3IgKGxldCBtZXRob2Qgb2YgWydyZXF1ZXN0JywgJ2RlbGV0ZScsICdnZXQnLCAnaGVhZCcsICdvcHRpb25zJywgJ3Bvc3QnLCAncHV0JywgJ3BhdGNoJ10pIHtcbiAgYXhpb3NFeHRyYVsnJCcgKyBtZXRob2RdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpc1ttZXRob2RdLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykudGhlbihyZXMgPT4gcmVzICYmIHJlcy5kYXRhKSB9XG59XG5cbmNvbnN0IGV4dGVuZEF4aW9zSW5zdGFuY2UgPSBheGlvcyA9PiB7XG4gIGZvciAobGV0IGtleSBpbiBheGlvc0V4dHJhKSB7XG4gICAgYXhpb3Nba2V5XSA9IGF4aW9zRXh0cmFba2V5XS5iaW5kKGF4aW9zKVxuICB9XG59XG5cbmNvbnN0IGNyZWF0ZUF4aW9zSW5zdGFuY2UgPSBheGlvc09wdGlvbnMgPT4ge1xuICAvLyBDcmVhdGUgbmV3IGF4aW9zIGluc3RhbmNlXG4gIGNvbnN0IGF4aW9zID0gQXhpb3MuY3JlYXRlKGF4aW9zT3B0aW9ucylcbiAgYXhpb3MuQ2FuY2VsVG9rZW4gPSBBeGlvcy5DYW5jZWxUb2tlblxuICBheGlvcy5pc0NhbmNlbCA9IEF4aW9zLmlzQ2FuY2VsXG5cbiAgLy8gRXh0ZW5kIGF4aW9zIHByb3RvXG4gIGV4dGVuZEF4aW9zSW5zdGFuY2UoYXhpb3MpXG5cbiAgLy8gU2V0dXAgaW50ZXJjZXB0b3JzXG5cbiAgc2V0dXBQcm9ncmVzcyhheGlvcylcblxuICByZXR1cm4gYXhpb3Ncbn1cblxuY29uc3Qgc2V0dXBQcm9ncmVzcyA9IChheGlvcykgPT4ge1xuICBpZiAocHJvY2Vzcy5zZXJ2ZXIpIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIC8vIEEgbm9vcCBsb2FkaW5nIGludGV0ZXJmYWNlIGZvciB3aGVuICRudXh0IGlzIG5vdCB5ZXQgcmVhZHlcbiAgY29uc3Qgbm9vcExvYWRpbmcgPSB7XG4gICAgZmluaXNoOiAoKSA9PiB7IH0sXG4gICAgc3RhcnQ6ICgpID0+IHsgfSxcbiAgICBmYWlsOiAoKSA9PiB7IH0sXG4gICAgc2V0OiAoKSA9PiB7IH1cbiAgfVxuXG4gIGNvbnN0ICRsb2FkaW5nID0gKCkgPT4gKHdpbmRvdy4kbnV4dCAmJiB3aW5kb3cuJG51eHQuJGxvYWRpbmcgJiYgd2luZG93LiRudXh0LiRsb2FkaW5nLnNldCkgPyB3aW5kb3cuJG51eHQuJGxvYWRpbmcgOiBub29wTG9hZGluZ1xuXG4gIGxldCBjdXJyZW50UmVxdWVzdHMgPSAwXG5cbiAgYXhpb3Mub25SZXF1ZXN0KGNvbmZpZyA9PiB7XG4gICAgaWYgKGNvbmZpZyAmJiBjb25maWcucHJvZ3Jlc3MgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjdXJyZW50UmVxdWVzdHMrK1xuICB9KVxuXG4gIGF4aW9zLm9uUmVzcG9uc2UocmVzcG9uc2UgPT4ge1xuICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS5jb25maWcgJiYgcmVzcG9uc2UuY29uZmlnLnByb2dyZXNzID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY3VycmVudFJlcXVlc3RzLS1cbiAgICBpZiAoY3VycmVudFJlcXVlc3RzIDw9IDApIHtcbiAgICAgIGN1cnJlbnRSZXF1ZXN0cyA9IDBcbiAgICAgICRsb2FkaW5nKCkuZmluaXNoKClcbiAgICB9XG4gIH0pXG5cbiAgYXhpb3Mub25FcnJvcihlcnJvciA9PiB7XG4gICAgaWYgKGVycm9yICYmIGVycm9yLmNvbmZpZyAmJiBlcnJvci5jb25maWcucHJvZ3Jlc3MgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjdXJyZW50UmVxdWVzdHMtLVxuXG4gICAgaWYgKEF4aW9zLmlzQ2FuY2VsKGVycm9yKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgJGxvYWRpbmcoKS5mYWlsKClcbiAgICAkbG9hZGluZygpLmZpbmlzaCgpXG4gIH0pXG5cbiAgY29uc3Qgb25Qcm9ncmVzcyA9IGUgPT4ge1xuICAgIGlmICghY3VycmVudFJlcXVlc3RzKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3QgcHJvZ3Jlc3MgPSAoKGUubG9hZGVkICogMTAwKSAvIChlLnRvdGFsICogY3VycmVudFJlcXVlc3RzKSlcbiAgICAkbG9hZGluZygpLnNldChNYXRoLm1pbigxMDAsIHByb2dyZXNzKSlcbiAgfVxuXG4gIGF4aW9zLmRlZmF1bHRzLm9uVXBsb2FkUHJvZ3Jlc3MgPSBvblByb2dyZXNzXG4gIGF4aW9zLmRlZmF1bHRzLm9uRG93bmxvYWRQcm9ncmVzcyA9IG9uUHJvZ3Jlc3Ncbn1cblxuZXhwb3J0IGRlZmF1bHQgKGN0eCwgaW5qZWN0KSA9PiB7XG4gIC8vIGJhc2VVUkxcbiAgY29uc3QgYmFzZVVSTCA9IHByb2Nlc3MuYnJvd3NlclxuICAgICAgPyAnaHR0cDovL2xvY2FsaG9zdDozMDAwLydcbiAgICAgIDogKHByb2Nlc3MuZW52Ll9BWElPU19CQVNFX1VSTF8gfHwgJ2h0dHA6Ly9sb2NhbGhvc3Q6MzAwMC8nKVxuXG4gIC8vIENyZWF0ZSBmcmVzaCBvYmplY3RzIGZvciBhbGwgZGVmYXVsdCBoZWFkZXIgc2NvcGVzXG4gIC8vIEF4aW9zIGNyZWF0ZXMgb25seSBvbmUgd2hpY2ggaXMgc2hhcmVkIGFjcm9zcyBTU1IgcmVxdWVzdHMhXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9temFicmlza2llL2F4aW9zL2Jsb2IvbWFzdGVyL2xpYi9kZWZhdWx0cy5qc1xuICBjb25zdCBoZWFkZXJzID0ge1xuICAgIFwiY29tbW9uXCI6IHtcbiAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L3BsYWluLCAqLypcIlxuICAgIH0sXG4gICAgXCJkZWxldGVcIjoge30sXG4gICAgXCJnZXRcIjoge30sXG4gICAgXCJoZWFkXCI6IHt9LFxuICAgIFwicG9zdFwiOiB7fSxcbiAgICBcInB1dFwiOiB7fSxcbiAgICBcInBhdGNoXCI6IHt9XG59XG5cbiAgY29uc3QgYXhpb3NPcHRpb25zID0ge1xuICAgIGJhc2VVUkwsXG4gICAgaGVhZGVyc1xuICB9XG5cbiAgLy8gUHJveHkgU1NSIHJlcXVlc3QgaGVhZGVycyBoZWFkZXJzXG4gIGF4aW9zT3B0aW9ucy5oZWFkZXJzLmNvbW1vbiA9IChjdHgucmVxICYmIGN0eC5yZXEuaGVhZGVycykgPyBPYmplY3QuYXNzaWduKHt9LCBjdHgucmVxLmhlYWRlcnMpIDoge31cbiAgZGVsZXRlIGF4aW9zT3B0aW9ucy5oZWFkZXJzLmNvbW1vblsnYWNjZXB0J11cbiAgZGVsZXRlIGF4aW9zT3B0aW9ucy5oZWFkZXJzLmNvbW1vblsnaG9zdCddXG4gIGRlbGV0ZSBheGlvc09wdGlvbnMuaGVhZGVycy5jb21tb25bJ2NmLXJheSddXG4gIGRlbGV0ZSBheGlvc09wdGlvbnMuaGVhZGVycy5jb21tb25bJ2NmLWNvbm5lY3RpbmctaXAnXVxuICBkZWxldGUgYXhpb3NPcHRpb25zLmhlYWRlcnMuY29tbW9uWydjb250ZW50LWxlbmd0aCddXG4gIGRlbGV0ZSBheGlvc09wdGlvbnMuaGVhZGVycy5jb21tb25bJ2NvbnRlbnQtbWQ1J11cbiAgZGVsZXRlIGF4aW9zT3B0aW9ucy5oZWFkZXJzLmNvbW1vblsnY29udGVudC10eXBlJ11cblxuICBpZiAocHJvY2Vzcy5zZXJ2ZXIpIHtcbiAgICAvLyBEb24ndCBhY2NlcHQgYnJvdGxpIGVuY29kaW5nIGJlY2F1c2UgTm9kZSBjYW4ndCBwYXJzZSBpdFxuICAgIGF4aW9zT3B0aW9ucy5oZWFkZXJzLmNvbW1vblsnYWNjZXB0LWVuY29kaW5nJ10gPSAnZ3ppcCwgZGVmbGF0ZSdcbiAgfVxuXG4gIGNvbnN0IGF4aW9zID0gY3JlYXRlQXhpb3NJbnN0YW5jZShheGlvc09wdGlvbnMpXG5cbiAgLy8gSW5qZWN0IGF4aW9zIHRvIHRoZSBjb250ZXh0IGFzICRheGlvc1xuICBjdHguJGF4aW9zID0gYXhpb3NcbiAgaW5qZWN0KCdheGlvcycsIGF4aW9zKVxufVxuIiwiaW1wb3J0IFZ1ZSBmcm9tICd2dWUnXG5pbXBvcnQgTWV0YSBmcm9tICd2dWUtbWV0YSdcbmltcG9ydCBDbGllbnRPbmx5IGZyb20gJ3Z1ZS1jbGllbnQtb25seSdcbmltcG9ydCBOb1NzciBmcm9tICd2dWUtbm8tc3NyJ1xuaW1wb3J0IHsgY3JlYXRlUm91dGVyIH0gZnJvbSAnLi9yb3V0ZXIuanMnXG5pbXBvcnQgTnV4dENoaWxkIGZyb20gJy4vY29tcG9uZW50cy9udXh0LWNoaWxkLmpzJ1xuaW1wb3J0IE51eHRFcnJvciBmcm9tICcuLi9sYXlvdXRzL2Vycm9yLnZ1ZSdcbmltcG9ydCBOdXh0IGZyb20gJy4vY29tcG9uZW50cy9udXh0LmpzJ1xuaW1wb3J0IEFwcCBmcm9tICcuL0FwcC5qcydcbmltcG9ydCB7IHNldENvbnRleHQsIGdldExvY2F0aW9uLCBnZXRSb3V0ZURhdGEsIG5vcm1hbGl6ZUVycm9yIH0gZnJvbSAnLi91dGlscydcbmltcG9ydCB7IGNyZWF0ZVN0b3JlIH0gZnJvbSAnLi9zdG9yZS5qcydcblxuLyogUGx1Z2lucyAqL1xuXG5pbXBvcnQgbnV4dF9wbHVnaW5fcGx1Z2luXzg3M2I5MmU2IGZyb20gJ251eHRfcGx1Z2luX3BsdWdpbl84NzNiOTJlNicgLy8gU291cmNlOiAuL3Z1ZXRpZnkvcGx1Z2luLmpzIChtb2RlOiAnYWxsJylcbmltcG9ydCBudXh0X3BsdWdpbl9heGlvc180MGEwZjk5NyBmcm9tICdudXh0X3BsdWdpbl9heGlvc180MGEwZjk5NycgLy8gU291cmNlOiAuL2F4aW9zLmpzIChtb2RlOiAnYWxsJylcblxuLy8gQ29tcG9uZW50OiA8Q2xpZW50T25seT5cblZ1ZS5jb21wb25lbnQoQ2xpZW50T25seS5uYW1lLCBDbGllbnRPbmx5KVxuXG4vLyBUT0RPOiBSZW1vdmUgaW4gTnV4dCAzOiA8Tm9Tc3I+XG5WdWUuY29tcG9uZW50KE5vU3NyLm5hbWUsIHtcbiAgLi4uTm9Tc3IsXG4gIHJlbmRlciAoaCwgY3R4KSB7XG4gICAgaWYgKHByb2Nlc3MuY2xpZW50ICYmICFOb1Nzci5fd2FybmVkKSB7XG4gICAgICBOb1Nzci5fd2FybmVkID0gdHJ1ZVxuXG4gICAgICBjb25zb2xlLndhcm4oJzxuby1zc3I+IGhhcyBiZWVuIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBOdXh0IDMsIHBsZWFzZSB1c2UgPGNsaWVudC1vbmx5PiBpbnN0ZWFkJylcbiAgICB9XG4gICAgcmV0dXJuIE5vU3NyLnJlbmRlcihoLCBjdHgpXG4gIH1cbn0pXG5cbi8vIENvbXBvbmVudDogPE51eHRDaGlsZD5cblZ1ZS5jb21wb25lbnQoTnV4dENoaWxkLm5hbWUsIE51eHRDaGlsZClcblZ1ZS5jb21wb25lbnQoJ05DaGlsZCcsIE51eHRDaGlsZClcblxuLy8gQ29tcG9uZW50IE51eHRMaW5rIGlzIGltcG9ydGVkIGluIHNlcnZlci5qcyBvciBjbGllbnQuanNcblxuLy8gQ29tcG9uZW50OiA8TnV4dD5cblZ1ZS5jb21wb25lbnQoTnV4dC5uYW1lLCBOdXh0KVxuXG5WdWUudXNlKE1ldGEsIHtcImtleU5hbWVcIjpcImhlYWRcIixcImF0dHJpYnV0ZVwiOlwiZGF0YS1uLWhlYWRcIixcInNzckF0dHJpYnV0ZVwiOlwiZGF0YS1uLWhlYWQtc3NyXCIsXCJ0YWdJREtleU5hbWVcIjpcImhpZFwifSlcblxuY29uc3QgZGVmYXVsdFRyYW5zaXRpb24gPSB7XCJuYW1lXCI6XCJwYWdlXCIsXCJtb2RlXCI6XCJvdXQtaW5cIixcImFwcGVhclwiOnRydWUsXCJhcHBlYXJDbGFzc1wiOlwiYXBwZWFyXCIsXCJhcHBlYXJBY3RpdmVDbGFzc1wiOlwiYXBwZWFyLWFjdGl2ZVwiLFwiYXBwZWFyVG9DbGFzc1wiOlwiYXBwZWFyLXRvXCJ9XG5cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUFwcCAoc3NyQ29udGV4dCkge1xuICBjb25zdCByb3V0ZXIgPSBhd2FpdCBjcmVhdGVSb3V0ZXIoc3NyQ29udGV4dClcblxuICBjb25zdCBzdG9yZSA9IGNyZWF0ZVN0b3JlKHNzckNvbnRleHQpXG4gIC8vIEFkZCB0aGlzLiRyb3V0ZXIgaW50byBzdG9yZSBhY3Rpb25zL211dGF0aW9uc1xuICBzdG9yZS4kcm91dGVyID0gcm91dGVyXG5cbiAgLy8gQ3JlYXRlIFJvb3QgaW5zdGFuY2VcblxuICAvLyBoZXJlIHdlIGluamVjdCB0aGUgcm91dGVyIGFuZCBzdG9yZSB0byBhbGwgY2hpbGQgY29tcG9uZW50cyxcbiAgLy8gbWFraW5nIHRoZW0gYXZhaWxhYmxlIGV2ZXJ5d2hlcmUgYXMgYHRoaXMuJHJvdXRlcmAgYW5kIGB0aGlzLiRzdG9yZWAuXG4gIGNvbnN0IGFwcCA9IHtcbiAgICBzdG9yZSxcbiAgICByb3V0ZXIsXG4gICAgbnV4dDoge1xuICAgICAgZGVmYXVsdFRyYW5zaXRpb24sXG4gICAgICB0cmFuc2l0aW9uczogW2RlZmF1bHRUcmFuc2l0aW9uXSxcbiAgICAgIHNldFRyYW5zaXRpb25zICh0cmFuc2l0aW9ucykge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodHJhbnNpdGlvbnMpKSB7XG4gICAgICAgICAgdHJhbnNpdGlvbnMgPSBbdHJhbnNpdGlvbnNdXG4gICAgICAgIH1cbiAgICAgICAgdHJhbnNpdGlvbnMgPSB0cmFuc2l0aW9ucy5tYXAoKHRyYW5zaXRpb24pID0+IHtcbiAgICAgICAgICBpZiAoIXRyYW5zaXRpb24pIHtcbiAgICAgICAgICAgIHRyYW5zaXRpb24gPSBkZWZhdWx0VHJhbnNpdGlvblxuICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHRyYW5zaXRpb24gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0cmFuc2l0aW9uID0gT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdFRyYW5zaXRpb24sIHsgbmFtZTogdHJhbnNpdGlvbiB9KVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0cmFuc2l0aW9uID0gT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdFRyYW5zaXRpb24sIHRyYW5zaXRpb24pXG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0cmFuc2l0aW9uXG4gICAgICAgIH0pXG4gICAgICAgIHRoaXMuJG9wdGlvbnMubnV4dC50cmFuc2l0aW9ucyA9IHRyYW5zaXRpb25zXG4gICAgICAgIHJldHVybiB0cmFuc2l0aW9uc1xuICAgICAgfSxcblxuICAgICAgZXJyOiBudWxsLFxuICAgICAgZGF0ZUVycjogbnVsbCxcbiAgICAgIGVycm9yIChlcnIpIHtcbiAgICAgICAgZXJyID0gZXJyIHx8IG51bGxcbiAgICAgICAgYXBwLmNvbnRleHQuX2Vycm9yZWQgPSBCb29sZWFuKGVycilcbiAgICAgICAgZXJyID0gZXJyID8gbm9ybWFsaXplRXJyb3IoZXJyKSA6IG51bGxcbiAgICAgICAgY29uc3QgbnV4dCA9IHRoaXMubnV4dCB8fCB0aGlzLiRvcHRpb25zLm51eHRcbiAgICAgICAgbnV4dC5kYXRlRXJyID0gRGF0ZS5ub3coKVxuICAgICAgICBudXh0LmVyciA9IGVyclxuICAgICAgICAvLyBVc2VkIGluIHNyYy9zZXJ2ZXIuanNcbiAgICAgICAgaWYgKHNzckNvbnRleHQpIHtcbiAgICAgICAgICBzc3JDb250ZXh0Lm51eHQuZXJyb3IgPSBlcnJcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZXJyXG4gICAgICB9XG4gICAgfSxcbiAgICAuLi5BcHBcbiAgfVxuXG4gIC8vIE1ha2UgYXBwIGF2YWlsYWJsZSBpbnRvIHN0b3JlIHZpYSB0aGlzLmFwcFxuICBzdG9yZS5hcHAgPSBhcHBcblxuICBjb25zdCBuZXh0ID0gc3NyQ29udGV4dCA/IHNzckNvbnRleHQubmV4dCA6IGxvY2F0aW9uID0+IGFwcC5yb3V0ZXIucHVzaChsb2NhdGlvbilcbiAgLy8gUmVzb2x2ZSByb3V0ZVxuICBsZXQgcm91dGVcbiAgaWYgKHNzckNvbnRleHQpIHtcbiAgICByb3V0ZSA9IHJvdXRlci5yZXNvbHZlKHNzckNvbnRleHQudXJsKS5yb3V0ZVxuICB9IGVsc2Uge1xuICAgIGNvbnN0IHBhdGggPSBnZXRMb2NhdGlvbihyb3V0ZXIub3B0aW9ucy5iYXNlLCByb3V0ZXIub3B0aW9ucy5tb2RlKVxuICAgIHJvdXRlID0gcm91dGVyLnJlc29sdmUocGF0aCkucm91dGVcbiAgfVxuXG4gIC8vIFNldCBjb250ZXh0IHRvIGFwcC5jb250ZXh0XG4gIGF3YWl0IHNldENvbnRleHQoYXBwLCB7XG4gICAgc3RvcmUsXG4gICAgcm91dGUsXG4gICAgbmV4dCxcbiAgICBlcnJvcjogYXBwLm51eHQuZXJyb3IuYmluZChhcHApLFxuICAgIHBheWxvYWQ6IHNzckNvbnRleHQgPyBzc3JDb250ZXh0LnBheWxvYWQgOiB1bmRlZmluZWQsXG4gICAgcmVxOiBzc3JDb250ZXh0ID8gc3NyQ29udGV4dC5yZXEgOiB1bmRlZmluZWQsXG4gICAgcmVzOiBzc3JDb250ZXh0ID8gc3NyQ29udGV4dC5yZXMgOiB1bmRlZmluZWQsXG4gICAgYmVmb3JlUmVuZGVyRm5zOiBzc3JDb250ZXh0ID8gc3NyQ29udGV4dC5iZWZvcmVSZW5kZXJGbnMgOiB1bmRlZmluZWQsXG4gICAgc3NyQ29udGV4dFxuICB9KVxuXG4gIGNvbnN0IGluamVjdCA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgaWYgKCFrZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW5qZWN0KGtleSwgdmFsdWUpIGhhcyBubyBrZXkgcHJvdmlkZWQnKVxuICAgIH1cbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbmplY3Qoa2V5LCB2YWx1ZSkgaGFzIG5vIHZhbHVlIHByb3ZpZGVkJylcbiAgICB9XG5cbiAgICBrZXkgPSAnJCcgKyBrZXlcbiAgICAvLyBBZGQgaW50byBhcHBcbiAgICBhcHBba2V5XSA9IHZhbHVlXG5cbiAgICAvLyBBZGQgaW50byBzdG9yZVxuICAgIHN0b3JlW2tleV0gPSBhcHBba2V5XVxuXG4gICAgLy8gQ2hlY2sgaWYgcGx1Z2luIG5vdCBhbHJlYWR5IGluc3RhbGxlZFxuICAgIGNvbnN0IGluc3RhbGxLZXkgPSAnX19udXh0XycgKyBrZXkgKyAnX2luc3RhbGxlZF9fJ1xuICAgIGlmIChWdWVbaW5zdGFsbEtleV0pIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBWdWVbaW5zdGFsbEtleV0gPSB0cnVlXG4gICAgLy8gQ2FsbCBWdWUudXNlKCkgdG8gaW5zdGFsbCB0aGUgcGx1Z2luIGludG8gdm1cbiAgICBWdWUudXNlKCgpID0+IHtcbiAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKFZ1ZSwga2V5KSkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVnVlLnByb3RvdHlwZSwga2V5LCB7XG4gICAgICAgICAgZ2V0ICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLiRyb290LiRvcHRpb25zW2tleV1cbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGlmIChwcm9jZXNzLmNsaWVudCkge1xuICAgIC8vIFJlcGxhY2Ugc3RvcmUgc3RhdGUgYmVmb3JlIHBsdWdpbnMgZXhlY3V0aW9uXG4gICAgaWYgKHdpbmRvdy5fX05VWFRfXyAmJiB3aW5kb3cuX19OVVhUX18uc3RhdGUpIHtcbiAgICAgIHN0b3JlLnJlcGxhY2VTdGF0ZSh3aW5kb3cuX19OVVhUX18uc3RhdGUpXG4gICAgfVxuICB9XG5cbiAgLy8gUGx1Z2luIGV4ZWN1dGlvblxuXG4gIGlmICh0eXBlb2YgbnV4dF9wbHVnaW5fcGx1Z2luXzg3M2I5MmU2ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgYXdhaXQgbnV4dF9wbHVnaW5fcGx1Z2luXzg3M2I5MmU2KGFwcC5jb250ZXh0LCBpbmplY3QpXG4gIH1cblxuICBpZiAodHlwZW9mIG51eHRfcGx1Z2luX2F4aW9zXzQwYTBmOTk3ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgYXdhaXQgbnV4dF9wbHVnaW5fYXhpb3NfNDBhMGY5OTcoYXBwLmNvbnRleHQsIGluamVjdClcbiAgfVxuXG4gIC8vIElmIHNlcnZlci1zaWRlLCB3YWl0IGZvciBhc3luYyBjb21wb25lbnQgdG8gYmUgcmVzb2x2ZWQgZmlyc3RcbiAgaWYgKHByb2Nlc3Muc2VydmVyICYmIHNzckNvbnRleHQgJiYgc3NyQ29udGV4dC51cmwpIHtcbiAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICByb3V0ZXIucHVzaChzc3JDb250ZXh0LnVybCwgcmVzb2x2ZSwgKCkgPT4ge1xuICAgICAgICAvLyBuYXZpZ2F0ZWQgdG8gYSBkaWZmZXJlbnQgcm91dGUgaW4gcm91dGVyIGd1YXJkXG4gICAgICAgIGNvbnN0IHVucmVnaXN0ZXIgPSByb3V0ZXIuYWZ0ZXJFYWNoKGFzeW5jICh0bywgZnJvbSwgbmV4dCkgPT4ge1xuICAgICAgICAgIHNzckNvbnRleHQudXJsID0gdG8uZnVsbFBhdGhcbiAgICAgICAgICBhcHAuY29udGV4dC5yb3V0ZSA9IGF3YWl0IGdldFJvdXRlRGF0YSh0bylcbiAgICAgICAgICBhcHAuY29udGV4dC5wYXJhbXMgPSB0by5wYXJhbXMgfHwge31cbiAgICAgICAgICBhcHAuY29udGV4dC5xdWVyeSA9IHRvLnF1ZXJ5IHx8IHt9XG4gICAgICAgICAgdW5yZWdpc3RlcigpXG4gICAgICAgICAgcmVzb2x2ZSgpXG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICByZXR1cm4ge1xuICAgIHN0b3JlLFxuICAgIGFwcCxcbiAgICByb3V0ZXJcbiAgfVxufVxuXG5leHBvcnQgeyBjcmVhdGVBcHAsIE51eHRFcnJvciB9XG4iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///27\n")},74:function(module,exports,__webpack_require__){eval("// style-loader: Adds some css to the DOM by adding a
Loading...
- + diff --git a/engine-docs/src/main/resources/docs-for-nb/01_nosqlbench/index.md b/engine-docs/src/main/resources/docs-for-nb/01_nosqlbench/index.md index 0cca1fc96..d357e0ba5 100644 --- a/engine-docs/src/main/resources/docs-for-nb/01_nosqlbench/index.md +++ b/engine-docs/src/main/resources/docs-for-nb/01_nosqlbench/index.md @@ -1,5 +1,5 @@ --- -title: Introducing nosqlbench +title: Introducing NoSQLBench weight: 10 --- @@ -8,21 +8,11 @@ weight: 10 Welcome to the documentation for NoSQLBench. This is a power tool that emulates real application workloads. This means that you can fast-track performance, sizing and data model testing without writing your own testing harness. -NoSQLBench endeavors to be valuable to all users. We do this by making it easy for you, our user, to -do just what you need without worrying about the rest. If you need to do something simple, it should -be simple to find the right settings and just do it. If you need something more sophisticated, then you -should be able to find what you need with a reasonable amount of effort and no surprises. - -Doing this well requires a coordinated effort in how the tools are documented and layered. We're just -getting started with the bundled docs that you are reading now. Look for new and expanded content in this -guidebook with each major release. We will be adding docs for more advanced users to unlock based on a how-to format. - - ## What is NoSQLBench? NoSQLBench is a serious performance testing tool for the NoSQL ecosystem. -It brings together features and capabilities that are not found in any -other tool. + +**NoSQLBench brings advanced testing capabilities into one tool that are not found in other testing tools.** - You can run common testing workloads directly from the command line. You can start doing this within 5 minutes of reading this. @@ -66,4 +56,12 @@ limited to testing only one type of system. It is our wish to build a community of users and practice around this project so that everyone in the NoSQL ecosystem can benefit from common concepts and understanding and reliable patterns of use. +## Scalable User Experience + +NoSQLBench endeavors to be valuable to all users. We do this by making it easy for you, our user, to +do just what you need without worrying about the rest. If you need to do something simple, it should +be simple to find the right settings and just do it. If you need something more sophisticated, then you +should be able to find what you need with a reasonable amount of effort and no surprises. + +That is the core design principle behind NoSQLBench. We hope you like it. diff --git a/engine-docs/src/main/resources/docs-for-nb/02_getting_started/02_running.md b/engine-docs/src/main/resources/docs-for-nb/02_getting_started/01_example_commands.md similarity index 96% rename from engine-docs/src/main/resources/docs-for-nb/02_getting_started/02_running.md rename to engine-docs/src/main/resources/docs-for-nb/02_getting_started/01_example_commands.md index 9d50f2c90..26561e13b 100644 --- a/engine-docs/src/main/resources/docs-for-nb/02_getting_started/02_running.md +++ b/engine-docs/src/main/resources/docs-for-nb/02_getting_started/01_example_commands.md @@ -1,19 +1,19 @@ --- -title: 02 Running +title: 01 Commands weight: 2 --- -# 2. Running nosqlbench +Let's run a simple test against a cluster to establish some basic familiarity with the NoSQLBench. -Now that we have nosqlbench installed, we will run a simple test against a DSE cluster to establish some basic familiarity with the tool. - -## Create Schema +## Create a Schema We will start by creating a simple schema in the database. From your command line, go ahead and execute the following command, replacing the `host=` with that of one of your database nodes. - ./nb run type=cql yaml=baselines/cql-keyvalue tags=phase:schema host= +``` +./nb run type=cql yaml=baselines/cql-keyvalue tags=phase:schema host= +``` This command is creating the following schema in your database: @@ -100,7 +100,7 @@ baselines/cql-keyvalue: 8.87%/Running (details: min=0 cycle=8868 max=100000) baselines/cql-keyvalue: 100.00%/Finished (details: min=0 cycle=100000 max=100000) ``` -## Run main workload +## Run the main test phase Now that we have a base dataset of 100k rows in the database, we will now run a mixed read / write workload, by default this runs a 50% read / 50% write workload. diff --git a/engine-docs/src/main/resources/docs-for-nb/02_getting_started/01_your_first_run.md b/engine-docs/src/main/resources/docs-for-nb/02_getting_started/01_your_first_run.md deleted file mode 100644 index 25601f657..000000000 --- a/engine-docs/src/main/resources/docs-for-nb/02_getting_started/01_your_first_run.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -title: Your first run -weight: 1 ---- - -If you are on Linux, you should be able to start getting useful results immediately with this command: - - - -1. `./nb run type=cql yaml=baselines/cql-iot tags=phase:schema` -2. `./nb run type=cql yaml=baselines/cql-iot tags=phase:main diff --git a/engine-docs/src/main/resources/docs-for-nb/02_getting_started/03_getting_results.md b/engine-docs/src/main/resources/docs-for-nb/02_getting_started/02_example_results.md similarity index 74% rename from engine-docs/src/main/resources/docs-for-nb/02_getting_started/03_getting_results.md rename to engine-docs/src/main/resources/docs-for-nb/02_getting_started/02_example_results.md index 31c9f9521..031528c53 100644 --- a/engine-docs/src/main/resources/docs-for-nb/02_getting_started/03_getting_results.md +++ b/engine-docs/src/main/resources/docs-for-nb/02_getting_started/02_example_results.md @@ -1,22 +1,24 @@ --- -title: 03 Getting Results +title: 02 Results weight: 3 --- -# 3. Getting Results - -Coming off of our first run with nosqlbench, we ran a very simple workload against our database. In that example, we saw that nosqlbench writes to a log file and it is in that log file where the most basic form of metrics are displayed. +We just ran a very simple workload against our database. In that example, we saw that +nosqlbench writes to a log file and it is in that log file where the most basic form of metrics are displayed. ## Log File Metrics For our previous run, we saw that nosqlbench was writing to `logs/scenario_20190812_154431_028.log` -Even when you don't configure nosqlbench to write its metrics to another location, it will periodically report all the metrics to the log file. -At the end of a scenario, before nosqlbench shuts down, it will flush the partial reporting interval again to the logs. This means you can always -look in the logs for metrics information. +Even when you don't configure nosqlbench to write its metrics to another location, it +will periodically report all the metrics to the log file. At the end of a scenario, +before nosqlbench shuts down, it will flush the partial reporting interval again to +the logs. This means you can always look in the logs for metrics information. :::warning -If you look in the logs for metrics, be aware that the last report will only contain a partial interval of results. When looking at the last partial window, only metrics which average over time or which compute the mean for the whole test will be meaningful. +If you look in the logs for metrics, be aware that the last report will only contain a +partial interval of results. When looking at the last partial window, only metrics which +average over time or which compute the mean for the whole test will be meaningful. ::: diff --git a/engine-docs/src/main/resources/docs-for-nb/02_getting_started/04_reading_metrics.md b/engine-docs/src/main/resources/docs-for-nb/02_getting_started/03_reading_metrics.md similarity index 61% rename from engine-docs/src/main/resources/docs-for-nb/02_getting_started/04_reading_metrics.md rename to engine-docs/src/main/resources/docs-for-nb/02_getting_started/03_reading_metrics.md index 40e8d5500..68664c4ab 100644 --- a/engine-docs/src/main/resources/docs-for-nb/02_getting_started/04_reading_metrics.md +++ b/engine-docs/src/main/resources/docs-for-nb/02_getting_started/03_reading_metrics.md @@ -1,17 +1,22 @@ --- -title: 04 Reading Metrics +title: 03 Metrics weight: 4 --- -# 4. Reading Metrics - -A set of core metrics are provided for every workload that runs with nosqlbench, regardless of the activity type and protocol used. This section explains each of these metrics and shows an example of them from the log file. +A set of core metrics are provided for every workload that runs with nosqlbench, + regardless of the activity type and protocol used. This section explains each of + these metrics and shows an example of them from the log file. ## metric: result -This is the primary metric that should be used to get a quick idea of the throughput and latency for a given run. It encapsulates the entire operation life cycle ( ie. bind, execute, get result back ). +This is the primary metric that should be used to get a quick idea of the +throughput and latency for a given run. It encapsulates the entire +operation life cycle ( ie. bind, execute, get result back ). -For this example we see that we averaged 3732 operations / second with 3.6ms 75th percentile latency and 23.9ms 99th percentile latency. Note the raw metrics are in microseconds. This duration_unit may change depending on how a user configures nosqlbench, so always double-check it. +For this example we see that we averaged 3732 operations / second with 3.6ms + 75th percentile latency and 23.9ms 99th percentile latency. Note the raw metrics are + in microseconds. This duration_unit may change depending on how a user configures + nosqlbench, so always double-check it. ``` 2019-08-12 15:46:01,310 INFO [main] i.e.c.ScenarioResult [Slf4jReporter.java:373] type=TIMER, name=baselines/cql-keyvalue.result, count=100000, min=233.48, max=358596.607, mean=3732.00338612, stddev=10254.850416061185, median=1874.815, p75=3648.767, p95=10115.071, p98=15855.615, p99=23916.543, p999=111292.415, mean_rate=4024.0234405430424, m1=3514.053841156124, m5=3307.431472596865, m15=3268.6786509004132, rate_unit=events/second, duration_unit=microseconds @@ -19,9 +24,13 @@ For this example we see that we averaged 3732 operations / second with 3.6ms 75t ## metric: result-success -This metric shows whether there were any errors during the run. You can confirm that the count is equal to the number of cycles for the run if you are expecting or requiring zero failed operations. +This metric shows whether there were any errors during the run. You can confirm that + the count is equal to the number of cycles for the run if + you are expecting or requiring zero failed operations. -Here we see that all 100k of our cycles succeeded. Note that the metrics for throughput and latency here are slightly different than the `results` metric simply because this is a separate timer that only includes operations which completed with no exceptions. +Here we see that all 100k of our cycles succeeded. Note that the metrics for throughput +and latency here are slightly different than the `results` metric simply because this + is a separate timer that only includes operations which completed with no exceptions. ``` 2019-08-12 15:46:01,452 INFO [main] i.e.c.ScenarioResult [Slf4jReporter.java:373] type=TIMER, name=baselines/cql-keyvalue.result-success, count=100000, min=435.168, max=358645.759, mean=3752.40990808, stddev=10251.524945886964, median=1889.791, p75=3668.479, p95=10154.495, p98=15884.287, p99=24280.063, p999=111443.967, mean_rate=4003.3090048756894, m1=3523.40328629036, m5=3318.8463896065778, m15=3280.480326762243, rate_unit=events/second, duration_unit=microseconds @@ -29,16 +38,19 @@ Here we see that all 100k of our cycles succeeded. Note that the metrics for thr ## metric: resultset-size -For read workloads, this metric shows the size of result sent back to nosqlbench from the server. This is useful to confirm that you are reading rows that already exist in the database. +For read workloads, this metric shows the size of result sent back to nosqlbench +from the server. This is useful to confirm that you are reading rows that already +exist in the database. -TODO: talk about mix of read / writes and how that affects this metric ``` 2019-08-12 15:46:00,298 INFO [main] i.e.c.ScenarioResult [Slf4jReporter.java:373] type=HISTOGRAM, name=baselines/cql-keyvalue.resultset-size, count=100000, min=0, max=1, mean=8.0E-5, stddev=0.008943914131967056, median=0.0, p75=0.0, p95=0.0, p98=0.0, p99=0.0, p999=0.0 ``` #### metric: tries -nosqlbench will retry failures 10 times by default, this is configurable via the `maxtries` command line option < link >. This metric shows a histogram of the number of tries that each operation required, in this example, there were no retries as the `count` is 100k. +nosqlbench will retry failures 10 times by default, this is configurable via the `maxtries` command line +option for the cql activity type. This metric shows a histogram of the number of tries that each operation +required, in this example, there were no retries as the `count` is 100k. ``` 2019-08-12 15:46:00,341 INFO [main] i.e.c.ScenarioResult [Slf4jReporter.java:373] type=HISTOGRAM, name=baselines/cql-keyvalue.tries, count=100000, min=1, max=1, mean=1.0, stddev=0.0, median=1.0, p75=1.0, p95=1.0, p98=1.0, p99=1.0, p999=1.0 ``` @@ -59,5 +71,8 @@ To get more information on these options, see the output of ### Congratulations -You have completed your first run with nosqlbench! Let's head over to the Next Steps section < link > to talk about the possibilities that are now at our fingertips. +You have completed your first run with nosqlbench! + +In the 'Next Steps' section, you'll find options for how to continue, whether you are looking +for basic testing or something more advanced. diff --git a/engine-docs/src/main/resources/docs-for-nb/02_getting_started/04_next_steps.md b/engine-docs/src/main/resources/docs-for-nb/02_getting_started/04_next_steps.md new file mode 100644 index 000000000..45b2dcf68 --- /dev/null +++ b/engine-docs/src/main/resources/docs-for-nb/02_getting_started/04_next_steps.md @@ -0,0 +1,45 @@ +--- +title: Next Steps +weight: 5 +--- + +Now that you've run nosqlbench for the first time and seen what it does, you can +choose what level of customization you want for further testing. + +The sections below describe key areas that users typically customize +when working with nosqlbench. + +Everyone who uses nosqlbench will want to get familiar with the 'NoSQLBench Basics' section below. +This is essential reading for new and experienced testers alike. + +## High-Level Users + +Several canonical workloads are already baked-in to nosqlbench for immediate use. +If you are simply wanting to drive workloads from nosqlbench without building a custom workload, +then you'll want to learn about the available workloads and their options. + +Recommended reading for high-level testing workflow: +1. 'Built-In Workloads' +2. 'nosqlbench Basics' + +## Workload Builders + +If you want to use nosqlbench to build a tailored workload that closely emulates what + a specific application would do, then you can build a YAML file that specifies all + of the details of an iterative workload. You can specify the access patterns, + data distributions, and more. + +The recommended reading for this is: + +1. 'NoSQLBench Basics' +2. All of the 'Designing Workloads' section. +3. The online examples (find the links in the Designing Workloads section.) + +## Scenario Developers + +The underlying runtime for a scenario in nosqlbench is based on EngineBlock, +which means it has all the scripting power that comes with that. For advanced +scenario designs, iterative testing models, or analysis methods, you can use +ECMAScript to control the scenario from start to finish. This is an advanced + feature that is not recommended for first-time users. A guide for scenario + developers will be released in increments. diff --git a/engine-docs/src/main/resources/docs-for-nb/02_getting_started/05_next_steps.md b/engine-docs/src/main/resources/docs-for-nb/02_getting_started/05_next_steps.md deleted file mode 100644 index f6f6b0a98..000000000 --- a/engine-docs/src/main/resources/docs-for-nb/02_getting_started/05_next_steps.md +++ /dev/null @@ -1,35 +0,0 @@ ---- -title: 05 Next Steps -weight: 5 ---- - -# 5. Next Steps - -Now that you've run nosqlbench for the first time and seen what it does, you can choose what level of customization you want for further testing. - -The sections below describe key areas that users typically customize when working with nosqlbench. - -Everyone who uses nosqlbench will want to get familiar with the basics section below. This is essential reading for new and experienced testers alike. - -## High-Level Users - -Several canonical workloads are already baked-in to nosqlbench for immediate use. If you are simply wanting to drive workloads from nosqlbench without building a custom workload, then you'll want to learn about the available workloads and their options. - -Recommended reading for this is: -1. 'Built-In Workloads' -2. 'nosqlbench Basics' - -## Workload Builders - -If you want to use nosqlbench to build a tailored workload that closely emulates what a specific application would do, then you can build a YAML file that specifies all of the details of an iterative workload. You can specify the access patterns, data distributions, and more. - -The recommended reading for this is: - -1. 'nosqlbench Basics' -2. All of the 'Designing Workloads' section. -3. The online examples (find the links in the Designing Workloads section.) - -## Scenario Developers - -The underlying runtime for a scenario in nosqlbench is based on EngineBlock, -which means it has all the scripting power that comes with that. For advanced scenario designs, iterative testing models, or analysis methods, you can use ECMAScript to control the scenario from start to finish. This is an advanced feature that is not recommended for first-time users. A guide for scenario developers will be released in increments. diff --git a/engine-docs/src/main/resources/docs-for-nb/02_getting_started/index.md b/engine-docs/src/main/resources/docs-for-nb/02_getting_started/index.md index 94907dffc..fe8b28957 100644 --- a/engine-docs/src/main/resources/docs-for-nb/02_getting_started/index.md +++ b/engine-docs/src/main/resources/docs-for-nb/02_getting_started/index.md @@ -1,9 +1,20 @@ --- -title: Getting Started +title: Quick Start Example weight: 20 --- -# Getting Started +If you are on Linux, you should be able to start getting useful results immediately with these commands: -In this Getting Started track, we will walk you through your first test run with nosqlbench and explain the minimal set of information that you will need to get off the ground. We recommend that you go through the steps in this section in order, as each step builds on the last. +1. `/nb run type=cql yaml=baselines/cql-iot tags=phase:schema host=dsehost` +2. `./nb run type=cql yaml=baselines/cql-iot tags=phase:main host=dsehost cycles=1M threads=auto host=dsehost` +You can put your own contact points in place of `dsehost`. + +Alternately, if you have docker installed on your Linux system, and you have permissions to use it, you +can use `--docker-metrics` to stand up a live metrics dashboard at port 3000. + +This example doesn't go into much detail about what it is doing. It is here to show you how quickly you can +start running real workloads without having to learn much about the machinery that makes it happen. + +The rest of this section has a more elaborate example that exposes some of the basic options you may want to +adjust for your first serious test. diff --git a/engine-docs/src/main/resources/docs-for-nb/03_basics/01_command_line.md b/engine-docs/src/main/resources/docs-for-nb/03_basics/01_command_line.md index 5861d017c..a9190e0a3 100644 --- a/engine-docs/src/main/resources/docs-for-nb/03_basics/01_command_line.md +++ b/engine-docs/src/main/resources/docs-for-nb/03_basics/01_command_line.md @@ -1,10 +1,8 @@ --- -title: nosqlbench CLI Options +title: NoSQLBench CLI Options weight: 01 --- -# nosqlbench CLI Options - This is the same documentation you get in markdown format with the `nb --help` command. @@ -29,7 +27,7 @@ named argument to the previous command. The following example is a commandline with a command *start*, and two named arguments to that command. - ./nb start type=diag alias=example + ./nb start type=diag alias=example ### Discovery options ### @@ -160,7 +158,7 @@ When this option is set, engineblock will start graphite, prometheus, and grafan ### Console Options ### Increase console logging levels: (Default console logging level is *warning*) - -v (info) + -v (info) -vv (debug) -vvv (trace) diff --git a/engine-docs/src/main/resources/docs-for-nb/03_basics/index.md b/engine-docs/src/main/resources/docs-for-nb/03_basics/index.md index 7061d6017..dcceaccb2 100644 --- a/engine-docs/src/main/resources/docs-for-nb/03_basics/index.md +++ b/engine-docs/src/main/resources/docs-for-nb/03_basics/index.md @@ -1,5 +1,5 @@ --- -title: nosqlbench Basics +title: NoSQLBench Basics weight: 30 --- diff --git a/engine-docs/src/main/resources/docs-for-nb/04_designing/statement_params.md b/engine-docs/src/main/resources/docs-for-nb/04_designing/statement_params.md deleted file mode 100644 index 04d4e477c..000000000 --- a/engine-docs/src/main/resources/docs-for-nb/04_designing/statement_params.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -title: Statement Params -weight: 15 ---- - -Statement parameters apply to the defined operations for an activity. Statement -parameters are always configurable as part of a `params` block in YAML, for -activities that use the [Standard YAML](/user-guide/standard_yaml) format. - -In some cases, an [Activity Parameter](/parameters/activity_params) of the same -name can be used to establish a default value. In that case, it will be -documented here with the parameter description. - -### ratio - -`ratio: ` - -Determines the frequency of the affected statements in the operational sequence. -This means, in effect, the number of times a given statement will be executed -within the planned sequence before it starts over at the beginning. When using ratio, -it is important to be aware of *how* these statements are sequenced according -to the ratio. That is controlled by [seq](/parameters/activity_params#seq). - - - - - - diff --git a/engine-docs/src/main/resources/docs-for-nb/04_designing/00_yaml_org.md b/engine-docs/src/main/resources/docs-for-nb/04_designing_workloads/00_yaml_org.md similarity index 100% rename from engine-docs/src/main/resources/docs-for-nb/04_designing/00_yaml_org.md rename to engine-docs/src/main/resources/docs-for-nb/04_designing_workloads/00_yaml_org.md diff --git a/engine-docs/src/main/resources/docs-for-nb/04_designing/01_statement_templates.md b/engine-docs/src/main/resources/docs-for-nb/04_designing_workloads/01_statement_templates.md similarity index 100% rename from engine-docs/src/main/resources/docs-for-nb/04_designing/01_statement_templates.md rename to engine-docs/src/main/resources/docs-for-nb/04_designing_workloads/01_statement_templates.md diff --git a/engine-docs/src/main/resources/docs-for-nb/04_designing/02_data_bindings.md b/engine-docs/src/main/resources/docs-for-nb/04_designing_workloads/02_data_bindings.md similarity index 100% rename from engine-docs/src/main/resources/docs-for-nb/04_designing/02_data_bindings.md rename to engine-docs/src/main/resources/docs-for-nb/04_designing_workloads/02_data_bindings.md diff --git a/engine-docs/src/main/resources/docs-for-nb/04_designing/03_stmt_params.md b/engine-docs/src/main/resources/docs-for-nb/04_designing_workloads/03_stmt_params.md similarity index 100% rename from engine-docs/src/main/resources/docs-for-nb/04_designing/03_stmt_params.md rename to engine-docs/src/main/resources/docs-for-nb/04_designing_workloads/03_stmt_params.md diff --git a/engine-docs/src/main/resources/docs-for-nb/04_designing/04_stmt_tags.md b/engine-docs/src/main/resources/docs-for-nb/04_designing_workloads/04_stmt_tags.md similarity index 100% rename from engine-docs/src/main/resources/docs-for-nb/04_designing/04_stmt_tags.md rename to engine-docs/src/main/resources/docs-for-nb/04_designing_workloads/04_stmt_tags.md diff --git a/engine-docs/src/main/resources/docs-for-nb/04_designing/05_stmt_blocks.md b/engine-docs/src/main/resources/docs-for-nb/04_designing_workloads/05_stmt_blocks.md similarity index 100% rename from engine-docs/src/main/resources/docs-for-nb/04_designing/05_stmt_blocks.md rename to engine-docs/src/main/resources/docs-for-nb/04_designing_workloads/05_stmt_blocks.md diff --git a/engine-docs/src/main/resources/docs-for-nb/04_designing/06_more_statements.md b/engine-docs/src/main/resources/docs-for-nb/04_designing_workloads/06_more_statements.md similarity index 100% rename from engine-docs/src/main/resources/docs-for-nb/04_designing/06_more_statements.md rename to engine-docs/src/main/resources/docs-for-nb/04_designing_workloads/06_more_statements.md diff --git a/engine-docs/src/main/resources/docs-for-nb/04_designing/07_multi_docs.md b/engine-docs/src/main/resources/docs-for-nb/04_designing_workloads/07_multi_docs.md similarity index 100% rename from engine-docs/src/main/resources/docs-for-nb/04_designing/07_multi_docs.md rename to engine-docs/src/main/resources/docs-for-nb/04_designing_workloads/07_multi_docs.md diff --git a/engine-docs/src/main/resources/docs-for-nb/04_designing/08_template_params.md b/engine-docs/src/main/resources/docs-for-nb/04_designing_workloads/08_template_params.md similarity index 100% rename from engine-docs/src/main/resources/docs-for-nb/04_designing/08_template_params.md rename to engine-docs/src/main/resources/docs-for-nb/04_designing_workloads/08_template_params.md diff --git a/engine-docs/src/main/resources/docs-for-nb/04_designing/09_stmt_naming.md b/engine-docs/src/main/resources/docs-for-nb/04_designing_workloads/09_stmt_naming.md similarity index 100% rename from engine-docs/src/main/resources/docs-for-nb/04_designing/09_stmt_naming.md rename to engine-docs/src/main/resources/docs-for-nb/04_designing_workloads/09_stmt_naming.md diff --git a/engine-docs/src/main/resources/docs-for-nb/04_designing/10_yaml_diagnostics.md b/engine-docs/src/main/resources/docs-for-nb/04_designing_workloads/10_yaml_diagnostics.md similarity index 100% rename from engine-docs/src/main/resources/docs-for-nb/04_designing/10_yaml_diagnostics.md rename to engine-docs/src/main/resources/docs-for-nb/04_designing_workloads/10_yaml_diagnostics.md diff --git a/engine-docs/src/main/resources/docs-for-nb/04_designing/index.md b/engine-docs/src/main/resources/docs-for-nb/04_designing_workloads/index.md similarity index 100% rename from engine-docs/src/main/resources/docs-for-nb/04_designing/index.md rename to engine-docs/src/main/resources/docs-for-nb/04_designing_workloads/index.md